Boost算法(GDBT,AdaBoost,XGBoost)原理

本文详细阐述了梯度提升算法的基本原理,通过逐步优化弱预测模型来逼近损失函数的最小值,并介绍了三种典型应用:梯度下降提升树(GDBT)、自适应提升(AdaBoost)及XGBoost。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:点击打开链接

简单地来说,提升Boost就是指每一步都产生一个弱预测模型,然后加权累加到总模型中,然后每一步弱预测模型生成的的依据都是损失函数的负梯度方向,这样若干步以后就可以达到逼近损失函数局部最小值的目标。

首先Boost肯定是一个加法模型,它是由若干个基函数及其权值乘积之和的累加,即

其中b是基函数,beta是基函数的系数,这就是我们最终分类器的样子,现在的目标就是想办法使损失函数的期望取最小值,也就是


一下子对这M个分类器同时实行优化,显然不太现实,这问题也太复杂了,所以人们想了一个略微折中的办法,因为是加法模型,所以我每一步只对其中一个基函数及其系数进行求解,这样逐步逼近损失函数的最小值,也就是说


那聪明的你一定想到了,要使损失函数最小,那就得使新加的这一项刚好等于损失函数的负梯度,这样不就一步一步使得损失函数最快下降了吗?没错,就是这样,那么就有了


Lambda是我随便写的一个参数,可以和beta合并表示步长,那么对于这个基函数而言,其实它就是关于x和这个函数梯度的一个拟合,然后步长的选择可以根据线性搜索法,即寻找在这个梯度上下降到最小值的那个步长,这样可以尽快逼近损失函数的最小值。


到这里,梯度提升的原理其实就讲完了,接下来我们就讲几个实际情况中的特例,包括梯度下降提升树(GDBT),自适应提升(AdaBoost),以及Kaggle竞赛的王者XGBoost。

第一个,GDBT。

对于这个,一旦对上面梯度提升的想法理解了那就很容易解释了。首先既然是树,那么它的基函数肯定就是决策树啦,而损失函数则是根据我们具体的问题去分析,但方法都一样,最终都走上了梯度下降的老路,比如说进行到第m步的时候,首先计算残差


有了残差之后,我们再用(xi,rim)去拟合第m个基函数,假设这棵树把输入空间划分成j个空间R1m,R2m……,Rjm,假设它在每个空间上的输出为bjm,这样的话,第m棵树可以表示如下:


下一步,对树的每个区域分别用线性搜索的方式寻找最佳步长,这个步长可以和上面的区域预测值bjm进行合并,最后就得到了第m步的目标函数


当然了,对于GDBT比较容易出现过拟合的情况,所以有必要增加一点正则项,比如叶节点的数目或叶节点预测值score的平方和,进而限制模型复杂度的过度提升,这里在下面的实践中的参数设置我们可以继续讨论。


第二个,AdaBoost。

首先要说的是是AdaBoost是用于分类的。然后套路想必你已经非常了解了,前面几步完全和上面的GDBT一样,区别在于AdaBoost给出了损失函数为指数损失函数,即


很好理解,预测正确了yf(x)为正值,损失函数值就小,预测错误yf(x)为正值,损失函数值较大,然后我们来看一下第m步的损失函数


现在就是分别求alpha和G(x)使得损失函数最小值,按照之前的想法,直接算伪残差然后用G(x)拟合,不过这边我们先不着急。指数项中,yi与fm-1的乘积是不依赖于alpha和G(x)的,所以可以提出来不用考虑,对于任意alpha>0,在exp(-yi*fm-1)权值分布下,要exp(-yi*alpha*G(x))取最小值,也就是要G(x)对加权y预测的正确率最高。接下来,求alpha很愉快,直接求导位0,懒癌发作,公式推导过程就不打了,最后的结果如下:


得到了参数之后就能愉快的迭代,使得训练数据上的正确率蹭蹭蹭地往上涨。

再回过头来看看AdaBoost的标准做法和我们推导的是否一致

1 第一步假设平均分布,权值都为1/N,训练数据得到分类器。

2 求第一步的分类器预测数据的错误率,计算G(x)的系数alpha。

3 更新权值分布,不过加了归一化因子,使权值满足概率分布。

4 基于新的权值分布建立新的分类器,累加在之前的模型中。

5 重复上述步骤,得到最终的分类器。

可以看出,除了在更新权值分布处加了一个归一化因子之外,其他的都和我们推导的一样,所以,所以什么呀……你不仅会用还会推导啦?O(∩_∩)O哈哈~


