决策树是一种分类算法。我们将通过一个经典的例子逐步了解决策树。假设我们要根据天气状况决策是否进行羽毛球训练,且有14天的历史数据供我们建立模型。如下:
Day | Outlook | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|---|
D1 | Sunny | Hot | High | Weak | No |
D2 | Sunny | Hot | High | Strong | No |
D3 | Overcast | Hot | High | Weak | Yes |
D4 | Rain | Mild | High | Weak | Yes |
D5 | Rain | Cool | Normal | Weak | Yes |
D6 | Rain | Cool | Normal | Strong | No |
D7 | Overcast | Cool | Normal | Strong | Yes |
D8 | Sunny | Mild | High | Weak | No |
D9 | Sunny | Cool | Normal | Weak | Yes |
D10 | Rain | Mild | Normal | Weak | Yes |
D11 | Sunny | Mild | Normal | Strong | Yes |
D12 | Overcast | Mild | High | Strong | Yes |
D13 | Overcast | Hot | Normal | Weak | Yes |
D14 | Rain | Mild | High | Strong | No |
决策树,顾名思义,就是要构建出一棵树状模型,将训练集中的不同类数据分隔开,尽可能地让叶子节点包含”纯“的同类数据。内点(非叶子节点)是特征项,分支是父节点特征不同的取值,树叶(叶子节点)是分类结果。自此,迎来了构建决策树过程中的第一个问题,根节点如何选择?经典的ID3算法引入了概念——熵,并用信息增益的大小作为选择根节点的标准。
定义一:
熵,用以描述某一集合、状态的不确定性。集合中的样本越统一,熵值越小;样本越随机,熵值越大。状态越稳定,熵值越小,反之熵值越大。公式如下:
E n t r o p y ( S ) ≡ ∑ i = 1 c − p i log 2 p i Entropy(S) \equiv \sum\limits_{i=1}^c -p_i \log_2 p_i Entropy(S)≡i=1∑c−pilog2pi
其中, p i p_i pi表示某集合中类别 i i i所占比列,或者是某状态现象 i i i出现的概率。定义 0 log 0 = 0 0 \log0 = 0 0log0=0。
以文章开头的决策是否进行羽毛球训练为例。当历史数据中
P
l
a
y
T
e
n
n
i
s
PlayTennis
PlayTennis全为
Y
e
s
Yes
Yes或
N
o
No
No时,熵值为
0
0
0;当
P
l
a
y
T
e
n
n
i
s
PlayTennis
PlayTennis一半为
Y
e
s
Yes
Yes,一半为
N
o
No
No时,熵值为
1
1
1;其余情况,熵值在
0
0
0到
1
1
1之间。如下图:
历史数据中的熵值为:
E
n
t
r
o
p
y
(
[
9
+
,
5
−
]
)
=
−
(
9
/
14
)
log
2
(
9
/
14
)
−
(
5
/
14
)
log
2
(
5
/
14
)
=
0.940
Entropy([9+,5-]) = -(9/14)\log_2(9/14) - (5/14)\log_2(5/14) = 0.940
Entropy([9+,5−])=−(9/14)log2(9/14)−(5/14)log2(5/14)=0.940
定义二:
集合 S S S在特征 A A A下的信息增益定义为集合 S S S通过特征 A A A分支演变成集合 S v S_v Sv的熵值减小(即集合 S S S中的样本由随机变得统一)。公式如下:
G a i n ( S , A ) ≡ E n t r o p y ( S ) − ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ E n t r o p y ( S v ) Gain(S, A) \equiv Entropy(S) - \sum\limits_{v \in Values(A)} \frac {\vert S_v \vert}{\vert S \vert}Entropy(S_v) Gain(S,A)≡Entropy(S)−v∈Values(A)∑∣S∣∣Sv∣Entropy(Sv)
以文章开头的决策是否进行羽毛球训练为例。历史数据在特征
W
i
n
d
Wind
Wind下的信息增益计算如下:
V
a
l
u
e
s
(
W
i
n
d
)
=
W
e
a
k
,
S
t
r
o
n
g
S
=
[
9
+
,
5
−
]
S
W
e
a
k
←
[
6
+
,
2
−
]
S
S
t
r
o
n
g
←
[
3
+
,
3
−
]
G
a
i
n
(
S
,
W
i
n
d
)
=
E
n
t
r
o
p
y
(
S
)
−
∑
v
∈
[
W
e
a
k
,
S
t
r
o
n
g
]
∣
S
v
∣
∣
S
∣
E
n
t
r
o
p
y
(
S
v
)
=
E
n
t
r
o
p
y
(
S
)
−
(
8
/
14
)
E
n
t
r
o
p
y
(
S
W
e
a
k
)
−
(
6
/
14
)
E
n
t
r
o
p
y
(
S
S
t
r
o
n
g
)
=
0.940
−
(
8
/
14
)
0.811
−
(
6
/
14
)
1.00
=
0.048
Values(Wind) = Weak, Strong \\ S = [9+, 5-] \\ S_{Weak} \leftarrow [6+, 2-] \\ S_{Strong} \leftarrow [3+, 3-] \\ \begin{aligned} &Gain(S, Wind) = Entropy(S) - \sum\limits_{v \in [Weak, Strong]} \frac {\vert S_v \vert}{\vert S \vert}Entropy(S_v) \\ & = Entropy(S) - (8/14)Entropy(S_{Weak}) - (6/14)Entropy(S_{Strong}) \\ & = 0.940 - (8/14)0.811 - (6/14)1.00 \\ & = 0.048 \end{aligned}
Values(Wind)=Weak,StrongS=[9+,5−]SWeak←[6+,2−]SStrong←[3+,3−]Gain(S,Wind)=Entropy(S)−v∈[Weak,Strong]∑∣S∣∣Sv∣Entropy(Sv)=Entropy(S)−(8/14)Entropy(SWeak)−(6/14)Entropy(SStrong)=0.940−(8/14)0.811−(6/14)1.00=0.048
ID3算法通过计算每个特征的信息增益,选择信息增益最大(分类效果最好)的特征作为当前树的节点。构建过树节点的特征将不再加入到信息增益的计算中。以文章开头的决策是否进行羽毛球训练为例,构建决策树模型的根节点。先计算每个特征的信息增益:
G
a
i
n
(
S
,
O
u
t
l
o
o
k
)
=
0.246
G
a
i
n
(
S
,
H
u
m
i
d
i
t
y
)
=
0.151
G
a
i
n
(
S
,
W
i
n
d
)
=
0.048
G
a
i
n
(
S
,
T
e
m
p
e
r
a
t
u
r
e
)
=
0.029
Gain(S, Outlook) = 0.246 \\ Gain(S, Humidity) = 0.151 \\ Gain(S, Wind) = 0.048 \\ Gain(S, Temperature) = 0.029
Gain(S,Outlook)=0.246Gain(S,Humidity)=0.151Gain(S,Wind)=0.048Gain(S,Temperature)=0.029
计算得知,特征
O
u
t
l
o
o
k
Outlook
Outlook的信息增益最大,选其作为根节点。如下:
继续计算集合
S
S
u
n
n
y
S_{Sunny}
SSunny在剩余特征下的信息增益:
G
a
i
n
(
S
S
u
n
n
y
,
H
u
m
i
d
i
t
y
)
=
0.970
G
a
i
n
(
S
S
u
n
n
y
,
T
e
m
p
e
r
a
t
u
r
e
)
=
0.570
G
a
i
n
(
S
S
u
n
n
y
,
W
i
n
d
)
=
0.019
Gain(S_{Sunny}, Humidity) = 0.970 \\ Gain(S_{Sunny}, Temperature) = 0.570 \\ Gain(S_{Sunny}, Wind) = 0.019
Gain(SSunny,Humidity)=0.970Gain(SSunny,Temperature)=0.570Gain(SSunny,Wind)=0.019
选择信息增益最大的
H
u
m
i
d
i
t
y
Humidity
Humidity作为
S
S
u
n
n
y
S_{Sunny}
SSunny的特征节点。如下:
如此重复,最后此例完整的决策树如下:
细心的读者会发现,尽管特征 D a y Day Day的信息增益最大, G a i n ( S , D a y ) = 0.940 Gain(S, Day) = 0.940 Gain(S,Day)=0.940,它并没有被用来当作根节点。因为特征 D a y Day Day会导致生成的决策树模型过拟合。然而,用信息增益的方式却无法识别、并避免这种情况。因此,引入信息增益率来选择特征节点。
定义三:
信息增益率,通过引入split information项来抵消过大的信息增益。split information公式如下:
S p l i t I n f o r m a t i o n ( S , A ) ≡ − ∑ i = 1 c ∣ S i ∣ ∣ S ∣ log 2 ∣ S i ∣ ∣ S ∣ SplitInformation(S, A) \equiv - \sum\limits_{i=1}^c \frac {\vert S_i \vert}{\vert S \vert} \log_2 \frac {\vert S_i \vert}{\vert S \vert} SplitInformation(S,A)≡−i=1∑c∣S∣∣Si∣log2∣S∣∣Si∣
信息增益率公式如下:
G a i n R a t i o ( S , A ) ≡ G a i n ( S , A ) S p l i t I n f o r m a t i o n ( S , A ) GainRatio(S, A) \equiv \frac {Gain(S, A)} {SplitInformation(S, A)} GainRatio(S,A)≡SplitInformation(S,A)Gain(S,A)
以羽毛球训练为例, G a i n R a t i o ( S , D a y ) = 0.940 3.807 = 0.247 GainRatio(S, Day) = \frac {0.940}{3.807} = 0.247 GainRatio(S,Day)=3.8070.940=0.247, G a i n R a t i o ( S , O u t l o o k ) = 0.246 1.577 = 0.156 GainRatio(S, Outlook) = \frac {0.246}{1.577} = 0.156 GainRatio(S,Outlook)=1.5770.246=0.156, G a i n R a t i o ( S , H u m i d i t y ) = 0.151 1.0 = 0.151 GainRatio(S, Humidity) = \frac {0.151}{1.0} = 0.151 GainRatio(S,Humidity)=1.00.151=0.151。通过计算可以发现,尽管没能避免特征 D a y Day Day被选作根节点,但是有效地降低了特征 D a y Day Day的影响。本例中 D a y Day Day是一个十分极端的个例,在实际应用中信息增益率比信息增益能更好地挑选特征节点。
除此之外,决策树的规模过大也会导致树模型过拟合。到一定程度,树模型的分类准确率会随着树规模的增大而递减。因此,决策树的建立需要受剪枝策略的限制。剪枝策略分为前剪枝和后剪枝:
- 前剪枝:限制树的深度,或者规定叶子节点的最小样本数。(实施难度较小,但是很难提前预知树模型的最佳规模)
- 后剪枝:先构建出一棵完整的决策树,再根据剪枝不影响树模型分类准确率的前提,对树进行剪枝。(理论上效果比前剪枝好,但是实施难度较大)
最后,除了可以通过信息增益和信息增益率来选择特征节点外,还可以基于某特征获取成本的考虑来选择特征节点。这是基于实际的考虑,例如:病人病症的分类预测。某些检查可能十分昂贵,因此,需要尽可能地利用普通检查的结果来做分类。此种考虑常用的计算公式如下:
G
a
i
n
2
(
S
,
A
)
C
o
s
t
(
A
)
\frac {Gain^2(S,A)}{Cost(A)}
Cost(A)Gain2(S,A)
或者:
2
G
a
i
n
(
S
,
A
)
−
1
(
C
o
s
t
(
A
)
+
1
)
w
\frac {2^{Gain(S, A)} -1}{(Cost(A) +1)^w}
(Cost(A)+1)w2Gain(S,A)−1
其中,
w
∈
[
0
,
1
]
w \in [0,1]
w∈[0,1]是一个常量,用以权衡成本和信息增益之间的重要性。
补充
除了将决策树应用于分类问题之外,还可以将其输出作为其它机器学习算法的输入,这个思想很重要!!!
构建一个大的决策树容易导致树模型过拟合。因此,我们可以基于特征的若干子集构建若干个小决策树,每个小决策树就像是它所处特征集里的“专家”。每个“专家”基于自己的知识给某条数据返回一个 { 0 , 1 } \{0,1\} {0,1}标签。例如:如果我们有100个小决策树,那么就有100个布尔值。这些布尔值构成了一个100维的特征向量。这个特征向量可以作为其它学习算法的输入!