决策树梳理

信息论基础

信息

这个是熵和信息增益的基础概念,是对一个抽象事物的命名,无论用不用‘信息’来命名这种抽象事物,或者用其他名称来命名这种抽象事物,这种抽象事物是客观存在的。如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息(量)定义如下:
在这里插入图片描述
I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。当事件xi发生的概率p(xi)很小,但是它却发生了,那这个信息量相当大,比如买彩票中奖了,那么这个信息量肯定是很大的。相反,对于大概率事件,人们习以为常,那么这个事件的信息量就很小。这就体现在上述公式中。

信息熵

“信息熵”是度量样本纯度最常用的一种指标。所谓样本纯度,相反而言之就是凌乱程度。如一个数据集U中的样本都属于同一类,那么这时样本纯度最高而凌乱程度最低。信息熵定义为:
在这里插入图片描述

其中D表示样本集合,|y|样本中类别的数目, pk表示第k种分类占集合的比例。Ent(D)的值越小,D的纯度越高。

信息增益

信息增益 指的是,使用某一个属性a进行划分后,所带来的纯度提高的大小。一般而言,信息增益越大,意味着使用属性a来进行划分所获得的“纯度提升”越大。信息增益定义如下:
在这里插入图片描述
信息增益 = 根节点的信息熵 - 所有分支节点的信息熵的加权和
 其中,权值为划分后属性a=ak节点中样本的数量与划分前节点中的样本数量的比值,即概率。概率确保了权重的和为1.

增益率

背景:当样本集中的某一属性取值使得所有样本被分到不同类别,此时分支的纯度达到最高,无需再继续划分。然而这样的决策树不具备泛化能力。事实上,信息增益准则对可取值较多的属性有所偏好。
为了减少这种偏好可能带来的影响,因此使用增益率代替信息增益准则选择划分属性。

在这里插入图片描述
即增益率(Gain_ratio(D,a))=信息增益Gain(D,a)/属性固有值(IV(a))。

属性A的可能取值越大,固有值IV(a)通常越大。

信息增益率偏向于可能取值减少的属性。因此C4.5算法不直接使用信息增益率来选择划分属性。

基尼值

基尼值 Gini(D) 反映了从数据集中随机抽取两个样本,其类别标记不一致的概率。当数据集的纯度越高,每次抽到不同类别标记的概率越小。打个比方,在一个袋子里装100个乒乓球,其中有99个白球,1个黄球,那么当我们随机抽取两个球的时候,很大概率是抽到两个白球。
所以数据集D的纯度可以用基尼值来度量,其定义如下:
在这里插入图片描述
基尼值越小,数据集D纯度越高。

基尼指数

基尼指数是针对于属性定义的,其反映的是,使用属性a进行划分后,所有分支中(使用基尼值度量的)纯度的加权和。
   属性a的基尼指数定义如下:
   在这里插入图片描述
我们在属性集合A中选择划分属性的时候,就选择使得划分后基尼指数最小的属性作为最优划分属性。CART就是用基尼指数来选择划分属性的。

决策树

决策树是在已知各种情况发生概率((各个样本数据出现中,不同特征出现的概率))的基础上,通过构建决策树来进行分析的一种方式。常用算法有ID3、C4.5、CART

决策树构建过程

构建决策树的关键步骤是分裂属性,指在某个节点按照一类特征属性的不同划分构建不同的分支,使每个分支中的数据类别尽可能的纯。
决策树是一种贪心算法策略,只考虑当前数据特征的最好分割方式,不能回溯操作(只能从上往下分割;
步骤:
1.将所有的特征看成一个一个的节点
2.遍历所有特征,遍历到其中某一个特征时:遍历当前特征的所有分割方式,找到最好的分割点,将数据划分为不同的子节点,计算划分后子节点的纯度信息
3.在遍历的所有特征中,比较寻找最优的特征以及最优特征的最优划分方式,纯度越高,则对当前数据集进行分割操作
4.对新的子节点继续执行2-3步,直到每个最终的子节点都足够纯

决策树算法构建的停止条件:
1.(会导致过拟合)当子节点中只有一种类型的时候停止构建
2.(比较常用)当前节点种样本数小于某个值,同时迭代次数达到指定值,停止构建,此时使用该节点中出现最多的类别样本数据作为对应值

ID3算法

ID3算法的核心思想即在决策树的各个节点上使用信息增益选择特征。从根节点开始,计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,再根据该特征的取值建立子节点,对子节点递归调用上述过程。即:
输入:训练数据集D,特征A,阈值beta :
输出:决策树T
(1)若D中所有实例属于同一类Ck则T为单节点树,并将Ck作为该节点的类标记,返回T
(2)若A为空集,则通过统计D中实例数最大的类作为该节点类标记(即对于某一节点而言,没有其它特征可以进行分辨了,则对将该节点的类设置为分到该节点数据最多属于的类中),返回T
3)否则计算A中各特征对D的信息增益,选择信息增益最大的特征 Ag :
H ( D ) = ( C k / D ) l o g ( C k / D ) H(D)=−∑(|C_k|/|D|)log(|C_k|/|D|)
H ( D A ) = ( D i / D ) H ( D i ) H(D|A)=−∑(|D_i|/|D|)H(D_i)
信息增益:
g ( D , A ) = H ( D ) H ( D A ) g(D,A)=H(D)−H(D|A)

