编程语言
首页 > 编程语言> > 【机器学习(四)】决策树、ID3算法、C4.5算法、CART算法:原理,案例和代码

【机器学习(四)】决策树、ID3算法、C4.5算法、CART算法:原理,案例和代码

作者:互联网

目录

1.引言

2.决策树

2.1 决策树与if-then规则

2.2 决策树与条件概率分布

2.3 决策树学习

3.特征选择

4.决策树生成

4.1 ID3生成算法

4.2 C4.5生成算法

5.决策树剪枝

5.1剪枝算法

6.CART算法

6.1 CART回归树生成树

6.2 最小二乘法回归树

6.3 CART分类树生成

6.3.1 基尼指数

6.3.2 CART分类树生成

6.3.3 CART剪枝

6.3.4 CART剪枝流程

7.代码实现



1.引言

决策树(decision tree)是一种分类与回归的方法,顾名思义,决策树呈树形结构,可以认为是if-then规则的集合,也可以认为是特征空间与类空间上的条件概率分布。

主要的优点:分类速度快、可读性强。

决策树学习通常有三个步骤:特征选择决策树生成决策树修剪

常用的决策树算法有:ID3算法、C4.5算法和CART算法,其中CART更是被广泛应用。

 

2.决策树

定义:分类决策树模型是一种描述对实例进行分类的属性结构。决策树由结点和向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或者属性,叶结点表示一个类。

例如上图,圆形是内部结点,表示特征和属性,矩形表示叶子结点,表示一个类。训练的时候,按照训练数据集的属性和类,逐渐构建一个树,分类的时候,从根结点按照递归的方法对内部结点的属性进行测试和匹配,直到到达叶结点。

2.1 决策树与if-then规则

可以认为决策树是if-then规则的集合,其中内部结点之间连城的通路,构建成一条规则。路径上的点是规则的条件,叶子结点则是规则的结论。每一个实例都被一条路径或者一条规则覆盖,而且只被一条路径或规则覆盖。

2.2 决策树与条件概率分布

决策树还可以认为是特征条件下类的条件概率分布。将特征空间划分为互不相交的单元或区域,并在每个单元定义一个类的概率分布。而决策树的一条路径就是一个单元,因此可以认为决策树是给定条件下类的概率分布的集合。

2.3 决策树学习

给定训练集D=(x_1,y_1),(x_2,y_2),...,(x_N,y_N),其中x_i=x^1_i,x^2_i,...,x^n_i,n是特征个数;y\epsilon \{1,2,...,K\}是类的标记。

决策树的目的就是根据训练数据集构建一个决策树模型,使它能够对实例进行正确分类。

所以决策树的本质就是从训练数据中归纳出一组分类规则,这样决策树可能有很多个,也可能一个没有。但是我们需要的是一个与训练数据矛盾较小的决策树,又要具有很好的泛化能力,不仅对训练数据有很好的拟合,对未知数据又有很好的预测

决策树学习使用损失函数作为自己的目标函数,学习的策略就是最小化损失函数。决策树学习的算法通常是一个递归选择最优特征的方法,根据特征对训练数据进行分割,使各个子数据有一个最好的分类过程。这一个过程也是对特征空间的划分,也对应着决策树的构建。从根结点开始,选择特征作为自己的内部结点,递归构建,直到每个子集都被分到叶子结点上(即都有明确的分类),这就完成类决策树的构建。

 

3.特征选择

在构建决策树的时候,可以构建许多决策树,哪种决策树才是最有效的决策树?在开始构建的时候就考虑这个问题。要想构建一个高效的决策树,一般(CART除外)需要遵守信息增益或信息增益比的规则(点此查看信息熵、信息增益、信息增益比原理)。一般我们选择信息增益或信息增益比最大的特征作为当前的特征。信息增益体现出了特征与类的关联程度,即特征对类的不确定度的影响程度,信息增益比则是对这种程度的修正,避免决策树偏向选择取值较多的特征。

举一个例子:下表是贷款申请情况表,最后一列给出类是否给予贷款。

我们要从这表中构建一个决策树,怎样选择特征作为节点呢?

所以需要计算类的信息熵、特征与类的信息增益、信息增益比。

