一、决策树模型
决策树(decision tree)是一种常用的机器学习方法,是一种描述对实例进行分类的树形结构。
举例:决策树基于“树”结构进行决策:
(1)内部结点:属性
(2)分支:属性值
(3)p叶结点:分类结果
学习过程:通过对训练样本的分析来确定“划分属性”(即内部结点所对应的属性)
预测过程:将测试示例从根结点开始,沿着划分属性所构成的“判定测试序列”下行,直到叶结点
学习的过程就是通过划分属性构建决策树的过程,预测过程就是将测试样本从根节点开始,沿着划分属性构成的“判定序列”下行,直到叶结点。
二、划分选择
1.属性划分选择:
构造决策树的关键是如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
纯度越高意味着从这个子集中取得某个类别的样本的确定性越高,不确定性越低。
常用属性划分的准则:
(1)ID3:信息增益
(2)C4.5:增益率
(3)CART:基尼指数
2.结点的不纯度:
(1)信息熵(Entropy)
S
=
−
∑
i
=
1
N
p
i
log
2
p
i
,
S = -\sum_{i=1}^{N}p_i \log_2{p_i},
S=−i=1∑Npilog2pi,
其中,𝑝𝑖是系统位于第 i 个状态的概率。熵可以描述为系统的混沌程度,熵越高,系统的有序性越差,反之亦然。熵将帮助我们高效的分割数据,类似帮助我们找出在「20个问题」游戏中先问什么问题较好
设有c个类, t是结点, p(i|t)表示给定结点t中属于类i的记录所占的比例
举例:
为了解释熵是如何有利于构建决策树模型的,让我们来看一个玩具示例,在这个示例中将基于球的位置预测它的颜色。
这里有 9 个蓝球和 11 个黄球。如果随机选择一个球,这个球是蓝球的概率
p
1
=
9
20
p_1=\frac{9}{20}
p1=209,是黄球的概率
p
2
=
11
20
p_2=\frac{11}{20}
p2=2011,这意味着熵
S
0
=
−
9
20
log
2
9
20
−
11
20
log
2
11
20
≈
1
S_0 = -\frac{9}{20}\log_2{\frac{9}{20}}-\frac{11}{20}\log_2{\frac{11}{20}} \approx 1
S0=−209log2209−2011log22011≈1。这个值本身可能无法告诉我们很多信息。
将球分为「位置小于等于 12、位置大于 12」这两组,如下图所示。
那么分组后,熵的变化如何?左边一组有 13 个球, 8 蓝 5 黄。这一组的熵
S
1
=
−
5
13
log
2
5
13
−
8
13
log
2
8
13
≈
0.96
S_1 = -\frac{5}{13}\log_2{\frac{5}{13}}-\frac{8}{13}\log_2{\frac{8}{13}} \approx 0.96
S1=−135log2135−138log2138≈0.96。右边一组有 7 个球, 1 蓝 6 黄。右边这组的熵
S
2
=
−
1
7
log
2
1
7
−
6
7
log
2
6
7
≈
0.6
S_2 = -\frac{1}{7}\log_2{\frac{1}{7}}-\frac{6}{7}\log_2{\frac{6}{7}} \approx 0.6
S2=−71log271−76log276≈0.6。可见,两组的熵都下降了,且右边这组降得更多。由于熵实际上是系统混沌(或不确定)的程度,熵的下降被称为信息增益。数学上,基于变量 Q(在这个例子中是变量「x ≤ 12」)所作的分割,得到的信息增益(IG)定义为:
I
G
(
Q
)
=
S
O
−
∑
i
=
1
q
N
i
N
S
i
,
IG(Q) = S_O - \sum_{i=1}^{q}\frac{N_i}{N}S_i,
IG(Q)=SO−i=1∑qNNiSi,
其中,
q
q
q 是分割的组数,
N
i
N_i
Ni 是变量 Q 等于第 i 项时的样本数目。在玩具示例中,有 2 个组(
q
=
2
q = 2
q=2),一组有 13 个元素(
N
1
=
13
N_1 = 13
N1=13),另一组有 7 个(
N
2
=
7
N_2 = 7
N2=7)。因此,信息增益为:
I
G
(
x
≤
12
)
=
S
0
−
13
20
S
1
−
7
20
S
2
≈
0.16.
IG(x \leq 12) = S_0 - \frac{13}{20}S_1 - \frac{7}{20}S_2 \approx 0.16.
IG(x≤12)=S0−2013S1−207S2≈0.16.
结果表明,根据「坐标小于或等于12」将球分为两组带来了一个更有序的系统。让我们继续分组,直到每组中的球颜色都一样。
上图可见,右边那组只需根据「坐标小于或等于 18」再分割一次即可。而左边那组还需要三次分割。注意,若组内所有球的颜色都一样,那么这个组的熵为 0(
log
2
1
=
0
\log_2{1} = 0
log21=0)。
通过这个例子,我们成功构建了一个基于球的位置预测球颜色的决策树。但倘若我们再向里面增加一个球,这个决策树就可能无法很好地工作,因为它完全拟合了训练集(初始的 20 球)。如果希望提升它的泛用性,那么一棵具有更少分支(「问题」)的决策树将有更好的效果。
上面我们讨论了熵是如何衡量树的分区的,但还有其他指标来衡量分割的好坏:
(2) 基尼指数(Gini Index)
(3)误分类率(Misclassification error)
对于二类问题:
实践中几乎从不使用错分率,而基尼不确定性和信息增益的效果差不多。
二元分类问题的熵和基尼不确定性为:
S
=
−
p
+
log
2
p
+
−
p
−
log
2
p
−
=
−
p
+
log
2
p
+
−
(
1
−
p
+
)
log
2
(
1
−
p
+
)
S = -p_+ \log_2{p_+} -p_- \log_2{p_-} = -p_+ \log_2{p_+} -(1 - p_{+}) \log_2{(1 - p_{+})}
S=−p+log2p+−p−log2p−=−p+log2p+−(1−p+)log2(1−p+)
G
=
1
−
p
+
2
−
p
−
2
=
1
−
p
+
2
−
(
1
−
p
+
)
2
=
2
p
+
(
1
−
p
+
)
G = 1 - p_+^2 - p_-^2 = 1 - p_+^2 - (1 - p_+)^2 = 2p_+(1-p_+)
G=1−p+2−p−2=1−p+2−(1−p+)2=2p+(1−p+)
其中
p
+
p_+
p+ 是对象具有标签 + 的概率。
以
p
+
p_+
p+ 为坐标,绘制上面两个函数的图像。
import warnings
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set()
warnings.filterwarnings('ignore')
plt.figure(figsize=(6, 4)) #画布大小
xx = np.linspace(0, 1, 50) #0-1的等差数列,50个数
plt.plot(xx, [2 * x * (1-x) for x in xx], label='gini')
plt.plot(xx, [4 * x * (1-x) for x in xx], label='2*gini')
plt.plot(xx, [-x * np.log2(x) - (1-x) * np.log2(1 - x)
for x in xx], label='entropy')
plt.plot(xx, [1 - max(x, 1-x) for x in xx], label='missclass')
plt.plot(xx, [2 - 2 * max(x, 1-x) for x in xx], label='2*missclass')
plt.xlabel('p+')
plt.ylabel('criterion')
plt.title('Criteria of quality as a function of p+ (binary classification)')
plt.legend()
上图可见,熵的图像和两倍的基尼不确定性图像非常接近。因此,在实践中,这两个指标的效果基本上是一样的。
信息熵越大,信息不确定性越大,纯度越低。
基尼指数越小,数据集的纯度越高
3.信息增益
(1)信息增益( ID3算法 ):
信息增益:在划分数据集之前之后信息发生的变化。按照属性的特征值划分数据集,计算信息增益,获得信息增益最高的属性就是最好的选择。
举例: ①求信息熵:
②求信息增益:
以属性“色泽”为例,其对应的3个数据子集分别为:
D1(色泽=青绿),D2(色泽=乌黑),D3(色泽=浅白)
子集D1包含的编号为{1,4,6,10,13,17}的6个样例,其中正例占 P1 = 3/6 ,反例占 P2 = 3/6 ;D2、D3同理,3个结点的信息熵为:
计算得属性“色泽”的信息增益为:
同理计算其他的信息增益:
纹理”的信息增益最大,其被选为划分属性:
对每个分支结点作进一步划分,最终得到决策树:
(2)信息增益率( C4.5算法 ):
熵和Gini指标等不纯性度量往往有利于具有大量不同值的属性(例如:考虑将“编号”作为一个属性),这里引入一个新的度量,增益率:
增益率是划分增益与划分信息的比:
其中,IV为划分信息,又称划分的熵。
属性 a 的可能取值数目越多 (即 V 越大),则 IV(a) 的值(属性固有值)通常就越大。
举例:
以色泽为例,
D1(色泽=青绿)={1,4,6,10,13,17}6个样例(3正,3负)
D2(色泽=乌黑)={2,3,7,8,9,15}6个样例(4正,2负)
D3(色泽=浅白)={5,11,12,14,16}5个样例(1正,4负)
信息增益率为:
(3)基尼指数( CART算法 —分类树):
定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。
基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率
举例:
以色泽为例,
D1(色泽=青绿)={1,4,6,10,13,17}6个样例,3个正例,3个反例
D2(色泽=乌黑)={2,3,7,8,9,15}6个样例,4个正例,2个反例
D3(色泽=浅白)={5,11,12,14,16}5个样例,1个正例,4个反例
求色泽的基尼指数:
三、剪枝处理
过拟合:在决策树学习过程中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这时就可能会因训练样本学得太好,以致于把训练集自身的一些特点当作所有数据都具有的一般性质导致过拟合。
剪枝:对付过拟合的一种重要手段,通过主动去掉一些分支来降低过拟合的风险。
基本策略:预剪枝和后剪枝。
预剪枝:就是在构建决策树的时候提前停止。比如指定树的深度最大为3,那么训练出来决策树的高度就是3,预剪枝主要是建立某些规则限制决策树的生长,降低了过拟合的风险,降低了建树的时间,但是有可能带来欠拟合问题。
后剪枝:后剪枝是一种全局的优化方法,在决策树构建好之后,然后才开始进行剪枝。后剪枝的过程就是删除一些子树,这个叶子节点的标识类别通过大多数原则来确定,即属于这个叶子节点下大多数样本所属的类别就是该叶子节点的标识。选择减掉哪些子树时,可以计算没有减掉子树之前的误差和减掉子树之后的误差,如果相差不大,可以将子树减掉。一般使用后剪枝得到的结果比较好。
如何评估:留出法,即预留一部分数据用作“验证集”以进行性能评估。
举例:
我们将西瓜数据集随机分成两部分,如图1.1所示:
假设我们采用信息增益准则来进行划分属性选择,则生成如下决策树图1.2:
1、预剪枝
基于信息增益准则,我们会选取属性“脐部”来对测试集进行划分,并产生三个分支。然而,是否应该进行这个划分呢?预剪枝要对划分前后的泛化性能进行估计。
划分之前,所有样例集中在根结点,图2.1:
在用属性“脐部”划分之后,如图2.2:
基于预剪枝策略从表1.1数据所生成的决策树如图2.3:
2、后剪枝
后剪枝先从训练集中生成一棵完整的决策树,其验证集精度测得为 42.9%。
首先考虑结点⑥,若将其替换为叶结点,根据落在其上的训练样例{7,15},将其标记为“好瓜”,测得验证集精度提高至 57.1%,于是决定剪枝:
然后考虑结点⑤,若将其替换为叶结点,根据落在其上的训练样例{6,7,15},将其标记为“好瓜”,测得验证集精度仍为 57.1%,可以不剪枝:
对结点②,若将其替换为叶结点,根据落在其上的训练样例{1,2,3,14},将其标记为“好瓜”,测得验证集精度提升至 71.4%,决定剪枝:
对结点③和①,先后替换为叶结点,均未测得验证集精度提升,于是不剪枝:
最终,后剪枝得到的决策树:
总结:
对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。
五、决策树的优缺点
决策树算法的优点
1)简单直观,生成的决策树很直观。
2)基本不需要预处理,不需要提前归一化,处理缺失值。
3)使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数。
4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
5)可以处理多维度输出的分类问题。
6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
8) 对于异常点的容错能力好,健壮性高。
决策树算法的缺点
1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
6)决策树在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的,这个可通过多变量决策树(multi-variate decision tree)进行改善。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策,算法的代表是OC1。
参考文档链接:
https://blog.csdn.net/familyshizhouna/article/details/72551841
https://blog.csdn.net/weixin_41609899/article/details/79101532
https://blog.csdn.net/angela_6074/article/details/60964709
https://blog.csdn.net/weixin_41577426/article/details/100777776
https://blog.csdn.net/wyqwilliam/article/details/82413973
https://www.cnblogs.com/muzixi/p/6566803.html
https://www.cnblogs.com/lsm-boke/p/12256676.html
https://www.cnblogs.com/lsm-boke/p/12256686.html
https://www.cnblogs.com/dennis-liucd/p/7905793.html