决策树算法梳理

目录

  • 0. 前言
  • 1. 信息论基础
    • 1.1 熵
    • 1.2 联合熵
    • 1.3 条件熵
    • 1.4 信息增益
    • 1.5 基尼不纯度
  • 2. 决策树不同分类算法的原理及应用场景
    • 2.1 ID3
    • 2.2 C4.5
    • 2.3 CART
      • 2.3.1 CART分类树
      • 2.3.2 回归树
  • 3. 决策树防止过拟合手段
  • 4. 模型评估
  • 5. sklearn参数详解,Python绘制决策树

0. 前言

  1. 决策树是什么?
    决策树(decision tree) 是一种分类与回归方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。它主要用于分类,决策树模型呈现树形结构,是基于输入特征对实例进行分类的模型。
    例子可参考:https://www.cnblogs.com/yonghao/p/5061873.html
  2. 使用决策树算法的主要步骤又是什么呢?
    可以分为三部分: 1) 特征的选取 2) 决策树的生成 3) 决策树的修剪
  3. 当前决策树的主要流行的三个算法是:ID3算法、C4.5算法和 CART算法(classification and regression tree)分类与回归树

1. 信息论基础

决策树的基础知识–信息论基础。

1.1 熵

在机器学习算法中,熵表示整个系统或随机变量的不确定性,是对所有可能发生的事件产生的信息量的期望。熵越大,随机变量或系统的不确定性就越大。
那什么是信息量?如果一件事物X有多种可能性,每一种可能性被划分为多个类别,则某个类xi的信息量定义如下:
1
I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。当事件xi发生的概率p(xi)很小,但是它却发生了,那这个信息量相当大,比如买彩票中奖了,那么这个信息量肯定是很大的。相反,对于大概率事件,人们习以为常,那么这个事件的信息量就很小。
回到熵,对于事件X,有n种可能结果,且概率分别为p1,p2,…,pn,则熵H(X)为:

2

1.2 联合熵

对于服从联合分布为p(x,y)的一对离散型随机变量(X,Y),其联合熵H(X,Y)定义为:
3

1.3 条件熵

条件熵 H(Y|X) 表示在已知随机变量 X 的条件下随机变量 Y 的不确定性。条件熵 H(Y|X) 定义为 X 给定条件下 Y 的条件概率分布的熵对 X 的数学期望:

注意:这个条件熵,不是指在给定某个数(某个变量为某个值)的情况下,另一个变量的熵是多少,变量的不确定性是多少?因为条件熵中X也是一个变量,意思是在一个变量X的条件下(变量X的每个值都会取,注意求和符号),另一个变量Y熵对X的期望。
决策树算法梳理_第1张图片
条件熵 H(Y|X) 相当于联合熵 H(X,Y)减去单独的熵 H(X),即H(Y|X)=H(X,Y)−H(X),证明如下:
决策树算法梳理_第2张图片
可以这样理解,描述 X 和 Y 所需的信息(联合熵)是描述 X 自己所需的信息(单独的熵),加上给定 X 的条件下具体化 Y 所需的额外信息(条件熵)。
参考:https://www.cnblogs.com/kyrieng/p/8694705.html#name2
关于条件熵计算非常好的例子:https://zhuanlan.zhihu.com/p/26551798

1.4 信息增益

信息增益在决策树算法中是用来选择特征的指标,在得知特征X一定的情况下,Y不确定性的减少程度。信息增益越大,则这个特征的选择性越好,在概率中定义为:待分类的集合的熵和选定某个特征的条件熵之差。
6
在机器学习中,对一个确定的数据集来说,H(Y)是确定的,那H(Y|X)在X特征一定的情况下,随机变量的不确定性越小,信息增益越大,这个特征的表现就越好。

1.5 基尼不纯度

  • (书上解释) 从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。
  • (简单理解) 一个随机事件变成它的对立事件的概率。
  • 计算公式:(fi为某概率事件发生的概率)
    7
  • 结论:
    (1)基尼不纯度可以作为衡量系统混乱程度的标准;
    (2)基尼不纯度越小,系统纯度越高,集合的有序程度越高,分类的效果越好;
    (3)基尼不纯度为 0 时,表示集合类别一致;
    (4)在决策树中,比较基尼不纯度的大小可以选择更好的决策条件(子节点)。

