案例介绍

在这个案例中,我们使用波士顿的房屋数据集。通过构建一个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个数值型特征和一个目标变量房屋价格。

计算步骤

  1. 导入数据集并进行数据预处理。
  2. 将数据集分割为训练集和测试集。
  3. 初始化预测函数。
  4. 按照以下步骤进行M轮迭代:
    • 计算残差向量。
    • 使用梯度提升树算法拟合残差向量。
    • 更新预测函数。
  5. 使用训练好的模型进行预测,并评估模型性能。

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()

代码细节

  1. 我们首先导入所需的库,包括numpy,pandas,sklearn等。
  2. 使用load_boston函数加载波士顿房屋价格数据集,并将特征存储在X中,目标变量存储在y中。
  3. 对特征进行标准化处理,通过减去均值并除以标准差将所有特征缩放到相似的范围内。
  4. 使用train_test_split函数将数据集划分为训练集和测试集。
  5. 初始化预测函数F_prev为训练集目标变量的平均值。
  6. 设置迭代次数M,并创建一个空列表losses用于存储每轮迭代的损失值。
  7. 在每一轮迭代中,计算残差向量r,并使用GradientBoostingRegressor拟合残差向量r。
  8. 更新预测函数F_prev,将当前迭代的预测加到先前预测上。
  9. 计算每一轮迭代的均方差损失函数,并将损失值添加到losses列表中。
  10. 最后,绘制损失随迭代次数的变化趋势图,以此来观察模型的优化过程。

这样,我们就可以通过Boosting方法构建并训练了一个梯度提升回归模型,并且通过计算均方差损失函数观察模型性能的改善情况。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注