决策树
2021-9-30
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

原理

决策树理解

假如现在有一个母亲给女儿找相亲对象的这么一段对话:
女儿:多大年纪了?
母亲:26。
女儿:长的帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。
那么转换成图便是这样:
notion image
以上这个就是决策树的原理。通过不断的划分条件来进行分类。其中决策树最关键的,是找出那些对结果影响最大的条件,放到前面。比如以上如果年龄是女儿最看重的,那么就应该把年龄放到最前面,这样可以节省查找的次数
 

决策树ID3算法的信息论基础

作为一个码农经常会不停的敲if, else if, else,其实就已经在用到决策树的思想了。只是有这么多条件,用哪个条件特征先做if,哪个条件特征后做if比较优呢?怎么准确的定量选择这个标准就是决策树机器学习算法的关键了。1970年代,一个叫昆兰的大牛找到了用信息论中的熵来度量决策树的决策选择过程,方法一出,它的简洁和高效就引起了轰动,昆兰把这个算法叫做ID3。
首先需要熟悉信息论中熵的概念。熵度量了事物的不确定性,越不确定的事物,它的熵就越大。具体的,随机变量的熵的表达式如下:
其中代表种不同的离散取值。而代表了取值为的概率, 为以2或者e为底的对数。
举个例子,比如 有2个可能的取值,而这两个取值各为1/2时X的熵最大,此时具有最大的不确定性,值为 。如果一个值概率大于1/2,另一个值概率小于1/2,则不确定性减少,对应的熵也会减少。比如一个概率1/3,一个概率2/3,则对应熵为
 
推广到多个个变量的联合熵,这里给出两个变量的联合熵表达式:
有了联合熵,可以得到条件熵的表达式,条件熵类似于条件概率,度量了在知道以后剩下的不确定性,表达式如下:
 
度量了的不确定性,条件熵度量了在知道以后剩下的不确定性,那么呢?从上面的描述可以看出,它度量了在知道以后不确定性减少程度,这个度量在信息论中称为互信息,记为。在决策树ID3算法中叫做信息增益。ID3算法就是用信息增益来判断当前节点应该用什么特征来构建决策树。信息增益大,则越适合用来分类。
用下面这个图很容易明白他们的关系,左边的椭圆代表,右边的椭圆代表,中间重合的部分就是互信息或者信息增益 ,左边的椭圆去掉重合部分就是,右边的椭圆去掉重合部分就是 ,两个椭圆的并就是
notion image
 

决策树ID3算法的思路

ID3算法就是用信息增益大小来判断当前节点应该用什么特征来构建决策树,用计算出的信息增益最大的特征来建立决策树的当前节点。

例子

有15个样本D,输出为0或者1。其中有9个输出为1, 6个输出为0。 样本中有个特征A,取值为A1,A2和A3。在取值为A1的样本的输出中,有3个输出为1, 2个输出为0;取值为A2的样本输出中,2个输出为1,3个输出为0; 在取值为A3的样本中,4个输出为1,1个输出为0。
样本D的熵为:
样本D在特征下的条件熵为:
对应的信息增益为:
 
贷款案例信息增益:
notion image
以上数据集中,有年龄是否有工作是否有房子信贷情况4个特征来判断是否应该给这个用户贷款,当时放到决策树中,我们应该要把哪个特性放到前面,哪个特性放到后面,就应该通过计算信息增益来决定。
 
 
具体算法过程:
输入的是个样本,样本输出集合为,每个样本有个离散特征,特征集合即为,输出为决策树
 
算法的过程为:
  1. 初始化信息增益的阈值
  1. 判断样本是否为同一类输出,如果是则返回单节点树,标记类别为
  1. 判断特征是否为空,如果是则返回单节点树,标记类别为样本中输出类别实例数最多的类别
  1. 计算中的各个特征(一共个)对输出的信息增益,选择信息增益最大的特征
  1. 如果的信息增益小于阈值,则返回单节点树,标记类别为样本中输出类别实例数最多的类别
  1. 否则,按特征的不同取值将对应的样本输出分成不同的类别,每个类别产生一个子节点,对应特征值为,返回增加了节点的数
  1. 对于所有的子节点,令递归调用2-6步,得到子树并返回
 

决策树ID3算法的不足

ID3算法虽然提出了新思路,但是还是有很多值得改进的地方。
  • ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用,大大限制了ID3的用途
  • ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?
  • ID3算法对于缺失值的情况没有做考虑
  • 没有考虑过拟合的问题
ID3算法的作者昆兰基于上述不足,对ID3算法做了改进,这就是C4.5算法
 

决策树C4.5算法的改进