转自:https://blog.csdn.net/JJBOOM425/article/details/79997440

2. 决策树不同分类算法的原理及应用场景

决策树算法在实际建模中应用非常广泛,也是很多热门机器学习算法的基础,那决策树的本质是什么?是将特征空间逐级划分,如下图:
决策树算法梳理_第3张图片 决策树算法梳理_第4张图片决策树算法梳理_第5张图片决策树算法梳理_第6张图片
图示就是每次都找不同的切分点,将样本空间逐渐进行细分,最后把属于同一类的空间进行合并,就形成了决策边界,树的层次越深,决策边界的切分就越细,区分越准确,同时也越有可能产生过拟合。
这也就是说,决策树最重要的一件事情就是:怎么找切分点?

2.1 ID3

ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征递归地构建决策树。
算法流程:
输入:训练数据集D,特征集A,阈值ε;

输出:决策树T.

Step1:若D中所有实例属于同一类,则T为单结点树,并将类作为该节点的类标记,返回T;

Step2:若A=Ø(所有样本特征数为0),则T为单结点树,并将D中实例数最大的类作为该节点的类标记,返回T;

Step3:否则,计算A中个特征对D的信息增益,选择信息增益最大的特征

Step4:如果的信息增益小于阈值ε,则T为单节点树,并将D中实例数最大的类作为该节点的类标记,返回T

Step5:否则,对的每一种可能值,依将D分割为若干非空子集,将中实例数最大的类作为标记,构建子结点,由结点及其子树构成树T,返回T;

Step6:对第i个子节点,以为训练集,以为特征集合,递归调用Step1~step5,得到子树,返回;

从上面的算法过程我们可以看出,其本质就是在不停地选择当前未被选中的特征中,最为重要的特征(信息增益最大的特征)作为划分样本空间的依据,当信息增益达不到阈值或没有可用的样本了,决策树的递归过程也就结束了。

信息增益计算:
决策树算法梳理_第7张图片
这里的概率分布是通过先验概率来表示的,也就是通过对已有样本的简单统计给出数据集的分布,其实际就是一种极大似然估计,比如经验熵中,第 C k C_k Ck类样本出现的概率用: C k C_k Ck类样本的个数/整个数据集D中总样本个数来表示。
具体例子:决策树ID3算法

2.2 C4.5

ID3算法有两个明显的缺点:
1)使用信息增益进行特征选择,但信息增益是一个绝对的概念,与训练集本身的离散程度有很大的关系,当训练集本身离散程度很高时(信息增益会偏向取值较多的特征),其可改进的空间更大,能够获得的信息增益更大,反之更小,这会导致很难在开始训练前就确定一个较为合理的阈值ϵ。
为什么信息增益会偏向取值较多的特征:
从公式出发,信息增益是整个数据集的经验熵与特征A对整个数据集的经验条件熵的差值,信息增益越大即经验条件熵越小,那什么情况下的属性会有极小的的经验条件熵呢?举个极端的例子,如果将身份证号作为一个属性,那么,其实每个人的身份证号都是不相同的,也就是说,有多少个人,就有多少种取值,如果用身份证号这个属性去划分原数据集,那么,原数据集中有多少个样本,就会被划分为多少个子集,这样的话,会导致信息增益公式的第二项整体为0,虽然这种划分毫无意义,但是从信息增益准则来讲,这就是最好的划分属性。其实从概念来讲,就一句话,信息增益表示由于特征A而使得数据集的分类不确定性减少的程度,信息增益大的特征具有更强的分类能力。

2)需要一直进行到没有特征可选为止,特征很多时树深度可能很深,无关紧要的特征也会被精确分析,从而导致过拟合。
因此,C4.5算法做出了两个改进。