如下图,通过计算得到房子的信息增益最大(0.420),要是以信息增益为特征条件,那么构建决策树的第一个节点(根结点)应该是“房子”这个特征。(此处有详细的计算过程:信息熵、信息增益、信息增益比原理

如下图,计算得到信息增益比,同样特征“房子”的信息增益比最大(0.4325),当以信息增益比为选择条件的时候,特征“房子”应该作为第一个节点(根结点)

 

4.决策树生成

4.1 ID3生成算法

ID3算法的核心就是在决策树各个节点上使用信息增益作为选择特征的准则,使用递归方法构建决策树。

输入:训练数据集D,特征集A和阈值\varepsilon

输出:决策树T

  1. 若D中所有实例属于同一类C_k,则T为单结点树,并将类C_k作为该结点的类标记,返回T;
  2. A=\phi,则T为单结点树,将D中实例树最大的类C_k作为该结点的类标记,返回T;
  3. 否则信息增益算法计算A中各特征对D的信息增益,选择信息增益最大的特征A_g
  4. 如果A_g的信息增益小于阈值\varepsilon,则置T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T;
  5. 否则,对A_g的每一个可能的值a_i,依照A_g=a_i将D分割为若干个非空子集D_i,将D_i中实例树最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T;
  6. 对第i个子节点,以D_i为训练集,以A-\{A_g\}为新的特征集,递归调用1~5,得到树T,返回T。

以上一个案例为为例:

A_1作为特征“年龄”,A_2作为特征“工作”,A_3作为特征“房子”,A_4作为特征“信贷”。在上一步的计算中,可以知道特征A_3的信息增益最大,所以选择A_3作为根结点的特征。它把数据集划分为两个子集D_1A_3取是)和D_2A_3取否)。由于D_1只有同一类的样本点,所以D_1单独成为一个叶子结点,结果类标记“是”。

则下面对D_2从特征A_1A_2A_4中选择新的特征,计算各个特征的信息增益:

从上图,可以看到A_2信息增益最大,因此A_2作为新的内部结点。

A_2引出两个节点,即将数据集D_2划分成两个D_3A_2取是)和D_4A_2取否)。由于D_3内的类属于同一类,且类标记为“是”,故此数据集为叶子结点,且标记为“是”;D_4内的类也是属于同一类,故此数据集为叶子结点,且类标记为“否”。这样就生成了一个决策树(下图),仅仅使用了两个特征,使决策树更加高效。

 

4.2 C4.5生成算法

ID3算法生成树有一个缺点,就是容易过拟合。为此C4.5算法对ID3算法进行改进,使用信息增益比作为选择特征的条件

输入:训练数据集D,特征集A和阈值\varepsilon

输出:决策树T

  1. 若D中所有实例属于同一类C_k,则T为单结点树,并将类C_k作为该结点的类标记,返回T;
  2. A=\phi,则T为单结点树,将D中实例树最大的类C_k作为该结点的类标记,返回T;
  3. 否则信息增益算法计算A中各特征对D的信息增益比,选择信息增益比最大的特征A_g
  4. 如果A_g的信息增益小于阈值\varepsilon,则置T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T;
  5. 否则,对A_g的每一个可能的值a_i,依照A_g=a_i将D分割为若干个非空子集D_i,将D_i中实例树最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T;
  6. 对第i个子节点,以D_i为训练集,以A-\{A_g\}为新的特征集,递归调用1~5,得到树T,返回T。

以上一个为例,计算信息增益比:

A_1作为特征“年龄”,A_2作为特征“工作”,A_3作为特征“房子”,A_4作为特征“信贷”。如下图,可以知道A_3的信息增益比最大,因此选择A_3作为根结点。它把数据集划分为两个子集D_1A_3取是)和D_2A_3取否)。由于D_1只有同一类的样本点,所以D_1单独成为一个叶子结点,结果类标记“是”。

则下面对D_2从特征A_1A_2A_4中选择新的特征,计算各个特征的增益比:

从上图,可以看到A_2信息增益比最大,因此A_2作为新的内部结点。

A_2引出两个节点,即将数据集D_2划分成两个D_3A_2取是)和D_4A_2取否),由于D_3内的类属于同一类,且类标记为“是”,故此数据集为叶子结点,且标记为“是”;D_4内的类也是属于同一类,故此数据集为叶子结点,且类标记为“否”。

这样就生成了一个决策树,在这个案例中,C4.5和ID3生成的决策树是一样的,但是规则上有细微的区别——特征条件不同。

 

5.决策树剪枝

ID3和C4.5算通过递归产生决策树,直到不能继续。这样产生的树往往对训练数据分类很准确,但是对未知的测试数据的分类却没有那么准确——过拟合。因此需要通过剪枝,对已经生成的树进行简化,增加决策树的鲁棒性

顾名思义,剪枝,就是裁掉一些已经生成的子树或者叶子结点,将其父结点或者根结点作为新的叶结点,从而简化了分类树模型。

决策树剪枝通过极小化整体损失函数或代价函数实现。

