这周主要学习了决策树的几种划分选择、剪枝处理、连续值及缺失值的处理以及多变量决策树。
一般地,一棵决策树包含一个根节点、若干个内部节点和若干个叶节点;叶节点对应于决策结果,其他每个节点则对应于一个属性测试;每个节点包含的样本集合根据属性测试的结果被划分到子节点中;根节点包含样本全集。
从根节点到每个叶节点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单而直观的“分而治之”策略。
决策树学习的关键在于如何选择最优划分属性。
一般而言,随着划分过程的不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度“越来越高。
划分选择
ID3 信息增益
“信息熵” 是度量样本集合纯度最常用的一种指标。假设当前样本集合中第
类样本所占比例为
,则
的信息熵定义为
的值越小,则
的纯度越高。
假设离散属性 有
个可能的取值{
},若使用
来对样本集
进行划分,则会产生
个分支结点,其中第
个分支结点包含了
中所有在属性
上取值为
的样本,即为
。我们可根据信息熵公式计算出
的信息熵,在考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重
,即样本数越多的分支结点的影响越大,于是可计算出用属性
对样本集
进行划分所获得的“信息增益(information gain)”
一般而言,信息增益越大,则意味着使用属性 来进行划分所获得的“纯度提升” 越大。因此,我们可使用信息增益来进行决策树的划分属性选择。ID3决策树学习算法就是以信息增益为准则来选择划分属性的。
ID3算法改进的地方:
1.ID3没有考虑连续特征,比如长度、密度都是连续值,无法运用ID3,这大大限制了ID3的用途
2.ID3采用信息增益大的特征优先建立决策树的节点。但在相同条件下,取值较多的特征比取值少的特征信息增益大。
3.ID3算法对于缺失值的情况没有做考虑
4.没有考虑过拟合问题
增益率 C4.5
信息增益偏向于取值较多的属性,容易过拟合,基于信息增益的缺点,C4.5算法不直接使用信息增益,而是使用一种增益率的方法来选择最优属性进行划分,对于样本集中的离散属性
,增益率为:
其中
增益率准则就可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
C4.5虽然改进或改善了ID3算法的几个主要问题,仍然有优化的空间:
1.由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。C4.5的剪枝方法有优化的空间。思路主要有两种:一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
2.C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中,二叉树模型会比多叉树运算效率高。
3.C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
4.C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化,可以减少运算强度但又不牺牲太多的准确性的话,就更好了。
基尼指数 CART算法
CART决策树使用“基尼指数”来选择划分属性。数据集 的纯度可用基尼值来度量:
由于度量数据集的纯度,Gini(D)反映了从数据集中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集的纯度越高。
属性 的基尼指数定义为
三种决策树算法的对比
算法 | 划分准则 | 优缺点 |
ID3 | 信息增益 | 1.没有考虑缺失值 2.在采用信息增益大的特征时,会偏向于取值较多的特征,比如编号、日期 3.没有考虑缺失值的情况 4.容易过拟合 |
C4.5 | 信息增益率 | 1.改善了ID3算法 2.C4.5剪枝空间有待优化 3.C4.5生成是多叉树,运行效率低 4.C4.5只能用于分类 5.采用熵模型,有大量对数运算,运算量大 6.对可取值较少的属性有偏好 |
CART | Gini指数 | 1.CART生成的是二叉树,计算量相对来说不是很大 2.可以处理连续和离散变量 3.能够对缺失值进行处理 4.CART本身是一种大样本的统计分析方法,在样本量较小时,模 |
剪枝处理
剪枝(purning)是决策树学习算法对付“过拟合”的主要手段。
在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练学得“太好”了,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,通过主动去掉一些分支来降低过拟合的风险。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
预剪枝 | 在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点。 | 预剪枝使得决策树的汗多分支都没有“展开”,这不仅境地了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。 但有些分支当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时降低,但在其基础上进行的后续划分却有可能导致性能显著提高。 预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。 思想直接、算法简单,效率高,适合解决大规模问题。 |
后剪枝 | 先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策泛化性能提升,则将该子树替换为叶结点。 | 一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。 但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树都要打得多。 相比于预剪枝,泛化能力强,但时间开销大 |
连续与缺失值
现实的学习任务常会遇到连续属性,如何在决策树中学习中使用连续属性。
由于连续属性的可取数值数目不再有限,因此,不能直接使用根据连续属性的可取值来对结点进行划分。因此,连续属性离散化技术可派上用场。
最简单的是采用二分法对连续属性进行处理,这正是C4.5决策树算法中采用的机制。
给定样本集 和连续属性
,假定
在
上出现了
个不同的取值,将这些值从小到大进行排序,记为{
} 。基于划分点
可将
分为子集
和
,其中
包含那些属性
上取值不大于
的样本,而
则包含那些属性
上取值大于
的样本。显然,对于相邻的属性取值
与
来说,
在区间 [
,
)中取任意值所产生的划分结果相同。因此,对于连续属性
,我们可考虑
个元素的候选划分点集合
即把区间 [ ,
)的中位点
作为候选划分点。然后,我们就可以像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分。
缺失值的处理
(1)如何在属性值缺失的情况下进行划分属性的选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
给定训练集 和属性
,令
表示
中在属性
上没有缺失值的样本子集。对于问题(1),显然我们仅可根据
来判断属性
的优劣。假定属性
有
个可取值{
},令
表示
在属性
上取值为
的样本子集,
表示
中属于第
类
的样本子集,则显然有
,
。假定我们为每个样本
赋予一个权重
,并定义
直观地看,对属性表示无缺失值样本所占的比例,
表示无缺失值样本中第
类所占的比例,
则表示无缺失值样本中在属性
上取值为
的样本所占的比例。显然,
基于上述定义,可将信息增益推广为
其中,
对于问题(2),
若样本在划分属性
上的取值已知,则将
划入与其取值对应的子结点,则样本权值在子结点中保持为
。
若样本在划分属性
上的取值未知,则将
划入所有子结点,且样本权值在与属性值
对应的子结点中调整为
;
直观地看,就是让同一样本以不同的概率划分到不同的子结点中去。
缺失值的处理流程:
1. 在样本某些属性缺失的情况下选择划分的属性,
对于某一个有缺失属性的属性a。C4.5的思路是将数据分成两个部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有属性值A 的数据 ,另一部分是没有属性a数据D2。然后对于没有缺失值a的数据集
来和对应的a 属性的各个属性值一起计算加权重后的信息增益比,最后乘以一个系数,这个系数是无属
性a 缺失的样本加权后所占加权总样本的比例。
2. 选定了划分属性,对于在该属性上的缺失属性的样本的处理。
可以将缺失属性的样本同时划分入所有的子节点,不过该样本的权重按各个子节点样本的数量比例来分配。比如缺失属性a 的样本之前的权重为1,属性a 有3个属性值 A1,A2,A3。3个属性值对应的无缺失a属性的样本个数为2,3,4。则缺失属性a 的样本同时划分入A1,A2,A3。对应的权重调节为2/9,3/9,4/9。
多变量决策树
若我们将每个属性视为坐标空间中的一个坐标轴,则 个属性描述的样本就对应了
维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。
决策树若形成的分类边界有个明显的特点:轴平行,即它的分类边界由若干个与坐标轴平行的分段组成。
以表4.5的西瓜数据3.0为例,将它作为训练集可学得图4.10所示的决策树,这棵树所对应的分类边界如图4.11所示。
若能使用分类斜的划分边界,如图4.12中红色线段所示,则决策树模型将大为简化。“多变量决策模型”将能实现这样的“斜划分” 甚至更复杂划分的决策树。
以实现斜划分的多变量决策树为例,在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶结点是一个形如的线性分类器,其中
是属性
的权重,
和
可在该结点所含的样本集合属性集上学得。
与传统的“单变量决策树” 不同,在多变量决策树的学习过程中,不是为每个非叶节点寻找一个最优的划分属性,而是试图建立一个合适的线性分类器。如对西瓜数据3.0 ,我们可学得图4.13这样的多变量决策树,其分类边界如图4.14所示。
sklearn库中的决策树
classsklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
参数详解:
1.criterion
为将表格数据转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。
不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。
Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
1)输入”entropy“,使用信息熵(Entropy)
2)输入”gini“,使用基尼系数(Gini Impurity)
若t代表给定的节点,i代表标签的任意分类,p(i|t)代表标签分类i在节点t上所占的比例。注意,当使用信息熵时,sklearn实际计算的是基于信息熵的信息增益(Information Gain),即父节点的信息熵和子节点的信息熵之差。
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。当然,这不是绝对的。
2. random_state & splitter
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。
3剪枝参数
为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。sklearn为我们提供了不同的剪枝策略:
3.1 max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉
这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度。
3.2 min_samples_leaf
min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从=5开始使用。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,过拟合的叶子节点出现。对于类别不多的分类问题,=1通常就是最佳选择。
3.3 min_samples_split
min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
3.4 max_features
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
3.5 min_impurity_decrease
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本种更新的功能,在0.19版本之前时使用min_impurity_split。
4 目标权重参数
4.1 class_weight
完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是 是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重。
4.2 min_weight_fraction_leaf
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_ weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_ fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
5 重要属性和接口
属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。
sklearn中许多算法的接口都是相似的,比如说我们之前已经用到的fit和score,几乎对每个算法都可以使用。除了这两个接口之外,决策树最常用的接口还有apply和predict。apply中输入测试集返回每个测试样本所在的叶子节点的索引,predict输入测试集返回每个测试样本的标签。返回的内容一目了然并且非常容易,大家感兴趣可以自己下去试试看。
总结:
七个参数:Criterion,两个随机性相关的参数(random_state,splitter),四个剪枝参数(max_depth, ,min_sample_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict
参考: https://www.cnblogs.com/juanjiang/p/11003369.html