十、(机器学习)-决策树和梯度提升树

决策树CART与梯度提升树GBDT

1、CART分类回归树简介
CART分类回归树是一种典型的二叉决策树,可以做分类和回归,如果待预测结果是离散数据,则CART生成分类决策树,如果待预测结果是连续型数据,则CART生成回归决策树,数据对象的属性特征为离散型和连续型,并不是区别分类树与回归树的标准。作为分类决策树,待预测的样本落至某一个叶子节点,则输出该叶子节点所有样本所属类别最多的那一类(即叶子节点中的样本可能不是属于一个类别,则多数为主), 作为回归决策树,待预测样本落至某一叶子节点,则输出该叶子节点中所有样本的均值。

2、分类回归树分裂属性的选择
  选择最下的基尼系数的属性及其属性值,作为最有分裂属性以及最优分裂属性值,Gain_GINI值越小,说明二分之后的子样本的“纯净度”越高,即说明选择该属性作为分裂属性的效果越好。
GINI计算如下: G I N I ( S ) = 1 − ∑ p k 2 GINI(S) = 1 - \sum p_k^2 GINI(S)=1pk2,其在样本集S中,P表示分类结果中第k哥类别出现的概率。
对于含有N个样本的样本集S,根据属性A的第i个属性值,将数据集S划分成两部分,则划分两部分之后,Gain_GINI计算如下: G a i n G I N I A , i ( S ) = n 1 N G I N I ( s 1 ) + n 2 N G I N I ( s 2 ) Gain _ GINI_{A,i}(S) = \frac{n_1}{N}GINI(s_1) + \frac{n_2}{N}GINI(s_2) GainGINIA,i(S)=Nn1GINI(s1)+Nn2GINI(s2),其中,n1, n2 分别为样本子集S1,S2的样本个数。
对于属性A,分别计算任意属性值将数据集划分成两部分之后的Gain_GINI,选取其中的最小值,作为属性A得到的最优二分方案: min ⁡ i ∈ A ( G a i n G I N I A , J ( S ) ) \min_{i∈A}(Gain GINI_{A, J(S)}) iAmin(GainGINIA,J(S))
对于样本集S,计算所有属性的最优方案,选取其中的最小值,作为样本集的最优二分方案: min ⁡ A ∈ A t t r i b u t e ( min ⁡ i ∈ A ( G a i n G I N I A , i ( S ) ) ) \min_{A∈Attribute}(\min_{i∈A}(GainGINI_{A,i}(S))) AAttributemin(iAmin(GainGINIA,i(S)))
所得到的属性A及其第i属性值,即为样本集S的最优分类属性 以及最优分裂属性值。

3、CART分类回归树中的剪枝
  由于决策树的建立完全是依赖于训练样本,因此该决策树对训练样本能够产生完美的拟合效果。但这样的决策树对于测试样本来说过于庞大而复杂,可能产生较高的分类错误率。这种现象就称为过拟合。因此需要将复杂的决策树进行简化,即去掉一些节点解决过拟合问题,这个过程称为剪枝。
  剪枝方法分为预剪枝和后剪枝两大类。预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。后剪枝方法又分为两种,一类是把训练数据集分成树的生长集和剪枝集;另一类算法则是使用同一数据集进行决策树生长和剪枝。常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。其中,悲观错误剪枝法PEP,这里我们详细介绍CART分类回归树中应用最广泛的剪枝算法——代价复杂性剪枝法CCP(Cost Complexity Pruning)。
  代价复杂性剪枝法CCP(Cost Complexity Pruning)主要包含两个步骤:(1)从原始决策树T0开始生成一个子树序列{T0,T1,…,Tn},其中,Ti+1从Ti产生,Tn为根节点。(2)从第1步产生的子树序列中,根据树的真实误差估计选择最佳决策树。
  CCP剪枝法步骤(1)
  生成子树序列{T0,T1,…,Tn}的基本思想是从T0开始,裁剪Ti中关于训练数据集误差增加最小的分枝来得到Ti+1。实际上,当1棵树T在节点t处剪枝时,它的误差增加直观上认为是R(t)−R(Tt),其中,R(t)为在节点t的子树被裁剪后节点t的误差,R(Tt)为在节点t的子树没被裁剪时子树Tt的误差。然而,剪枝后,T的叶子数减少了L(Tt)−1,其中, L(Tt)为子树Tt的叶子数,也就是说,T的复杂性减少了。因此,考虑树的复杂性因素,树分枝被裁剪后误差增加率由下式决定:
  img
  
  其中,R(t)表示节点t的子树被裁剪后节点t的误差,R(t)=r(t)∗p(t),r(t)是节点t的误差率,p(t)是节点t上的样本个数与训练集中样本个数的比例。R(Tt)表示节点t的子树没被裁剪时子树Tt的误差,即子树Tt上所有叶子节点的误差之和。
  Ti+1就是选择Ti中具有最小α值所对应的剪枝树。
  例如:图1中ti表示决策树中第i个节点,A、B表示训练集中的两个类别,A、B之后的数据表示落入该节点分别属于A类、B类的样本个数。
  img
  图1,决策树中训练样本总个数为80。对于节点t4,其中,A类样本46个,B类样本4个,根据大多数原则,则节点t4中样本为A类,故节点t4的子树(t8、t9)被裁剪之后t4的误差为:450∗5080=480。节点t4的子树(t8、t9)被裁剪之前t4的误差为:145∗4580+25∗580=380。故α(t4)=480−3802−1=0.0125。类似过程,依次得到所有节点的误差增加率,如表2:
  img从表2可以看出,在原始树T0行,4个非叶节点中t4的α值最小,因此,裁剪T0的t4节点的分枝得到T1;在T1行,虽然t2和t3的α值相同,但裁剪t2的分枝可以得到更小的决策树,因此,T2是裁剪T1中的t2分枝得到的。
  CCP剪枝法步骤(2)
  如何根据第1步产生的子树序列{T0,T1,…,Tn},选择出1棵最佳决策树是CCP剪枝法步骤(2)的关键。通常采用的方法有两种,一种是V番交叉验证(V-fold cross-validation),另一种是基于独立剪枝数据集。
  