第三个,XGBoost。

其实说白了也很简单,之前用的梯度下降的方法我们都只考虑了一阶信息,根据泰勒展开,

我们可以把二阶信息也用上,假如目标函数如下


其中Ω为正则项,正如上面讲的,可表示如下


然后对于决策树而言,最重要的就是一共有多少个节点以及每个节点的权值,所以决策树可以表示为


这样就有了下一步的推导


第二步是因为不管fm如何取值第一项的值都不变,所以优化过程中可以不用考虑,第三步是因为对于每个样本而言其预测值就是对应输入空间对应的权值,第四步则是把样本按照划分区域重新组合,然后定义


带入对w求偏导使其为0,这样就求得了


再回代,就可以把J(fm)中的w给消去了,得到了


这样我们就把新一步函数的损失函数变成了只与上一步相关的一个新的损失函数,这样我们就可以遍历数据中所有的分割点,寻找新的损失函数下降最多的分割点,然后重复上述操作。

相比于梯度提升,XGBoost在划分新的树的时候还是用了二阶信息,因此能够更快地收敛,而且XGBoost包是用C/C++写的,所以速度更快,而且在寻找最佳分割点的时候,可以引入并行计算,因此速度进一步提高,广受各大竞赛参赛者的喜爱啊。


### Adaboost Adaboost是一种基于提升方法的集成学习算法,其核心在于通过加权调整错误分类样本的重要性来逐步训练一系列弱分类器。最终模型由这些弱分类器组合而成,权重较高的样本会在后续的学习中得到更多关注[^1]。 ```python from sklearn.ensemble import AdaBoostClassifier clf = AdaBoostClassifier(n_estimators=50, learning_rate=1) model = clf.fit(X_train, y_train) predictions = model.predict(X_test) ``` ### 决策树 (DTree) 决策树是一种简单直观的监督学习技术,适用于分类和回归任务。该算法通过对特征空间进行分割形成一棵或多棵子树结构来进行预测。它具有易于理解和解释的优点,但在处理高维数据时容易发生过拟合现象。 ```python from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(random_state=0) model = clf.fit(X_train, y_train) predictions = model.predict(X_test) ``` ### 高斯过程 (GP) 高斯过程提供了一种灵活的概率建模框架用于回归分析和其他连续变量估计问题。相比于其他黑箱型机器学习方法,GP能够给出置信区间从而更好地量化不确定性。然而计算复杂度较高限制了其大规模应用范围[^2]。 ```python from sklearn.gaussian_process import GaussianProcessRegressor gp = GaussianProcessRegressor() model = gp.fit(X_train, y_train) predictions = model.predict(X_test) ``` ### k近邻算法 (KNN) k近邻属于实例化的懒惰学习者类别之一,意味着仅当需要做出新预测时才会执行实际运算操作。对于给定测试点而言,会找到最接近它的`k`个邻居并据此决定所属类别或数值大小。尽管实现起来非常简便快速,不过效率低下且存储需求较大成为主要缺点所在[^3]。 ```python from sklearn.neighbors import KNeighborsClassifier neigh = KNeighborsClassifier(n_neighbors=3) model = neigh.fit(X_train, y_train) predictions = model.predict(X_test) ``` ### 岭回归 (Ridge) 岭回归是在最小二乘线性回归基础上引入L2范数正则项的一种改进版本。这样做可以有效缓解多重共线性和过度拟合等问题的发生几率;同时保持良好的泛化性能表现。特别适合于解决那些自变量间存在较强关联关系的数据集上的回归任务[^4]。 ```python from sklearn.linear_model import Ridge reg = Ridge(alpha=.5) model = reg.fit(X_train, y_train) predictions = model.predict(X_test) ``` ### XGBoost 作为一种高效的梯度增强决策树(Gradient Boosted Decision Trees,GDBT)库,XGBoost不仅继承和发展了传统GBDT的优势特性——比如支持多种目标函数、内置交叉验证机制等;还创造性地加入了诸如列抽样、直方图加速等一系列创新性的优化措施使得整体运行速度更快更稳定可靠。另外值得一提的是XGBoost内部实现了对损失函数做二阶泰勒展开以达到更高精度的目的. ```python import xgboost as xgb dtrain = xgb.DMatrix(X_train,label=y_train) param = {'max_depth':2,'eta':1,'objective':'binary:logistic'} bst = xgb.train(param,dtrain,num_boost_round=2) dpredict = xgb.DMatrix(X_test) preds = bst.predict(dpredict) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值