决策树原理详解及sklearn代码实例

1.决策树

1.1基本流程

决策树(decsioin tree)是一种常见的机器学习方法,例如西瓜书中的二分类任务,判断瓜的好坏。决策树如下:
西瓜判断决策树
可以看到此使判断西瓜是否好坏,则通过色泽,根蒂,敲声等一些列属性来得出结果。
 一般的,一颗决策树包括一个根节点,若干个内部接待你和若干个叶结点;叶节点对应于决策结果,其他结点则对应一个属性测试;从根节点大到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是根据输入生成一个泛化能力强的决策树,基本算法如下;
决策树生成算法
决策树的生成是一个递归的过策划的过程,有3种情形或导致递归返回(即不会生成对应的决策结果叶结点)
算发的输入是所有样本的集合,而个体样本又包括此样本的类别已经所带的属性

1.当前结点包含的样本属于同一类别,无需划分
2.当前属性集为空或者所有样本在所有属性上取值相同,无法划分(属性相同,但是类别不同)
3.当前结点包含的样本集合为空,不能划分。(即没有一个类别对应此跳属性序列)

解决方法:
在(2)情形下,我们把当前结点标记为叶节点,并将其类别设定为该结点所含样本做多的类别
在(3)情形下,同样把当前结点标记为叶结点,但是将其类别设定为其父节点所含样本最多的类别

两种处理的实质区别:(2)是利用当前结点的后验分布 (3)是把父节点的样本分布作为当前结点的先验分布。
简单理解即(2)有多个类别,只是不知道如何划分为好,所以选取样本最多的类别;(3)无对应的类别,只能依据之前的类别划分来进行划分,即根据其父节点。这样处理的原因是为了提高决策树的泛化能力。

先验分布/后验分布详细讲解参见:https://blog.csdn.net/qq_23947237/article/details/78265026

1.2 划分选择

由上述算法可以看出,决策树学习的关键是第8行如何选择最后划分属性,一般而言,随着划分过程的不断进行,我们希望决策树的分支结点包含的样本尽可能属于同一类别,即结点’纯度’越来越高。这个最纯净在数学上叫纯度,纯度通俗点理解就是目标变量要分得足够开(y=1的和y=0的混到一起就会不纯)。

决策树学习:采用自顶向下的递归的方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)。

通俗讲,决策树思想,实际上就是寻找最纯净的划分,在数学上叫纯度。不纯度的选取有多种方法,每种方法也就形成了不同的决策树方法,比如ID3算法使用信息增益作为不纯度;C4.5算法使用信息增益率作为不纯度;CART算法使用基尼系数作为不纯度。

而决策树要达到寻找最纯净划分的目标要干两件事,建树和剪枝

1.3 建树(如何按次序选择属性)

也就是首先树根上以及树节点是哪个变量呢?这些变量是从最重要到次重要依次排序的,那怎么衡量这些变量的重要性呢? ID3算法用的是信息增益,C4.5算法用信息增益率;CART算法使用基尼系数。决策树方法是会把每个特征都试一遍,然后选取那个,能够使分类分的最好的特征,也就是说将A属性作为父节点,产生的纯度增益(GainA)要大于B属性作为父节点,则A作为优先选取的属性。以下摘自西瓜书种三种算法的解释:

1.3.1信息增益

信息增益
简单来讲使用信息增益构建决策树的过程如下;
1.根据输入的数据,按照公式(4.1)计算当前情况下的信息熵,
2.将信息熵代入(4.2),求出所有为确定的属性的信息增益
3.将信息增益最大的属性作为该层结点(属性确定)
4.继续对该结点下的未确定的属性计算信息增益,直到无子节点,再计算其余可划分结点,重复2.3.

1.3.2增益率
实际上,信息增益准则对可取数值数目较多的属性有所偏好,为减少这种签好可能带来的不利影响,C4.5决策树选用增益率作为划分依据。增益率定义为:
增益率公式
IV(a)称为属性a的"固有值",属性a的可能取值数目越多(V越大),则IV(a)通常会越大,增益率公式将增益信息和数目挂钩,但是可能会对数据较少的属性有所偏好,因此C4.5并不是选取最大的增益率来划分属性,而是使用一个启发式

启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

1.3.3 基尼指数
 CART决策树使用基尼指数来划分树丛,采用于(4.1)相同的符号,数据集D的纯度可用基尼值来度量:
基尼指数
与前面二者不同,基尼指数选择指数最小的属性作为最优划分属性。

三种方法对比:
ID3的缺点,倾向于选择水平数量较多的变量,可能导致训练得到一个庞大且深度浅的树;另外输入变量必须是分类变量(连续变量必须离散化);最后无法处理空值。
C4.5选择了信息增益率替代信息增益。
CART以基尼系数替代熵;最小化不纯度而不是最大化信息增益。

1.4 剪枝

剪枝
下面这六种情况都会停止分裂。其中第一种其实属于树的完全长成,但这会出现过拟合问题,所有之前很流行一种抑制这种情况的方法,叫树的剪枝。树的剪枝分为预剪枝和后剪枝,预剪枝,及早的停止树增长控制树的规模,方法可以参考如下6点停止分类的条件。后剪枝在已生成过拟合决策树上进行剪枝,删除没有意义的组,可以得到简化版的剪枝决策树,包括REP(设定一定的误分类率,减掉对误分类率上升不超过阈值的多余树)、PEP,还有一种CCP,即给分裂准则—基尼系数加上惩罚项,此时树的层数越深,基尼系数的惩罚项会越大。
剪枝
1.4.1预剪枝