ID3算法有四个主要的不足,一是不能处理连续特征,第二个就是用信息增益作为标准容易偏向于取值较多的特征,最后两个是缺失值处理的问和过拟合问题。昆兰在C4.5算法中改进了上述4个问题。
 
对于不能处理连续特征, C4.5的思路是将连续的特征离散化。
比如个样本的连续特征个,从小到大排列为,则 C4.5取相邻两样本值的平均数,一共取得个划分点,其中第个划分点 表示为: 。对于这个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为,则小于的值为类别1,大于的值为类别2,这样就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
 
对于第二个问题,信息增益作为标准容易偏向于取值较多的特征的问题。引入一个信息增益比的变量,它是信息增益和特征熵的比值。表达式如下:
其中为样本特征输出的集合, 为样本特征,对于特征熵,表达式如下:
为特征的类别数, 为特征的第个取值对应的样本个数, 为样本个数。
从上述公式可以看到,如果某特征分类特别多,那么会导致信息熵会非常大,从而信息增益也会变得比较大,因此最后得出的信息增益率会变小,这样就进行了有效抑制,以校正信息增益容易偏向于取值较多的特征的问题。
 
对于缺失值处理的问题,主要需要解决的是两个问题,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理。
对于第一个子问题,对于某一个有缺失特征值的特征,C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2。然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例。
对于第二个子问题,可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4,则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。
 
对于第4个问题,C4.5引入了正则化系数进行初步的剪枝。
 

决策树C4.5算法的不足与思考

C4.5虽然改进或者改善了ID3算法的几个主要的问题,仍然有优化的空间。
  • 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
  • C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
  • C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
  • C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
这4个问题在CART树里面部分加以了改进。所以目前如果不考虑集成学习话,在普通的决策树算法里,CART算法算是比较优的算法了。scikit-learn的决策树使用的也是CART算法。
 
 

CART分类树算法的最优特征选择方法

ID3算法使用了信息增益来选择特征,信息增益大的优先选择。C4.5算法采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
具体的,在分类问题中,假设有个类别,第个类别的概率为, 则基尼系数的表达式为:
如果是二类分类问题,计算就更加简单了,如果属于第一个样本输出的概率是,则基尼系数的表达式为:
对于个给定的样本,假设有个类别,第个类别的数量为,则样本的基尼系数表达式为:
特别的,对于样本,如果根据特征的某个值a,把D分成D1和D2两部分,则在特征的条件下, 的基尼系数表达式为:
可以比较下基尼系数表达式和熵模型的表达式,二次运算是不是比对数简单很多?尤其是二类分类的计算,更加简单。但是简单归简单,和熵模型的度量方式比,基尼系数对应的误差有多大呢?对于二类分类,基尼系数和熵之半的曲线如下:
notion image
从上图可以看出,基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代(本质就是有近似方法来提升计算速度,但是又不至于损失太多精确度)。而CART分类树算法就是使用的基尼系数来选择决策树的特征。同时,为了进一步简化,CART分类树算法每次仅仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。这样一可以进一步简化基尼系数的计算,二可以建立一个更加优雅的二叉树模型。
 

CART分类树算法对于连续特征和离散特征处理的改进

对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。
具体的思路如下,比如个样本的连续特征个,从小到大排列为,则CART算法取相邻两样本值的平均数,一共取得 个划分点,其中第个划分点表示为: 。对于这个点,分别计算以该点作为二元分类点时的基尼系数。选择基尼系数最小的点作为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为 ,则小于的值为类别1,大于的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与ID3或者C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。
回忆下ID3或者C4.5,如果某个特征被选取建立决策树节点,如果它有A1,A2,A3三种类别,我们会在决策树上一下建立一个三叉的节点。这样导致决策树是多叉树。但是CART分类树使用的方法不同,他采用的是不停的二分,还是这个例子,CART分类树会考虑把A分成 , , 三种情况,找到基尼系数最小的组合,比如 ,然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是对应的节点。同时,由于这次没有把特征的取值完全分开,后面我们还有机会在子节点继续选择到特征来划分 。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。
 

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

算法输入是训练集,基尼系数的阈值,样本个数阈值
输出是决策树
算法从根节点开始,用训练集递归的建立CART树:
  1. 对于当前节点的数据集为 ,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
  1. 计算样本集 的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
  1. 计算当前节点现有的各个特征的各个特征值对数据集的基尼系数,对于离散值和连续值的处理方法和基尼系数的计算见前面。缺失值的处理方法和上篇的C4.5算法里描述的相同。
  1. 在计算出来的各个特征的各个特征值对数据集 的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分 ,同时建立当前节点的左右节点,左节点的数据集,右节点的数据集
  1. 对左右的子节点递归的调用1-4步,生成决策树。
