决策树与随机森林初探

1、特征选择的几种方式

2、几种常见的决策树算法

3、过拟合处理——剪枝

4、连续值属性特征的处理

5、Bagging(代表:随机深林)

6、Boosting(提升)(代表:AdaBoost、GBDT、XGBoost)

7、决策树算法小结

决策树的优势力与劣势

1、特征选择的几种方式

决策树的最关键的问题,如何选择划分属性的顺序才能使得决策树的平均性能最好

举例:


这堆西瓜的熵是Ent(D),按照某种属性划分之后这堆西瓜的熵是Ent(D′),Ent(D′) <= Ent(D。这两者的差,就是这个属性对于这堆西瓜有序化的贡献。

1)信息熵(Entropy)


熵(Entropy:在物理学上表示物质的混乱程度,在信息学上可以作类比。熵增加,表示信息更加混乱,熵减,表示信息更加有序。

2)信息增益

计算出当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益。
先计算根节点的信息熵:



可见:属性纹理的信息增益最大,于是它被选为划分属性,给出基于纹理对根节点进行划分的结果:

然后,决策树学习算法将对每个分支节点做进一步划分。以上图第一个分支节点(纹理=清晰)为例,该节点包含的样例集合D1中有编号为{1,2,3,4,5,6,8,10,15}的9各样例,可用属性集合为{色泽,根蒂,敲声,脐部,触感},少了一个纹理属性。

3)信息增益率

4)自有信息


根据上表数据计算自信息(属性a的可能值数目越多(即V越大),则IV(a)的值通常会越大):

5)基尼系数


直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高,这和信息增益(比)是相反的。于是,对于属性集合A中,选择那个使得划分后基尼系数最小的属性作为最优划分属性。
例如:

基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。

2、几种常见的决策树算法

ID3,C4.5主要应用于分类任务,CART树,主要应用于预测任务

更多的应用场景:

ID3

奥卡姆剃刀定律:当你有两个处于竞争地位的理论能得出同样的结论,那么简单的那个更好。
ID3算法的核心思想就是以【信息增益】来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策空间。

ID3的缺点:
1. 永远可以把N个数据分成100%纯洁的N组
2. 如果在『 期』这个条件下做分裂,就GG

C4.5

C4.5是在ID3的基础上改进而提出的。ID3采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的Feature,因为属性值多的Feature会有相对较大的信息增益?(信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大).为了避免这个不足C4.5中是用【信息增益比率(gain ratio)】来作为选择分支的准则。信息增益比率通过引入一个【自信息】的项来惩罚取值较多的Feature。除此之外,C4.5还弥补了ID3中不能处理特征属性值连续的问题。但是,对连续属性值需要扫描排序,会使C4.5性能下降,

C4.5并不一个算法,而是一组算法—C4.5,非剪枝C4.5和C4.5规则。
优点:C4.5算法产生的分类规则易于理解,准确率较高。
缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

CART

(Classification and Regression tree)分类回归树

ID3中根据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用【基尼指数(Gini)】来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数,回归时使用均方差作为loss function。

1)、CART分类树建立算法的具体流程

下面我们看看CART分类树建立算法的具体流程:

    算法输入是训练集D,基尼系数的阈值,样本个数阈值。

    输出是决策树T。

    我们的算法从根节点开始,用训练集递归的建立CART树。

    1) 对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。

    2) 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。

    3) 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。

    4) 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.

    5) 对左右的子节点递归的调用1-4步,生成决策树。

    对于生成的决策树做预测的时候,假如测试集里的样本A落到了某个叶子节点,而节点里有多个训练样本。则对于A的类别预测采用的是这个叶子节点里概率最大的类别。

2)、CART回归树建立算法的具体流程

CART回归树和CART分类树的建立算法大部分是类似的,所以这里我们只讨论CART回归树和CART分类树的建立算法不同的地方。

    首先,我们要明白,什么是回归树,什么是分类树。两者的区别在于样本输出,如果样本输出是离散值,那么这是一颗分类树。如果果样本输出是连续值,那么那么这是一颗回归树。

    除了概念的不同,CART回归树和CART分类树的建立和预测的区别主要有下面两点:

    1)连续值的处理方法不同
    对于连续值的处理,我们知道CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。这比较适合分类模型,但是对于回归模型,我们使用了常见的和方差的度量方式,这很好理解,被预测出错的越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。
    CART回归树的度量目标是,对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。表达式为:

    2)决策树建立后做预测的方式不同。
    对于决策树建立后做预测的方式,上面讲到了CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果

