决策树算法是一种基于规则的方法,用一组嵌套的规则进行预测,在树的每个决策节点处根据判断结果进入到下一个分支,反复执行这种操作直到叶子结点,得到预测结果,这些规则的是算法通过数据学习到的而不是人为指定。
选用周志华老师的西瓜书中的西瓜数据作为实验数据。
除了最后一列数据是西瓜的特征(label数据),色泽、根蒂、敲声和纹理都是特征(feature)。
递归分裂过程
决策树的建立是一个递归的过程,首先创立根节点,然后递归的建立左右子树,再根据左右子树建立子树,直到划分完所有的数据为止。如果样本数据集为D,训练的完整过程如下:
(1)用样本集D建立根节点,找到一个划分规则,将样本集划分为
D
1
\ D_1
D1和
D
2
\ D_2
D2两部分,同时为根节点设置判定规则。
(2)用样本集
D
1
\ D_1
D1递归建立左子树
(3)用样本集
D
2
\ D_2
D2递归建立右子树
(4)如果不能再进行分裂了则吧节点标记成叶子节点,同时赋值
寻找最佳分裂点
在递归建树的过程中需要一个评判准则将样本分裂成两个子集,寻找最佳的分裂特征。对于分裂问题要保证分类之后左右子树的样本尽可能的一致,即尽可能的纯,因此需要定义不纯度的指标,当样本都属于同一类时不纯度为0,当样本均匀地属于所有类时不纯度最大。
基于信息增益划分
**“信息熵”**是热力学单位,用在机器学习中永安里度量样本集合纯度的最常用的指标,假设当前样本集合D中第k类样本所占的比例为
p
k
\ p_k
pk(k=1,2,3…
y
\ y
y),则D的信息熵定义为:
E
n
t
(
D
)
=
−
∑
k
=
1
y
p
k
l
o
g
2
p
k
\ Ent(D)=-\sum_{k=1}^{y} p_klog_2p_k
Ent(D)=−∑k=1ypklog2pk
E
n
t
\ Ent
Ent值越小,则D的纯度越高。
假设离散属性
a
\ a
a有V个可能取值{
a
1
,
a
2
,
a
3
.
.
.
.
.
.
.
.
.
a
V
\ a^1,a^2,a^3.........a^V
a1,a2,a3.........aV},若使用
a
\ a
a来对样本集D进行划分,则会产生V个分支节点,其中第v个分支节点包含了D中所有在属性
a
\ a
a上取值为
a
v
\ a^v
av的样本,记为
D
v
\ D^v
Dv,可根据上面的信息熵计算公式计算出
D
v
\ D^v
Dv的信息熵,考虑不同分支样本包含的数据量不同,因此可给不同的分支节点不同的权重
∣
D
v
∣
/
∣
D
∣
|D^v|/|D|
∣Dv∣/∣D∣,样本数越大的分支节点影响越大,因此可计算出用属性
a
\ a
a对样本集进行划分得到的“信息增益”
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
Gain(D,a)=Ent(D)−∑v=1V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,则意味着使用属性
a
a
a划分所获得的“纯度提升”越大,因此可以选用信息增益进行决策树划分属性的选择。
以上图中的西瓜数据为例,
可看到表中总包含17个样本,其中好瓜有8个,坏果有9个,因此可计算出根节点的信息熵为
E
n
t
(
D
)
=
−
∑
k
=
1
2
p
k
l
o
g
2
p
k
=
−
(
8
17
l
o
g
2
8
17
+
9
17
l
o
g
2
9
17
)
=
0.998
Ent(D)=-\sum_{k=1}^{2}p_klog_2p_k=-(\frac{8}{17}log_2\frac{8}{17}+\frac{9}{17}log_2\frac{9}{17})=0.998
Ent(D)=−∑k=12pklog2pk=−(178log2178+179log2179)=0.998
算出根节点的信息熵之后,再分别计算每个特征{色泽、根蒂、敲声、纹理}的信息增益,以色泽为例,若使用该属性进行作为根节点进行划分的话,色泽共有3个子特征
D
1
D^1
D1(青绿),
D
2
D^2
D2(乌黑),
D
3
D^3
D3(浅白)
由上图可知,色泽为青绿时,正反样本均为3个,总样本数目为6个,对于色泽的剩下两个字特征来说方法一样,由此可计算出色泽的3个分支的信息熵:
E
n
t
(
D
1
)
=
−
(
3
6
l
o
g
2
3
6
+
3
6
l
o
g
2
3
6
)
=
1.00
Ent(D^1)=-(\frac{3}{6}log_2\frac{3}{6}+\frac{3}{6}log_2\frac{3}{6})=1.00
Ent(D1)=−(63log263+63log263)=1.00
E
n
t
(
D
2
=
−
(
4
6
l
o
g
2
4
6
+
2
6
l
o
g
2
2
6
)
=
0.918
Ent(D^2=-(\frac{4}{6}log_2\frac{4}{6}+\frac{2}{6}log_2\frac{2}{6})=0.918
Ent(D2=−(64log264+62log262)=0.918
E
n
t
(
D
3
)
=
−
(
1
5
l
o
g
2
1
5
+
4
5
l
o
g
2
4
5
)
=
0.722
Ent(D^3)=-(\frac{1}{5}log_2\frac{1}{5}+\frac{4}{5}log_2\frac{4}{5})=0.722
Ent(D3)=−(51log251+54log254)=0.722
根据上文可知因为属性有不同的分支,因此需要给不同的分支加上不同的权重。
由此可知“色泽”的信息增益为:
G
a
i
n
(
D
,
色
泽
)
=
E
n
t
(
D
)
−
∑
v
=
1
3
D
v
D
E
n
t
(
D
v
)
=
0.998
−
(
6
/
17
∗
1
+
6
/
17
∗
0.918
+
5
/
17
∗
0.722
)
=
0.109
Gain(D,色泽)=Ent(D)-\sum_{v=1}^{3}\frac{D^v}{D}Ent(D^v)=0.998-(6/17*1+6/17*0.918+5/17*0.722)=0.109
Gain(D,色泽)=Ent(D)−∑v=13DDvEnt(Dv)=0.998−(6/17∗1+6/17∗0.918+5/17∗0.722)=0.109
对于其他特征计算方法是一样的。
可计算出其他
G
a
i
n
(
D
,
根
蒂
)
=
0.143
Gain(D,根蒂)=0.143
Gain(D,根蒂)=0.143,
G
a
i
n
(
D
,
敲
声
)
=
0.141
Gain(D,敲声)=0.141
Gain(D,敲声)=0.141,
G
a
i
n
(
D
,
纹
理
)
=
0.381
Gain(D,纹理)=0.381
Gain(D,纹理)=0.381。
因此选择纹理作为根节点,
然后以纹理是清晰的再继续上述步奏,不过是特征不可以是纹理了,还是先计算纹理等于清晰时候的好瓜与坏果的类别然后计算信息熵,再根据纹理等于清晰重复上述步奏,判断在纹理等于清晰的时候,剩下的几个特征选择哪个作为纹理等于清晰之后的第二次判断的根节点可以然信息增益最大,以此类推直到数据全部用完为止。