集成算法(Emseble Learning) 是构建多个学习器,然后通过一定策略结合把它们来完成学习任务的,常常可以获得比单一学习显著优越的学习器。
用于减少方差的bagging
用于减少偏差的boosting
目录
1. BAGGING:
2. BOOSTING:
3 梯度提升算法GradientBoosting:
3.1 梯度下降法
3.1.1 用泰勒公式表示损失函数:
3.2 从梯度下降法到梯度上升法:
3.3 梯度提升原理推导
4. 梯度上升的思考:
代表:随机森林:取弱分类器的结果取平均。分类任务中会采取投票。
其主要做法是,通过T次自主选取法(每一个样本有放回地选取)取出m个数据,得到T个子数据集。分别在T个数据集上,训练出T个相同的模型,最后取他们的结果的平均值或者投票得到最终答案。
我们做一个简单的估计,样本在m次采样中始终不被采样到的概率是,取极限得到:
所以通过这个采样方法,有36.8%的初始数据不会出现在采样数据集中。
所以他的特点是:
不对模型的偏差产生影响(使用的是同一个模型),会降低模型的方差,提高了泛化性。
具体在机器学习任务中使用的函数是:sklearn.ensemble.BaggingClassifier()
实际中来集合别的分类器的使用方法是
from sklearn.ensemble import BaggingClassifier
bagging = BaggingClassifier(RandomForest(n_estimators = 50), n_estimators = T)
#T 是迭代T次,是从原始数据集中提取出的T个数据集。
bagging.fit(train,y)
bagging.predict(test)
代表:GradientBoosting、AdaBoost、LogitBoost。思想:增加前一个基学习器在训练过程中预测错误样本的权重,使得后续基学习器更加关注这些打标错误的训练样本,尽可能纠正这些错误,一直向下串行直至产生需要的T个基学习器,Boosting最终对这T个学习器进行加权结合,产生集成学习器。
借鉴于梯度下降法,其基本原理是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。采用决策树作为弱分类器的Gradient Boosting算法被称为GBDT。
在机器学习任务中,需要最小化损失函数 ,其中 是要求解的模型参数。梯度下降法通常用来求解这种无约束最优化问题,它是一种迭代方法:选取初值 ,不断迭代,更新 的值,进行损失函数的极小化。这里我们还需要初始化算法终止距离 以及步长。
复习一下泰勒公式:
对于这个算法的泰勒展开解释:
首先:,
目的:梯度下降,L()损失函数要变小,所以要取一个复数,使得
解释,为什么要用梯度的负方向作为局部下降最快的方向。
和都是向量,相乘就是向量点乘,当他们两个向量都是同方向的时候,可以取到最大值,这个值也是到的移动的最大值。因此,证明了沿着梯度方向变换就是最快的下降方式。而要加个负号,就是让整个损失函数在下降。
一张PPT足以:
总结:Gradient Boosting算法在每一轮迭代中,首先计算出当前模型在所有样本上的负梯度,然后以该值为目标训练一个新的弱分类器进行拟合并计算出该弱分类器的权重,最终实现对模型的更新。
对于平方损失函数拟合的是残差;对于一般损失函数,拟合的就是残差的近似值。
为什么要用泰勒公式推导梯度下降法,是因为我们在面试中经常会被问到GBDT与XGBoost的区别和联系?其中一个重要的回答就是:GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。当然,GBDT和XGBoost还有许多其它的区别与联系,感兴趣的同学可以自己查阅一些相关的资料。
reference:梯度提升(Gradient Boosting)算法 - 知乎 (zhihu.com)
(1)梯度提升与梯度下降的区别和联系是什么?
两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
(2)梯度提升和提升树算法的区别和联系?
提升树利用加法模型与前向分歩算法实现学习的优化过程。提升树算法的损失函数是平方误差损失函数和指数损失函数,因此,每一步优化是很简单的。
但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用损失函数的负梯度在当前模型的值作为提升树算法中残差的近似值,,拟合一个梯度提升模型。
(3)梯度提升和GBDT的区别和联系?
(4)对于一般损失函数而言,为什么可以利用损失函数的负梯度在当前模型的值作为梯度提升算法中残差的近似值呢?
我们观察到在提升树算法中,残差 是损失函数的负梯度方向,因此可以将其推广到其他不是平方误差(分类或是排序问题)的损失函数。也就是说,梯度提升算法是一种梯度下降算法,不同之处在于更改损失函数和求其负梯度就能将其推广。即,可以将结论推广为对于一般损失函数也可以利用损失函数的负梯度近似拟合残差。