3、过拟合处理——剪枝

完整的决策树并不是一棵分类预测新数据对象的最佳树。其原因是完整的决策树对Training Data描述过于“精确”。我们知道,随着决策树的生长,决策树分枝时所处理的样本数量在不断减少,决策树对数据总体代表程度在不断下降。在对根节点进行分枝时,处理的是全部样本,再往下分枝,则是处理的不同分组下的样本。可见随着决策树的生长和样本数量的不断减少,越深层处的节点所体现的数据特征就越个性化,可能出现如上推理规则:“年收入大于50000元且年龄大于50岁且姓名叫张三的人购买了此产品”。这种过度学习从而精确反映Training Data特征,失去一般代表性而无法应用于新数据分类预测的现象,叫过度拟合(Overfitting)或过度学习。那我们应该怎么办呢?修剪!

常用的修剪技术有预修剪(Pre-Pruning)和后修剪(Post-Pruning)。

预剪枝(pre-pruning):

1、预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。

总结: 对比未剪枝的决策树和经过预剪枝的决策树可以看出:预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但是,另一方面,因为预剪枝是基于“贪心”的,所以,虽然当前划分不能提升泛华性能,但是基于该划分的后续划分却有可能导致性能提升,因此预剪枝决策树有可能带来欠拟合的风险。

2、事先先指定决策树的最大深度,或最小样本量,以防止决策树过度生长。前提是用户对变量聚会有较为清晰的把握,且要反复尝试调整,否则无法给出一个合理值。注意,决策树生长过深无法预测新数据,生长过浅亦无法预测新数据。

后剪枝(post-pruning):

后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点。

对比预剪枝和后剪枝,能够发现,后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险小,泛华性能往往也要优于预剪枝决策树。但后剪枝过程是在构建完全决策树之后进行的,并且要自底向上的对树中的所有非叶结点进行逐一考察,因此其训练时间开销要比未剪枝决策树和预剪枝决策树都大得多。

决策树中的C4.5、C5.0、CHAID、CART和QUEST都使用了不同 剪枝策略。

4、连续值属性特征的处理


对于数据集中的属性“密度”,决策树开始学习时,根节点包含的17个训练样本在该属性上取值均不同。我们先把“密度”这些值从小到大排序:

然后计算可能的属性分割点:

下面开始计算t 取不同值时的信息增益:

计算得到的各属性的信息增益值:

比较能够知道纹理的信息增益值最大,因此,“纹理”被选作根节点划分属性,下面只要重复上述过程递归的进行,就能构造出一颗决策树:

有一点需要注意的是:与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。

5、Bagging(代表:随机深林)

bagging方法bootstrap aggregating(自助聚集)的缩写,采用的是随机有放回的选择训练数据然后构造分类器,最后组合。

随机深林

整个随机森林算法的过程中,有两个随机过程:

第一个: 【输入数据】是随机的从整体的训练数据中选取一部分作为一棵决策树的构建,而且是有放回的选取;
第二个: 每棵决策树的构建所需的【特征】是从整体的特征集随机的选取的;

这两个随机过程使得随机森林很大程度上避免了过拟合现象的出现。

过程:

1、从训练数据中选取n个数据作为训练数据输入,一般情况下n是远小于整体的训练数据N的,这样就会造成有一部分数据是无法被去到的,这部分数据称为袋外数据,可以使用袋外数据做误差估计。

2、选取了输入的训练数据的之后,需要构建决策树,具体方法是每一个分裂结点从整体的特征集M中选取m个特征构建,一般情况下m远小于M。

3、在构造每棵决策树的过程中,按照选取最小的基尼指数进行分裂节点的选取进行决策树的构建。决策树的其他结点都采取相同的分裂规则进行构建,直到该节点的所有训练样例都属于同一类或者达到树的最大深度。

4、 重复第2步和第3步多次,每一次输入数据对应一颗决策树,这样就得到了随机森林,可以用来对预测数据进行决策。

5、 输入的训练数据选择好了,多棵决策树也构建好了,对待预测数据进行预测,比如说输入一个待预测数据,然后多棵决策树同时进行决策,最后采用多数投票的方式进行类别的决策。

随机森林算法的注意点:

1、 在构建决策树的过程中是不需要剪枝的。
2、 整个森林的树的数量和每棵树的特征需要人为进行设定。
3、 构建决策树的时候分裂节点的选择是依据最小基尼系数的。

随机森林有很多的优点:

a. 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合。

b. 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力。

c. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。

d. 在创建随机森林的时候,对generlization error使用的是无偏估计。

e. 训练速度快,可以得到变量重要性排序。

f. 在训练过程中,能够检测到feature间的互相影响。

g 容易做成并行化方法。

h. 实现比较简单。

6、Boosting(提升)(代表:AdaBoost、GBDT、XGBoost)

Bagging只是将分类器进行简单的组合,实际上,并没有发挥出分类器组合的威力来。

Boosting是一种提高任意给定学习算法准确度的方法。
Boosting的提出与发展离不开Valiant和 Kearns两位大牛的不懈努力,下面是他们的“奋斗史”:
Boosting的思想起源于 Valiant提出的 PAC ( Probably Approximately Correct)(可能近视正确)学习模型。Valiant和 Kearns提出了弱学习和强学习的概念:
弱学习:识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法)
强学习:识别准确率很高并能在多项式时间内完成的学习算法
同时 ,Valiant和 Kearns首次提出了 PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法 ,是否可以将其提升为强学习算法 ? 如果二者等价 ,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法 ,而不必寻找很难获得的强学习算法。

1)、AdaBoost

AdaBoost通过改变样本的分布突出错分类,并进而训练弱分类器得到弱分类器的权重,最终根据权重整合在一起得到最终的强分类器。

Boosting这其实思想相当的简单,举个例子:

对一份数据集建立M个模型(比如分类),一般这种模型比较简单,称为弱分类器(weak learner)。每次分类都将上一次分错的数据权重提高一点再进行分类,这样最终得到的分类器在测试数据与训练数据上都可以得到比较好的成绩。

Boosting算法基本步骤:

1、先对N个训练样本S1的学习得到一个弱分类器M1;
2、将S1中分错的样本和其他新的数据一起构成新的N个训练样本S2,再得到一个弱分类器M2;
3、将S1和S2中都分错的样本和其他新的数据一起构成新的N个训练样本S3,再得到一个弱分类器M3;
4、最终得到一堆弱分类器,可根据弱分类器的多数投票表决。

2)、GBDT(Gradient Boosted Decision Tree)梯度提高决策树


首先gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。

GBDT训练过程:

gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。
弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)

但是其实我们真正关注的:
1.是希望损失函数能够不断的减小;
2.是希望损失函数能够尽可能快的减小。所以如何尽可能快的减小呢?
让损失函数沿着梯度方向的下降。这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。
gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。
这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。

gbdt如何选择特征?

其实就是CART选择特征的过程。

gbdt 如何构建特征 ?

gbdt 本身是不能产生特征的,但是我们可以利用gbdt去产生特征的组合。

如图所示,我们 使用 GBDT 生成了两棵树,两颗树一共有五个叶子节点。我们将样本 X 输入到两颗树当中去,样本X 落在了第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,于是我们便可以依次构建一个五纬的特征向量,每一个纬度代表了一个叶子节点,样本落在这个叶子节点上面的话那么值为1,没有落在该叶子节点的话,那么值为 0.
于是对于该样本,我们可以得到一个向量[0,1,0,1,0] 作为该样本的组合特征,和原来的特征一起输入到逻辑回归当中进行训练。实验证明这样会得到比较显著的效果提升。

gbdt 如何用于分类的 ?

gbdt 如何用于分类:查看转载

3)、XGBoost(X (Extreme) GBoosted)



https://blog.csdn.net/ice_martin/article/details/63683657

7、决策树算法小结

    终于到了最后的总结阶段了,这里我们不再纠结于ID3, C4.5和 CART,我们来看看决策树算法作为一个大类别的分类回归算法的优缺点。这部分总结于scikit-learn的英文文档。

    首先我们看看决策树算法的优点:

    1)简单直观,生成的决策树很直观。

    2)基本不需要预处理,不需要提前归一化,处理缺失值。

    3)使用决策树预测的代价是O(log2m)。 m为样本数。

    4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。

    5)可以处理多维度输出的分类问题。

    6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释

    7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。

    8) 对于异常点的容错能力好,健壮性高。

    我们再看看决策树算法的缺点:

    1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。

    2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。

    3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。

    4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。

    5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

猜你喜欢

转载自blog.csdn.net/shinecjj/article/details/81773620