转自:https://www.cnblogs.com/pinard/p/6140514.html
GBDT也是集成学习Boosting家族的成员。回顾下Adaboost,是利用前一轮迭代弱学习器的误差率来更新训练集的权重。GBDT也是迭代,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 ft−1(x) f t − 1 ( x ) , 损失函数是 L(y,ft−1(x)) L ( y , f t − 1 ( x ) ) , 本轮迭代的目标是找到一个CART回归树模型的弱学习器 ht(x) h t ( x ) ,让本轮的损失损失 L(y,ft(x))=L(y,ft−1(x)+ht(x)) L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) 最小,本轮迭代找到的决策树,要让样本的损失尽量变得更小。
强分类器是由多个弱分类器线性相加而成,那么可以写成如下形式:
输入是训练集样本 T=(x1,y1),(x2,y2),...(xm,ym) T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) , 最大迭代次数 T T , 损失函数 L L 。
输出是强学习器 f(x) f ( x )
1) 初始化弱学习器 f0(x)=argminc∑i=1mL(yi,c) f 0 ( x ) = a r g m i n ⏟ c ∑ i = 1 m L ( y i , c )
2) 对迭代轮数 t=1,2,...T t = 1 , 2 , . . . T 有:
a)对样本 i=1,2,...m i = 1 , 2 , . . . m ,计算负梯度
对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
a) 如果是指数损失函数,则损失函数表达式为 L(y,f(x))=exp(−yf(x)) L ( y , f ( x ) ) = e x p ( − y f ( x ) )
b) 如果是对数损失函数,分为二元分类和多元分类两种
二元: L(y,f(x))=log(1+exp(−yf(x))) L ( y , f ( x ) ) = l o g ( 1 + e x p ( − y f ( x ) ) ) ,这里的类别编号是{-1,1}
按照上面的算法:则此时的负梯度误差为:
多元: L(y,f(x))=−∑k=1Kyklogpk(x) L ( y , f ( x ) ) = − ∑ k = 1 K y k l o g p k ( x ) ,这里的多元类别编号采用one-hot编码形式。
对于回归算法,常用损失函数有如下4种:
a)均方差,这个是最常见的回归损失函数了 L(y,f(x))=(y−f(x))2 L ( y , f ( x ) ) = ( y − f ( x ) ) 2
b)绝对损失,这个损失函数也很常见 L(y,f(x))=|y−f(x)| L ( y , f ( x ) ) = | y − f ( x ) | ,对应负梯度误差为: sign(yi−f(xi)) s i g n ( y i − f ( x i ) )
c)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有两种方式。
第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为 ν ν ,对于前面的弱学习器的迭代
fk(x)=fk−1(x)+hk(x) f k ( x ) = f k − 1 ( x ) + h k ( x ) ,如果加上了正则化项,则有 fk(x)=fk−1(x)+νhk(x) f k ( x ) = f k − 1 ( x ) + ν h k ( x ) , ν ν 的取值范围为 0<ν≤1 0 < ν ≤ 1 。对于同样的训练集学习效果,较小的 ν ν 意味着我们需要更多的弱学习器。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
GDBT本身并不复杂,不过要吃透的话需要对集成学习的原理,决策树原理和各种损失函树有一定的了解。由于GBDT的卓越性能,只要是研究机器学习都应该掌握这个算法,包括背后的原理和应用调参方法。目前GBDT的算法比较好的库是xgboost。当然scikit-learn也可以。
GBDT主要的优点有:
1) 可以灵活处理各种类型的数据,包括连续值和离散值。
2) 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
3) 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点:
由于弱学习器之间存在依赖关系,难以并行训练数据。但可以通过自采样SGBT来达到部分并行。
参考文章:
https://www.cnblogs.com/pinard/p/6140514.html
https://www.cnblogs.com/ScorpioLu/p/8296994.html
sklearn:http://www.cnblogs.com/pinard/p/6143927.html