RF,GBDT,XgBoost、adaboost
Random Forest:
主要运用到的方法是bagging,采用Bootstrap的随机有放回的抽样,抽样出N份数据集,训练出N个决策树。然后根据N个决策树输出的结果决定最终结果(离散型的输出:取最多的类别,连续型的输出:取平均数),是一种集成学习
下面引用的是谢益辉博士关于Bootstrap (和 Jackknife)基本思想的论述
一般情况下,总体永远都无法知道,我们能利用的只有样本,现在的问题是,样本该怎样利用呢?Bootstrap的奥义也就是:既然样本是抽出来的,那我何不从样本中再抽样(Resample)?Jackknife的奥义在于:既然样本是抽出来的,那我在作估计、推断的时候“扔掉”几个样本点看看效果如何?既然人们要质疑估计的稳定性,那么我们就用样本的样本去证明吧。

随机森林的优势:
- 容易理解和解释
- 不需要太多的数据预处理工作
- 隐含地创造了多个联合特征,并能够解决非线性问题
- 随机森林模型不容易过拟合
- 自带out-of-bag (oob)错误评估功能
- 并行化容易实现
随机森林的劣势:
- 不适合小样本,只适合大样本
- 精度较低
- 适合决策边界是矩形的,不适合对角线型的
GBDT:
Gradient Boosting是一种Boosting的方法[more...] 它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。这句话有一点拗口,损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里就假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。Gradient Boosting是非常经典而又重要的提升方法,他与AdaBoost一样都是讲弱分类器合成强分类,但是其大致区别有:
- Gradient Boosting通过残差来变量的改变错误分类的权重,而AdaBoost就真的直接去修改分类错误的训练权重了
- Gradient Boosting接入的分类器一般完整的决策树居多,但是AdaBoost一般使用二层决策树
Gradient Boosting中最有代表性的就是GBDT,该模型虽好,使用时理解数据以及正确调参才是王道

原理:
通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。一般选择cart tree且树的深度不会很深。
gbdt 无论用于分类还是回归一直都是使用的CART 回归树。不会因为我们所选择的任务是分类任务就选用分类树,这是因为gbdt 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄。

给定样本集: ;
损失函数: ;
树模型: ;
我们的目的:用较弱的树模型组合出一个强模型 ,来进行样本的预测。
直接进入算法流程:
第一步:初始化 ,先找到最合适的参数
, 使得
最小,模型初始化,
;
第二步:
1. 如果这里的损失函数是均方误差,就如书中P169那样,我们通过 能计算得到各样本点预测的残差,我们要拟合的样本集就变成了
,按照老套路找最合适的
来拟合这个集合,最后模型升级,
;
2. 再推广到一般的情况,利用残差的近似值,书中P171给出的负梯度 来代替,我们要拟合的样本集就变成了
,后面的方法就跟上面一样了;
第三步:设定一个停止条件,比如树的数量 ,利用第二步的思路一直拟合下去,最终会得到我们需要的强模型,
。
这里的梯度下降法是在函数空间中通过梯度下降法寻找使得LOSS最小的一个函数,即L(y,f)对f求层,区别于传统的梯度下降法选择一个方向(对x求导);那么问题就来了,对函数求导?这也太难了吧。所以就有了一个近似的方法,根据经验风险最小化原则,我们认为在训练集上使得LOSS最小的函数,往往在测试集上表现会好,即在训练集上寻优;因此,把求导的函数理解成在训练集上该函数对应的离散的函数值,对函数求导就变成了对样本的函数值向量求导;因此就可以得到一个梯度向量,表示寻找到的最优函数, 这个函数就是一个新的弱分类器;对于一个样本,最理想的梯度是越接近0的梯度。所以,我们要能够让函数的估计值能够使得梯度往反方向移动(>0的维度上,往负方向移动,<0的维度上,往正方向移动)最终使得梯度尽量=0),并且该算法在会严重关注那些梯度比较大的样本,跟Boost的意思类似。
GBDT的一般步骤
- Step 1: 初始化。初始化y_hat在第0时刻的值。
- Step 2:求残差。通过类似梯度下降法的思路,每次y都向梯度下降的方向挪一小步。只是在GBDT,y挪的一小步并不是一个variable,而是一个function。
- Step 3:构建决策树。使用决策树逼近这个残差 –g,得到第t个决策树:f_t。
- Step 4:求叶节点权重。
- Step 5:更新输出y。y(t) = y(t – 1) + learning_rate * f_t