&esmp;简单讲首先根据上述三种算法中的一个,来确定一个属性,然后计算预剪枝决策树划分树的划分前后精度,如果精度降低则禁止划分,但是,预剪枝使得决策树的很多分支都没有"展开",这不仅降低了过拟合的风险,还显著减少了决策树的训练时间和开销和测试时间开销。但是另一方面,有些分支的当前划分虽然不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在此基础上进行后续划分缺可能会提升,因此预剪枝可能会带来过拟合的风险。

1.4.2后剪枝

 后剪枝则是根据完整的决策树,先从最下层的结点的开始,先将其作为叶结点,然后根据属兔数据计算改变前后的精度,如果精度变高则删除此结点。西瓜书中借用西瓜来做实例讲解如下;
训练集和验证集
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

预剪枝和后剪枝的比较;

后剪枝可以保留更多的分支,一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能优于预剪枝决策树。
但是后剪枝是在完成决策树之后进行的,自底向上,代价大于预剪枝。

1.5决策树的输入数据

1.5.1离散型属性
 对于离散型属性,可以通过上述的信息增益,增益率,基尼指数来生成对应的初步决策树
1.5.2连续性属性
 对于连续属性,属性数目不在有限(即一个属性可以分为无限多个属性),此时要对数据进行离散化,最简单的就是采用二分法进行处理,这也是C4.5决策树中采用的机制。我们基于离散数据的信息增益推到出连续性对用的公式如下;
二分化离散
通过计算出让连续型属性信息增益的最大化划分点,然后再与其他属性的信息增益进行比较进行建树。

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

1.5.3空值属性
 面对缺失值我们要考虑:(1)如何在属性缺失的情况下进行划分属性选择? (2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
简单来讲,1是指建树时如何对缺失属性值的属性求其增益属性,2指在构建好决策树后,若验证样本中某属性指缺失,输入决策树后,如何对其进行处理判断。
对于(1)情况,对离散型数据信息增益进行变形得到如下的新表达式:
具体推导过程见周志华的<<机器学习>>第四章。
缺失值情况下的信息增益公式
该公式将训练集中该属性的缺失情况和为缺失样本中具体属性值所占比例作为影响因素加入到公式中,解决了问题(1).

在这里插入图片描述

2.总结:

决策树的一些优点:
1.分类规则清晰,易于理解和解释,树可以可视化。
2.使用树的花费(例如预测数据)是训练数据点(data points)数量的对数。
3.可以处理不同纲量的值,例如同时处理数值变量和分类变量,其他方法大都只适用分析一种变量的集合。
4.几乎不需要数据预处理。其他方法经常需要数据标准化,创建虚拟变量和删除缺失值。
5.可以使用统计检验检验模型。这样做被认为是提高模型的可行度。
6.决策树不需要做变量筛选,它会自动筛选;适合处理高维度数据。
7.可以处理多输出问题。

决策树的一些缺点:
1.决策树可能是不稳定的,因为即使非常小的变异,可能会产生一颗完全不同的树。这个问题通过decision trees with an ensemble来缓解。
2.贪婪算法(可能找不到最好的树)
3.如果某些分类占优势,决策树将会创建一棵有偏差的树。因此,建议在训练之前,先抽样使样本均衡。
4.没有考虑变量之间相关性,每次筛选都只考虑一个变量(因此不需要归一化)
5.只能线性分割数据。

ID3是基本的决策树构建算法,作为决策树经典的构建算法,其具有结构简单、清晰易懂的特点。虽然ID3比较灵活方便,但是有以下几个缺点:

(1)采用信息增益进行分裂,分裂的精确度可能没有采用信息增益率进行分裂高

(2)不能处理连续型数据,只能通过离散化将连续性数据转化为离散型数据

(3)不能处理缺省值

(4)没有对决策树进行剪枝处理,很可能会出现过拟合的问题

C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:

  1. 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;

  2. 在树构造过程中进行剪枝;

  3. 能够完成对连续属性的离散化处理;

  4. 能够对不完整数据进行处理。

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

另外,无论是ID3还是C4.5最好在小数据集上使用,决策树分类一般只试用于小数据。当属性取值很多时最好选择C4.5算法,ID3得出的效果会非常差。

3.sklearn代码实现

3.1 二分类和多分类

 在sklearn中的DecisionTreeClassifier 能对数据进行多分类和二分类任务。和其他分类器一样,DecisionTreeClassifier 有两个向量输入:X,稀疏或密集,大小为[n_sample,n_fearure],存放训练样本; Y,值为整型,大小为[n_sample],存放训练样本的分类标签:实例代码如下:
分类实例
3.2 回归问题

决策树也可用来解决回归问题,使用 DecisionTreeRegressor 类。

和分类一样,拟合方法也需要两个向量参数,X 和 y,不同的是这里y是浮点型数据,而不是整型:

>>> from sklearn import tree
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = tree.DecisionTreeRegressor()
>>> clf = clf.fit(X, y)
>>> clf.predict([[1, 1]])
array([ 0.5])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章