C4.5算法使用信息增益比进行特征选择,其公式为:
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)
其中其中的 H A ( D ) H_A(D) HA(D),对于样本集合D,将当前特征A作为随机变量(取值是特征A的各个特征值),求得的经验熵。
12
因为当信息增益偏向于选择取值较多的特征,但根据熵的公式可知,特征越多,熵越大,所以除 H A ( D ) H_A(D) HA(D)正好抵消了特征变量的复杂程度,避免了过拟合的存在。

2.3 CART

不同于前两种算法预测结果为分类结果,CART的预测结果为概率值。所以在CART树中,不再采用信息增益或信息增益比,而是在做回归时采用平方误差最小化准则,在做分类时采用基尼指数最小化准则。

2.3.1 CART分类树

对于给定集合D,其基尼指数为
G i n i ( D ) = 1 − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ 2 Gini(D)=1-\sum_{k=1}^K\frac{|C_k|}{|D|}^2 Gini(D)=1k=1KDCk2
其中, C k C_k Ck是D中属于第k类的样本子集,K是类的个数。 ∣ C k ∣ |C_k| Ck ∣ D ∣ |D| D 分别表示子集的个数和样本的个数。
如果样本集合D根据特征A是否取某一可能值a被分割成D1和D2两部分,即:
D 1 = { ( x , y ) ∈ D ∣ A ( x ) = a } , D 2 = D − D 1 D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1 D1={(x,y)DA(x)=a},D2=DD1
需要说明的是CART是个二叉树,也就是当使用某个特征划分样本集合只有两个集合:1 等于给定的特征值 的样本集合D1;2 不等于给定的特征值 的样本集合D2。
则在特征A的条件下,集合D的基尼指数定义为:
G i n i ( D , A ) = D 1 D G i n i ( D 1 ) + D 2 D G i n i ( D 2 ) Gini(D,A)=\frac{D_1}{D}Gini(D_1)+\frac{D_2}{D}Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点跟熵相似。
下面举个简单的例子:
决策树算法梳理_第8张图片
在上述图中,属性有3个,分别是有房情况,婚姻状况和年收入,其中有房情况和婚姻状况是离散的取值,而年收入是连续的取值,拖欠贷款者属于分类的结果。

  1. 假设现在来看有房情况这个属性,那么按照它划分后的Gini指数计算如下( t 1 t_1 t1即为上式公式的 D 1 D_1 D1):
    决策树算法梳理_第9张图片
  2. 而对于婚姻状况属性来说,它的取值有3种,按照每种属性值分裂后Gini指标计算如下:
    决策树算法梳理_第10张图片
  3. 最后还有一个取值连续的属性,年收入,它的取值是连续的,那么连续的取值采用分裂点进行分裂。如下:
    决策树算法梳理_第11张图片

了解关键的基尼指数后,看看算法步骤:

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

输出:CART决策树

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

Step1:设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点A=a的测试为“是”或“否”将D分割为D1和D2两部分,利用上式Gini(D,A)来计算A=a时的基尼指数。

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

Step3:对两个子结点递归地调用Step1、Step2,直至满足条件。

Step4:生成CART决策树

算法停止计算的条件是节点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值,或者没有更多特征。

构建决策树总结: 根据以上的两种算法ID3、C4.5,第一步就是计算总集合的熵,然后在现有的特征中计算以各特征为根结点,依据该特征的不同值分类后的子节点的熵,计算出信息增益(或信息增益比),选择信息增益(或信息增益比)最大的特征作为根结点;第二步就是依据根结点的不同特征值分类后得到的不同数据集,以剩下的特征(即除去根结点那个特征)重新返回第一步,直至满足分裂条件。而CART分类树类似,只不过他是一棵二叉树,若某个特征A的可取值有n个,A1,A2…An(n>2),那么以该特征进行分类后的一个子节点(该子节点的特征可取值有n-1个,A1,A2…An-1),那么剩余的特征中也包括该特征A,只不过该特征的可取值变成n-1个,A1,A2…An-1。

2.3.2 回归树

与分类树不同的是回归树处理的数据连续分布的。假设X和Y分别是输入和输出变量,并且Y是连续变量,训练数据集给定,

一个回归树是对应着输入空间(特征空间)的一个划分以及在划分单元上的输出,此处假设已将输入空间划分为M个单元R1,R2,R3…Rm,并在每一个单元 R m R_m Rm上有固定的输出值 C m C_m Cm,那么回归树的模型则可以表示为:

