看上图,首先对集成学习有一个宏观的认识。
三种基本的集成方法:Bagging、Boosting和Stacking。分别产生了Random Forest(随机森林),AdaBoost和GBDT。
集成学习是指将多个基学习器(弱学习器)结合来完成学习任务。通过模型集成,一般会获得比单个基学习器更好的效果。集成学习的原则是 “好而不同”。根据个体学习器的生成方式,可以分为两类。
工作机制:
Boosting算法是一种加法模型。
AdaBoost是Adaptive Boosting的缩写,针对同一个训练集训练不同的学习模型,然后将不同的这n个模型,带权相加。AdaBoost是Boosting的经典算法, 主要给出了每一个权重更新的迭代公示。
相同: 都是Boosting算法,均是迭代求解,都是前向分步算法;
不同: GBDT限定CART树,AdaBoost可使用决策树,NN等基分类器,迭代思路不同
Bagging与Boosting有着明显的不同,主要体现在样本的选取,和基学习器的训练与相加上。
考虑数据集 D D D, D D D具有 m m m个样本,我们对数据进行有放回的随机采样(自助采样法),得到具有m个样本的数据集,重复同样的工作T次,便可以得到T个m样本数的数据集。然后对每个训练样本集训练,得到不同的基学习器,对基学习器平均,即得到总的模型。
算法流程图如下:
算法 | Boosting | Bagging |
---|---|---|
采样方法 | 对同一个数据集迭代,不断增加训练错误样本的权重 | m次有放回采样得到具有m个样本采样集 |
代表算法 | AdaBoost、GBDT | Random Forest |
样本权重 | 不同 | 相同 |
基学习器权重 | 不同 | 相同 |
作用 | 降低偏差 | 降低方差 |
并行 | 不支持 | 支持 |
这里介绍的GBDT特指,“Greedy Function Approximation:A Gradient Boosting Machine”中提出的算法,使用了一阶展开,也就是梯度下降进行优化。通产情况下,GBDT(Gradient Boosting Decision Tree)泛指所有的梯度提升树算法,也就包括XGBoost和LightGBM。
讲解GBDT之前首先明白什么是提升树。
什么是提升树:
提升树是一个以决策树为基模型的Boosting方法,是一个加法模型。
加法模型:
f M ( x ) = ∑ m = 1 M T ( x , θ m ) f_M(x) = \sum_{m=1}^MT(x, \theta_m) fM(x)=m=1∑MT(x,θm)
T ( x , θ m ) : T(x, \theta_m): T(x,θm):第m颗决策树; θ m : \theta_m: θm:决策树参数; M : M: M:树的个数。
回归问题的提升树算法:
输入:训练集, T = ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) T={(x_1, y_1), (x_2, y_2)...(x_n, y_n)} T=(x1,y1),(x2,y2)...(xn,yn);
输出:提升树, f M ( x ) f_M(x) fM(x)
为什么要拟合残差:
首先提升树是一个加法模型, f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x) = f_{m-1}(x) + T(x; \theta_m) fm(x)=fm−1(x)+T(x;θm)。
前向分步算法中第m步,给定 f m − 1 ( x ) f_{m-1}(x) fm−1(x),求解参数即求Loss最小化:
θ = a r g m i n ( ∑ L ( y i , f m ( x ) ) ) = a r g m i n ( ∑ L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) ) \theta = argmin(\sum L(y_i, f_m(x))) = argmin(\sum L(y_i, f_{m-1}(x) + T(x; \theta_m))) θ=argmin(∑L(yi,fm(x)))=argmin(∑L(yi,fm−1(x)+T(x;θm)))
平方误差损失函数: L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y, f(x)) = (y-f(x))^2 L(y,f(x))=(y−f(x))2
代入上式: L ( y i , f m − 1 ( x ) + T ( x ; θ m ) ) = ( y − f m − 1 ( x ) − T ( x ; θ m ) ) 2 L(y_i, f_{m-1}(x) + T(x; \theta_m)) = (y - f_{m-1}(x) - T(x;\theta_m))^2 L(yi,fm−1(x)+T(x;θm))=(y−fm−1(x)−T(x;θm))2
r m i = y i − f m − 1 ( x i ) r_{mi} = y_i -f_{m-1}(x_i) rmi=yi−fm−1(xi)即为我们要拟合的。
回归问题下,损失函数是MSE,优化简单,但是对于复杂的损失函数,优化并不是那么容易。因此Freidman提出梯度提升的算法,使用负梯度来作为残差的近似值,拟合回归树,进而引出我们的GBDT。
输入:训练集样本 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x n , y n ) T={(x_1, y_1), (x_2, y_2)...(x_n, y_n)} T=(x1,y1),(x2,y2)...(xn,yn),最大迭代次数T, 损失函数L
输出:提升树, f M ( x ) f_M(x) fM(x)
二分类问题和回归问题大部分是相同的,只是损失函数不同。使用Logloss作为损失函数:
损失函数:
L ( y i , F m ( x i ) ) = − y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)} L(yi,Fm(xi))=−yilogpi+(1−yi)log(1−pi)
概率:
p i = 1 1 + e ( − F m ( x i ) ) p_i=\frac{1}{1+e(−F_m(x_i))} pi=1+e(−Fm(xi))1
代入化简:
L ( y i , F m ( x i ) ) = − y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) = − y i F m ( x i ) − l o g ( 1 + e F m ( x i ) ) L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)}=−{y_iF_m(x_i)−log(1+e^{F_m(x_i)})} L(yi,Fm(xi))=−yilogpi+(1−yi)log(1−pi)=−yiFm(xi)−log(1+eFm(xi))
[1] GBDT算法原理以及实例理解
[2] GBDT(MART) 迭代决策树入门教程 | 简介
[3] Boosting Decision Tree入门教程
[4] 决策树系列(五)——CART
[5] 梯度提升树GBDT原理
[6] 数据挖掘十大算法之CART详解
[7] 梯度提升树(GBDT)原理小结
[8] 集成学习之Adaboost算法原理小结
[9] GBDT原理与Sklearn源码分析-分类篇
[10] GBDT原理与Sklearn源码分析-回归篇
[11] GBDT原理与实践-多分类篇