对于生成的决策树做预测的时候,假如测试集里的样本落到了某个叶子节点,而节点里有多个训练样本。则对于的类别预测采用的是这个叶子节点里概率最大的类别
 

CART回归树建立算法

CART回归树和CART分类树的建立算法大部分是类似的,这里只讨论CART回归树和CART分类树的建立算法不同的地方。
两者的区别在于样本输出,如果样本输出是离散值,那么这是一颗分类树。如果果样本输出是连续值,那么那么这是一颗回归树。
除了概念的不同,CART回归树和CART分类树的建立和预测的区别主要有下面两点:
  • 连续值的处理方法不同
  • 决策树建立后做预测的方式不同
 
对于连续值的处理,CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。这比较适合分类模型,但是对于回归模型,使用了常见的和方差的度量方式,CART回归树的度量目标是,对于任意划分特征,对应的任意划分点两边划分成的数据集,求出使 各自集合的均方差最小,同时的均方差之和最小所对应的特征和特征值划分点。表达式为:
数据集的样本输出均值, 数据集的样本输出均值
对于决策树建立后做预测的方式,上面讲到了CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。
除了上面提到了以外,CART回归树和CART分类树的建立算法和预测没有什么区别
 

预剪枝和后剪枝

notion image
预剪枝就是在决策树的建立过程中不断的调节,可以调节的条件有:
  1. 数的深度:如果在决策树建立过程中,发现深度超过指定的值,那么就不再分了。
  1. 叶子节点个数:同上。
  1. 叶子节点样本数:如果某个叶子节点的个数已经低于指定的值,那么就不会再分了。
  1. 信息增益量/Gini系数:计算信息增益量或者Gini系数,如果小于指定的值,那么也不会再分了。
以上的参数,都需要在建模的过程中,不断的调节,来达到最优。
预剪枝可以有效的降低过拟合现象,并且因为是在决策树建立的过程中进行调节,因此显著的减少了训练时间开销和测试时间的开销。另外因为预剪枝是通过限制一些建树的条件来实现的,这种方式容易导致(欠拟合:模型训练得不够好)的现象。
 
后剪枝就是在决策树建立完成后再进行的,根据以下公式:
C = gini*samples + α*叶子节点个数
C表示损失,C越大,表示损失越多,我们要选择损失小的。其中的α我们是可以调节的,如果α越大,那么叶子结点个数越多的,损失越大。因此α值越大,那么偏向叶子节点少的。α越小,那么偏向叶子节点多的。
后剪枝通常比预剪枝保留更多的分支,因此欠拟合风险比预剪枝要小,但是因为后剪枝是在树建立完成后再自底向上对所有非叶子节点进行逐一考察,因此训练时间开销比预剪枝要大得多。
 

CART树算法的剪枝

CART回归树和CART分类树的剪枝策略除了在度量损失的时候一个使用均方差,一个使用基尼系数,算法基本完全一样。
由于决策时算法很容易对训练集过拟合,而导致泛化能力差,为了解决这个问题,需要对CART树进行剪枝,即类似于线性回归的正则化,来增加决策树的泛化能力。但是,有很多的剪枝方法,应该这么选择呢?CART采用的办法是后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。
也就是说,CART树的剪枝算法可以概括为两步,第一步是从原始决策树生成各种剪枝效果的决策树,第二部是用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。
首先看看剪枝的损失函数度量,在剪枝的过程中,对于任意的一刻子树,其损失函数为:
为正则化参数, 为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差度量。 是子树的叶子节点的数量。
时,即没有正则化,原始的生成的CART树即为最优子树。当时,即正则化强度达到最大,此时由原始的生成的CART树的根节点组成的单节点树为最优子树。当然,这是两种极端情况。一般来说, 越大,则剪枝剪的越厉害,生成的最优子树相比原生决策树就越偏小。对于固定的,一定存在使损失函数最小的唯一子树。
 
再来看看剪枝的思路,对于位于节点t的任意一颗子树,如果没有剪枝,它的损失是
如果将其剪掉,仅仅保留根节点,则损失是
或者 很小时, ; 当增大到一定的程度时 。当继续增大时不等式反向,也就是说,如果满足下式:
有相同的损失函数,但是 节点更少,因此可以对子树 进行剪枝,也就是将它的子节点全部剪掉,变为一个叶子节点
 
最后看看CART树的交叉验证策略。上面我们讲到,可以计算出每个子树是否剪枝的阈值,如果把所有的节点是否剪枝的值都计算出来,然后分别针对不同的所对应的剪枝后的最优子树做交叉验证。这样就可以选择一个最好的 ,有了这个 ,就可以用对应的最优子树作为最终结果。
 
