介绍
决策树(DecisionTree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
常见的决策树算法有ID3、C4.5以及CART。但在讨论这些之前,我们先了解一下熵的概念。
熵
熵 这个概念最早起源于物理学,在物理学中是用来度量热力学系统的无序程度;而在信息学里,熵则是对不确定性的度量。1948年,香农引入了信息熵,将其定义为离散随机事件出现的概率。一个系统越是有序,信息熵越低,反之一个系统越是混乱,它的信息熵就越高。
假设一个随机变量 X X X 的取值为 X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},每一种值取到的概率分别为 { p 1 , p 2 , . . . , p n } \{p_1, p_2, ..., p_n\} {p1,p2,...,pn},那么熵的定义为 H ( X ) = − ∑ i = 1 n p i l o g 2 p i H(X) = - \sum_{i=1}^n p_i log_2 p_i H(X)=−i=1∑npilog2pi
对于分类模型来说,类别 C C C 是变量,它的取值为 C 1 , C 2 , . . . , C n C_1, C_2, ..., C_n C1,C2,...,Cn,而每个类别出现的概率分别为 P ( C 1 ) , P ( C 2 ) , . . . , P ( C n ) P(C_1), P(C_2), ..., P(C_n) P(C1),P(C2),...,P(Cn), 这里 n 是类别的总数,此时分类模型的熵就可以表示为 H ( C ) = − ∑ i = 1 n P ( C i ) l o g 2 P ( C n ) H(C) = -\sum_{i=1}^n P(C_i) log_2 P(C_n) H(C)=−i=1∑nP(Ci)log2P(Cn)
这是一家高尔夫球俱乐部的历史数据,里面记录了不同天气状况用户来打高尔夫球的历史记录。我们要做的是通过构建决策树来预测用户是否会来打高尔夫球。
日期 | 天气 | 温度 | 湿度 | 风速 | 活动 |
---|---|---|---|---|---|
1 | 晴 | 炎热 | 高 | 弱 | 取消 |
2 | 晴 | 炎热 | 高 | 强 | 取消 |
3 | 阴 | 炎热 | 高 | 弱 | 进行 |
4 | 雨 | 适中 | 高 | 弱 | 进行 |
5 | 雨 | 寒冷 | 正常 | 弱 | 进行 |
6 | 雨 | 寒冷 | 正常 | 强 | 取消 |
7 | 阴 | 寒冷 | 正常 | 强 | 进行 |
8 | 晴 | 适中 | 高 | 弱 | 取消 |
9 | 晴 | 寒冷 | 正常 | 弱 | 进行 |
10 | 雨 | 适中 | 正常 | 弱 | 进行 |
11 | 晴 | 适中 | 正常 | 强 | 进行 |
12 | 阴 | 适中 | 高 | 强 | 进行 |
13 | 阴 | 炎热 | 正常 | 弱 | 进行 |
14 | 雨 | 适中 | 高 | 强 | 取消 |
ID3
ID3 (Iterative Dichotomiser 3),即迭代二叉树 3代。核心思想就是以信息增益来度量属性,优先选择信息增益最大的属性进行分裂。
计算信息熵
数据集中共14个样本,活动 (Label) 包含9个正例和5个负例,当前属性的信息熵计算如下
E
n
t
r
o
p
y
(
S
)
=
−
9
14
l
o
g
2
9
14
−
5
14
l
o
g
2
5
14
=
0.94
Entropy(S) = -\frac{9}{14}log_2\frac{9}{14} - \frac{5}{14}log_2\frac{5}{14} = 0.94
Entropy(S)=−149log2149−145log2145=0.94
以 天气 为例,各分支的信息熵计算如下
E n t r o p y ( 晴 ) = − 2 5 l o g 2 2 5 − 3 5 l o g 2 3 5 = 0.97 Entropy(晴) = -\frac{2}{5}log_2\frac{2}{5} - \frac{3}{5}log_2\frac{3}{5} = 0.97 Entropy(晴)=−52log252−53log253=0.97
E n t r o p y ( 阴 ) = − 4 4 l o g 2 4 4 − 0 ⋅ l o g 2 ⋅ 0 = 0 Entropy(阴) = -\frac{4}{4}log_2\frac{4}{4} - 0·log_2·0 = 0 Entropy(阴)=−44log244−0⋅log2⋅0=0
E n t r o p y ( 雨 ) = − 3 5 l o g 2 3 5 − 2 5 l o g 2 2 5 = 0.97 Entropy(雨) = -\frac{3}{5}log_2\frac{3}{5} - \frac{2}{5}log_2\frac{2}{5} = 0.97 Entropy(雨)=−53log253−52log252=0.97
天气 的信息熵
E
n
t
r
o
p
y
(
天
气
)
=
5
14
⋅
0.97
+
4
14
⋅
0
+
5
14
⋅
0.97
=
0.694
Entropy(天气) = \frac{5}{14}·0.97 + \frac{4}{14}·0 + \frac{5}{14}·0.97 = 0.694
Entropy(天气)=145⋅0.97+144⋅0+145⋅0.97=0.694
同理,其他几个属性的信息熵
E n t r o p y ( 温 度 ) = 0.911 Entropy(温度) = 0.911 Entropy(温度)=0.911
E n t r o p y ( 湿 度 ) = 0.789 Entropy(湿度) = 0.789 Entropy(湿度)=0.789
E n t r o p y ( 风 速 ) = 0.892 Entropy(风速) = 0.892 Entropy(风速)=0.892
计算信息增益
信息增益的计算公式
I
G
(
S
∣
T
)
=
E
n
t
r
o
p
y
(
S
)
−
∑
v
a
l
u
e
(
T
)
∣
S
v
∣
S
E
n
t
r
o
p
y
(
S
v
)
IG(S|T) = Entropy(S) - \sum_{value(T)} \frac{|S_v|}{S} Entropy(S_v)
IG(S∣T)=Entropy(S)−value(T)∑S∣Sv∣Entropy(Sv)
I G ( 天 气 ) = E n t r o p y ( S ) − E n t r o p y ( 天 气 ) = 0.94 − 0.694 = 0.246 IG(天气) = Entropy(S) - Entropy(天气) = 0.94 - 0.694 = 0.246 IG(天气)=Entropy(S)−Entropy(天气)=0.94−0.694=0.246
I G ( 温 度 ) = E n t r o p y ( S ) − E n t r o p y ( 温 度 ) = 0.94 − 0.911 = 0.029 IG(温度) = Entropy(S) - Entropy(温度) = 0.94 - 0.911 = 0.029 IG(温度)=Entropy(S)−Entropy(温度)=0.94−0.911=0.029
I G ( 湿 度 ) = E n t r o p y ( S ) − E n t r o p y ( 湿 度 ) = 0.94 − 0.789 = 0.15 IG(湿度) = Entropy(S) - Entropy(湿度) = 0.94 - 0.789 = 0.15 IG(湿度)=Entropy(S)−Entropy(湿度)=0.94−0.789=0.15
I G ( 风 速 ) = E n t r o p y ( S ) − E n t r o p y ( 风 速 ) = 0.94 − 0.892 = 0.048 IG(风速) = Entropy(S) - Entropy(风速) = 0.94 - 0.892 = 0.048 IG(风速)=Entropy(S)−Entropy(风速)=0.94−0.892=0.048
在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,优先选择最大信息增益的属性来划分。信息增益越大,区分样本的能力越强,越具有代表性。
C4.5
假设,每个属性中的每种类别都只有一个样本,那属性的信息熵就等于零,继续使用信息增益就无法选择出有效分类特征。所以,C4.5在ID3的基础上做出了改进,使用信息增益率对属性进行分裂,以减少信息增益容易选择特征值多的属性的缺点。
计算属性分裂信息度量
H ( 天 气 ) = − 5 14 l o g 2 5 14 − 5 14 l o g 2 5 14 − 4 14 l o g 2 4 14 = 1.577 H(天气) = -\frac{5}{14}log_2\frac{5}{14} -\frac{5}{14}log_2\frac{5}{14} -\frac{4}{14}log_2\frac{4}{14} = 1.577 H(天气)=−145log2145−145log2145−144log2144=1.577
H ( 温 度 ) = − 4 14 l o g 2 4 14 − 6 14 l o g 2 6 14 − 4 14 l o g 2 4 14 = 1.556 H(温度) = -\frac{4}{14}log_2\frac{4}{14} -\frac{6}{14}log_2\frac{6}{14} -\frac{4}{14}log_2\frac{4}{14} = 1.556 H(温度)=−144log2144−146log2146−144log2144=1.556
H ( 湿 度 ) = − 7 14 l o g 2 7 14 − 7 14 l o g 2 7 14 = 1.0 H(湿度) = -\frac{7}{14}log_2\frac{7}{14} -\frac{7}{14}log_2\frac{7}{14} = 1.0 H(湿度)=−147log2147−147log2147=1.0
H ( 风 速 ) = − 6 14 l o g 2 6 14 − 8 14 l o g 2 8 14 = 0.048 H(风速) = -\frac{6}{14}log_2\frac{6}{14} -\frac{8}{14}log_2\frac{8}{14} = 0.048 H(风速)=−146log2146−148log2148=0.048
计算信息增益率
I G R ( 天 气 ) = I G ( 天 气 ) / H ( 天 气 ) = 0.246 / 1.577 = 0.155 IGR(天气) = IG(天气) / H(天气) = 0.246 / 1.577 = 0.155 IGR(天气)=IG(天气)/H(天气)=0.246/1.577=0.155
I G R ( 温 度 ) = I G ( 温 度 ) / H ( 温 度 ) = 0.029 / 1.556 = 0.0186 IGR(温度) = IG(温度) / H(温度) = 0.029 / 1.556 = 0.0186 IGR(温度)=IG(温度)/H(温度)=0.029/1.556=0.0186
I G R ( 湿 度 ) = I G ( 湿 度 ) / H ( 湿 度 ) = 0.151 / 1.0 = 0.151 IGR(湿度) = IG(湿度) / H(湿度) = 0.151 / 1.0 = 0.151 IGR(湿度)=IG(湿度)/H(湿度)=0.151/1.0=0.151
I G R ( 风 速 ) = I G ( 风 速 ) / H ( 风 速 ) = 0.048 / 0.985 = 0.048 IGR(风速) = IG(风速) / H(风速) = 0.048 / 0.985 = 0.048 IGR(风速)=IG(风速)/H(风速)=0.048/0.985=0.048
C4.5有效克服了ID3中存在的多值属性的问题,计算每一个属性所带来的信息增益率,优先选择最大信息增益率的属性来划分。信息增益率越大,区分样本的能力越强,越具有代表性。
CART
无论是 ID3 还是 C4.5,都是基于熵的模型,里面会涉及到大量的对数运算,我们能否在此基础上进行简化,节省运算时间?于是就有了 GINI指数。
GINI指数公式
G
I
N
I
(
D
)
=
∑
i
=
1
k
p
k
⋅
(
1
−
p
k
)
=
1
−
∑
i
=
1
k
p
k
2
GINI(D) = \sum_{i=1}^k p_k·(1 - p_k) = 1 - \sum_{i=1}^k p_k^2
GINI(D)=i=1∑kpk⋅(1−pk)=1−i=1∑kpk2
基尼指数的意义是从数据集D中随机抽取样本类别标识不一致的概率,基尼指数越小,数据集的纯度越高。
以 天气 为例,各分支的GINI指数计算如下
G i n i ( 晴 ) = 1 − ( 2 5 2 + 3 5 2 ) = 0.48 Gini(晴) = 1 - (\frac{2}{5}^2 + \frac{3}{5}^2) = 0.48 Gini(晴)=1−(522+532)=0.48
G i n i ( 阴 ) = 1 − ( 4 4 2 + 0 0 2 ) = 0 Gini(阴) = 1 - (\frac{4}{4}^2 + \frac{0}{0}^2) = 0 Gini(阴)=1−(442+002)=0
G i n i ( 雨 ) = 1 − ( 3 5 2 + 2 5 2 ) = 0.48 Gini(雨) = 1 - (\frac{3}{5}^2 + \frac{2}{5}^2) = 0.48 Gini(雨)=1−(532+522)=0.48
天气 的GINI指数
G
i
n
i
(
天
气
)
=
5
14
⋅
0.48
+
4
14
⋅
0
+
5
14
⋅
0.48
=
0.342
Gini(天气) = \frac{5}{14}·0.48 + \frac{4}{14}·0 + \frac{5}{14}·0.48 = 0.342
Gini(天气)=145⋅0.48+144⋅0+145⋅0.48=0.342
同理,其他几个属性的GINI指数
G i n i ( 温 度 ) = 0.439 Gini(温度) = 0.439 Gini(温度)=0.439
G i n i ( 湿 度 ) = 0.367 Gini(湿度) = 0.367 Gini(湿度)=0.367
G i n i ( 风 速 ) = 0.428 Gini(风速) = 0.428 Gini(风速)=0.428
Gini系数越小,属性的纯度越高。
剪枝
决策树的基本剪枝策略有 预剪枝 (Pre-Pruning) 和 后剪枝 (Post-Pruning) 。首先将数据集划分成训练集和验证集,训练集用来决定树生成过程中每个结点划分所选择的属性;验证集在预剪枝中用于决定该结点是否有必要依据该属性进行展开,在后剪枝中用于判断该结点是否需要进行剪枝。
预剪枝
在每一次实际对结点进行划分之前,先采用验证集的数据来验证如果划分是否能提高划分的准确性。如果不能,就把结点标记为叶结点并退出进一步划分;如果可以就继续递归生成节点。
后剪枝
后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。
优缺点对比
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 | 分类变量 | 样本量 |
---|---|---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 | 分类变量 | 已退出舞台 |
C4.5 | 分类 | 多叉树 | 信息增益率 | 支持 | 支持 | 支持 | 连续变量和分类变量 | 小样本 |
CART | 分类、回归 | 二叉树 | GINI系数/均方差 | 支持 | 支持 | 支持 | 连续变量和分类变量 | 大样本 |