(4)若Ag的信息增益小于阈值,则将T作为单节点树,将D中实例数最大的类作为该节点的标记
(5)否则,对Ag每一个可能值 ai 将D划分为若干非空子集,将子集中实例数最大的类作为标记,构建子节点,返回树T
6)对第i个子节点,以(5)中的子集作为训练集,A-Ag
作为特征集,递归调用(1)~(5),构建决策树。
上述就是ID3算法的核心步骤,即用信息增益来选择分类特征。但是以信息增益作为划分的标准会带来一个问题,观察公式我们可以看出,由于对于数据集而言经验熵是给定的,我们想要获得大的信息增益就要使条件熵较小,当我们的特征有较多取值时条件熵就会相应较小,因此我们的算法会倾向于选择取值较多的特征值。为了解决这个问题,就有了C4.5算法

C4.5算法:

使用信息增益率选取划分数据集的特征.

C4.5决策树算法流程:
1.计算整个数据集的熵Ent
2.选取最好的数据集划分方式(这里指选取信息增益率最高的特征,亦为去除该特征后数据集增益率最高的特征)
a.计算除去已经被使用的特征和正在被计算的特征的数据集的熵Ent(Dv)(v为当前被计算熵特征取值为v的样本集),将其该特征每个特征值计算的Ent(Dv)进行加和按比例即得到使用该特征值进行划分之后,数据集的信息熵Ent(D)
b.计算各个特征值的熵增(Ent-Ent(D))
c.计算所有特征信息增益的均值,选取信息增益高于均值的特征
d.计算被选取的特征的固有值IV(a)
e.使用各个特征的信息增益和固有值分别计算其增益率,选择最高的特征作为划分特征
3.根据选取的特征,根据其取值对数据集进行划分,构建分支
4.去除已使用的特征,在每个数据分支中重复步骤2,3,4直到(满足下列条件之一)
a.每个分支中所有数据的类别都相同
b.所有特征都已被使用(都已经用来划分了数据集(此情况下通常使用投票的方式选择数据类型,即选择类别的数量多的类型)
5.C4.5决策树构建完毕
增益率计算:
在这里插入图片描述
各个特征的固有值IV(a)

在这里插入图片描述

特征a的取值数量越多,则IV(a)越大
信息增益及信息熵增:

在这里插入图片描述

a:样本集中的某一特征
Dv:某特征所有取值为v 的样本的集合

信息熵计算:

在这里插入图片描述

pk:k类样本所占的比例

CART

算法步骤:
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;

1 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准.
2 CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。本文我们仅讨论用于分类的CART。对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。 CART生成算法如下:

输入:训练数据集D,停止计算的条件:

输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:

设结点的训练数据集为D,计算现有特征对该数据集的Gini系数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或 “否”将D分割成D1和D2两部分,计算A=a时的Gini系数。

在所有可能的特征A以及它们所有可能的切分点a中,选择Gini系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。

对两个子结点递归地调用步骤l~2,直至满足停止条件。

生成CART决策树。

算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。

Gini指数的计算

其实gini指数最早应用在经济学中,主要用来衡量收入分配公平度的指标。在决策树算CART算法中用gini指数来衡量数据的不纯度或者不确定性,同时用gini指数来决定类别变量的最优二分值得切分问题。
在分类问题中,假设有K个类,样本点属于第k类的概率为Pk,则概率分布的gini指数的定义为:

在这里插入图片描述

如果样本集合D根据某个特征A被分割为D1,D2两个部分,那么在特征A的条件下,集合D的gini指数的定义为:
在这里插入图片描述

gini指数Gini(D,A)表示特征A不同分组的数据集D的不确定性。gini指数值越大,样本集合的不确定性也就越大,这一点与熵的概念比较类似。
所以在此,基于以上的理论,我们可以通过gini指数来确定某个特征的最优切分点(也即只需要确保切分后某点的gini指数值最小),这就是决策树CART算法中类别变量切分的关键所在。是不是对于决策树的CART算法有点小理解啦!其实,这里可以进一步拓展到我们对于类别变量的粗分类应用上来。比如我某个特征变量下有20多个分组,现在我只想要5个大类,如何将这个20多个类合并为5个大类,如何分类最优,以及如何找到最优的分类。这些建模初期的数据预处理问题其实我们都可以用gini指数来解决。

决策树防止过拟合手段

产生过度拟合数据问题的原因

1 样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;
解决办法:合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;
2 样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;
解决办法:剪枝:提前停止树的增长或者对已经生成的树按照一定的规则进行后剪枝。

sklearn种决策树的算法参数

criterion 特征选择标准
‘gini’ or ‘entropy’ (default=”gini”),前者是基尼系数,后者是信息熵。两种算法差异不大对准确率无影响,信息墒云孙效率低一点,因为它有对数运算.一般说使用默认的基尼系数”gini”就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。

splitter 特征划分标准
‘best’ or ‘random’ (default=”best”) 前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。 默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random” 。

max_depth 决策树最大深度
int or None, optional (default=None) 一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。常用来解决过拟合

min_impurity_decrease 节点划分最小不纯度
float, optional (default=0.) 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。 sklearn 0.19.1版本之前叫 min_impurity_split

min_samples_split 内部节点再划分所需最小样本数
int, float, optional (default=2) 如果是 int,则取传入值本身作为最小样本数; 如果是 float,则去 ceil(min_samples_split * 样本数量) 的值作为最小样本数,即向上取整。

min_samples_leaf 叶子节点最少样本数
如果是 int,则取传入值本身作为最小样本数; 如果是 float,则去 ceil(min_samples_leaf * 样本数量) 的值作为最小样本数,即向上取整。 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。

max_leaf_nodes 最大叶子节点数
int or None, optional (default=None) 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

min_impurity_split 信息增益的阀值
决策树在创建分支时,信息增益必须大于这个阀值,否则不分裂

min_weight_fraction_leaf
叶子节点最小的样本权重和
float, optional (default=0.) 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

class_weight 类别权重 dict, list of dicts, “balanced” or None, default=None 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的”None” 不适用于回归树 sklearn.tree.DecisionTreeRegressor