决策树两大核心
如何划分数据集;何时停止划分数据集
一、决策树构造
特征选择,决策树生成,决策树修剪
决策树简介
决策树由结点(node)和有向边(directed edged)组成。结点有两种类型:内部结点(internal node)和叶结点(lead node)。内部结点表示一个特征或属性,叶结点表示一个类。如下图,长方形和椭圆都是结点,其中,长方形结点属于内部结点,代表判断模块(decision block),椭圆形属于叶结点,代表终止模块(terminating block)。
构建决策树的一般流程
- 收集数据:可以使用任何方法
- 准备数据:树构造算法只适合标称型数据,因此数值型数据必须离散化。 将这些所有收集的信息按照一定规则整理出来,并进行排版。
- 分析数据:可以使用任何方法,构造树完成之后,检查图形是否符合预期。
- 训练算法:决策树学习,构造一个决策树。
- 测试算法:使用经验树计算错误率。
- 使用算法:使用决策树可以更好的理解数据的内在含义。
香农熵
信息量
信息量是对信息的度量,就跟时间的度量是秒一样,当我们观察到的这个变量的一个具体值的时候,我们接受到了多少信息呢?多少信息用信息量来衡量,我们接受到的信息量跟具体发生的时间有关。
信息的大小跟随机事件的概率有关。越小概率的实践发生了产生的信息量越大,越大概率的事件发生了产生的信息量越小,如太阳从东边升起来,没什么信息量。
特征一:
一个具体事件的信息量应该是随着其发生概率而递减的,且不能为负
特征二:
如果我们有两个不相关的事件
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是两个不相关的事件,则满足:
p
(
x
,
y
)
=
p
(
x
)
∗
p
(
y
)
p(x,y)=p(x)*p(y)
p(x,y)=p(x)∗p(y)根据上面推导,我们很容易看出
h
(
x
)
h(x)
h(x)一定与
p
(
x
)
p(x)
p(x)的对数有关,因为只有对数形式的真数相乘之后,对应对数才能是相加形式
h
(
x
)
=
−
log
2
p
(
x
)
h(x)=-\log_2{p(x)}
h(x)=−log2p(x)其中,负号是为了确保信息一定是正数或者是0,不能是负数;底数可以是任意值,2对应的值是比特。
信息熵
定义一:
信息量度量的是一个具体事件发生所带来的信息,而信息熵是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。
定义二:
信息熵作为一个系统复杂程度的度量,如果系统越复杂,出现的不同情况种类越多,不确定性越大,那么其信息熵较大。(系统越复杂,系统事件越多,里面单一事件p出现的概率越低,此时(事件p概率*信息量)即(
p
log
2
1
/
p
p\log_2{1/p}
plog21/p)概率越大) 如果一个系统简单,出现不同情况种类很少,此时信息熵较小,极端情况为一种时,对应概率为1,则其信息熵为0。
H
(
x
)
=
−
∑
i
=
1
n
p
(
x
i
)
log
p
(
x
i
)
H(x)=-\sum_{i=1}^n{p(x_i)\log{p(x_i)}}
H(x)=−i=1∑np(xi)logp(xi)
经验熵(香农熵)
当熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)。定义训练数据集D,则训练数据集D的经验熵为H(D),|D|表示其样本容量,及样本个数。设有K个类
C
k
C_k
Ck,
∣
C
k
∣
|C_k|
∣Ck∣为属于类
C
k
C_k
Ck的样本个数,则经验熵公式可以写为:
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例如,分析贷款申请样本数据表中的数据,分类结果只有两类,即放贷和不放贷。根据表中的数据统计可知,在15个数据中,9个数据的结果为放贷,6个数据的结果为不放贷,则数据集D的经验熵为:
H
(
D
)
=
−
9
15
log
2
9
15
−
6
15
log
2
6
15
=
0.971
H(D)= -{9 \over 15}\log_2{9\over15}-{6\over15}\log_2{6\over15}=0.971
H(D)=−159log2159−156log2156=0.971
#!/user/bin/env python
# -*- coding:utf-8 -*-
#@Time : 2020/3/1 19:43
#@Author: fangyuan
#@File : 决策树香农熵.py
from math import log
def createDataSet():
# 数据集
dataSet = [[0,0,0,0,'no'],
[0, 0, 0, 1, 'no'],
[0, 1, 0, 1, 'yes'],
[0, 1, 1, 0, 'yes'],
[0, 0, 0, 0, 'no'],
[1, 0, 0, 0, 'no'],
[1, 0, 0, 1, 'no'],
[1, 1, 1, 1, 'yes'],
[1, 0, 1, 2, 'yes'],
[1, 0, 1, 2, 'yes'],
[2, 0, 1, 2, 'yes'],
[2, 0, 1, 1, 'yes'],
[2, 1, 0, 1, 'yes'],
[2, 1, 0, 2, 'yes'],
[2, 0, 0, 0, 'no']
]
# 分类属性
labels = ['年龄','有工作','有自己的房子','信贷情况']
# 返回数据集和分类属性
return dataSet,labels
def calcShannonEnt(dataSet):
# 返回数据集行数
numEntries = len(dataSet)
# 保存每个Label出现次数的字典
labelCounts = {}
# 对每组特征向量进行统计
for featVec in dataSet:
# 提取标签Label信息
currentLabel = featVec[-1]
# 如果标签Label没有放入统计次数的字典,添加进去
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
# Label计数
labelCounts[currentLabel] +=1
# 经验熵(香农熵)
shannonEnt = 0.0
# 计算香农熵
for key in labelCounts:
# 选择该标签Label的概率
prob = float(labelCounts[key])/numEntries
# 利用公式计算
shannonEnt -= prob*log(prob,2)
# 返回香农熵
return shannonEnt
if __name__ == '__main__':
dataSet,features = createDataSet()
print(dataSet)
print(calcShannonEnt(dataSet))
信息增益
解决两大核心问题其一,如何划分数据集。一次划分数据集对应的熵减去下次划分数据集对应的熵之差称为信息增益。信息增益是相对于特征而言的,信息增益越大,特征对最终的分类结果影响也就越大,我们应该选择对最终分类结果影响最大的那个特征作为我们的分类特征。
通俗理解,信息熵越大越混乱,比如给一个女孩子介绍对象,小姑娘一听要去相亲见面,心里面怦怦直跳,非常混乱,也不知道这个男孩子怎么样。然后给她引入3个特征,比如说身高180,头发黑色,身体健全,很显然身高180对女孩子最有吸引力,其他两个特征是所有相亲者必备的没有吸引力。加入这个特征后,女孩子心里会更加平静,即maximum(信息熵)=怦怦直跳复杂度-(身高180)更加平静复杂度>怦怦直跳复杂度-(黑色头发)更加平静复杂度. 所以说,信息增益就是引入新特征添加约束后,与之前信息熵的差值。
条件熵
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,随机变量X给定的条件下随机变量Y的条件熵(conditional entropy)H(Y|X),定义X给定条件下Y的条件概率分布的熵对X的数学期望: H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^n{p_iH(Y|X=x_i)} H(Y∣X)=i=1∑npiH(Y∣X=xi)这里: p i = P ( X = x i ) , i = 1 , 2 , . . . , n p_i=P(X=x_i),i=1,2,...,n pi=P(X=xi),i=1,2,...,n
同理,当条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的条件熵成为条件经验熵(empirical conditional entropy)。
前面提到,信息增益是相对于特征而言的。所以,特征A对于训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即
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)与条件熵H(D|A)之差成为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
根据特征A的取值将D划分为n个子集
D
1
,
D
2
,
.
.
.
,
D
N
,
∣
D
i
∣
D_1,D_2,...,D_N,|D_i|
D1,D2,...,DN,∣Di∣为
D
i
D_i
Di的样本个数。子集
D
i
D_i
Di中属于
C
k
C_k
Ck的样本集合为
D
i
k
D_ik
Dik,
∣
D
i
k
∣
|D_ik|
∣Dik∣为其样本个数。
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
∣
log
2
∣
D
i
k
∣
∣
D
∣
H(D|A)=\sum_{i=1}^n{{|D_i| \over |D|}H(D_i)}=-\sum_{i=1}^n{{|D_i| \over |D|}}\sum_{k=1}^K{{|D_{ik}| \over |D|}}\log_2{|D_{ik}| \over |D|}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣D∣∣Dik∣log2∣D∣∣Dik∣
例如, 以贷款申请样本数据表为例进行说明。看下年龄这一列的数据,也就是特征A1,一共有三个类别,分别是:青年、中年和老年。我们只看年龄是青年的数据,年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现的概率是十五分之五,也就是三分之一。同理,年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是青年的数据的最终得到贷款的概率为五分之二,因为在五个数据中,只有两个数据显示拿到了最终的贷款,同理,年龄是中年和老年的数据最终得到贷款的概率分别为五分之三、五分之四。所以计算年龄的信息增益,过程如下:
g
(
D
,
A
1
)
=
H
(
D
)
−
[
5
15
H
(
D
1
)
+
5
15
H
(
D
2
)
+
5
15
H
(
D
3
)
]
=
0.971
−
g(D,A_1)=H(D)-[{5\over15}H(D_1)+{5\over15}H(D_2)+{5\over15}H(D_3)] =0.971-
g(D,A1)=H(D)−[155H(D1)+155H(D2)+155H(D3)]=0.971−
[
5
15
(
−
2
5
log
2
2
5
−
3
5
log
2
3
5
)
+
5
15
(
−
3
5
log
2
3
5
−
2
5
log
2
2
5
)
+
[{5\over15}({- {2\over5}}\log_2{{2\over5}}{- {3\over5}}\log_2{{3\over5}})+ {5\over15}({- {3\over5}}\log_2{{3\over5}}{- {2\over5}}\log_2{{2\over5}})+
[155(−52log252−53log253)+155(−53log253−52log252)+
5
15
(
−
4
5
log
2
4
5
−
1
5
log
2
1
5
)
]
=
0.971
−
0.888
=
0.083
{5\over15}({- {4\over5}}\log_2{{4\over5}}{- {1\over5}}\log_2{{1\over5}})] =0.971-0.888=0.083
155(−54log254−51log251)]=0.971−0.888=0.083
g
(
D
,
A
2
)
=
H
(
D
)
−
[
5
15
H
(
D
1
)
+
10
15
H
(
D
2
)
]
=
0.971
−
[
5
15
∗
0
+
g(D,A_2)=H(D)-[{5\over15}H(D_1)+{10\over15}H(D_2)]=0.971- [{5\over15}*0+
g(D,A2)=H(D)−[155H(D1)+1510H(D2)]=0.971−[155∗0+
10
15
(
−
4
10
log
2
4
10
−
6
10
log
2
6
10
)
=
0.971
−
0.647
=
0.324
{10\over15}({- {4\over10}}\log_2{{4\over10}}{- {6\over10}}\log_2{{6\over10}})=0.971-0.647=0.324
1510(−104log2104−106log2106)=0.971−0.647=0.324
g ( D , A 3 ) = H ( D ) − [ 6 15 H ( D 1 ) + 9 15 H ( D 2 ) ] = 0.971 − [ 6 15 ∗ 0 + g(D,A_3)=H(D)-[{6\over15}H(D_1)+{9\over15}H(D_2)]=0.971- [{6\over15}*0+ g(D,A3)=H(D)−[156H(D1)+159H(D2)]=0.971−[156∗0+ 9 15 ( − 3 9 log 2 3 9 − 6 9 log 2 6 9 ) = 0.971 − 0.551 = 0.420 {9\over15}({- {3\over9}}\log_2{{3\over9}}{- {6\over9}}\log_2{{6\over9}})=0.971-0.551=0.420 159(−93log293−96log296)=0.971−0.551=0.420 g ( D , A 2 ) = 0.971 − 0.608 = 0.363 \begin{aligned}g(D,A_2)=0.971-0.608=0.363\end{aligned} g(D,A2)=0.971−0.608=0.363综上,特征 A 3 A_3 A3的信息增益最大,所以其为最优特征