从random forest到adaboost到GBDT到xgboost

今天来谈一下基于集成的机器学习算法。

目前主要的集成算法有两个大类,第一种是bagging,以random forest为代表;第二种是boosting,以GBDT为代表。
bagging一句话概括就是基于不同分类器的结果进行投票,得票数多的结果即为最后的分类结果。boosting一句话概括就是分别赋予训练样本和结果权重,对于训练错误的样本赋予更高权重,下次迭代时更加使模型更加关注这些样本,赋予正确的结果更大的权重,使最终正确的预测所占比例更大

关于random forest

随机森林主要说这么几个点:

  1. 两个“随机”:有放回的取样本和随机取特征。这样做的目的是增强模型的鲁棒性,减少过拟合风险,使模型泛化能力更强;
  2. 随机森林的训练过程是:通过多棵树训练出不同的分类树,再将数据输入到不同的分类树,对分类结果进行投票,投票的众数为最终结果;
  3. 优点是模型性能好,速度快,可以训练高纬度的特征(随机划分到不同的树),对抗过拟合的能力强,缺点是对于特征维度较少的训练数据,效果较差,做回归问题不能给出连续值,效果差。
关于adaboost

这里有篇文章写adaboost的原理,我觉得写得非常好:https://www.cnblogs.com/ScorpioLu/p/8295990.html

这篇文章里有几个点需要解读一下。

  1. adaboost中可以选择任何的弱分类器,不管是决策树还是lr还是svm都可以,adaboost需要做的事情是调整训练样本的权重和分类器(分类结果)得权重;
  2. 为什么说要把分类错误的样本的权重提高,下一轮迭代更关注错误的样本?比如说文章中用分段函数作为弱分类器,如果一开始的权重都是相同的,肯定取的划分点是一个总误差最小的划分点,如果权重偏向这一轮分类错误的样本,划分点的选取就会更偏向错误的样本,使之前的错误样本在本轮中更有可能划分正确;
  3. 其实公式推导并不难,be more patient.
关于GBDT

GBDT是本篇文章的重点,之前一直就想好好研究一下。因为GBDT是目前各大机器学习比赛,top3中常见的算法,so,you know。

  1. GBDT需要理解为回归树
    为什么是回归树而不是分类树?我们知道GBDT的基分类器是CART树,这种树又可以解决分类问题也可以解决回归问题。但是,boosting的最终目的是将多种结果相加,数值相加才有意义,而类别相加是无意义的。所以这里我们把他理解为一种回归树。

  2. 关于GB
    GB(Gradient Boosting),梯度迭代。这个概念是GBDT的重点:每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
    举个栗子:
    比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。
    这个栗子中的梯度是怎么体现的呢?因为残差值不管loss function是什么,残差值向量F(X) = G(X) - X就是梯度方向。
    通过不断学习残差来慢慢逼近真实结果,这就是Gradient Boosting在GBDT中的意义,这种逼近残差在深度学习中也有应用(ResNet)。

  3. Shrinkage
    Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。用方程来看更清晰,即
    没用Shrinkage时:(yi表示第i棵树上y的预测值, y(1~i)表示前i棵树y的综合预测值)
    y(i+1) = 残差(y1~yi), 其中: 残差(y1~yi) = y真实值 - y(1 ~ i)
    y(1 ~ i) = SUM(y1, ..., yi)
    Shrinkage不改变第一个方程,只把第二个方程改为:
    y(1 ~ i) = y(1 ~ i-1) + step * yi
    即Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。直觉上这也很好理解,不像直接用残差一步修复误差,而是只修复一点点,其实就是把大步切成了很多小步。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。这个weight就是step。
    换种理解角度,Shrinkage就是设定了一个学习率ratio

关于xgboost

xgboost是陈天奇大神最早提出来的,和GBDT原理其实是一样的,主要就是实现不同,这里主要有四点:

  1. xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear);
  2. xgboost在目标函数中显示的加上了正则化项,基学习为CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关;
  3. GB中使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还使用二阶导数;
  4. CART回归树中寻找最佳分割点的衡量标准是最小化均方差,xgboost寻找分割点的标准是最大化,lamda,gama与正则化项相关

当然还有一些对于GBDT的优化,可以看这篇文章:http://www.cnblogs.com/wxquare/p/5541414.html

然后就是xgboost是一个工具库,里面有很多调整xgboost的参数,需要从实战中具体去理解。


好了,集成学习就到这,下次attention和transform。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值