4、梯度提升树

回归树(Regression Decision Tree)总体流程类似于分类树,区别在于,回归树的每一个节点都会得到一个预测值,以年龄为例,该预测值等于属于这个节点的所有的人年龄的平均值,分支时穷举每一个feature的每个阈值或找到最好的分割点,但衡量最好的标准不再时最大熵,而是最小平方误差,也就时被预测出错的人越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分支依据,分支直到每个叶子节点上的人的年龄都唯一或者达到预设的终止条件,若最终叶子己点上的人的年龄不唯一,则以该节点上所有人的平均年龄作为该叶子节点的预测年龄。 提升树(Boosting Decision Tree) 是迭代多课回归树来共同决策,当采用平方误差损失函数时, 每一棵回归树学习的是之前左右的树的结论和残差,拟合得到一个当前的残差回归树,残差的意义是:残差 = 真实值 - 预测值,提升树即使整个迭代过程生成的回归树的累加。
imgimg

梯度提升树Gradient Boosting Decision Tree,提升树利用加法模型和前向分布算法实现学习的优化过程,当损失函数时平方损失和指数损失函数时,每一步的优化很简单,如平方损失函数学习残差回归树。
  但是对于一般的损失函数,往往每一步的优化都i没那么容易,如上图中的绝对值损失函数,和Huber损失函数,针对这一问题Freidman提出了梯度提升算法,利用最速下降的近似方法,即利用损失函数的负梯度再当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。
  算法步骤解释:
  1、初始化,估计使损失函数极小化的常数值,他是只有一个根节点的树,即ganma是一个常数
  2、计算损失函数的负梯度再当前模型的值,将它作为残差的估计
  3、估计回归树叶节点区域,以拟合残差的近似值
  4、利用线性搜索估计叶节点区域的值,是损失函数最小
  5、更新回归树
  6、得到最终的模型
  
5、重要参数的意义和设置

【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?  用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
【答】
  这是一个非常好的问题,题主对各算法的学习非常细致透彻,问的问题也关系到这两个算法的本质。这个问题其实并不是一个很简单的问题,我尝试用我浅薄的机器学习知识对这个问题进行回答。
  一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
  随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
  Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
  其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X2)-[E(X)]2)**。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。**这个有点儿绕,不过你一定知道过拟合。
  当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以模型过于复杂的时候会导致过拟合。
  当模型越简单时,即使我们再换一组数据,最后得出的学习器和之前的学习器的差别就不那么大,模型的方差很小。还是因为模型简单,所以偏差会很大。
  img
  
  也就是说,当我们训练一个模型时,偏差和方差都得照顾到,漏掉一个都不行。
  对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
  对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。


望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值