0.参考
1.预备知识
1.1 信息熵(Entropy)
信息熵,可以看作是样本集合纯度一种指标,也可以认为是样本集合包含的平均信息量。
假定当前样本集合 X X X中第 i i i类样本 x i x_i xi 所占的比例为 P ( x i ) ( i = 1 , 2 , . . . , n ) P(x_i)(i=1,2,...,n) P(xi)(i=1,2,...,n),也代表随机事件 X = x i X=x_i X=xi的概率,则 X X X的信息熵定义为: H ( X ) = − ∑ i = 1 n P ( x i ) log 2 P ( x i ) H(X) = -\sum_{i = 1}^nP(x_i)\log_2P(x_i) H(X)=−i=1∑nP(xi)log2P(xi) H ( X ) H(X) H(X)的值越小,则 X X X的纯度越高,蕴含的不确定性越少。
1.2 信息量
信息量是对信息的度量,就跟时间的度量是秒一样
,当我们考虑一个离散的随机变量
x
x
x的时候,当我们观察到的这个变量的一个具体值的时候,我们接收到了多少信息呢?多少信息用信息量来衡量,我们接受到的信息量跟具体发生的事件有关。
信息的大小跟随机事件的概率有关。
越小概率的事情发生了产生的信息量越大,如:某地产生的地震了;越大概率的事情发生了产生的信息量越小,如太阳从东边升起来了(这个事情肯定会发生,没什么信息量)。
所以信息量的大小跟事情不确定性的变化有关
。那么,不确定性的变化跟什么有关呢?
1.跟事情的可能结果的数量有关;
2.跟概率有关。
下面详细解释这两条:
先说1, 例如:我们讨论太阳从哪升起。本来就只有一个结果,我们早就知道,那么无论传递任何信息都是没有信息量的。当可能结果数量比较大时,我们得到的新信息才有潜力拥有大信息量。
再说2,单看可能结果数量不够,还要看初始的概率分布。例如:一开始我就知道小明在电影院的有15*15个座位的A厅看电影。小明可以坐的位置有225个,可能结果数量算多了。可是假如我们一开始就知道小明坐在第一排的最左边的可能是99%,坐其它位置的可能性微乎其微,那么在大多数情况下,你再告诉我小明的什么信息也没有多大用,因为我们几乎确定小明坐第一排的最左边了。
我们将将衡量不确定性的变化的大小叫做信息量
。
信息量起码该满足些什么特点呢?
- 信息量
起码不能为负
,并且信息量和信息量之间可以相加。
假如你告诉我的第一句话的信息量是3,在第一句话的基础上又告诉我一句话,额外信息量是4,那么两句话信息量加起来应该等于7吧!难道还能是5是9?
- 刚刚已经提过,信息量跟概率有关系,但我们应该会觉得,
信息量是连续依赖于概率的。
就是说,某一个概率变化了0.0000001,那么这个信息量不应该变化很大。
刚刚也提过,信息量大小跟可能结果数量有关。
假如每一个可能的结果出现的概率一样,那么对于可能结果数量多的那个事件,新信息有更大的潜力具有更大的信息量,因为初始状态下不确定性更大。也就是随机变量的取值等概率分布的时候,相应的熵最大,
如 x = 0 , 1 x={0,1} x=0,1时, x = 0 x=0 x=0时概率为 p p p, x = 1 x=1 x=1时概率为 1 − p 1-p 1−p,则 H ( X ) = − p log p − ( 1 − p ) log ( 1 − p ) H(X)=-p\log p -(1-p)\log(1-p) H(X)=−plogp−(1−p)log(1−p),当 p = 0.5 p=0.5 p=0.5时, H ( x ) H(x) H(x)最大。
因此一个具体事件的信息量应该是随着其发生概率而递减的
。
但是这个表示信息量函数的形式怎么找呢?
随着概率增大而减少的函数形式太多了
!
还有下面这条性质:
如果我们有俩个不相关的事件 x x x和 y y y,那么我们观察到的俩个事件同时发生时获得的信息应该等于观察到的事件各自发生时获得的信息之和,即: h ( x , y ) = h ( x ) + h ( y ) h(x,y)=h(x)+h(y) h(x,y)=h(x)+h(y)
由于
x
,
y
x,y
x,y是两个独立的事件,那么满足
p
(
x
,
y
)
=
p
(
x
)
⋅
p
(
y
)
p(x,y) = p(x)\cdot p(y)
p(x,y)=p(x)⋅p(y)。
根据上面推导,我们很容易看出
h
(
x
)
h(x)
h(x)一定与
P
(
x
)
P(x)
P(x)的对数有关(因为只有对数形式的真数相乘之后,能够对应对数的相加形式,也就是乘法加对数后变加法)。因此我们有信息量公式如下:
−
log
2
P
(
x
i
)
-\log_2P(x_i)
−log2P(xi)
下面解决两个疑问:
1.为什么有一个负号
其中,负号是为了确保信息一定是正数或者是0( P ( x ) P(x) P(x)只能是0-1),总不能为负数吧!
信息量取概率的负对数,其实是因为信息量的定义是概率的倒数的对数( 1 P ( x i ) \frac{1}{P(x_i)} P(xi)1,这里概率不可能为0)。而用概率的倒数,是为了使概率越大,信息量越小,同时因为概率的倒数大于1,其对数自然大于0了。
2.为什么底数为2
这是因为,我们只需要信息量满足低概率事件x对应于高的信息量。那么对数的选择是任意的。我们只是遵循信息论的普遍传统,使用2作为对数的底!
一个事件的信息量就是这个事件发生的概率的负对数。
1.3 信息量到熵总结
信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望(平均值)——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。信息量的期望: E = h ( x 1 ) p ( x 1 ) + h ( x 1 ) p ( x 1 ) + h ( x 2 ) p ( x 2 ) + h ( x 3 ) p ( x 3 ) + … + h ( x n ) p ( x n ) E = h(x_1)p(x_1) + h(x_1)p(x_1) + h(x_2)p(x_2) + h(x_3)p(x_3) + …+ h(x_n)p(x_n) E=h(x1)p(x1)+h(x1)p(x1)+h(x2)p(x2)+h(x3)p(x3)+…+h(xn)p(xn)即 H ( X ) = − ∑ i = 1 n P ( x i ) log 2 P ( x i ) H(X) = -\sum_{i = 1}^nP(x_i)\log_2P(x_i) H(X)=−i=1∑nP(xi)log2P(xi)
信息熵还可以作为一个系统复杂程度的度量,如果系统越复杂,出现不同情况的种类越多,那么他的信息熵是比较大的。如果一个系统越简单,出现情况种类很少(极端情况为1种情况,那么对应概率为1,那么对应的信息熵为0),此时的信息熵较小。
1.4条件熵和信息增益
条件熵的公式
H
(
Y
∣
X
)
=
−
∑
i
−
1
n
P
(
X
=
x
i
)
H
(
Y
∣
X
=
x
i
)
H(Y|X)=-\sum_{i-1}^nP(X=x_i)H(Y|X=x_i)
H(Y∣X)=−i−1∑nP(X=xi)H(Y∣X=xi)
当熵和条件熵中的概率是由数据估计得到(是训练集训练得到的)时,则为经验熵和经验条件熵。
信息增益
得知特征 X X X而使类 Y Y Y的信息的不确定性减少的程度。
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
其中
D
D
D是训练集,
A
A
A是特征。已知特征
A
A
A,使训练集有了重新的分类,
H
(
D
∣
A
)
H(D|A)
H(D∣A)在变化,哪个特征
A
A
A,使得
g
g
g变化越大,增益就越大,也就是式子中在某特征下训练数据集的熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)越小,则其不确定性越小,对应的信息增益越大,该特征就越好。
算法流程:
输入:训练数据集 D D D和特征 A A A
输出:特征 A A A对 D D D的信息增益 g ( D , A ) g(D,A) g(D,A)
计算经验熵 H ( D ) H(D) H(D): H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K \frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
计算经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A): H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ log 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}^n \frac{|D_i|}{|D|}H(D_i)=\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
这里的经验熵和经验条件熵都是根据已有数据估计得到的,在特征 A A A下每个子集所占的权重为 w i = ∣ D i ∣ ∣ D ∣ w_i=\frac{|D_i|}{|D|} wi=∣D∣∣Di∣
所以经验条件熵可以表示为一个加权和: H ( D ∣ A ) = ∑ i = 1 n w i H ( D i ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ log 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}^n w_i H(D_i)=\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑nwiH(Di)=i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
计算信息增益: g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
可以看出,信息增益就是经验熵和经验条件熵的差值,即得知特征
A
A
A而使类
Y
Y
Y的信息的不确定性减少的程度。
后者越小,说明对应的不确定性最小,意味着如果选择特征
A
A
A为最优特征时,对于分的类是最为确定的,那么就会知道,我们对应的就希望这个信息增益是最大的。
1.5 信息增益例题
例题:简博士决策树:信息增益例题解答
贷款申请样本数据表:
ID | 年龄 | 有工作 | 有自己的房子 | 信贷情况 | 类别 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 一般 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 一般 | 是 |
5 | 青年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 一般 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 非常好 | 是 |
10 | 中年 | 否 | 是 | 非常好 | 是 |
11 | 老年 | 否 | 是 | 非常好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 非常好 | 是 |
15 | 老年 | 否 | 否 | 一般 | 否 |
第一步 计算经验熵公式
在这里我们对应的 D = 15 D=15 D=15类别有两类,分别是:否=6,是=9。
代入计算: H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ = − 6 15 log 2 6 15 − 9 15 log 2 9 15 = 0.971 \begin{aligned}H(D)&=-\sum_{k=1}^K \frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|}\\&=-\frac{6}{15}\log_2\frac{6}{15}-\frac{9}{15}\log_2\frac{9}{15}\\&=0.971\end{aligned} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣=−156log2156−159log2159=0.971
第二步计算经验条件熵公式
分别用 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1,A2,A3,A4表示年龄、是否有工作、是否有自己的房子和信贷情况4个特征。
首先来看一下 A 1 A_1 A1年龄这个特征,这个特征的取值分为 i = 1 i=1 i=1青年、 i = 2 i=2 i=2中年、 i = 3 i=3 i=3老年,对应是否同意贷款类别统计如下:
D|A1 | 年龄 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D1 | 青年 | 5 | 3 | 2 |
D2 | 中年 | 5 | 2 | 3 |
D3 | 老年 | 5 | 1 | 4 |
代入计算:
i
=
1
i=1
i=1青年时:
w
1
=
∣
D
1
∣
∣
D
∣
=
5
15
H
(
D
1
)
=
−
∑
k
=
1
2
∣
D
1
k
∣
∣
D
1
∣
log
2
∣
D
1
k
∣
∣
D
1
∣
=
−
3
5
log
2
3
5
−
2
5
log
2
2
5
=
0.972
w_1=\frac{|D_1|}{|D|}=\frac{5}{15}\\ H(D_1)=-\sum_{k=1}^2\frac{|D_{1k}|}{|D_1|}\log_2\frac{|D_{1k}|}{|D_1|}=-\frac{3}{5}\log_2\frac{3}{5}-\frac{2}{5}\log_2\frac{2}{5}=0.972
w1=∣D∣∣D1∣=155H(D1)=−k=1∑2∣D1∣∣D1k∣log2∣D1∣∣D1k∣=−53log253−52log252=0.972
i
=
2
i=2
i=2中年时:
w
2
=
∣
D
1
∣
∣
D
∣
=
5
15
H
(
D
2
)
=
−
∑
k
=
1
2
∣
D
2
k
∣
∣
D
2
∣
log
2
∣
D
2
k
∣
∣
D
2
∣
=
−
2
5
log
2
2
5
−
3
5
log
2
3
5
=
0.972
w_2=\frac{|D_1|}{|D|}=\frac{5}{15}\\ H(D_2)=-\sum_{k=1}^2\frac{|D_{2k}|}{|D_2|}\log_2\frac{|D_{2k}|}{|D_2|}=-\frac{2}{5}\log_2\frac{2}{5}-\frac{3}{5}\log_2\frac{3}{5}=0.972
w2=∣D∣∣D1∣=155H(D2)=−k=1∑2∣D2∣∣D2k∣log2∣D2∣∣D2k∣=−52log252−53log253=0.972
i
=
3
i=3
i=3老年时:
w
1
=
∣
D
1
∣
∣
D
∣
=
5
15
H
(
D
3
)
=
−
∑
k
=
1
2
∣
D
3
k
∣
∣
D
3
∣
log
2
∣
D
3
k
∣
∣
D
3
∣
=
−
1
5
log
2
1
5
−
4
5
log
2
4
5
=
0.720
w_1=\frac{|D_1|}{|D|}=\frac{5}{15}\\ H(D_3)=-\sum_{k=1}^2\frac{|D_{3k}|}{|D_3|}\log_2\frac{|D_{3k}|}{|D_3|}=-\frac{1}{5}\log_2\frac{1}{5}-\frac{4}{5}\log_2\frac{4}{5}=0.720
w1=∣D∣∣D1∣=155H(D3)=−k=1∑2∣D3∣∣D3k∣log2∣D3∣∣D3k∣=−51log251−54log254=0.720
那么经验条件熵
H
(
D
∣
A
1
)
H(D|A_1)
H(D∣A1)为:
H
(
D
∣
A
1
)
=
w
1
H
(
D
1
)
+
w
2
H
(
D
2
)
+
w
3
H
(
D
3
)
=
0.324
+
0.324
+
0.24
=
0.888
\begin{aligned}H(D|A_1)&=w_1H(D_1)+w_2H(D_2)+w_3H(D_3)\\&=0.324+0.324+0.24\\&=0.888\end{aligned}
H(D∣A1)=w1H(D1)+w2H(D2)+w3H(D3)=0.324+0.324+0.24=0.888
第三步 计算信息增益
公式: g ( D , A 1 ) = H ( D ) − H ( D ∣ A 1 ) = 0.971 − 0.888 = 0.083 g(D,A_1)=H(D)-H(D|A_1)=0.971-0.888=0.083 g(D,A1)=H(D)−H(D∣A1)=0.971−0.888=0.083
同理,我们继续计算
A
2
,
A
3
,
A
4
A_2,A_3,A_4
A2,A3,A4的信息增益
对应如下的表格:
D|A2 | 有工作 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D1 | 是 | 5 | 0 | 5 |
D2 | 否 | 10 | 6 | 4 |
D|A3 | 有自己的房子 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D1 | 是 | 6 | 0 | 6 |
D2 | 否 | 9 | 3 | 6 |
D|A4 | 信贷情况 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D1 | 非常好 | 4 | 0 | 4 |
D2 | 好 | 6 | 2 | 4 |
D3 | 一般 | 5 | 4 | 4 |
第四步 继续进行上面三步走的计算
将结果汇总到表格中:
特征 | 经验熵 | 经验条件熵 | 信息增益 |
---|---|---|---|
年龄 | 0.971 | 0.888 | 0.083 |
有工作 | 0.971 | 0.647 | 0.324 |
有自己的房子 | 0.971 | 0.551 | 0.420 |
信贷情况 | 0.971 | 0.608 | 0.368 |
可以看出,有自己的房子这一特征
对应的经验条件熵
0.551
0.551
0.551最小,信息增益
0.420
0.420
0.420最大,意味着选择这个特征的话,对应的不确定性最小,分类选择最为明确,那么就可以设为最优特征
。
当然,我们会发现如果不同特征内的分类个数不同
,有的是
3
3
3个,比如青年、中年、老年,有的则是
2
2
2个,比如有房子和没房子,取值个数较多时,有可能计算出的信息增益会更大
,可以看出,信息增益会更倾向于取值较多的特征
。
1.7 信息增益比(C4.5算法)
计算信息增益比最大值确认最优特征
为了降低取值较多的影响,有个办法叫做信息增益比。就是为了得到某一特征单位取值个数下的信息增益
,训练数据集
D
D
D关于特征
A
A
A的熵:
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
log
2
∣
D
i
∣
∣
D
∣
H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|}
HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣,其中
D
i
D_i
Di为特征A第
i
i
i种取值的个数。
信息增益比
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)
那么怎么计算
H
A
(
D
)
H_A(D)
HA(D)呢?以年龄
A
1
A_1
A1为例:
H
A
1
(
D
)
=
−
5
15
log
2
5
15
−
5
15
log
2
5
15
−
5
15
log
2
5
15
H_{A_1}(D)=-\frac{5}{15}\log_2 \frac{5}{15}-\frac{5}{15}\log_2\frac{5}{15}-\frac{5}{15}\log_2\frac{5}{15}
HA1(D)=−155log2155−155log2155−155log2155
即:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
=
0.052
g_R(D,A)=\frac{g(D,A)}{H_A(D)}=0.052
gR(D,A)=HA(D)g(D,A)=0.052
同理,我们继续计算
A
2
,
A
3
,
A
4
A_2,A_3,A_4
A2,A3,A4 特征对应的信息增益比。列在表格中:
特征 | 信息增益 | H_A(D) | 信息增益比 |
---|---|---|---|
年龄 | 0.083 | 1.585 | 0.052 |
有工作 | 0.324 | 0.918 | 0.353 |
有自己的房子 | 0.971 | 0.551 | 0.432 |
信贷情况 | 0.368 | 1.566 | 0.232 |
这里我们一起观察一下有工作和信贷情况
这两个特征,可以看出如果从信息增益的角度出发,那么信贷情况的值
0.363
0.363
0.363更大,在这两个特征中应该作为最优特征;然而,如果从信息增益比角度出发,那么是否有工作的值
0.353
0.353
0.353更大,那么就应该是最优特征。
因此,现在你就知道这两者的区别(一个倾向于取值多的,一个倾向于取值少的)吧,那么哪一个指标更好呢?这还是要和实际情况相结合,看看哪种分类下的树形结构更优化才行
。
2.如何构建决策树
基本步骤:
1.构建根结点
训练数据集,假如包含 N N N个样本,我们将其置于根结点处,故事就是从这里开始的,也就是说我们的决策树就是从根结点开始分叉的
。
2.选择最优特征
在这么多的特征里面,我们需要选择最优特征来分割训练数据集
。
3.判断是否产生了叶结点
若子集被基本正确分类,构建叶结点
,否则,重新选择新的最优特征。
4.重复Step 2和Step 3步
直到训练数据集中所有样本基本被正确分类,注意,是基本正确分类哦,原因是为了平衡拟合和泛化能力
。
从上面的步骤里,我们要关注两个点,一是最优特征的选择
(借助熵),二是正确的分类
。
3.特征选择
因此,现在你就知道这两者的区别(一个倾向于取值多的,一个倾向于取值少的)吧,那么哪一个指标更好呢?这还是要和实际情况相结合,看看哪种分类下的树形结构更优化才行
。
ID3和C4.5分别用信息增益和信息增益比来选择,详细看预备知识。
4.决策树的生成
4.1 ID3算法(使用信息增益来选择特征)
输入:训练数据集
D
D
D,特征集
A
A
A,阈值
ϵ
\epsilon
ϵ
输出:决策树
T
T
T
第一步 判断 T T T是否需要选择特征生成决策树
case1:若 D D D中所有实例属于
同一类
,则 T T T为单结点树
,记录实例类别 ,以此作为该结点的类标记,并返回 T T T。
case2:若 D D D中所有实例无任何特征
( A = ∅ A=\empty A=∅),则 T T T为单结点树
,记录 D D D中实例个数最多类别 C k C_k Ck,根据多数表决原则,以此作为该结点的类标记,并返回 T T T。
第二步 否则,计算 A A A中各特征的信息增益(),并选择信息增益最大的特征 A g A_g Ag
case1:若 A g A_g Ag的
信息增益小于
ϵ \epsilon ϵ,则 T T T为单结点树
,记录 D D D中实例个数最多类别 C k C_k Ck,以此作为该结点的类标记,并返回 T T T。
case2:否则,按照 A g A_g Ag的每个可能值 a i a_i ai,将 D D D分为若干非空子集,将中实例个数最多的类别作为标记
,构建子结点,以结点和其子节点构成 T T T,并返回 T T T。
第三步 第 i i i个子结点,以 D i D_i Di为训练集, A − A g A-A_g A−Ag为特征集合,递归地调用以上步骤,得到子树 T i T_i Ti。
4.1.1 ID3算法的问题
- 1.ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。
- 2.ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?
H ( D ∣ A 1 ) = 0.5 ∗ ( − 0.5 ∗ l o g 2 0.5 − 0.5 ∗ l o g 2 0.5 ) + 0.5 ∗ ( − 0.5 ∗ l o g 2 0.5 − 0.5 ∗ l o g 2 0.5 ) H ( D ∣ A 2 ) = 1 3 ∗ ( − 1 3 ∗ l o g 2 1 3 − 1 3 ∗ l o g 2 1 3 ) + 1 3 ∗ ( − 1 3 ∗ l o g 2 1 3 − 1 3 ∗ l o g 2 1 3 ) + 1 3 ∗ ( − 1 3 ∗ l o g 2 1 3 − 1 3 ∗ l o g 2 1 3 ) H(D|A_1)=0.5*(-0.5*log_20.5-0.5*log_20.5)+0.5*(-0.5*log_20.5-0.5*log_20.5)\\ H(D|A_2)=\frac{1}{3}*(-\frac{1}{3}*log_2\frac{1}{3}-\frac{1}{3}*log_2\frac{1}{3})+\frac{1}{3}*(-\frac{1}{3}*log_2\frac{1}{3}-\frac{1}{3}*log_2\frac{1}{3})+\frac{1}{3}*(-\frac{1}{3}*log_2\frac{1}{3}-\frac{1}{3}*log_2\frac{1}{3}) H(D∣A1)=0.5∗(−0.5∗log20.5−0.5∗log20.5)+0.5∗(−0.5∗log20.5−0.5∗log20.5)H(D∣A2)=31∗(−31∗log231−31∗log231)+31∗(−31∗log231−31∗log231)+31∗(−31∗log231−31∗log231) - 3.ID3算法对于缺失值的情况没有做考虑
- 没有考虑过拟合的问题
4.2 C4.5算法(使用信息增益比来选择特征)
和ID3区别就是信息增益比
从这个图中,我们可以知道决策树思想的核心在于当每个迭代出来的训练集计算出的最大信息增益小于阈值时,生成单结点树才可终止
。
4.2.1 C4.5的问题
- 1.C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
- 2.C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围
- 3.C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
4.2 ID3算法例题
ϵ
=
0.001
\epsilon=0.001
ϵ=0.001
贷款申请样本数据表:
ID | 年龄 | 有工作 | 有自己的房子 | 信贷情况 | 类别 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 一般 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 一般 | 是 |
5 | 青年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 一般 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 非常好 | 是 |
10 | 中年 | 否 | 是 | 非常好 | 是 |
11 | 老年 | 否 | 是 | 非常好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 非常好 | 是 |
15 | 老年 | 否 | 否 | 一般 | 否 |
特征 | 经验熵 | 经验条件熵 | 信息增益 |
---|---|---|---|
年龄 | 0.971 | 0.888 | 0.083 |
有工作 | 0.971 | 0.647 | 0.324 |
有自己的房子 | 0.971 | 0.551 | 0.420 |
信贷情况 | 0.971 | 0.608 | 0.368 |
最大增益是自己的房子 A 3 A_3 A3这个特征,且大于阈值
D|A3 | 有自己的房子 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D1 | 是 | 6 | 0 | 6 |
D2 | 否 | 9 | 3 | 6 |
将
D
D
D划分为
D
1
D_1
D1和
D
2
D_2
D2,
D
1
D_1
D1中结果是的个数为6,否为0,即为叶子结点。而
D
2
D_2
D2中结果否的个数是3,是的个数是6,使用需要将
D
2
D_2
D2作为新的训练数据集,
A
1
,
A
2
,
A
4
A_1,A_2,A_4
A1,A2,A4为新的特征集。
分别列出各特征:
D2|A1 | 年龄 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D21 | 青年 | 4 | 1 | 3 |
D22 | 中年 | 2 | 0 | 2 |
D23 | 老年 | 3 | 2 | 1 |
从没有房子的选择中看出,共有 个,其中有 个同意贷款, 个不同意贷款。那么经验熵可以写成:
H
(
D
2
)
=
−
6
9
log
2
6
9
−
6
9
log
2
3
9
=
0.918
H(D_2)=-\frac{6}{9}\log_2 \frac{6}{9}-\frac{6}{9}\log_2\frac{3}{9}=0.918
H(D2)=−96log296−96log293=0.918
来算
H
(
D
2
∣
A
1
)
=
∑
i
=
1
3
w
i
H
(
D
2
i
)
H(D_2|A_1)=\sum_{i=1}^3w_i H(D_{2i})
H(D2∣A1)=∑i=13wiH(D2i)
i
=
1
i=1
i=1青年时,
w
1
=
∣
D
21
∣
∣
D
2
∣
=
4
9
H
(
D
21
)
=
−
1
4
log
2
1
4
−
3
4
log
2
3
4
=
0.811
w_1=\frac{|D_{21}|}{|D_2|}=\frac{4}{9}\\H(D_{21})=-\frac{1}{4}\log_2\frac{1}{4}-\frac{3}{4}\log_2\frac{3}{4}=0.811
w1=∣D2∣∣D21∣=94H(D21)=−41log241−43log243=0.811
i
=
2
i=2
i=2中年时,
w
2
=
∣
D
22
∣
∣
D
2
∣
=
2
9
H
(
D
22
)
=
0
w_2=\frac{|D_{22}|}{|D_2|}=\frac{2}{9}\\H(D_{22})=0
w2=∣D2∣∣D22∣=92H(D22)=0
可以看出对于这个子集都是同意贷款,那么它的经验条件熵就为0。
i
=
3
i=3
i=3老年时,
w
1
=
∣
D
23
∣
∣
D
2
∣
=
3
9
H
(
D
21
)
=
−
2
3
log
2
2
3
−
1
3
log
2
1
3
=
0.918
w_1=\frac{|D_{23}|}{|D_2|}=\frac{3}{9}\\H(D_{21})=-\frac{2}{3}\log_2\frac{2}{3}-\frac{1}{3}\log_2\frac{1}{3}=0.918
w1=∣D2∣∣D23∣=93H(D21)=−32log232−31log231=0.918
那么经验条件熵 H ( D 2 ∣ A 1 ) H(D_2|A_1) H(D2∣A1)为: H ( D 2 ∣ A 1 ) = ∑ i = 1 3 w i H ( D 2 i ) = 0.360 + 0 + 0.307 = 0.667 H(D_2|A_1)=\sum_{i=1}^3w_i H(D_{2i})=0.360+0+0.307=0.667 H(D2∣A1)=i=1∑3wiH(D2i)=0.360+0+0.307=0.667
D2|A2 | 有工作 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D21 | 是 | 3 | 3 | 0 |
D22 | 否 | 6 | 0 | 6 |
H ( D 2 ∣ A 2 ) = ∑ i = 1 2 w i H ( D 2 i ) = 3 9 H ( D 21 ) + 6 9 H ( D 22 ) = 0 \begin{aligned}H(D_2|A_2)&=\sum_{i=1}^2w_i H(D_{2i})\\&=\frac{3}{9}H(D_{21})+\frac{6}{9}H(D_{22})=0\end{aligned} H(D2∣A2)=i=1∑2wiH(D2i)=93H(D21)+96H(D22)=0
D2|A4 | 信贷情况 | 个数 | 是否同意贷款 | |
否 | 是 | |||
D21 | 非常好 | 1 | 1 | 0 |
D22 | 好 | 4 | 2 | 2 |
D23 | 一般 | 4 | 0 | 4 |
H ( D 2 ∣ A 4 ) = ∑ i = 1 3 w i H ( D 2 i ) = 1 9 H ( D 21 ) + 4 9 H ( D 22 ) + 4 9 H ( D 23 ) = 0.444 H(D_2|A_4)=\sum_{i=1}^3w_i H(D_{2i})=\frac{1}{9}H(D_{21})+\frac{4}{9}H(D_{22})+\frac{4}{9}H(D_{23})=0.444 H(D2∣A4)=i=1∑3wiH(D2i)=91H(D21)+94H(D22)+94H(D23)=0.444
最终得到 D 2 D_2 D2下的信息增益:
特征 | 经验熵 | 经验条件熵 | 信息增益 |
年龄 | 0.918 | 0.667 | 0.251 |
有工作 | 0 | 0.918 | |
信贷情况 | 0.444 | 0.474 |
最终最大信息增益就是是否有工作
,那么下一个特征就选它,继续绘制决策树:
对于这个例子而言,整棵决策树只用了两个特征,因为他们的子集都是属于一个类别的,对于有房子都是同意贷款,对于没有房子的都是不同意贷款,因此就满足了一开始流程图里的单一叶结点要求,决策树就生成了
。
4.3 决策树的剪枝
4.3.1 剪枝的目的
理想决策树:既能对已知数据有良好的拟合效果
,还能对未知数据有良好的泛化效果
。
如图:
1.
深度大小
:深度是指所有结点的层次数,一般从上往下、从0开始,下面这个例子就可以看出,深度分别是第0层、第1层和第2层
。
2.叶结点数量
:叶结点就是咱们生成决策树后的最优分类结果,从下面这个图上看出就是绿色框框出的啦,一共有3个叶结点
。
那么效果又好又简单的模型,就是以上两者的结合,也就是既能深度小又能叶结点少
。
4.3.2 剪枝的分类
剪枝的目标是为了解决过拟合的问题
,那么接下来就看看剪枝的分类:1.预剪枝,2.后剪枝。
预剪枝
:生成过程中,对每个结点划分前进行估计,若当前结点的划分不能提升泛化能力
,则停止划分,记当前结点为叶结点。
后剪枝
:生成一棵完整的决策树后,从底部向上对内部结点进行考察,如果将内部结点变成叶结点
,可以提升泛化能力,那么就进行交换。
预剪枝方法
限定决策树的深度
这个方法的特点就是从深度来限定。
参考《西瓜书》上的例子:
- 输入:色泽、根蒂、敲声、纹理、脐部、触感。
- 输出:是否好瓜。
西瓜的数据集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷缩 | 浊响 | 稍模糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷缩 | 浊响 | 稍模糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷缩 | 沉闷 | 稍模糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
第一步 使用ID3算法来生成决策树
此时一共
4
4
4层。现在如果我们要将深度限定
为
2
2
2层时,也就意味着从3层开始的色泽结点,就要进行剪枝,我们把符合纹理清晰、根蒂稍蜷缩
(也就是纹理清晰->根蒂稍蜷缩这条路径)中的数据集挑出来,就只有第6、第8、第15行符合要求,如下表格所示:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
6 | 青绿 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
15 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
在这3个数据中有2个认为都是好瓜(6,8),好瓜更多,那么我们就可以认为替换后的叶结点标记为好瓜
。
如下图:
1.第一种方法设定一个阈值
- 输入:训练数据集 D D D,特征集 A A A,阈值 ϵ \epsilon ϵ
- 输出:决策树
在ID3算法中,阈值出现在信息增益的比较环节
,阈值的不同,生成的树也会不同(看前面)。
若把阈值
ϵ
\epsilon
ϵ设置为0.4,根据所有的特征计算出的信息增益(如下表格),可以看出都是小于阈值的,那么这就意味着特征并不会给分类带来确定性
,只有看总的数据集中,有多少好瓜和坏瓜。
特征 | 信息增益 |
---|---|
色泽 | 0.109 |
根蒂 | 0.143 |
敲声 | 0.141 |
纹理 | 0.381 |
脐部 | 0.289 |
触感 | 0.006 |
在17个样本中,共有8个好瓜,9个坏瓜,坏瓜更多,那我们就可以直接剪枝,并且认为是坏瓜。于是我们得到的就是一棵单结点树,类标记为坏瓜
。
设置某个指标,比较结点划分前后的泛化能力
我们用测试集来代表未知数据,所以利用测试集的误差率进行比较。
-
测试集上的误差率:测试集中「错误」分类的实例占比。
-
测试集上的准确率:测试集中「正确」分类的实例占比。
-
测试集上的误差率越高,说明泛化能力越弱;反之,说明泛化能力越强。
第一步:计算根结点处的误差率
我们从17个数据集中,挑出10个数据集作为训练集,挑出7个作为测试集。
训练集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷缩 | 浊响 | 稍模糊 | 稍凹 | 软粘 | 是 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
14 | 浅白 | 稍蜷缩 | 沉闷 | 稍模糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
训练集中有5个好瓜和5个坏瓜。
在比较根结点处剪枝前后的误差率之前,先看一下测试集的情况。
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷缩 | 浊响 | 稍模糊 | 凹陷 | 硬滑 | 否 |
测试集中有3个好瓜和4个坏瓜。
*剪枝前的误差率 *
记根结点为一个内部结点,我们不妨根据信息增益选择最优特征进行划分。计算出的信息增益为:
特征 | 条件熵 | 信息增益 |
---|---|---|
色泽 | 0.724 | 0.276 |
根蒂 | 0.885 | 0.115 |
敲声 | 0.828 | 0.172 |
纹理 | 0.828 | 0.172 |
脐部 | 0.724 | 0.276 |
触感 | 1 | 0 |
此处,特征“色泽”和“脐部”的信息增益最大,我们任选其一即可,不妨先选择脐部
。那么在训练集中,凹陷的瓜有4个,其中3个为好瓜,1个为坏瓜,那么就认为凹陷对应好瓜;稍凹的瓜中,有2个是好瓜,2个是坏瓜,这里类标记不妨是好瓜;平坦的瓜中,2个都是坏瓜,很容易得到类标记坏瓜。
以脐部为根结点的深度为1的决策树
接着我们用它对测试集进行判断:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷缩 | 浊响 | 稍模糊 | 凹陷 | 硬滑 | 否 |
根据决策树,我们知道脐部凹陷和稍凹对应的是好瓜,脐部平坦是坏瓜。可以看出在测试集中,编号13、9和决策树结果不一致,2个是错的,此时的「误差率为 2 7 \frac{2}{7} 72」。
剪枝后的误差率
若此处采取剪枝的策略(直接将好瓜或者坏瓜当成根结点),则根结点为一个叶子结点
,通过训练集可以得出类标记为“好瓜”或“坏瓜”的结论,我们任选其一即可。
假如记为好瓜
,那么测试集中有4个坏瓜都被误判为好瓜,得出误差率为
4
7
\frac{4}{7}
74。
假如记为坏瓜
,那么测试集中有3个坏瓜都被误判为好瓜,得出误差率为
3
7
\frac{3}{7}
73。
我们发现,无论叶子节点标为哪种类型,误差率都明显提高了,所以可以得出结论根结点处不剪枝
(测试集上:根结点不剪枝的误差率为
2
7
\frac{2}{7}
72,而根结点剪枝误差率会提高)。
第二步 计算第一层处的误差率
先根据最大信息增益建立决策树
如果直接用这棵决策树来判断,误差率就是
2
7
\frac{2}{7}
72,比直接用根结点好,泛化能力提高了,应该再继续划分。
从第一个叶子结点开始划分
第一层第一个结点剪枝前的误差率
根据信息增益,可以选出此处的最优特征,即色泽
。可以计算出此时测试集上的误差率为
3
7
\frac{3}{7}
73
第一层第一个结点剪枝后的误差率
根据之前的计算,测试集上的误差率为
2
7
\frac{2}{7}
72。
可见,误差率明显提高了,所以可以得出结论第一层第一个结点处剪枝
。
第一层第二个结点剪枝前的误差率
根据信息增益,可以选出此处的最优特征,即根蒂
。可以计算出此时测试集上的误差率为
2
7
\frac{2}{7}
72。
第一层第二个结点剪枝后的误差率
如果在该结点处采取剪枝策略,根据之前的计算,测试集上的误差率为
2
7
\frac{2}{7}
72。
可见,误差率不发生变化,根据奥卡姆剃刀原理
,对于相同的误差率,还要选择深度小的决策树为佳
,可以得出结论第一层第二个结点处剪枝
。
第一层第三个结点
该结点处都是坏瓜,不需要继续划分。
第三步 最优决策树
这样,我们就得到一棵根据测试集上的误差率生成的最优决策树
一定要注意预剪枝的特点就是从根结点开始,边生成决策树,边来根据深度、阈值、或者指标来剪枝
。
后剪枝
- 降低错误剪枝 Reduce Error Pruning
- 悲观错误剪枝 Pessimistic Error Pruning
- 最小误差剪枝 Minimum Error Pruning
- 基于错误的剪枝 Error Based Pruning
- 代价复杂度剪枝 Cost-Complexity Pruning
1.降低错误剪枝REP
原理:自下而上,使用测试集
剪枝,对每个结点计算剪枝前后的误判个数,如果剪枝满足减少误判或者相同误判
,则减掉该结点所在分枝。这个方法和预剪枝的用测试集误差率来判断是否需要剪枝
的方法类似,不同之处在于后剪枝的方向是自下而上,另外我们在这里用的是误差个数。
训练集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷缩 | 浊响 | 稍模糊 | 稍凹 | 软粘 | 是 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
14 | 浅白 | 稍蜷缩 | 沉闷 | 稍模糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
测试集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷缩 | 浊响 | 稍模糊 | 凹陷 | 硬滑 | 否 |
根据训练集生成的决策树(深度为4层)
接下来,自下而上的后剪枝正式开始:
第4层剪枝:开始对第4层纹理
剪枝
第一步 得出可替代的叶子结点
观察这棵决策树纹理上面的叶子结点,对照训练集
找到脐部稍凹、根蒂稍蜷缩、色泽乌黑
的数据,分别是编号6和编号7,分别对应的是好瓜和坏瓜,那么我们不妨将这个叶子结点设为好瓜
。
第二步 对比子树和叶子结点的误判个数
先用有子树结构的决策树来找到在测试集
中的误判个数,还是对应的去找脐部稍凹、根蒂稍蜷缩、色泽乌黑
的数据,分别是编号8和编号9,对应纹理清晰应该是好瓜,稍模糊是坏瓜,误判数为2。
再用子树剪枝的决策树来找到在测试集
中的误判个数,误判个数只有1个,误判个数小于2
,确定剪枝
,这样决策树就成功地从深度为4层变为来深度为3层。
第3层剪枝
对第3层色泽
剪枝,重复之前的两步:
第一步 得出可替代的叶子结点
观察这棵决策树纹理上面的叶子结点,对照训练集
找到脐部稍凹、根蒂稍蜷缩
的数据,分别是编号8和编号9,分别对应的是好瓜和坏瓜,那么我们不妨将这个叶子结点设为好瓜
。
第二步 对比子树和叶子结点的误判个数
先用子树来找到在测试集
中的误判个数,还是对应的去找「脐部稍凹、根蒂稍蜷缩」的数据,分别是编号8和编号9,对应都是色泽乌黑,测试中分别是1个好瓜,1个坏瓜,而子树判断的都是好瓜,可以看出误判个数为1。
再看一下叶子结点呢,同样的,误判个数也是1个,那么根据奥卡姆剃刀原理,也可以剪枝。那么决策树就从深度为3层变为2层。
第2层剪枝
对第2层色泽
和根蒂
剪枝,这层有两棵子树,先选择色泽
第一步 得出可替代的叶子结点
对照训练集
找到脐部凹陷
的数据,分别是编号1、2、3、14,对应的好瓜有3个,坏瓜有1个,那么我们将这个叶子结点设为好瓜
。
第二步 对比子树和叶子结点的误判个数
接着先用子树来找到在测试集
中的误判个数,还是对应的去找脐部凹陷
的数据,分别是编号4、5、13,根据子树知道色泽乌黑或青绿都为好瓜,浅白为坏瓜,而测试集中青绿有1个好瓜和1个坏瓜,浅白为好瓜
,可以看出误判个数为2。
再看一下使用叶子结点的,对了2个,错了1个,误判个数更少,也可以剪枝。
对于根蒂而言,得出叶子结点的误判个数更少,也可以剪枝哦。那么就可以得出深度为1层的决策树了。
第1层剪枝
接下来我们还可以看看是不是能变成单结点树。
第一步 得出可替代的叶子结点
训练集中的好瓜有5个,坏瓜也是5个,那么我们不妨将这个叶子结点设为好瓜
。
第二步 对比子树和叶子结点的误判个数
接着先用子树来找到在测试集
中的误判个数,还是对应的去找脐部凹陷
的数据,为编号4、5、13,其中误判1个;再找脐部稍凹
的数据,为编号8、9,误判1个;最后找脐部平坦
的数据,为编号11和12,没有误判。那么总的误判个数为2个。
总结:
- 计算复杂性是线性的,每个结点只需要访问1次。
- 操作简单,容易理解。
- 受测试集影响大,体现出了欠拟合的不足,如果测试集比训练集小,就会限制分类的精度。
2.悲观错误剪枝PEP
原理:根据剪枝前后的错误率来决定是否剪枝,和REP不同,PEP只需要训练集即可
,不需要测试集,并且是从上而下
的剪枝。
先按整个集进行标注
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 是否好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷缩 | 浊响 | 稍模糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷缩 | 浊响 | 稍模糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷缩 | 沉闷 | 稍模糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷缩 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍模糊 | 稍凹 | 硬滑 | 否 |
从最上面的纹理
开始有8好9坏,依次到纹理清晰的根蒂
有7好2坏,往下可知纹理清晰且根蒂蜷缩
有5好0坏,依次类推,标记处对应的正类(好瓜)和负类(坏瓜)数据。
每个数字左边是好瓜个数,右边是坏瓜个数。
如果想把目标子树根蒂
剪枝,那么就按照PEP的思路来计算一下虚线框里误判率。在这棵子树中叶子结点有
4
4
4个,共有样本数
9
9
9个,只有色泽乌黑时误判了
1
1
1个。
E
r
r
o
r
(
T
)
=
1
+
4
∗
0.5
9
Error(T)=\frac{1+4*0.5}{9}
Error(T)=91+4∗0.5
计算期望值和标准差
E
(
T
)
=
N
(
T
)
∗
E
r
r
o
r
(
T
)
=
∑
i
=
1
L
e
r
r
o
r
(
L
e
a
f
i
)
+
0.5
∗
L
=
9
∗
1
3
=
3
\mathbb{E}(T)=N(T)*Error(T)=\sum_{i=1}^Lerror(Leaf_i)+0.5*L=9*\frac{1}{3}=3
E(T)=N(T)∗Error(T)=i=1∑Lerror(Leafi)+0.5∗L=9∗31=3
s
t
d
(
T
)
=
N
(
T
)
∗
E
r
r
o
r
(
T
)
∗
(
1
−
E
r
r
o
r
(
T
)
)
=
9
∗
1
3
∗
(
1
−
1
3
)
=
1.414
std(T)=\sqrt{N(T)*Error(T)*(1-Error(T))}=\sqrt{9*\frac{1}{3}*(1-\frac{1}{3})}=1.414
std(T)=N(T)∗Error(T)∗(1−Error(T))=9∗31∗(1−31)=1.414
计算剪枝前误判上限
E
(
T
)
+
s
t
d
(
T
)
=
4.414
\mathbb{E}(T)+std(T)=4.414
E(T)+std(T)=4.414
计算剪枝后的,我们看到「根蒂」中有7好2坏,那么单结点为好瓜,误判了2个:
计算剪枝后该结点的修正误差和期望
E
r
r
o
r
(
L
e
a
f
)
=
e
r
r
o
r
(
L
e
a
f
)
+
0.5
N
(
T
)
=
2
+
0.5
9
=
2.5
9
Error(Leaf)=\frac{error(Leaf)+0.5}{N(T)}=\frac{2+0.5}{9}=\frac{2.5}{9}
Error(Leaf)=N(T)error(Leaf)+0.5=92+0.5=92.5
E
(
L
e
a
f
)
=
e
r
r
o
r
(
L
e
a
f
)
+
0.5
=
2.5
E(Leaf)=error(Leaf)+0.5=2.5
E(Leaf)=error(Leaf)+0.5=2.5
比较剪枝前后的误判率,如果满足以下不等式,则剪枝;否则,不剪枝
可以看出剪枝前的
E
(
T
)
+
s
t
d
(
T
)
\mathbb{E}(T)+std(T)
E(T)+std(T)值
4.414
4.414
4.414大于剪枝后的
E
(
L
e
a
f
)
E(Leaf)
E(Leaf)值 ,说明剪枝后的误判率降低了,那么就可以剪枝
。
总结:
- 不需要分离剪枝数据集,有利于实例少的问题
- 误差使用了连续修正值,适用性更强
- 由于自上而下的剪枝策略,PEP效果更高,但是也可能修剪掉不应修剪的。
3.最小误差剪枝MEP
原理:根据剪枝前后的最小分类错误来决定是否剪枝。
特点:自下而上剪枝,只需要训练集即可。
例题:
这里T4~T8分别代表了叶子结点。+号代表正类样本
,-号代表负类样本
,个数就是对应的数字。接着可以看到3个矩形叶子结点,分别是T6、T7、T8。
绿色表示正类,红色表示负类。
现在我们就要用最小误差剪枝方法判断在T5这棵子树处是否需要剪枝
。
1、计算剪枝前目标子树每个叶子结点的预测错误率
我们看到T5这棵子树有T7和T8两个叶子结点,那么咱们就分别计算一下预测误差率,T7这个叶子结点的样本总是为11,一共分为了正类和负类,意味着K=2,那么就可以知道N(T7)=11,m=2。这里由于T7属于正类,其中2个不属于正类。那么分子就等于负类的个数加上1。
E
r
r
o
r
(
T
7
)
=
11
−
9
+
1
11
+
2
=
3
13
Error(T7)=\frac{11-9+1}{11+2}=\frac{3}{13}
Error(T7)=11+211−9+1=133
同理可以求出T8的预测错误率,这里注意哦,由于这个叶子属性是负类,这里分子就以正类的个数来计算。
E
r
r
o
r
(
T
8
)
=
9
−
8
+
1
9
+
2
=
2
11
Error(T8)=\frac{9-8+1}{9+2}=\frac{2}{11}
Error(T8)=9+29−8+1=112
2、计算剪枝前目标子树的预测错误率
接着我们计算出T7和T8的权重,分别就是它们在子树T5中的个数占比
,然后乘以各自结点的预测错误率后求和,就算出T5这棵目标子树的预测错误率。
E
r
r
o
r
(
L
e
a
f
)
=
11
20
∗
3
13
+
9
20
∗
2
11
=
0.2087
Error(Leaf)=\frac{11}{20}*\frac{3}{13}+\frac{9}{20}*\frac{2}{11}=0.2087
Error(Leaf)=2011∗133+209∗112=0.2087
3、计算剪枝后目标子树的预测错误率
可以看出T5这个叶子结点中,有10个正类,10个负类,那不妨就把它认为是正类。接着就可以来计算预测错误率。
E
r
r
o
r
(
T
5
)
=
20
−
10
+
1
20
+
2
=
1
2
Error(T5)=\frac{20-10+1}{20+2}=\frac{1}{2}
Error(T5)=20+220−10+1=21
4.比较剪枝前后的预测错误率
可以看出剪枝前的误差率0.2087明显小于剪枝后的 0.5,说明剪枝后的误差率反而提高了,那就得出了「不能剪枝」的结论。
基于错误的剪枝-EBP
代价复杂度剪枝-CCP
原理:根据剪枝前后的损失函数
来决定是否剪枝。这个方法是CART算法中的。
损失函数:
C
α
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}=C(T)+\alpha|T|
Cα=C(T)+α∣T∣
其中:
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^KN_{tk}\log\frac{N_{tk}}{N_t}
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
这个表达式里,是用经验熵
H
t
(
T
)
H_t(T)
Ht(T)的方式来计算的,再通过加权和后代入,当然我们还可以用基尼指数的方式来计算。
还有
C
(
T
)
C(T)
C(T)对应的是T的预测误差,t代表了目标子树叶子结点的个数,|T|反映了复杂度,
α
\alpha
α反映了复杂度的程度(
α
\alpha
α就是用来调节预测误差和复杂度的平衡的,也就是调合模型的拟合能力和泛化能力。),如果越大,说明复杂度更重要,如果为零,则只与预测误差有关。
在之前的正则化和过拟合里说过,正则化的一般形式为:
m
i
n
f
∈
F
1
N
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
+
λ
J
(
f
)
{min}_{f\in F}\frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))+\lambda J(f)
minf∈FN1i=1∑NL(yi,f(xi))+λJ(f)
这个式子代表的是结构性风险,第一部分就是预测误差
,第二部分就是模型的复杂度
,而这里的
λ
\lambda
λ和上文的
α
\alpha
α类似,也是用来调节平衡的,可以将它称为是惩罚参数。
算法步骤:
1.剪枝前的决策树记做
T
A
T_A
TA,计算每个叶子结点t的经验熵:
H
t
=
−
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
H_t=-\sum_{k=1}^KN_{tk}\log\frac{N_{tk}}{N_t}
Ht=−k=1∑KNtklogNtNtk
2.剪枝前决策树的损失函数为:
C
α
(
T
A
)
=
C
(
T
A
)
+
α
∣
T
A
∣
C_\alpha(T_A)=C(T_A)+\alpha|T_A|
Cα(TA)=C(TA)+α∣TA∣
接下来就可以代入上面的公式来计算出损失函数,这里
∣
T
A
∣
|T_A|
∣TA∣代表的是叶子结点的个数。
3.剪枝后的决策树记做
T
B
T_B
TB,损失函数为:
C
α
(
T
B
)
=
C
(
T
B
)
+
α
∣
T
B
∣
C_\alpha(T_B)=C(T_B)+\alpha|T_B|
Cα(TB)=C(TB)+α∣TB∣
同理,剪枝后的损失函数也可以计算出来了。
四.比较剪枝前后的损失函数,如果满足以下不等式,则剪枝;否则,不剪枝。
比较前后的损失函数,就可判断是否需要后剪枝。