其中函数 I I I表示当样本属于第m个叶子节点时,其CART树的输出值为 c m c_m cm
决策树算法梳理_第12张图片
一头雾水!!!看个例子:
最小二乘法回归树生成算法
其实就像分类树选择最优的基尼指数一样,回归树选择最优的平方误差,选择使得基尼指数或平方误差最优的特征(变量)以及最优切分点,一层一层地构建,直至满足算法停止条件。

3. 决策树防止过拟合手段

剪枝是决策树学习算法中对付过拟合的主要手段。主要是从已生成的树中剪掉一些子树或者叶子节点,并将根节点或者父节点作为新的叶子节点,从而简化分类树模型。决策树的剪枝往往是通过极小化决策树的整体损失函数或者代价函数。设树T的叶子节点数为 ∣ T ∣ |T| T,叶子节点t上有 N t N_t Nt个样本点,其中k类的样本点数为 N k t N_{kt} Nkt H t ( T ) H_t(T) Ht(T)为结点t上的经验熵,α>=0为参数,损失函数定义为:
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| Cα(T)=t=1TNtHt(T)+αT
经验熵为:
H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T)=-\sum_{k}\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=kNtNtklogNtNtk
此时令:
C ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k l o g N t k N t C(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}N_{tk}log\frac{N_{tk}}{N_t} C(T)=t=1Tk=1KNtklogNtNtk
所以:
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT
C(T) 表示对训练数据的预测误差, ∣ T ∣ |T| T 表示模型的复杂度,参数α权衡训练数据的拟合程度与模型复杂度。
这个时候我们求其 C α ( T ) C_\alpha (T) Cα(T)的最小值,C(T)为预测误差,希望尽量的小,而要想使损失尽量的小,那么表现在决策树上就是决策树越来越复杂即树叶节点很多,即|T|很多,但是第二项呢?也是希望尽可能的小,在给定 α \alpha α时,希望|T|尽可能的小,因此矛盾就出来了,因此需要找到平衡的|T|,而这个平衡值T就和 α \alpha α有关了。
此时一方面是要求正确率尽可能的高,另一方面是希望复杂度尽可能的低,这样目标公式就建立起来了,我们再看看这个目标公式会发现,此时的损失函数是正对全局优化的即整棵树的所有叶节点的损失和,因此求出来的一定是全局最优的。
决策树算法梳理_第13张图片
此时也就是说当 α \alpha α等于这个值时剪枝前和剪枝后的损失结果是一样的,这就是临界条件。对于当前这个节点,只要α 大于这个值时,一定有 C α ( t ) < C α ( T t ) C_α(t)Cα(t)<Cα(Tt) ,也就是剪掉这个节点后比不剪要更优。所以每个最优子树对应的是一个区间,在这个区间内都是最优的。
具体步骤:

  1. 生成子树序列;
  2. 交叉验证选取最优子树;
    决策树算法梳理_第14张图片

总的来说就是:对每个内部结点都计算g(t),然后剪去g(t)最小的 T t T_t Tt。(为什么是最小?因为g(t)可以理解为整体损失函数的减少程度,g(t)最小就证明这个内部结点增加的叶子结点换取来的预测误差才减少了那么一点,花那么大的功夫增加叶子节点,误差才减小那么一点点,还不如不要,因此优先剪去g(t)最小的t)然后重复,直到剩下一个根结点。最后就是交叉验证子树序列中哪个最优。

剪枝详细过程可以看这里:https://blog.csdn.net/wjc1182511338/article/details/76793164?locationNum=6&fps=1

4. 模型评估

关于模型评估,在我之前的线性回归算法篇以及逻辑回归算法篇都有详细介绍。
分类树:Precision、Recall、F1 score、PR曲线、ROC曲线和AUC
线性回归篇
回归树: MAE、MSE、RMSE、R-squared
逻辑回归篇

5. sklearn参数详解,Python绘制决策树

分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor。
DecisionTreeClassifier
DecisionTreeRegressor

你可能感兴趣的:(算法)