关于集成算法的参考
集成算法Python实现包:ML-Ensemble
Bagging集成算法是Bootstrap Aggregating的缩写,对数据集通过有放回的随机采样建多个模型,各模型之间没有关系;对所有基模型预测的结果进行综合产生最终的预测结果,常用算数平均或最多票数的种类。对弱学习器没有限制,但常用的是决策树和神经网络。
随机采样(bootsrap)是从训练集里用有放回的方式抽取固定个数的样本,之前采集到的样本在放回后仍可能被抽到。
通常随机抽样后的形成的新样本集合大小和原数据集大小相同。若有 m m m个样本,则每次抽中概率为 1 m \frac{1}{m} m1,在 m m m次采样中都为被抽取到的概率是 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m,从而有 ( 1 − 1 m ) m → 1 e ≃ 0.368 (1-\frac{1}{m})^m \to \frac{1}{e} \simeq 0.368 (1−m1)m→e1≃0.368,即有约36.8%的样本会始终无法被采集。这部分样本成为袋外样本(Out Of Bag,OOB),通常用于检测模型泛化能力。
Bagging算法由于每次都用随机抽样来训练模型,因此泛化能力强,方差小,但由于未使用全部数据,偏差会大。
随机森林建立在Bagging的基础上,用CART决策树作为弱学习器,对样本进行有放回的随机抽样(同原数据集大小),大小和元数据集相同;再对每个决策树的特征进行随机筛选(是在根节点,不再是全部特征;也可以理解为在节点划分上随机从特征中抽取选择最优划分特征);建每颗树时的有放回样本抽样会有约1/3样本无法被抽到,可用于做袋外估计(OOB,outofbag)来评估性能;最终一个样本的预测结果由各树进行投票或平均。
RandomForest只能接受数值型变量,对于分类变量,需要进行如One-Hot编码的转换。
【重点参数】各树间的相关性与决策树所用特征量有关,特征越多,相关性可能越强;减少使用的特征个数,树的相关性和分类能力都会降低。
【有放回抽样原因】每颗决策树都用完全不同的数据来构建,则每棵树都是“片面”的,缺少共性,对最终的汇总结果没有帮助。
【袋外估计】效果与K折交叉验证相似。
【优点】:可以给出各特征对于输出的重要性矩阵;产生的模型方差小,泛化能力强;采用袋外估计,无需进行K折交叉验证;可以并行计算,速度快;对缺失值不敏感。
【缺点】:对噪音较大的样本集容易过拟合;值比较多的特征容易对模型产生影响。
【特征重要性】判断每个特征在随机森林的每颗树上做了多大的贡献,然后取平均值即可。其中关于贡献的计算方式有:
打乱特征j的样本顺序由两种方法:
1)是使用均匀分布或者正态分布随机值来抽样替换原特征;
2)是通过permutation test(随机排序测试、置换检验)将原来的所有N个样本的第 j j j个特征值重新打乱分布(相当于重新洗牌),保证了特征替代值与原特征的分布是近似的(只是重新洗牌而已)。参考
Extra trees是基于随机森林,但样本使用原始训练集,在特征划分时随机选择特征并随机选择划分阈值进行划分(不再使用具体准则)。
极大的抑制了过拟合,但增加了拟合的偏差
简称TRTE,是一种无监督的将低维的数据集映射到高维的方法,从而让映射到高维的数据可以更好的用于分类或回归。
TRTE在数据转化的过程用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕后,数据集里的每个数据在T个决策树中叶节点的位置也定下来了。从而将样本在每颗决策树中用one-hot(在对应节点为1,不在为0)编码表示的结果按树的顺序合在一起,映射结果维度 n o u t ≤ N o d e ∗ T r e e n_out \le Node*Tree nout≤Node∗Tree。实际上是实现了高维离散化。
示例:有3颗决策树,每个决策树有5个叶子节点,某个数据特征x划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1),有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。
简称IForest,是一种异常点监测方法。
随机采样时,所采子样本量远远小于原始训练集个数(通过部分数据来区分异常点)。每次建立决策树时,随机选择一个划分特征,并随机选择划分阈值。通过较小的决策树深度进行建模(少量异常点检测一般不用大规模树)。
对于异常点的判断是,将测试样本点 x x x用T颗树进行拟合,计算每颗决策树上该样本点所在的叶节点对应的深度 h t ( x ) h_t(x) ht(x),从而可计算平均高度 h ‾ t ( x ) \overline h_t(x) ht(x)。
样本点 x x x对应的异常概率为: s ( x , m ) = 2 − h ‾ ( x ) c ( m ) s(x,m)=2^{-\frac{\overline h(x)}{c(m)}} s(x,m)=2−c(m)h(x),其中 m m m是训练样本个数, c ( m ) = 2 l n ( m − 1 ) + ξ − 2 m − 1 m c(m)=2ln(m-1)+\xi -2\frac{m-1}{m} c(m)=2ln(m−1)+ξ−2mm−1, ξ \xi ξ是欧拉常数。
s ( x , m ) s(x,m) s(x,m)的取值范围是[0,1],取值越接近1,则 x x x是异常点的概率越大。
多输出任务是对一个输入样本会输出多个目标值(多个y,不是y的多个值)。以回归为例,对单输出任务是求解 θ \theta θ使得 X θ = Y X\theta=Y Xθ=Y,二多输出任务是求解 θ = ( θ 1 , θ 2 ) \theta=(\theta_1,\theta_2) θ=(θ1,θ2)使得 X ( θ 1 , θ 2 ) = ( Y 1 , Y 2 ) X(\theta_1,\theta_2)=(Y_1,Y_2) X(θ1,θ2)=(Y1,Y2)。对多输出任务,若各输出间相互独立,则多输出效果同多个单输出任务效果相似;但若各输出间有关联,则结果会不同与单输出任务的组合。
参考:https://www.cnblogs.com/pinard/p/6156009.html
【工作机制】首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重。使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2。如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
Boosting面临四个问题:
AdaBoost非常好的参考
AdaBoost算法(Adaptive Boost)可用于分类数据(二分类),对多分类任务,需要将任务通过OvR(一对多)转换成二分类任务;也可以用于回归。
AdaBoost每次都用全部数据,主要通过调整样本权重来建立各次迭代时的弱学习器。能够在学习过程中不断减少训练误差,且训练误差是以指数速度下降的。由于重视误分类样本的权重,因此对异常样本敏感,影响最终的强学习器的预测准确性。
AdaBoost算法可以认为是加法模型(弱学习器的线性组合)、损失函数为指数函数、学习算法为前向分布算法时的学习方法。
【思路】初始化时给数据集每个样本一个权重,用带权重的数据集来训练弱学习器。训练出模型后,针对这个模型中预测错误的样本,增加其权重值;对预测正确的样本,减少其权重。再根据计算出的误差给弱学习器一个权重。然后用新的样本权重调整后的样本继续训练新的弱学习器,重复得到B个模型。最后将B个弱学习器用对应的权重加总作为整体的强学习器。各弱学习器间相互依赖(样本权重受上一模型影响)。整个学习过程中使用的都是同一批样本,只是调整样本权重。
【过程】输入:训练集 T = { ( x , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} T={ (x,y1),(x2,y2),...(xm,ym)};分类y={-1,+1}
【Adaboost是前向分步学习算法】对第k轮迭代: f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x) fk(x)=fk−1(x)+αkGk(x)
【损失函数为指数函数】定义总体损失函数 a r g m i n ⏟ α , G ∑ i = 1 m e x p ( − y i f k ( x ) ) \underbrace{arg\;min\;}_{\alpha, G} \sum\limits_{i=1}^{m}exp(-y_if_{k}(x)) α,G argmini=1∑mexp(−yifk(x))
利用前向分步学习算法的关系可以得到损失函数为 ( α k , G k ( x ) ) = a r g m i n ⏟ α , G ∑ i = 1 m e x p [ ( − y i ) ( f k − 1 ( x ) + α k G k ( x ) ) ] (\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}exp[(-y_i) (f_{k-1}(x) + \alpha_kG_k(x))] (αk,Gk(x))=α,G argmini=1∑mexp[(−yi)(fk−1(x)+αkGk(x))]
令 w k i ′ = e x p ( − y i f k − 1 ( x ) ) w_{ki}^{'} = exp(-y_if_{k-1}(x)) wki′=exp(−yifk−1(x)),它的值不依赖于 α , G \alpha, G α,G,是上一轮中确定的结果,仅仅依赖于 f k − 1 ( x ) f_{k−1}(x) fk−1(x),随着每一轮迭代而改变,与本轮最小化时所求 G k G_k Gk无关。从而有 ( α k , G k ( x ) ) = a r g m i n ⏟ α , G ∑ i = 1 m w k i ′ e x p [ − y i α k G k ( x ) ] (\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}w_{ki}^{'}exp[-y_i\alpha_k G_k(x)] (αk,Gk(x))=α,G argmini=1∑mwki′exp[−yiαkGk(x)]。
又由于 G k ( x ) = a r g m i n ⏟ G ∑ i = 1 m w k i ′ I ( y i ≠ G ( x i ) ) G_k(x) = \underbrace{arg\;min\;}_{G}\sum\limits_{i=1}^{m}w_{ki}^{'}I(y_i \neq G(x_i)) Gk(x)=G argmini=1∑mwki′I(yi=G(xi)),从而带入损失函数,对 α \alpha α求导并使其为0,可得: α k = 1 2 l o g 1 − e k e k \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} αk=21logek1−ek
e k e_k ek即为我们前面的分类误差率: e k = ∑ i = 1 m w k i ’ I ( y i ≠ G ( x i ) ) ∑ i = 1 m w k i ’ = ∑ i = 1 m w k i I ( y i ≠ G ( x i ) ) e_k = \frac{\sum\limits_{i=1}^{m}w_{ki}^{’}I(y_i \neq G(x_i))}{\sum\limits_{i=1}^{m}w_{ki}^{’}} = \sum\limits_{i=1}^{m}w_{ki}I(y_i \neq G(x_i)) ek=i=1∑mwki’i=1∑mwki’I(yi=G(xi))=i=1∑mwkiI(yi=G(xi))
【何时停止建树??】
对于第 k k k个弱学习器,总体最大误差: E k = m a x ∣ y i − G k ( x i ) ∣ i = 1 , 2... m E_k= max|y_i - G_k(x_i)|\;i=1,2...m Ek=max∣yi−Gk(xi)∣i=1,2...m
对每个样本的误差根据不同定义可以有:若为线性误差,则 e k i = ∣ y i − G k ( x i ) ∣ E k e_{ki}= \frac{|y_i - G_k(x_i)|}{E_k} eki=Ek∣yi−Gk(xi)∣;若为平方误差,则时 e k i = ( y i − G k ( x i ) ) 2 E k 2 e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2} eki=Ek2(yi−Gk(xi))2;若为指数误差,则 e k i = 1 − e x p ( − y i + G k ( x i ) ) E k ) e_{ki}=1-exp(\frac{-y_i + G_k(x_i))}{E_k}) eki=1−exp(Ek−yi+Gk(xi)))。
最终得到第k个弱学习器的误差率: e k = ∑ i = 1 m w k i e k i e_k = \sum\limits_{i=1}^{m}w_{ki}e_{ki} ek=i=1∑mwkieki
第k个弱学习器的样本 i i i的权重 α k , i = e k , i 1 − e k , i \alpha_{k,i}=\frac{e_{k,i}}{1-e_{k,i}} αk,i=1−ek,iek,i,则第 k + 1 k+1 k+1个弱学习器的样本集权重系数为 w k + 1 , i = w k i Z k α k 1 − e k i w_{k+1,i}=\frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}} wk+1,i=Zkwkiαk1−eki,其中 Z k = ∑ i = 1 m w k i α k 1 − e k i Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}} Zk=i=1∑mwkiαk1−eki。
弱学习器的结合策略是对加权的弱学习器,取权重倒数的对数的中位数对应的弱学习器作为强学习器,最终的强回归器为 f ( x ) = G k ∗ ( x ) f(x) =G_{k^*}(x) f(x)=Gk∗(x), G k ∗ ( x ) G_{k^*}(x) Gk∗(x)是 l n 1 α k , k = 1 , 2 , . . . . K ln\frac{1}{\alpha_k}, k=1,2,....K lnαk1,k=1,2,....K的中位数值对应序号 k ∗ k^∗ k∗对应的弱学习器。
梯度提升算法是以基函数为变量求解损失函数最小化,基于加法模型,利用前向分布算法,根据泰勒一阶展开式得出基函数尽可能拟合上一模型的负梯度时,能够使损失函数最小化,实现逐渐逼近总体损失函数的局部最优值
。
称为Gradient是因为在添加新模型时用了梯度下降算法来实现损失函数最小化。
【加法模型】 F ( x ) = ∑ β m f m ( x ) F(x)=\sum \beta_mf_m(x) F(x)=∑βmfm(x)
【前向分布算法】 F t ( x ) = F t − 1 ( x ) + β t f t ( x ) F_t(x)=F_{t-1}(x)+\beta_tf_t(x) Ft(x)=Ft−1(x)+βtft(x)
【损失函数】总体模型的损失函数: L ( y , F ( x ) ) = ∑ N L ( y i , ∑ m β m f m ( x i ) ) L(y, F(x))=\sum^N L(y_i, \sum^m\beta_mf_m(x_i)) L(y,F(x))=∑NL(yi,∑mβmfm(xi))
【泰勒一阶展开式】 f ( x + Δ x ) = f ( x ) + Δ f ′ ( x ) f(x+\Delta x)=f(x)+\Delta f'(x) f(x+Δx)=f(x)+Δf′(x)
【梯度下降】由于损失 L ( y , F ( x ) ) = ∑ N L ( y i , ∑ m β t f t ( x i ) ) = ∑ L ( y i , F t − 1 ( x i ) + β t f t ( x i ) ) L(y, F(x))=\sum^N L(y_i, \sum^m\beta_tf_t(x_i))=\sum L(y_i, F_{t-1}(x_i)+\beta_tf_t(x_i)) L(y,F(x))=∑NL(yi,∑mβtft(xi))=∑L(yi,Ft−1(xi)+βtft(xi))是关于 F ( x ) F(x) F(x)的函数,对与每个样本,根据一阶泰勒展开式可得 L ( y i , F t − 1 ( x i ) + β t f t ( x i ) ) ≈ F t − 1 ( x i ) + β t f t ( x i ) L ( y i , F t − 1 ( x i ) ) F t − 1 ( x i ) L(y_i, F_{t-1}(x_i)+\beta_tf_t(x_i)) \approx F_{t-1}(x_i)+\beta_t f_t(x_i)\frac{L(y_i,F_{t-1}(x_i))}{F_{t-1}(x_i)} L(yi,Ft−1(xi)+βtft(xi))≈Ft−1(xi)+βtft(xi)Ft−1(xi)L(yi,Ft−1(xi))。由于 β t > 0 \beta_t\gt0 βt>0,从而根据梯度下降知识可知,当 f t ( x i ) = − L ( y i , F t − 1 ( x i ) ) F t − 1 ( x i ) f_t(x_i)=-\frac{L(y_i, F_{t-1}(x_i))}{F_{t-1}(x_i)} ft(xi)=−Ft−1(xi)L(yi,Ft−1(xi))(梯度下降)时有(平方项大于0), L ( y i , F t − 1 ( x i ) ) ≥ L ( y i , F t ( x i ) ) L(y_i,F_{t-1}(x_i))\ge L(y_i,F_t(x_i)) L(yi,Ft−1(xi))≥L(yi,Ft(xi))。此时可成功降低每个样本点上的预测损失。从而有 F t ( x ) = F t − 1 ( x ) + f t ( x ) F_t(x)=F_{t-1}(x)+f_t(x) Ft(x)=Ft−1(x)+ft(x)。参考,非常好的参考
以上是基于损失函数对总体模型 F ( x ) F(x) F(x)可导的,但 F ( x ) F(x) F(x)是否关于x可导不一定(即 f ( x ) f(x) f(x)是否对x可导)。
对于 β t \beta_t βt可以通过以为搜索找到: β t = a r g m i n β ∑ L ( y i , h t − 1 ( x i ) + β f t ( x i ) ) \beta_t=argmin_{\beta}\sum L(y_i, h_{t-1}(x_i)+\beta f_t(x_i)) βt=argminβ∑L(yi,ht−1(xi)+βft(xi))。
对初始的 f 0 ( x ) f_0(x) f0(x),可以用常量,如均值等。
对于不同的基函数、不同的损失函数,都可以用上述解法来做。当损失函数为 L ( F ) = ( y − F ) 2 L(F)=(y-F)^2 L(F)=(y−F)2时, 对 F F F的导数(不是对x求导)是 2 ( y − F ) 2(y-F) 2(y−F),这就是残差,从而新的函数 f m ( x ) f_m(x) fm(x)对伪残差的最大拟合实际就是对上轮迭代所得残差的最大拟合。若损失函数为其他函数时未必。
如此迭代不断找到新的 f ( x ) f(x) f(x)使总体损失函数变小,此方法即为梯度提升。
【推导方法二】
若 L L L关于 F F F二阶可导,还可以从极值角度考虑,令 L ′ = 0 L'=0 L′=0,而 L ′ L' L′可用泰勒展开式进行展开,从而可以计算出 f m f_m fm的具体形式参考:
【回归任务】
均方误差损失函数 L ( y m , F m ( x ) ) = 1 2 ( y − F m ( x ) ) 2 L(y_m, F_{m}(x))=\frac{1}{2}(y-F_{m}(x))^2 L(ym,Fm(x))=21(y−Fm(x))2此时梯度就是残差 y − F ( x ) y-F(x) y−F(x)。
绝对损失函数 L ( y , F ( x ) ) = ∣ y − F ( x ) ∣ L(y, F(x))=|y-F(x)| L(y,F(x))=∣y−F(x)∣,梯度是 s i g n ( y − F ( x ) ) sign(y-F(x)) sign(y−F(x))。
【分类任务】
二分类任务用逻辑回归的损失函数(logistic loss): L ( y , F ( x ) ) = y l o g p + ( 1 − y ) l o g ( 1 − p ) L(y,F(x))=ylogp+(1-y)log(1-p) L(y,F(x))=ylogp+(1−y)log(1−p),其中 p = 1 1 + e − F ( x ) p=\frac{1}{1+e^{-F(x)}} p=1+e−F(x)1,梯度是 y − 1 1 + e − F m − 1 ( x ) y-\frac{1}{1+e^{-F_{m-1}(x)}} y−1+e−Fm−1(x)1。
多分类任务使用Sofmax的损失函数。
指数损失函数 L ( y m , F m ( x ) ) = e ( − y ∗ F m ( x ) ) L(y_m, F_{m}(x))=e^{(-y*F_m(x))} L(ym,Fm(x))=e(−y∗Fm(x))。当损失函数为指数函数式,梯度提升算法相当于二分类的Adaboost算法参考
【示例】以逻辑回归为例,对每个类,预测其概率时,形成 y ^ ( i ) = ( p 1 , p 2 , p n ) \hat y^{(i)}=(p_1,p_2,p_n) y^(i)=(p1,p2,pn),对实际所属类可视为概率1,其余为0,如 y ( i ) = ( 1 , 0 , 0 ) y^{(i)}=(1,0,0) y(i)=(1,0,0),从而可以计算 y ^ ( i ) \hat y^{(i)} y^(i)与 y ( i ) y^{(i)} y(i)间的距离,从而构造 f ( x ) f(x) f(x)的损失函数并计算伪残差,之后再对该伪残差继续用逻辑回归建模,理论上直到所有残差为零时(或达到阈值)停止。分类的损失函数可以是预测类与真实类不一致的数量、叶节点的熵按叶节点占总体样本的比重做加权后的值……。
【正则化】在使用提升方法时,通常会在模型权值基础上再增加一个学习率 v v v(衰减因子Shrinkage),将上轮迭代的结果以一定比例缩减,削弱每个基函数的影响,让后面有更大的学习空间: F t ( x ) = F t − 1 ( x ) + v ⋅ β t f t ( x ) F_t(x)=F_{t-1}(x)+v·\beta_tf_t(x) Ft(x)=Ft−1(x)+v⋅βtft(x)。一般会把学习率设置得小一点( v < 0.1 v\lt 0.1 v<0.1),然后迭代次数设置得大一点。
另外在每次迭代时对样本可以进行随机无放回抽样,从而增加模型随机性,减小方差,即随机梯度提升SGD方法。
参考1 参考2 很好的参考
【特点】梯度提升树是基函数为CART回归树的梯度提升法的应用。GBDT的核心在于每次对上轮所得总体模型的负梯度进行拟合(损失函数是均方误差时就是对上轮残差进行拟合),通过累加所有树的结果作为最终结果(分类树的结果无法累加,故GBDT中的树都是回归树)。虽然调整后可用于分类任务(通过基函数返回概率),但基函数不是分类学习器。最终结果是对各树结果的加权求和得到总体结果
GBDT主要由三个概念组成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)
【基函数】最好是低方差和高偏差的,从而可以通过多次迭代减小偏差。
CART决策树不用很深,可接受单个基函数的高偏差,通过集合来减小偏差。
【损失函数】GBDT可以用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
【A、分类算法常用损失函数】:
B、回归算法常用损失函数】:
【正则化】:
每次随机无放回抽样建立CART决策树,总体损失函数用均方差(决策树的损失函数依赖于决策树)。对第 t t t轮迭代,有上一次迭代的残差(伪残差) r t − 1 , i r_{t-1,i} rt−1,i。参考 过程示例
树的建立依赖于树模型自身(如用基尼指数作为分割准则),之后获得伪残差才是关键。
【问题】具体如何确定各树的权重
过程同GBDT回归算法,但使用损失函数不同:用指数损失函数,则GBDT退化为Adaboost算法;用对数似然损失函数,类似逻辑回归,可得到预测概率值。参考
A)以对数似然损失函数logloss作为损失函数为例: y ∈ { 0 , 1 } y \in \{0,1\} y∈{ 0,1}好示例参考 参考
B)以指数损失作为损失函数为: y ∈ { − 1 , + 1 } y \in\{-1, +1\} y∈{ −1,+1}
除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。
采用OvR,实质上是在每轮训练时都是同时训练多颗树:是否A类一颗树,是否B类一个数,是否C类一棵树…,真实类的概率视为1,其余视为0,从而可以计算负梯度(残差),损失函数用对数似然损失函数。非常好的实例参考
对某轮训练,假设类别数为K,则对数似然损失函数为: L ( y , f ( x ) ) = − ∑ k = 1 K y k l o g p k ( x ) L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x) L(y,f(x))=−k=1∑Kyklogpk(x),其中如果样本x输出类别为 k k k,则 y k = 1 y_k=1 yk=1,否则为0。实际是本轮的K颗树之和。
在本轮的K颗树中,每颗树对样本x预测结果为 f l ( x ) f_l(x) fl(x),则可综合得属于第 k k k类的概率 p k ( x ) p_k(x) pk(x)的表达式为: p k ( x ) = e x p ( f k ( x ) ) ∑ l = 1 K e x p ( f l ( x ) ) p_k(x) =\frac{exp(f_k(x))}{\sum\limits_{l=1}^{K} exp(f_l(x))} pk(x)=l=1∑Kexp(fl(x))exp(fk(x))
结合上面两式,我们可以计算出第 t t t轮的第 i i i个样本属于类别 l l l时的负梯度(伪残差)为: r t i l = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f k ( x ) = f l , t − 1 ( x ) = y i l − p l , t − 1 ( x i ) r_{til} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f_k(x) = f_{l, t-1}\;\; (x)} = y_{il} - p_{l, t-1}(x_i) rtil=−[∂f(xi)∂L(yi,f(xi)))]fk(x)=fl,t−1(x)=yil−pl,t−1(xi)
这里的误差就是样本 i i i在OvR策略下,对应类别为 l l l时的真实概率(是则为1,否为0)和 t − 1 t−1 t−1轮预测概率的差值。
对于生成的决策树,我们各个叶子节点 J J J的最佳负梯度拟合值为: c t j l = a r g m i n ⏟ c j l ∑ i = 0 m ∑ k = 1 K L ( y k , f t − 1 , l ( x ) + ∑ j = 0 J c j l I ( x i ∈ R t j ) ) c_{tjl} = \underbrace{arg\; min}_{c_{jl}}\sum\limits_{i=0}^{m}\sum\limits_{k=1}^{K} L(y_k, f_{t-1, l}(x) + \sum\limits_{j=0}^{J}c_{jl} I(x_i \in R_{tj})) ctjl=cjl argmini=0∑mk=1∑KL(yk,ft−1,l(x)+j=0∑JcjlI(xi∈Rtj))
一般使用近似值代替: c t j l = K − 1 K ∑ x i ∈ R t j l r t i l ∑ x i ∈ R t i l ∣ r t i l ∣ ( 1 − ∣ r t i l ∣ ) c_{tjl} = \frac{K-1}{K} \; \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)} ctjl=KK−1xi∈Rtil∑∣rtil∣(1−∣rtil∣)xi∈Rtjl∑rtil
从而可以继续对残差进行建模拟合,重复上述过程。
除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多元GBDT分类和二元GBDT分类以及GBDT回归算法过程相同。
参考
全称Stochastic gradient boosting,每次迭代都对残差样本采用无放回的降采样,用部分样本训练基函数的参数,从而防止过拟合。令训练样本数占所有残差有样本的比例为g,当g=1时为原始模型。推荐使用样本比例 0.5 ≤ g ≤ 0.8 0.5\le g \le 0.8 0.5≤g≤0.8。
较小的g能够增强随机性,防止过拟合,并且收敛速度快。降采样的另一好处是可以用剩余样本做模型验证。
是eXtreme Gradient Boosting的简写。只能用于回归,对分类是通过预测概率后进行判断所属类别。
XGBoost只能接受数值型变量,对于分类变量,需要进行如One-Hot编码的转换。 原文slide 参考
【优点】
当新增分裂带来负增益时,GBM会停止分裂,而XGBoost会一直分裂到指定的最大深度,然后回过头来进行监枝。XGBoost允许在每一轮boosting迭代中使用交叉验证,以便获取最优boosting迭代次数;GMB使用网格搜索,只能检测有限个值。XGBoost和GBM都支持在线学习,即继续已有模型进行训练。最终结果是对各树叶子节点进行加权求和。
在目标函数中添加了正则化。叶子节点个数+叶子节点权重的L2正则化。max_depth,min_child_weight,gamma
列抽样。训练时只使用一部分的特征。colsample_bytree
子采样。每轮计算可以不使用全部样本,类似bagging。包括subsample。
early stopping。如果经过固定的迭代次数后,并没有在验证集上改善性能,停止训练过程。
shrinkage。调小学习率增加树的数量,为了给后面的训练留出更多的空间。减小learning_rate,同时增加estimator
常用损失函数:
- 均方误差: L ( y i , y ^ i ) = ( y i − y ^ i ) 2 L(y_i, \hat y_i)=(y_i-\hat y_i)^2 L(yi,y^i)=(yi−y^i)2
- 逻辑回归损失函数: L ( y i , y ^ i ) = y i l n ( 1 + e − y ^ i ) + ( 1 − y i ) l n ( 1 + e y ^ i ) L(y_i, \hat y_i)=y_iln(1+e^{-\hat y_i})+(1-y_i)ln(1+e^{\hat y_i}) L(yi,y^i)=yiln(1+e−y^i)+(1−yi)ln(1+ey^i) ,
一阶导 g = ∂ L ( y , F t − 1 ) F t − 1 = − y ( 1 − 1 1 + e F t − 1 ) + ( 1 − y ) 1 1 + e − y t − 1 = P r e d − L a b e l g=\frac{\partial L(y, F_{t-1})}{F_{t-1}}=-y(1-\frac{1}{1+e^{F_{t-1}}})+(1-y)\frac{1}{1+e^{-y_{t-1}}}=Pred-Label g=Ft−1∂L(y,Ft−1)=−y(1−1+eFt−11)+(1−y)1+e−yt−11=Pred−Label
二阶导 h = ∂ 2 L ( y , F t − 1 ) F t − 1 = e − y t − 1 ( 1 + e − y t − 1 ) 2 = P r e d ∗ ( 1 − P r e d ) h=\frac{\partial^2 L(y, F_{t-1})}{F_{t-1}}=\frac{e^{-y_{t-1}}}{(1+e^{-y_{t-1}})^2}=Pred*(1-Pred) h=Ft−1∂2L(y,Ft−1)=(1+e−yt−1)2e−yt−1=Pred∗(1−Pred)
3、通过泰勒展开式对损失函数进行简化:
由于二阶泰勒展开式 f ( x + △ x ) ≈ f ( x ) + f ′ ( x ) △ x + 1 2 f ′ ′ ( x ) △ x 2 f(x+\triangle x)\approx f(x)+f'(x)\triangle x+\frac{1}{2}f''(x)\triangle x^2 f(x+△x)≈f(x)+f′(x)△x+21f′′(x)△x2,对 L ( y i t , y ^ i ( t − 1 ) ) L(y^t_i,\hat y_i^{(t-1)}) L(yit,y^i(t−1)),因 y i t y_i^t yit是已知值,所以对第t次迭代 L ( y i t , y ^ i ( t − 1 ) ) 可 表 示 为 F ( y ^ i ( t − 1 ) + f t ( x i ) ) L(y^t_i,\hat y_i^{(t-1)})可表示为F(\hat y_i^{(t-1)}+f_t(x_i)) L(yit,y^i(t−1))可表示为F(y^i(t−1)+ft(xi)),从而可对 F F F按照泰勒展开式进行展开,即:
F ( y ^ i ( t − 1 ) + f t ( x i ) ) ≈ F ( y ^ i ( t − 1 ) ) + f t ( x i ) ∗ ∂ F ( y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) + 1 2 f t 2 ( x i ) ∗ ∂ 2 F ( y ^ i ( t − 1 ) ) ∂ ( y ^ i ( t − 1 ) ) 2 ≈ l ( y i t , y ^ i ( t − 1 ) ) + f t ( x i ) ∗ ∂ l ( y i t , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) + 1 2 f t 2 ( x i ) ∗ ∂ 2 l ( y i t , y ^ i ( t − 1 ) ) ∂ ( y ^ i ( t − 1 ) ) 2 ≈ l ( y i t , y ^ i ( t − 1 ) ) + f t ( x i ) ∗ g i + 1 2 f t 2 ( x i ) ∗ h i = ∑ i m [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] F(\hat y_i^{(t-1)}+f_t(x_i)) \approx F(\hat y_i^{(t-1)}) + f_t(x_i)*\frac{\partial F(\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}+\frac{1}{2}f_t^2(x_i)*\frac{\partial^2F(\hat y_i^{(t-1)})}{\partial (\hat y_i^{(t-1)})^2} \approx l(y_i^t,\hat y_i^{(t-1)})+ f_t(x_i)*\frac{\partial l(y_i^t,\hat y_i^{(t-1)})}{\partial \hat y_i^{(t-1)}}+\frac{1}{2}f_t^2(x_i)*\frac{\partial^2l(y_i^t,\hat y_i^{(t-1)})}{\partial (\hat y_i^{(t-1)})^2} \approx l(y_i^t,\hat y_i^{(t-1)})+f_t(x_i)*g_i+\frac{1}{2}f_t^2(x_i)*h_i = \sum_i^m [l(y_i, \hat y_i^{(t-1)})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)] F(y^i(t−1)+ft(xi))≈F(y^i(t−1))+ft(xi)∗∂y^i(t−1)∂F(y^i(t−1))+21ft2(xi)∗∂(y^i(t−1))2∂2F(y^i(t−1))≈l(yit,y^i(t−1))+ft(xi)∗∂y^i(t−1)∂l(yit,y^i(t−1))+21ft2(xi)∗∂(y^i(t−1))2∂2l(yit,y^i(t−1))≈l(yit,y^i(t−1))+ft(xi)∗gi+21ft2(xi)∗hi=∑im[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)],其中m是所有样本, l ( y i t , y ^ i ( t − 1 ) ) l(y_i^t,\hat y_i^{(t-1)}) l(yit,y^i(t−1))是根据之前预测结果得到的常量。
对 ∑ t T Ω ( f t ) = ∑ t T − 1 Ω ( f t ) + Ω ( f T ) \sum_t^T\Omega(f_t)=\sum_t^{T-1}\Omega(f_t)+\Omega(f_T) ∑tTΩ(ft)=∑tT−1Ω(ft)+Ω(fT),其中 ∑ t T − 1 Ω ( f t ) \sum_t^{T-1}\Omega(f_t) ∑tT−1Ω(ft)是根据前 T − 1 T-1 T−1次迭代获得的常量。
综合上边,将常量剔除,总体损失函数通过泰勒二阶展开式可简化为 L ( f t ) = ∑ t T L ( y i , y ^ i t ) = ∑ t T L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ∑ t T Ω ( f t ) = ∑ i m [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L(f_t)=\sum_t^T L(y_i, \hat y_i^t)=\sum_t^T L(y_i, \hat y_i^{(t-1)}+f_t(x_i))+\sum_t^T\Omega(f_t)=\sum_i^m [g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_t) L(ft)=∑tTL(yi,y^it)=∑tTL(yi,y^i(t−1)+ft(xi))+∑tTΩ(ft)=∑im[gift(xi)+21hift2(xi)]+Ω(ft),此时只需对第t次迭代找到最优的基模型 f t f_t ft即可(不是GBDT中用来求极值,只是进行简化)。
上式含义:在尽可能对目标值进行拟合以实现预测误差尽可能小的基础上,弱学习器应当有尽可能少的节点,节点取值也尽量偏差不大(防止过拟合风险)
4、对基函数是树模型的损失函数,用树的叶节点表示基函数
对基函数是决策树模型的 f ( x ) f(x) f(x),其结果可表示为叶节点数T、叶节点的值 w = ( w 1 , w 2 , … w T ) w=(w_1,w_2,…w_T) w=(w1,w2,…wT)的组合,样本 x x x在决策树中的结果可表示为 f ( x ) = w q ( x ) f(x)=w_{q(x)} f(x)=wq(x),其中 q ( x ) q(x) q(x)是第 q q q个节点。可以对叶节点数 T T T和叶节点值 w w w(拟合得到的)分别施加惩罚项,得到: Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_t)=\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 Ω(ft)=γT+21λ∑j=1Twj2,其中 T T T是决策树叶节点个数, w j w_j wj是第 j j j个叶节点对应的值(后面会被求解出来)。公式对决策树的惩罚方式不是唯一的,可定义其他形式,如L1正则项 1 2 α ∑ j = 1 T ∣ w j ∣ \frac{1}{2}\alpha\sum_{j=1}^T|w_j| 21α∑j=1T∣wj∣,或是L1+L2正则项一起用。引入正则项控制过拟合是GBDT没有的。
对第 t t