设树T的叶结点个数为|T|,t是树T的叶结点,该结点有N_t个样本点,其中k类的样本点有N_t_k个,H_t(T)为叶结点t上的经验熵,\alpha \geq 0是参数。则决策树学习的损失函数为:

C_\alpha (T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha |T|

其中经验熵为:H_t(T)=-\sum_{k} \frac{N_t_k}{N_t}log\frac{N_t_k}{N_t}

将损失函数的右边第一项记做C(T)=\sum_{t=1}^{|T|}N_tH_t(T),这是损失函数变成C_\alpha =C(T)+\alpha |T|

\alpha较大时,最优树偏小;

\alpha较小的时候,最优树偏大;

\alpha\n \to \infty,根结点组成的单结点最优;

\alpha=0,整个树是最优的。

决策树的生成只考虑了通过提高信息增益或信息增益比来训练数据,这样使模型对训练数据有很好的拟合效果,对未知数据的分类效果不是十分好。剪枝,通过优化损失函数,减小模型复杂度,学习整体最好表现。

剪枝,就是当\alpha确定时,选择损失函数最小的模型,即损失函数最小的子树。

5.1剪枝算法

输入:生成算法产生的决策树T,参数\alpha

输出:修剪后的子树T_\alpha

  1. 计算每个节点的经验熵
  2. 递归地从树的叶结点向上回溯。设一组叶结点回到其父结点,之前之后整体树分别为T_BT_A,对应的损失函数分别是C_\alpha (T_B)C_\alpha (T_A),如果:C_\alpha (T_A)\leq C_\alpha (T_B),则进行剪枝,将父结点变为新的叶结点。
  3. 返回2,直到不能继续剪枝为止,得到损失函数最小的子树T_\alpha

决策树的剪枝是在局部进行的,所以决策树剪枝可以由动态规划算法实现

 

6.CART算法

CART(classififcation and regression trees)是一种既可以分类(离散)也可以回归(连续)的决策树。CART只假设决策树是二叉树,因此CART最终生成的树形结构是二叉树。

6.1 CART回归树生成树

假设X与Y是输入和输出变量,并且Y是连续的,给定训练数据集D=\{(x_1,y-1),(x_2,y_2),...(x_N,y_N)\}。将输入控件划分为M个单元,于是回归树模型可以表示为:

f(x)= \sum_{m=1}^{M}c_mI

当输入空间事先知道时,使用平方误差\sum_{x_i}(y_i-f(x_i)^2)作为回归树的预测误差。

采用启发式方法,选择第j个变量x^j作为分类点,取他的值s,把输入数据切分成两部分R_1(输入小于s)和R_2(输入大于s)

然后寻找最优切分变量j和最优切分点s即可。

6.2 最小二乘法回归树

按照6.1方法生成的回归树就是最小二乘回归树(二叉树)。

输入:训练数据集D

输出:回归树f(x)

  1. 选择最优切分变量j和切分点s,求解损失min_j_s[min_c_1\sum_{x_i}(y_i-c_1)^2+min_c_2\sum_{x_i}(y_i-c_2)^2],找到损失最小的j和切分点s
  2. 用选定的(j,s)划分区域R_1(输入小于s)和R_2(输入大于s),并决定输出值c_m=\frac{1}{N_m}\sum_{x_i}y_i
  3. 继续对两个区域调用步骤1和2,直到满足停止条件。
  4. 将输入空间划分为M个子区域R_1,R_2,...,R_M,生成决策树:f(X)=\sum_{m=1}^{M}c_mI

继续以上一个案例为例,如何使用最小二乘回归树来构建决策树。

首先是挨个特征计算,找到损失函数最小的特征。从第一轮结果中可知道A_3的损失最小(3),因此选择“房子”作为根结点,将数据划分成两部分。左边是D_1,由于D_1中的数据全为一类,因此D_1为一个叶结点。右边是D_2,对其内的特征继续计算损失函数,即第二轮计算。

从结果中可以看到,A_2的损失值为0,因此可以直接停止后续计算,确定“工作”为新的节点。将数据分成两部分:D_3D_4。其中D_3数据为一类,所以D_3是叶子结点。同理D_4也是叶子结点。这就生成了一个归回二叉决策树。

 

6.3 CART分类树生成

分类树是使用基尼指数作为特征选择,同时决定这个特征的最优二值切分点(生成的同样是二叉树)。

6.3.1 基尼指数

设有K个分类,样本属于第k类的概率是p_k

  • 概率分布的基尼指数定义为:Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=\sum_{k=1}^{K}p_k^2
  • 二分类问题,属于1的概率是p,基尼指数为:Gini(p)=2p(1-p)
  • 集合问题,C_k是集合D的第k类样本子集,K是类的个数,基尼指数为:Gini(p)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2。如果集合D被特征A分割成两部分D_1D_2。在特征A的条件下,D的基尼指数为:Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)