好了,有了上面的思路,现在来看看CART树的剪枝算法:
输入是CART树建立算法得到的原始决策树
输出是最优决策子树
算法主要过程如下:
  1. 初始化, 最优子树集合
  1. 从叶子节点开始自下而上计算各内部节点t的训练误差损失函数(回归树为均方差,分类树为基尼系数), 叶子节点数 ,以及正则化阈值 , 更新
  1. 自上而下的访问子树的内部节点,如果 时,进行剪枝(什么时候需要剪枝呢?就是子树不剪枝的损失比剪枝的损失大,即此时满足: )。并决定叶节点的值。如果是分类树,则是概率最高的类别,如果是回归树,则是所有样本输出的均值。这样得到对应的最优子树
  1. 最优子树集合
  1. ,如果不是由根节点单独组成的树,则回到步骤2继续递归执行。否则就已经得到了所有的可选最优子树集合
  1. 采用交叉验证在选择最优子树
 

CART算法对比

CART算法相比C4.5算法的分类方法,采用了简化的二叉树模型,同时特征选择采用了近似的基尼系数来简化计算。当然CART树最大的好处是还可以做回归模型,这个C4.5没有。下表给出了ID3,C4.5和CART的一个比较总结:
算法
支持模型
树结构
特征选择
连续值处理
缺失值处理
 剪枝
ID3
分类
多叉树
信息增益
不支持
 不支持
 不支持
C4.5
分类
多叉树
信息增益比
支持
 支持
 支持
CART
分类,回归
二叉树
基尼系数,均方差
支持
 支持
 支持
看起来CART算法高大上,那么CART算法还有没有什么缺点呢?有!主要的缺点如下:
  • 无论是ID3, C4.5还是CART,在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。这样决策得到的决策树更加准确。这个决策树叫做多变量决策树(multi-variate decision tree)。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策。这个算法的代表是OC1
  • 如果样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习里面的随机森林之类的方法解决
 

决策树算法小结

决策树算法的优点:
  • 简单直观,生成的决策树很直观
  • 基本不需要预处理,不需要提前归一化,处理缺失值
  • 使用决策树预测的代价是 为样本
  • 既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值
  • 可以处理多维度输出的分类问题
  • 相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
  • 可以交叉验证的剪枝来选择模型,从而提高泛化能力
  • 对于异常点的容错能力好,健壮性高
 
决策树算法的缺点:
  • 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
  • 决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
  • 寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
  • 有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
  • 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
 
 
 

补充

Gini 系数与熵的关系

首先来看二者的基本定义:
处进行一阶泰勒展开(忽略高阶无穷小):
因此,熵可近似转化为:
 
 
 

代码

从零实现

 
 
 
 

scikit-learn实现

scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor。两者的参数定义几乎完全相同,但是意义不全相同。

参数

特征选择标准criterion
DecisionTreeClassifier :可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数"gini"就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。
DecisionTreeRegressor :可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。除非你想比较二个参数的效果的不同之处。
特征划分点选择标准splitter
可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。
默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random"
划分时考虑的最大特征数max_features
可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。
一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
决策树最大深max_depth
决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
内部节点再划分所需最小样本数min_samples_split
这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。
叶子节点最少样本数min_samples_leaf
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。
叶子节点最小的样本权重和min_weight_fraction_leaf
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
最大叶子节点数max_leaf_nodes
通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
类别权重class_weight
DecisionTreeClassifier :指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None”
DecisionTreeRegressor :不适用于回归树
节点划分最小不纯度min_impurity_split
这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。
数据是否预排序presort
这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。
 
其他在调参时的注意点有:
  • 当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
  • 如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
  • 推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
  • 在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
  • 决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
  • 如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化
 
 

scikit-learn决策树结果的可视化

scikit-learn中决策树的可视化一般需要安装graphviz,主要包括graphviz的安装和python的graphviz插件的安装。
第一步是安装graphviz。下载地址在:http://www.graphviz.org/。如果是linux,可以用apt-get或者yum的方法安装。如果是windows,就在官网下载msi文件安装。无论是linux还是windows,装完后都要设置环境变量,将graphviz的bin目录加到PATH,比如我是windows,将C:/Program Files (x86)/Graphviz/bin加入了PATH
第二步是安装python插件graphviz:
第三步是安装python插件pydotplus:
 
这样环境就搭好了,有时候python会很笨,仍然找不到graphviz,这时,可以在代码里面加入这一行:
 
 
 
notion image
 
  • Scikit-Learn
  • 朴素贝叶斯集成学习
    目录