决策树算法
1 概述
决策树是一种基本的分类与回归方法。这里主要讨论用于分类的决策树。
2 算法特点
- 优点:计算复杂度不高,输出结果易于理解,对中间值的确实不敏感。可以处理不相关特征数据。
- 缺点:可能会产生过度匹配问题。
- 适用数据类型:数值型和标称型。
3 算法原理
分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if-then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布。
4 构造决策树
在构造决策树前,先抛出两个问题:
- 如何确认由上到下的每一个非叶结点,假定每个非叶结点表示一个用于分类的特征,那么如何确认它在结点的位置呢?
- 当叶子结点足够多的时候,往往对训练样本的数据分类很准确,但对未知的测试数据分类缺没有那么准确,即出现过拟合现象,那么该如何避免呢?
构造决策树主要方式:
❐用决策树的生成算法来选择特征作为结点的特征
❐用决策树的剪枝来简化生成的决策树
4.1 决策树的生成算法
在使用生成算法前,必须要搞清楚三个重要概念:熵、信息增益、信息增益比。
(1)熵
熵是表示随机变量不确定性的度量,设
X
X
X是一个离散的型随机变量,其概率分布为:
P
(
X
=
x
i
⃗
)
=
p
i
,
i
=
1
,
2
,
⋯
,
n
P(X=\vec{x_{i}})=p_{i},i=1,2,\cdots ,n
P(X=xi)=pi,i=1,2,⋯,n
则随机变量
X
X
X的熵定义为
H
(
X
)
=
−
∑
i
=
1
n
p
i
l
o
g
p
i
H(X)=-\sum_{i=1}^{n}p_{i}logp_{i}
H(X)=−i=1∑npilogpi
其中式中对数一般以2为底。
熵的作用是啥?直白的说就是表示样本中的混乱程度,熵值越大越混乱。举个例子:
A = [11111]
B = [12345]
H(A) = -log1=0
H(B) = -5(1/5*log1/5)
很显然B的熵值要大于A的熵值,也就是说B的混乱程度更高。
(2)样本集合D对特征A的信息增益(ID3)
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
D
l
o
g
2
∣
C
k
∣
D
H(D)=-\sum_{k=1}^{K}\frac{|C_{k}|}{D}log_{2}\frac{|C_{k}|}{D}
H(D)=−k=1∑KD∣Ck∣log2D∣Ck∣
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
D
H
(
D
i
)
H(D|A)=\sum_{i=1}^{n}\frac{|D_{i}|}{D}H(D_{i})
H(D∣A)=i=1∑nD∣Di∣H(Di)
其中,
H
(
D
)
H(D)
H(D)是数据集D的熵,
H
(
D
i
)
H(D_{i})
H(Di)是数据集
D
i
D_{i}
Di的熵,
H
(
D
∣
A
)
H(D|A)
H(D∣A)是数据集D对特征A的条件熵。
H
(
D
i
)
H(D_{i})
H(Di)是D中特征A取第
i
i
i个值的样本自己,
H
(
C
k
)
H(C_{k})
H(Ck)是
D
D
D中属于第
k
k
k类的样本子集,
n
n
n是特征A取值的个数,K是类的个数。
示例:采用《统计学习方法》书中示例
首先计算出经验熵
H
(
D
)
H(D)
H(D),从表类别
字段可以看到总共有两个分类,是
有9个,否
有6个。
H
(
D
)
=
−
9
15
l
o
g
2
9
15
−
6
15
l
o
g
2
6
15
=
0.971
H(D)= -\frac{9}{15}log_{2}\frac{9}{15}-\frac{6}{15}log_{2}\frac{6}{15}=0.971
H(D)=−159log2159−156log2156=0.971
然后求取信息增益值,寻找最优特征
g
(
D
,
′
年
龄
′
)
=
H
(
D
)
−
[
5
15
H
(
′
青
年
′
)
+
5
15
H
(
′
中
年
′
)
+
5
15
H
(
′
老
年
′
)
]
=
0.971
−
[
5
15
(
−
2
5
l
o
g
2
2
5
−
3
5
l
o
g
2
3
5
)
+
5
15
(
−
3
5
l
o
g
2
3
5
−
2
5
l
o
g
2
2
5
)
+
5
15
(
−
4
5
l
o
g
2
4
5
−
1
5
l
o
g
2
1
5
)
]
=
0.0803
g(D,'年龄')=H(D) -[\frac{5}{15}H('青年')+\frac{5}{15}H('中年')+\frac{5}{15}H('老年')] =0.971-[\frac{5}{15}(-\frac{2}{5}log_{2}\frac{2}{5}-\frac{3}{5}log_{2}\frac{3}{5})+ \frac{5}{15}(-\frac{3}{5}log_{2}\frac{3}{5}-\frac{2}{5}log_{2}\frac{2}{5}) +\frac{5}{15}(-\frac{4}{5}log_{2}\frac{4}{5}-\frac{1}{5}log_{2}\frac{1}{5})]=0.0803
g(D,′年龄′)=H(D)−[155H(′青年′)+155H(′中年′)+155H(′老年′)]=0.971−[155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)]=0.0803
即
g
(
D
,
′
年
龄
′
)
=
0.083
g(D,'年龄')=0.083
g(D,′年龄′)=0.083
同理求得:
g
(
D
,
′
有
工
作
′
)
=
0.324
g(D,'有工作')=0.324
g(D,′有工作′)=0.324
g
(
D
,
′
有
自
己
的
房
子
′
)
=
0.420
g(D,'有自己的房子')=0.420
g(D,′有自己的房子′)=0.420
g
(
D
,
′
信
贷
情
况
′
)
=
0.363
g(D,'信贷情况')=0.363
g(D,′信贷情况′)=0.363
很明显特征有自己的房子
的信息增益值最大,所以该特征作为分类的最优特征。
(3)样本集合D对特征A的信息增益比(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)
其中,
g
(
D
,
A
)
g(D,A)
g(D,A)是信息增益,
H
A
(
D
)
H_{A}(D)
HA(D)是D关于特征A的值的熵。
示例:
g
(
D
,
′
年
龄
′
)
=
0.083
g(D,'年龄')=0.083
g(D,′年龄′)=0.083
H
′
年
龄
′
(
D
)
=
5
15
H
(
′
青
年
′
)
+
5
15
H
(
′
中
年
′
)
+
5
15
H
(
′
老
年
′
)
=
5
15
(
−
2
5
l
o
g
2
2
5
−
3
5
l
o
g
2
3
5
)
+
5
15
(
−
3
5
l
o
g
2
3
5
−
2
5
l
o
g
2
2
5
)
+
5
15
(
−
4
5
l
o
g
2
4
5
−
1
5
l
o
g
2
1
5
)
=
0.888
H_{'年龄'}(D) =\frac{5}{15}H('青年')+\frac{5}{15}H('中年')+\frac{5}{15}H('老年')=\frac{5}{15}(-\frac{2}{5}log_{2}\frac{2}{5}-\frac{3}{5}log_{2}\frac{3}{5})+ \frac{5}{15}(-\frac{3}{5}log_{2}\frac{3}{5}-\frac{2}{5}log_{2}\frac{2}{5}) +\frac{5}{15}(-\frac{4}{5}log_{2}\frac{4}{5}-\frac{1}{5}log_{2}\frac{1}{5})=0.888
H′年龄′(D)=155H(′青年′)+155H(′中年′)+155H(′老年′)=155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)=0.888
g
R
(
D
,
A
)
=
g
(
D
,
′
年
龄
′
)
H
′
年
龄
′
(
D
)
=
0.093
g_{R}(D,A)=\frac{g(D,'年龄')}{H_{'年龄'}(D) }=0.093
gR(D,A)=H′年龄′(D)g(D,′年龄′)=0.093
为啥要引入信息增益比呢?
ID3算法有一定的缺陷,比如说如何将表中ID作为一个分类特征
那么使用ID3得到的结果为:
g
(
D
,
′
I
D
′
)
=
H
(
D
)
−
0
=
0.971
g(D,'ID')=H(D) - 0=0.971
g(D,′ID′)=H(D)−0=0.971,则算法认为ID的信息增益最为显著,所以判定特征ID为重要特征,这显然是有误的,而使用信息增益比的C4.5算法则不会出现这种情况。
(4)样本集合D的基尼指数(CART)
G
i
n
i
(
D
)
=
1
−
∑
K
k
=
1
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=1-\sum_{K}^{k=1}\left ( \frac{|C_{k}|}{|D|} \right )^{2}
Gini(D)=1−K∑k=1(∣D∣∣Ck∣)2
特征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)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
假设有
K
K
K个分类,样本属于第
k
k
k类的概率为
p
k
=
p
(
y
=
c
k
)
p_{k}=p(y=c_{k})
pk=p(y=ck)则概率分布的基尼指数为:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
k
p
k
2
Gini(p)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{k}p_{k}^{2}
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑kpk2
对于二分类问题,若样本点属于第1个类得概率为p,则概率分布得基尼指数为:
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p)=2p(1-p)
Gini(p)=2p(1−p)
示例:
字段年龄
G
i
n
i
(
D
,
‘
年
龄
‘
=
′
青
年
′
)
=
5
15
(
2
×
2
5
×
(
1
−
2
5
)
)
+
10
15
(
2
×
7
10
×
(
1
−
7
10
)
)
=
0.44
Gini(D,`年龄`='青年')=\frac{5}{15}(2\times \frac{2}{5}\times (1-\frac{2}{5}))+\frac{10}{15}(2\times \frac{7}{10}\times (1-\frac{7}{10}))=0.44
Gini(D,‘年龄‘=′青年′)=155(2×52×(1−52))+1510(2×107×(1−107))=0.44
G
i
n
i
(
D
,
‘
年
龄
‘
=
′
中
年
′
)
=
0.48
Gini(D,`年龄`='中年')=0.48
Gini(D,‘年龄‘=′中年′)=0.48
G
i
n
i
(
D
,
‘
年
龄
‘
=
′
老
年
′
)
=
0.44
Gini(D,`年龄`='老年')=0.44
Gini(D,‘年龄‘=′老年′)=0.44
字段有工作
G
i
n
i
(
D
,
‘
有
工
作
‘
=
′
是
′
)
=
0.32
Gini(D,`有工作`='是')=0.32
Gini(D,‘有工作‘=′是′)=0.32
字段有自己的房子
G
i
n
i
(
D
,
‘
有
自
己
的
房
子
‘
=
′
是
′
)
=
0.27
Gini(D,`有自己的房子`='是')=0.27
Gini(D,‘有自己的房子‘=′是′)=0.27
字段信贷情况
G
i
n
i
(
D
,
‘
信
贷
情
况
‘
=
′
非
常
好
′
)
=
0.36
Gini(D,`信贷情况`='非常好')=0.36
Gini(D,‘信贷情况‘=′非常好′)=0.36
G
i
n
i
(
D
,
‘
信
贷
情
况
‘
=
′
好
′
)
=
0.47
Gini(D,`信贷情况`='好')=0.47
Gini(D,‘信贷情况‘=′好′)=0.47
G
i
n
i
(
D
,
‘
信
贷
情
况
‘
=
′
一
般
′
)
=
0.32
Gini(D,`信贷情况`='一般')=0.32
Gini(D,‘信贷情况‘=′一般′)=0.32
基尼指数表示:样本集合中,随机选中一个样本,该样本被分错的概率。基尼指数越小,表示越不容易分错。由结果可知有自己的房子
得基尼指数最小,所以选取有自己的房子 = 是
为最优得切分点,于是根节点生成了两个子结点,一个是叶子结点是
,一个是下一个最优切分点有工作 = 是
以此类推。
4.2 决策树的剪枝
由于生成得决策树存在过拟合问题,需要对它进行剪枝,以简化学到决策树。
决策树剪枝策略:
❐预剪枝:限制深度,叶子结点得个数,叶子结点样本数,信息增益等;一般
❐后剪枝:通过衡量标准,如损失函数
C
a
(
T
)
=
C
(
T
)
+
a
∣
T
∣
C_{a}(T)=C(T)+a|T|
Ca(T)=C(T)+a∣T∣
其中,T为任意子树,
C
(
T
)
C(T)
C(T)为训练数据得预测误差(如基尼指数),
∣
T
∣
|T|
∣T∣为叶子结点个数,
a
≥
0
a\geq 0
a≥0的超参数,叶子结点越多损失越大。
5 python实现
git地址:https://github.com/lingxiaaisuixin/MarchineLearning/tree/master/DecisionTree