基尼指数和信息增益、信息增益比一样,都近似代表分类误差率。

6.3.2 CART分类树生成

输入:训练数据集D

输出:CART决策树

从根结点开始,递归地对每个结点进行一下操作,构建二叉树:

  1. 设结点的训练数据集为D,计算现有特征A对D的基尼指数;
  2. 选择基尼指数最小的特征及其对应点,将数据集分成两部分,分配到两个子节点中。
  3. 对两个子节点递归调用1和2,直到满足停止条件(节点中样本个数小于预定阈值或基尼指数小于预定阈值)。
  4. 生成CART决策树

同样以上一个案例为例,如何使用CART算法生成决策树

首先是挨个特征计算,计算基尼指数。从第一轮结果中可知道A_3的基尼指数最小(0.27),因此选择“房子”作为根结点,将数据划分成两部分。左边是D_1,由于D_1中的数据全为一类,因此D_1为一个叶结点。右边是D_2,对其内的特征继续计算新的基尼指数,即第二轮计算。

从结果中可以看到,A_2的基尼指数为0,确定“工作”为新的节点。将数据分成两部分:D_3D_4。其中D_3数据为一类,所以D_3是叶子结点。同理D_4也是叶子结点。这就生成了一个归回二叉决策树。

 

6.3.3 CART剪枝

从生成的决策树底部开始,剪去一些子树,使决策树变小,从而能够对未知数据有更准确的预测。

剪枝的步骤就是先在已经生成决策树T_0底端不断剪枝,直到T_0的根结点,形成一个子树序列\{T_0,T_1,T_2,...,T_n\};然后通过交叉验证法在独立的验证数据集上对子树序列进行预测,从中选择最优子树

在剪枝的过程中计算子树的损失函数:C_\alpha (T)=C(T)+\alpha |T|,其中C(T)是对训练数据的预测误差,|T|是子树的叶子结点个数,C_\alpha是参数为\alpha时的子树T的整体损失。

T_0时,任意内部结点t,以t为单结点树的损失函数是:C_\alpha =C(t)+\alpha

T_0时,任意内部结点t,以t为根结点的子树损失函数是:C_\alpha(T_t) =C(T_t)+\alpha|T_t|

\alpha =0\alpha很小的时候,有:C_\alpha (T_t)< C_\alpha (t)

\alpha逐渐增大,在一个值的时候有:C_\alpha (T_t)= C_\alpha (t)

所以,只要g(t) =\frac{C(t)-C(T_t)}{|T_t|-1}T_t和t就有相同的损失函数,t是单结点,T_t是子树,因此剪枝,保留t更好。将T_0剪枝后得到T_1,同时将g(t)设为\alpha_1,那么T_1为区间[\alpha _1,\alpha _2)的最优子树。如此一直剪下去,直到根结点。

剪枝得到子树序列\{T_0,T_1,T_2,...,T_n\},利用独立验证的数据集测试子树序列中各个子树的平方误差或者基尼指数。在子树序列中,一个子树对应一个\alpha _i,选择损失最小的子树作为最终的剪枝结果,得到最优化决策树T_\alpha

6.3.4 CART剪枝流程

输入:CART回归生成树T_0

输出:最优决策树T_\alpha

  1. k=0,T=T_0
  2. \alpha =+\infty
  3. 自下而上地对各个内部结点t计算C(T_t)|T_t|以及g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}\alpha =min(\alpha,g(t))。其中T_t表示以t为根结点的子树,C(T_T)是对训练数据的预测误差,|T_t|T_t的叶结点个数。
  4. g(t)=\alpha的内部结点t进行剪枝,并对叶结点t以多数表决法(投票)决定其类,得到树T。
  5. k=k+1,\alpha _k\alpha ,T_k=T
  6. 如果T_k不是由根结点以及两个叶结点构成的数,则返回到步骤2;否则令T_k=T_n
  7. 采用交叉验证法在子树序列\{T_0,T_1,T_2,...,T_n\}中选择最优的子树T_\alpha

 

7.代码实现

关于案例的ID3算法和C4.5算的代码实现,见信息熵、信息增益、信息增益比原理

 

标签:剪枝,结点,特征,算法,CART,ID3,增益,决策树
来源: https://blog.csdn.net/qq_39709813/article/details/106694992