梯度提升算法详解

机器学习领域,经常会遇到模型误差的问题。这些误差主要分为两类:偏差误差和方差误差。梯度提升算法作为一种集成学习技术,其核心目标就是减少模型的偏差误差。与AdaBoost算法不同,梯度提升算法中的基估计器是固定的,即决策树桩(Decision Stump)。

梯度提升算法的应用

梯度提升算法不仅可以用于预测连续型的目标变量(作为回归器),还可以用于预测分类目标变量(作为分类器)。当用作回归器时,其代价函数是均方误差(MSE);而作为分类器时,其代价函数是对数损失(Log loss)。

梯度提升算法的工作原理

为了更好地理解梯度提升算法的工作原理,可以通过一个例子来说明。在这个例子中,将使用年龄作为目标变量,而是否喜欢锻炼、是否去健身房和是否开车作为自变量。由于目标变量是连续的,因此使用梯度提升回归器(GradientBoostingRegressor)。

在第一估计器中,将所有记录都包含在根级别(级别0)中。预测的年龄等于整个年龄列的平均值,即41.33(年龄列所有值的总和除以记录数,即9)。接下来,需要计算这一级别的均方误差(MSE)。MSE是误差平方的平均值,这里的误差等于实际年龄减去预测年龄。对于特定的节点,预测的年龄总是等于该节点年龄记录的平均值。因此,第一估计器的根节点的MSE计算如下:

MSE = (∑(Age_i – mu)^2)/9 = 577.11

这里的成本函数是MSE,算法的目标是最小化MSE。然后,梯度提升将使用其中一个自变量来创建决策树桩。假设在这里使用是否喜欢锻炼来进行预测。因此,不喜欢锻炼的记录将进入一个子节点,而喜欢锻炼的记录将进入另一个子节点。

现在,来找出第二估计器。与AdaBoost不同,在梯度提升算法中,第一估计器的残差(age_i – mu)被用作根节点。假设在这个估计器中使用另一个自变量进行预测。因此,不去健身房的记录将进入一个子节点,而去健身房的记录将进入另一个子节点。

年龄的预测在这里稍微有些棘手。首先,年龄将根据是否喜欢锻炼的值从第一估计器中预测出来,然后根据是否去健身房的值找到第二估计器中的均值,然后将这个均值加到第一估计器预测的年龄上,这就是梯度提升算法使用两个估计器的最终预测。

Python代码实现

下面是一个使用Python实现梯度提升算法的示例代码。

# 导入所需的模块 import numpy as np import pandas as pd from sklearn.ensemble import GradientBoostingRegressor from sklearn.preprocessing import LabelEncoder # 创建数据框 X=pd.DataFrame({'LikesExercising':[False,False,False,True,False,True,True,True,True], 'GotoGym':[True,True,True,True,True,False,True,False,False], 'DrivesCar':[True,False,False,True,True,False,True,False,True]}) Y=pd.Series(name='Age',data=[14,15,16,26,36,50,69,72,74]) # 将True和False编码为数值0和1 LE=LabelEncoder() X['LikesExercising']=LE.fit_transform(X['LikesExercising']) X['GotoGym']=LE.fit_transform(X['GotoGym']) X['DrivesCar']=LE.fit_transform(X['DrivesCar']) # 使用GradientBoostingRegressor和2个估计器来训练模型并预测年龄 GB=GradientBoostingRegressor(n_estimators=2) GB.fit(X,Y) Y_predict=GB.predict(X) # 使用2个估计器预测的年龄 Y_predict

以上代码展示了如何使用梯度提升回归器来预测年龄,并通过调整估计器的数量来优化模型的性能。通过增加估计器的数量,可以观察到MSE的降低,直到达到饱和点,即增加更多的估计器不会显著降低MSE。

使用GridSearchCV寻找最佳估计器

接下来,将展示如何使用GridSearchCV来寻找最佳估计器。

from sklearn.model_selection import GridSearchCV model=GradientBoostingRegressor() params={'n_estimators':range(1,200)} grid=GridSearchCV(estimator=model,cv=2,param_grid=params,scoring='neg_mean_squared_error') grid.fit(X,Y) print("GridSearchCV返回的最佳估计器是:",grid.best_estimator_)

通过GridSearchCV,可以找到最佳的估计器数量,从而优化梯度提升模型的性能。

在本文中,通过一个简单的例子解释了梯度提升算法的工作原理。梯度提升算法通常用于减少模型的偏差误差,并且可以应用于回归分类问题。在回归问题中,使用MSE作为代价函数;而在分类问题中,使用对数损失作为代价函数。

在梯度提升算法中,找到最佳的n_estimators值是非常重要的。本文展示了如何使用GridSearchCV来实现这一点。阅读本文后,应该先尝试将这个算法应用于实践问题,然后学习如何调整这个算法的超参数。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485