案例介绍
在这个案例中,我们使用波士顿的房屋数据集。通过构建一个Boosting回归模型,我们将预测波士顿地区房屋价格的能力提升到一个更高的水平。
算法原理
Boosting是一种集成学习方法,通过组合多个弱分类器来创建一个强分类器。Boosting算法的基本原理是训练一系列弱分类器,并加权组合它们的预测结果来生成最终的预测。在每一轮迭代中,Boosting算法尝试纠正先前弱分类器的错误,并重点关注错误样本的处理。
在本案例中,我们使用了梯度提升树(Gradient Boosting Tree)算法。梯度提升树是一种Boosting算法,通过构建多个决策树来组合预测。它通过逐步迭代地训练决策树,并根据前一个决策树的残差学习残差的近似值。
公式推导
我们以均方差损失函数作为回归问题的目标函数,使用梯度提升树算法进行优化。假设训练集包含m个样本,特征向量为$x_i$,对应的目标值为$y_i$。我们的目标是构建一个M个弱分类器的集合$H(x)$,通过将它们组合起来最小化均方差损失函数$Loss$,其中包含了所有样本的残差。
首先,我们初始化将在每轮迭代中使用的常数$F_0$(初始化预测)。
在第t轮迭代中,我们计算第t-1轮迭代的残差向量$r_t$,它是真实目标值$y_i$与预测值$F_{t-1}(x_i)$之间的差异:
$$r_{it} = y_i – F_{t-1}(x_i)$$
接下来,我们构建一棵回归树$h_t(x)$,通过拟合残差$r_t$来近似预测的残差。我们使用最小化均方差损失函数求解回归树。
计算第t棵树的叶节点输出$c_{jt}$,通过最小化均方差损失函数的负梯度:
$$c_{jt} = \underset{c}{\arg\min} \sum_{x_i \in R_j} (-r_{it} – c)^2$$
这里,R_j是将输入空间分割为J个非重叠区域的决策树划分函数。然后,我们更新第t轮的预测函数:
$$F_t(x) = F_{t-1}(x) + \sum_{j=1}^{J}c_{jt}I(x \in R_j)$$
其中,I是指示函数。
最后,我们重复迭代这个过程,直到达到预订的轮数M。
数据集
在本案例中,我们将使用波士顿房屋价格数据集。该数据集包含506个样本,每个样本有13个数值型特征和一个目标变量房屋价格。
计算步骤
- 导入数据集并进行数据预处理。
- 将数据集分割为训练集和测试集。
- 初始化预测函数。
- 按照以下步骤进行M轮迭代:
- 计算残差向量。
- 使用梯度提升树算法拟合残差向量。
- 更新预测函数。
- 使用训练好的模型进行预测,并评估模型性能。
Python代码示例
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# 加载波士顿房屋价格数据集
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
# 数据预处理: 标准化特征
X = (X - np.mean(X)) / np.std(X)
# 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化预测函数
F_prev = np.mean(y_train)
# 设置M轮迭代
M = 100
losses = []
for i in range(M):
# 计算残差向量
r = y_train - F_prev
# 拟合残差向量
clf = GradientBoostingRegressor(n_estimators=1, learning_rate=0.1, max_depth=2)
clf.fit(X_train, r)
# 更新预测函数
F_prev += clf.predict(X_train)
# 计算本轮迭代的预测值
y_pred = F_prev
# 计算本轮迭代的均方差损失函数值
loss = mean_squared_error(y_train, y_pred)
losses.append(loss)
# 绘制均方差损失函数随迭代次数的变化趋势
plt.plot(range(M), losses)
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.title('Gradient Boosting Regression Loss')
plt.show()
代码细节
- 我们首先导入所需的库,包括numpy,pandas,sklearn等。
- 使用
load_boston
函数加载波士顿房屋价格数据集,并将特征存储在X
中,目标变量存储在y
中。 - 对特征进行标准化处理,通过减去均值并除以标准差将所有特征缩放到相似的范围内。
- 使用
train_test_split
函数将数据集划分为训练集和测试集。 - 初始化预测函数
F_prev
为训练集目标变量的平均值。 - 设置迭代次数M,并创建一个空列表
losses
用于存储每轮迭代的损失值。 - 在每一轮迭代中,计算残差向量r,并使用GradientBoostingRegressor拟合残差向量r。
- 更新预测函数F_prev,将当前迭代的预测加到先前预测上。
- 计算每一轮迭代的均方差损失函数,并将损失值添加到losses列表中。
- 最后,绘制损失随迭代次数的变化趋势图,以此来观察模型的优化过程。
这样,我们就可以通过Boosting方法构建并训练了一个梯度提升回归模型,并且通过计算均方差损失函数观察模型性能的改善情况。