机器学习:决策树之信息熵、信息增益、信息增益率、基尼指数分析
信息熵信息理论从信息的完整性描述:当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。从信息的有序性描述:当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。“信息熵” (information entropy)是度量样本集合纯度最常用的一种指标。信息熵理解信息熵是一个变量包含信息多少的度量方式信息熵的值越大,则认为该变量包含的信息量就大信息熵越大,表示包含
1.信息熵
1.1 信息理论
- 从信息的完整性描述:当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。
- 从信息的有序性描述:当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
“信息熵” (information entropy)是度量样本集合纯度最常用的一种指标。
1.2 信息熵理解
- 信息熵是一个变量包含信息多少的度量方式
- 信息熵的值越大,则认为该变量包含的信息量就大
- 信息熵越大,表示包含的信息种类就越多,信息量就越大,信息越混乱分散,纯度就越低
- 信息熵只和包含的信息种类、出现的概率有关,与信息总数量无关
例如:
1、特征 α:ABCDEFGH
2、特征 β:AAAABBCD
特征 α 包含了 8 种信息,特征 β 包含了 4 种信息,虽然信息长度一样,但是包含的信息量则不同。我们可以说,特征 α 的信息熵大于特征 β 的信息熵。
1.3 信息熵的计算
1.3.1 变量信息熵通常用以下公式计算:
E
n
t
(
x
)
=
−
∑
i
=
1
n
P
(
x
i
)
log
2
P
(
x
i
)
Ent(x)=-\sum_{i=1}^nP(x_i)\log_2P(x_i)
Ent(x)=−i=1∑nP(xi)log2P(xi)
P(xi) 表示某一个信息出现的概率
Ent(x) 表示信息的信息熵值
1.3.2 特征 α:ABCDEFGH的计算过程:A、B、C、D、E、F、G、H出现的概率是1/8
E
n
t
(
α
)
=
−
(
1
8
×
log
2
1
8
)
×
8
=
3
Ent(\alpha)=-(\frac{1}{8}×\log_2\frac{1}{8})×8=3
Ent(α)=−(81×log281)×8=3
1.3.3 特征 β:AAAABBCD 的计算过程:
A出现的概率是:1/2
B出现的概率是:1/4
C、D出现的概率是:1/8
E n t ( β ) = − [ 1 2 × log 2 1 2 + 1 4 × log 2 1 4 + ( 1 8 × log 2 1 8 ) × 2 ] = 1.75 Ent(\beta)=-[\frac{1}{2}×\log_2\frac{1}{2}+\frac{1}{4}×\log_2\frac{1}{4}+(\frac{1}{8}×\log_2\frac{1}{8})×2]=1.75 Ent(β)=−[21×log221+41×log241+(81×log281)×2]=1.75
2.信息增益
2.1 概念
信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
通俗的讲:
- 熵可以指的是某个信息的信息熵
- 条件熵指的是在某种条件下信息熵的大小
- 信息增益 = 信息熵 - 条件熵
2.2 信息增益计算
2.2.1 信息增益计算公式:
Gain ( D , a ) = Ent ( D ) − Ent ( D ∣ a ) = Ent ( D ) − ∑ v = 1 V D v D Ent ( D v ) \operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\operatorname{Ent}(D \mid a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{D^{v}}{D} \operatorname{Ent}\left(D^{v}\right) Gain(D,a)=Ent(D)−Ent(D∣a)=Ent(D)−v=1∑VDDvEnt(Dv)
2.2.2 信息熵计算公式:
E n t ( D v ) = − ∑ k = 1 n C k D l o g C k D Ent(D^v)=-\sum_{k=1}^n\frac{C^k}{D}log\frac{C^k}{D} Ent(Dv)=−k=1∑nDCklogDCk
2.2.3 条件熵的计算公式为:
E
n
t
(
D
∣
a
)
=
∑
v
=
1
V
D
v
D
E
n
t
(
D
v
)
=
−
∑
v
=
1
V
D
v
D
∑
k
=
1
n
C
k
v
D
v
l
o
g
C
k
v
D
v
Ent(D|a)=\sum_{v=1}^V\frac{D^v}{D}Ent(D^v)=-\sum_{v=1}^V\frac{D^v}{D}\sum_{k=1}^n\frac{C^{kv}}{D^v}log\frac{C^{kv}}{D^v}
Ent(D∣a)=v=1∑VDDvEnt(Dv)=−v=1∑VDDvk=1∑nDvCkvlogDvCkv
其中:
Dv表示a属性中第v个分支节点包含的样本数
Dkv表示a属性中第v个分支节点包含的样本数中,第k个类别下包含的样本数
2.2.4 案例分析:
如下图,第一列为论坛号码,第二列为性别,第三列为活跃度,最后一列用户是否流失。
我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大?
2.2.4.1 计算is_lost类别信息熵
a、0出现的概率是10/15
b、1出现的概率是5/15
E
n
t
(
D
)
=
−
10
15
log
2
10
15
−
5
15
log
2
5
15
=
0.9182
Ent(D)=-\frac{10}{15}\log_2\frac{10}{15}-\frac{5}{15}\log_2\frac{5}{15}=0.9182
Ent(D)=−1510log21510−155log2155=0.9182
2.2.4.2 性别信息增益
2.2.4.3 计算性别属性的信息熵
E
n
t
(
D
男
)
=
−
5
8
×
log
2
5
8
−
3
8
×
log
2
3
8
=
0.9543
Ent(D^男)=-\frac{5}{8}×\log_2\frac{5}{8}-\frac{3}{8}×\log_2\frac{3}{8}=0.9543
Ent(D男)=−85×log285−83×log283=0.9543
E
n
t
(
D
女
)
=
−
5
7
×
log
2
5
7
−
2
7
×
log
2
2
7
=
0.8631
Ent(D^女)=-\frac{5}{7}×\log_2\frac{5}{7}-\frac{2}{7}×\log_2\frac{2}{7}=0.8631
Ent(D女)=−75×log275−72×log272=0.8631
2.2.4.4 计算性别的信息增益(a=“性别”)
Gain
(
D
|
性
别
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
a
)
\operatorname{Gain}(D|_{性别})=Ent(D)-Ent(D|a)
Gain(D|性别)=Ent(D)−Ent(D∣a)
Gain
(
D
∣
性
别
)
=
E
n
t
(
D
)
−
8
15
E
n
t
(
D
男
)
−
7
15
E
n
t
(
D
女
)
\operatorname{Gain}(D|_{性别})=Ent(D)-\frac{8}{15}Ent(D^男)-\frac{7}{15}Ent(D^女)
Gain(D∣性别)=Ent(D)−158Ent(D男)−157Ent(D女)
Gain
(
D
∣
性
别
)
=
0.9182
−
8
15
×
0.9543
−
7
15
×
0.8631
=
0.0064
\operatorname{Gain}(D|_{性别})=0.9182-\frac{8}{15}×0.9543-\frac{7}{15}×0.8631=0.0064
Gain(D∣性别)=0.9182−158×0.9543−157×0.8631=0.0064
2.2.4.5 活跃度信息增益
is_lost类别信息熵上边已经计算出为:0.9182
2.2.4.6 计算活跃度属性信息熵
E
n
t
(
D
高
)
=
−
1
×
log
2
1
=
0
Ent(D^高)=-1×\log_21=0
Ent(D高)=−1×log21=0
E
n
t
(
D
中
)
=
−
4
5
×
log
2
4
5
−
1
5
×
log
2
1
5
=
0.7219
Ent(D^中)=-\frac{4}{5}×\log_2\frac{4}{5}-\frac{1}{5}×\log_2\frac{1}{5}=0.7219
Ent(D中)=−54×log254−51×log251=0.7219
E
n
t
(
D
低
)
=
−
1
×
log
2
1
=
0
Ent(D^低)=-1×\log_21=0
Ent(D低)=−1×log21=0
2.2.4.7 计算活跃度信息增益
Gain
(
D
|
活
跃
度
)
=
E
n
t
(
D
)
−
6
15
E
n
t
(
D
高
)
−
5
15
E
n
t
(
D
中
)
−
4
15
E
n
t
(
D
低
)
\operatorname{Gain}(D|_{活跃度})=Ent(D)-\frac{6}{15}Ent(D^高)-\frac{5}{15}Ent(D^中)-\frac{4}{15}Ent(D^低)
Gain(D|活跃度)=Ent(D)−156Ent(D高)−155Ent(D中)−154Ent(D低)
Gain
(
D
|
活
跃
度
)
=
0.9182
−
5
15
×
0.7219
=
0.6776
\operatorname{Gain}(D|_{活跃度})=0.9182-\frac{5}{15}×0.7219=0.6776
Gain(D|活跃度)=0.9182−155×0.7219=0.6776
根据以上分析得出:活跃度的信息增益比性别的信息增益大,最直接就是活跃度对客户流失的影响比较大。在做特征选择或者用户数据分析的时候,应该重点关注活跃度这个指标。
3.信息增益率
3.1 定义
鉴于信息增益的不足,我们希望对信息增益的计算做出一些调整,即:当特征值种类较多时,大幅度降低其重要性。调整后的信息增益,我们叫做信息增益率。
增益率:增益率是用前面的信息增益Gain(D, a)和属性a对应的"固有值"(intrinsic value)的比值来共同定义的。
Gain_Ratio
(
D
∣
a
)
=
Gain
(
D
,
a
)
I
V
(
a
)
\operatorname{Gain\_Ratio}(D| a)=\frac{\operatorname{Gain}(D, a)}{I V(a)}
Gain_Ratio(D∣a)=IV(a)Gain(D,a)
I
V
(
a
)
=
−
∑
v
=
1
V
D
v
D
log
D
v
D
I V(a)=-\sum_{v=1}^{V} \frac{D^{v}}{D} \log \frac{D^{v}}{D}
IV(a)=−v=1∑VDDvlogDDv
- Gain_Ratio 表示信息增益率
- IV 表示特征的信息熵
- 特征的信息增益 ➗ 特征的信息熵
a. 如果某个特征的特征值种类较多,则其信息熵值就越大。即:特征值种类越多,除以的系数就越大。
b. 如果某个特征的特征值种类较小,则其信息熵值就越小。即:特征值种类越小,除以的系数就越小。
依旧使用上面的案例进行分析:
3.1.2 计算属性信息熵
gender属性信息熵:
I
V
(
g
e
n
d
e
r
)
=
−
8
15
×
log
2
8
15
−
7
15
×
log
2
7
15
=
0.9968
IV(gender)= -\frac{8}{15}×\log_2{\frac{8}{15}}-\frac{7}{15}×\log_2{\frac{7}{15}}=0.9968
IV(gender)=−158×log2158−157×log2157=0.9968
act_info属性信息熵:
I
V
(
a
c
t
_
i
n
f
o
)
=
−
6
15
×
log
2
6
15
−
5
15
×
log
2
5
15
−
4
15
×
log
2
4
15
=
1.5656
IV(act\_info)= -\frac{6}{15}×\log_2{\frac{6}{15}}-\frac{5}{15}×\log_2{\frac{5}{15}}-\frac{4}{15}×\log_2{\frac{4}{15}}=1.5656
IV(act_info)=−156×log2156−155×log2155−154×log2154=1.5656
上边计算得出:
gender的信息增益为:
Gain
(
D
|
g
e
n
d
e
r
)
=
0.0064
\operatorname{Gain}(D|_{gender})=0.0064
Gain(D|gender)=0.0064
act_info的信息增益为:
Gain
(
D
|
a
c
t
_
i
n
f
o
)
=
0.6776
\operatorname{Gain}(D|_{act\_info})=0.6776
Gain(D|act_info)=0.6776
因此:
gender的信息增益率为:
Gain_Ratio
(
D
∣
g
e
n
d
e
r
)
=
0.0064
/
0.9968
=
0.0064
\operatorname{Gain\_Ratio}(D|_{gender})=0.0064/0.9968=0.0064
Gain_Ratio(D∣gender)=0.0064/0.9968=0.0064
act_info的信息增益率为:
Gain_Ratio
(
D
∣
a
c
t
_
i
n
f
o
)
=
0.6776
/
1.5656
=
0.4328
\operatorname{Gain\_Ratio}(D|_{act\_info})=0.6776/1.5656=0.4328
Gain_Ratio(D∣act_info)=0.6776/1.5656=0.4328
根据以上计算结果:gender特征的信息增益率明显小于act_info的信息增益率,因此我们优先选用act_info做为特征分裂点。
为什么使用C4.5比较好
1.用信息增益率来选择属性
克服了用信息增益来选择属性时偏向选择值多的属性的不足。
2.采用了一种后剪枝方法
避免树的高度无节制的增长,避免过度拟合数据
3.对于缺失值的处理:
在某些情况下,可供使用的数据可能缺少某些属性的值。假如〈x,c(x)〉是样本集S中的一个训练实例,但是其属性A的值A(x)未知。处理缺少属性值的一种策略是赋给它结点n所对应的训练实例中该属性的最常见值;另外一种更复杂的策略是为A的每个可能值赋予一个概率。例如,给定一个布尔属性A,如果结点n包含6个已知A=1和4个A=0的实例,那么A(x)=1的概率是0.6,而A(x)=0的概率是0.4。于是,实例x的60%被分配到A=1的分支,40%被分配到另一个分支。
C4.5就是使用这种方法处理缺少的属性值。
4.基尼值和基尼指数
4.1 概念
CART 决策树 [Breiman et al., 1984] 使用"基尼指数" (Gini index)来选择划分属性.
CART 是Classification and Regression Tree的简称,这是一种著名的决策树学习算法,分类和回归任务都可用
基尼值Gini(D):从数据集D中随机抽取两个样本,其类别标记不一致的概率。故,Gini(D)值越小,数据集D的纯度越高。
数据集 D 的纯度可用基尼值来度量:
Gini
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
\operatorname{Gini}(D)=\sum_{k=1}^{|y|} \sum_{k \neq k} p_{k} p_{k^{\prime}}=1-\sum_{k=1}^{|y|} p_{k}^{2}
Gini(D)=k=1∑∣y∣k=k∑pkpk′=1−k=1∑∣y∣pk2
pk=Ck/D,D为样本的所有数量,Ck为第k类样本的数量。
基尼指数Gini_index(D,a):
Gini_index
(
D
,
a
)
=
∑
v
=
1
V
D
v
D
Gini
(
D
v
)
\operatorname{Gini\_index}(D, a)=\sum_{v=1}^{V} \frac{D^{v}}{D} \operatorname{Gini}\left(D^{v}\right)
Gini_index(D,a)=v=1∑VDDvGini(Dv)
4.2 案例
请根据下图列表,按照基尼指数的划分依据,做出决策树。
序号 | 是否有房 | 婚姻状况 | 年收入(K) | 是否拖欠贷款 |
---|---|---|---|---|
1 | yes | single | 125 | no |
2 | no | married | 100 | no |
3 | no | single | 70 | no |
4 | yes | married | 120 | no |
5 | no | divorced | 95 | yes |
6 | no | married | 60 | no |
7 | yes | divorced | 220 | no |
8 | no | single | 85 | yes |
9 | no | married | 75 | no |
10 | no | Single | 90 | Yes |
注意:三个特征中,是否有房包含2个值、婚姻状况包含3个值、年收入包含多个值。其计算方法略有不同,注意区分。
4.2.1 是否有房(二值特征)
计算过程如下:根据是否有房将目标值划分为两部分:
-
计算有房子的基尼值: 有房子有 1、4、7 共计三个样本,对应:3个no、0个yes
G i n i ( 是否有房,yes ) = 1 − ( 0 3 ) 2 − ( 3 3 ) 2 = 0 G i n i(\text {是否有房,yes })=1-\left(\frac{0}{3}\right)^{2}-\left(\frac{3}{3}\right)^{2}=0 Gini(是否有房,yes )=1−(30)2−(33)2=0 -
计算无房子的基尼值:无房子有 2、3、5、6、8、9、10 共七个样本,对应:4个no、3个yes
Gini ( 是否有房,no ) = 1 − ( 3 7 ) 2 − ( 4 7 ) 2 = 0.4898 \operatorname{Gini}(\text {是否有房,no })=1-\left(\frac{3}{7}\right)^{2}-\left(\frac{4}{7}\right)^{2}=0.4898 Gini(是否有房,no )=1−(73)2−(74)2=0.4898 -
计算基尼指数:第一部分样本数量占了总样本的 3/10、第二部分样本数量占了总样本的 7/10:
G i n i − i n dex ( D , 是否有房 ) = 7 10 ∗ 0.4898 + 3 10 ∗ 0 = 0.343 \operatorname{Gini_{-}} i n \operatorname{dex}(D, \text { 是否有房 })=\frac{7}{10} * 0.4898+\frac{3}{10} * 0=0.343 Gini−index(D, 是否有房 )=107∗0.4898+103∗0=0.343
4.2.2 婚姻状况(三值特征)
-
计算 {married} 和 {single,divorced} 情况下的基尼指数:
- 结婚的基尼值,有 2、4、6、9 共 4 个样本,并且对应目标值全部为 no:
Gini_index ( D , married ) = 0 \operatorname{Gini\_index}(D, \text { {married} })=0 Gini_index(D, married )=0
- 不结婚的基尼值,有 1、3、5、7、8、10 共 6 个样本,并且对应 3 个 no,3 个 yes:
Gini_index ( D , single,divorced ) = 1 − ( 3 6 ) 2 − ( 3 6 ) 2 = 0.5 \operatorname{Gini\_index}(D, \text { {single,divorced} })=1-\left(\frac{3}{6}\right)^{2}-\left(\frac{3}{6}\right)^{2}=0.5 Gini_index(D, single,divorced )=1−(63)2−(63)2=0.5
- 以 married 作为分裂点的基尼指数:
Gini_index ( D , married ) = 4 10 ∗ 0 + 6 10 ∗ [ 1 − ( 3 6 ) 2 − ( 3 6 ) 2 ] = 0.3 \operatorname{Gini\_index}(D, \text { married })=\frac{4}{10} * 0+\frac{6}{10} *\left[1-\left(\frac{3}{6}\right)^{2}-\left(\frac{3}{6}\right)^{2}\right]=0.3 Gini_index(D, married )=104∗0+106∗[1−(63)2−(63)2]=0.3
-
计算 {single} | {married,divorced} 情况下的基尼指数
Gini_index ( D , 婚姻状况 ) = 4 10 ∗ 0.5 + 6 10 ∗ [ 1 − ( 1 6 ) 2 − ( 5 6 ) 2 ] = 0.367 \operatorname{Gini\_index}(D, \text { 婚姻状况 })=\frac{4}{10} * 0.5+\frac{6}{10} *\left[1-\left(\frac{1}{6}\right)^{2}-\left(\frac{5}{6}\right)^{2}\right]=0.367 Gini_index(D, 婚姻状况 )=104∗0.5+106∗[1−(61)2−(65)2]=0.367 -
计算 {divorced} | {single,married} 情况下基尼指数
Gini_index ( D , 婚姻状况 ) = 2 10 ∗ 0.5 + 8 10 ∗ [ 1 − ( 2 8 ) 2 − ( 6 8 ) 2 ] = 0.4 \operatorname{Gini\_index}(D, \text { 婚姻状况 })=\frac{2}{10} * 0.5+\frac{8}{10} *\left[1-\left(\frac{2}{8}\right)^{2}-\left(\frac{6}{8}\right)^{2}\right]=0.4 Gini_index(D, 婚姻状况 )=102∗0.5+108∗[1−(82)2−(86)2]=0.4 -
最终:该特征的基尼值为 0.3,并且预选分裂点为:{married} 和 {single,divorced}
4.2.3 年收入(多值特征)
-
先将数值型属性升序排列,以相邻中间值作为待确定分裂点:
待确定的分裂点为:65、72.5、80、87.7、92.5、97.5、110、122.5、172.5 -
以年收入 65 将样本分为两部分,计算基尼指数
节点为 65 时 : { 年收入 } = 1 10 ∗ 0 − 9 10 ∗ [ 1 − ( 6 9 ) 2 − ( 3 9 ) 2 ] = 0.4 \text { 节点为 } 65 \text { 时 }:\{\text { 年收入 }\}=\frac{1}{10} * 0-\frac{9}{10} *\left[1-\left(\frac{6}{9}\right)^{2}-\left(\frac{3}{9}\right)^{2}\right]=0.4 节点为 65 时 :{ 年收入 }=101∗0−109∗[1−(96)2−(93)2]=0.4 -
以此类推计算所有分割点的基尼指数,我们发现最小的基尼指数为 0.3。
此时,我们发现:
- 以是否有房作为分裂点的基尼指数为:0.343
- 以婚姻状况为分裂特征、以 married 作为分裂点的基尼指数为:0.3
- 以年收入作为分裂特征、以 97.5 作为分裂点的的基尼指数为:0.3
最小基尼指数有两个分裂点,我们随机选择一个即可,假设婚姻状况,则可确定决策树如下:
-
样本 2、4、6、9 样本的类别都是 no,已经达到最大纯度,所以,该结点不需要再继续分裂。
-
样本 1、3、5、7、8、10 样本中仍然包含 4 个 no,2 个 yes,该节点并未达到要求的纯度,需要继续划分。
-
此时,右子树的数据集变为: 1、3、5、7、8、10,在该数据集中计算不同特征的基尼指数,选择基尼指数最小的特征继续分裂。
-
最终决策树构建为:
5 决策树变量类型
- 数字型(Numeric):变量类型是整数或浮点数,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。
- 名称型(Nominal):类似编程语言中的枚举类型,变量只能从有限的选项中选取,比如前面例子中的“婚姻情况”,只能是“单身”,“已婚”或“离婚”,使用“=”来分割。
6 分割点好坏评估
如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。
比如上面的例子,“拥有房产”,可以将记录分成了两类,“是”的节点全部都可以偿还债务,非常“纯”;“否”的节点,可以偿还贷款和无法偿还贷款的人都有,不是很“纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。
构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)