我们 使用 GBDT 生成了两棵树,两颗树一共有五个叶子节点。我们将样本 X 输入到两颗树当中去,样本X 落在了第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,于是我们便可以依次构建一个五纬的特征向量,每一个纬度代表了一个叶子节点,样本落在这个叶子节点上面的话那么值为1,没有落在该叶子节点的话,那么值为 0.于是对于该样本,我们可以得到一个向量[0,1,0,1,0] 作为该样本的组合特征,和原来的特征一起输入到逻辑回归当中进行训练。实验证明这样会得到比较显著的效果提升。
GBDT一些调参的方式:
- 树的个数 100~10000
- 叶子的深度 3~8
- 学习速率 0.01~1
- 叶子上最大节点树 20
- 训练采样比例 0.5~1
- 训练特征采样比例 (n−−√n)
GBDT的优势:
- 精度高
- 能处理非线性数据
- 能处理多特征类型
- 适合低维稠密数据
- 模型可解释性好
- 不需要做特征的归一化,可以自动选择特征
- 能适应多种损失函数
GBDT的劣势:
- 不太适合并发执行
- 计算复杂度高
- 不适用高维稀疏特征
RF和GBDT的比较
相同点:
- 都是由多棵树组成
- 最终的结果都是由多棵树一起决定
不同点:
- 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
- 组成随机森林的树可以并行生成;而GBDT只能是串行生成
- 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
- 随机森林对异常值不敏感,GBDT对异常值非常敏感
- 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
- 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。
而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的简历是为了使得之前模型的残差往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。[more...]
XGBoost:
XGBoost 是 “Extreme Gradient Boosting”的简称,是GB算法的一种高效实现,XGBoost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。GBDT是以决策树(CART)为基学习器的GB算法,XGBoost 扩展和改进了GDBT
XGBoost 主要具有以下几个优势
- 显式的把树模型复杂度作为正则项加到优化目标中。
- 公式推导中用到了二阶导数,用了二阶泰勒展开。
- 实现了分裂点寻找近似算法。
- 可以并行执行
1.xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合.
2.传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 —对损失函数做了改进(泰勒展开,一阶信息g和二阶信息h)
3.split finding algorithms(划分点查找算法):
3.1 exact greedy algorithm—贪心算法获取最优切分点
3.2 approximate algorithm— 近似算法,提出了候选分割点概念,先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。
3.3 Weighted Quantile Sketch—分布式加权直方图算法
这里的算法 3.2,3.3 是为了解决数据无法一次载入内存或者在分布式情况下算法 3.1 效率低的问题
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
4.xgboost工具支持并行。xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的。xgboost的并行是在特征粒度上的。xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
Adaboost
Adaptive Boosting是一种迭代算法。每轮迭代中会在训练集上产生一个新的学 习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性 (Informative)。换句话来讲就是,算法会为每个样本赋予一个权重,每次用训练 好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重 降低;否则提高样本的权重。权重越高的样本在下一个迭代训练中所占的比重就 越大,也就是说越难区分的样本在训练过程中会变得越重要;
整个迭代过程直到错误率足够小或者达到一定的迭代次数为止。
注意:是给样本增加权重,样本加权的过程可以如下图所示:

算法原理
Adaboost算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的 基本分类器以大的权值,给分类误差率较大的基分类器以小的权重值;构建的线 性组合为:

最终分类器是在线性组合的基础上进行Sign函数转换:

为什么进行转化呢?因为得到的线性组合是个连续的值,必须进行转化才能进行分类操作。
Sign函数如下图所示:
�

为了使得预测的结果尽量可能正确,则写出损失函数,损失函数为当预测失败的时候I函数加一,损失函数如下:

构建的学习器如下:

带入上述损失函数公式,求得最终损失函数为:

为了使损失函数最小,对上述式子进行化简,然后分别对其未知变量求偏导,可以解的未知变量,也就是前面所说的权重,求解过程如下:

最终解得:

其中参数e为第k轮的误差
构建模型的最终结果如图所示:

构建adaboost模型的过程如下:
-
假设训练数据集T={(X1,Y1),(X2,Y2)....(Xn,Yn)}
-
初始化训练数据权重分布
一般情况下刚开始的样本权重都是一样的
-
使用具有权值分布Dm的训练数据集学习,得到基本分类器
-
计算Gm(x)在训练集上的分类误差
-
根据误差e计算Gm(x)模型的权重系数αm
-
从新获得权重训练数据集的权值分布

其中Zm为为规范引子也就是归一化引子

- 构建基本分类器的线性组合

-
得到最终分类器
![]()
主要是理解两个权重,分类器权重和样本权重
(1)根据误差率计算的权重系数αm是分类器的权重
(2)样本的权重是根据已经求得的αm,做一个归一化之后更新每个样本的权重,目的是使得划分错误的数据的权重增大。


浙公网安备 33010602011771号