1.决策树
决策树指一类常见的机器学习算法,以二分类为例,我们希望从给定训练集学得一个模型用以对新实列进行分类,这个把样本分类的任务,可以看作对‘“当前样本属性正常吗”这个问题的“决策”过程。而决策树就是基于树结构来进行决策的,如下图所示如果一个女生的妈妈给她介绍对象,如果这个被介绍的人的年龄大于30岁就不见,如果小于30岁长相丑的话也不见,年龄低于30岁长的帅收入低也不见,如果收入中等不是公务员不见,是公务员才会见面。最终这个女生经过了一系列的决策,决定最终见面还是不见。这个决策的过程就构成了一颗决策树。决策过程的最终结论对应了我们所希望的判定结果:见还是不见。一般的,一棵决策树包含一个根节点,若干个内部节点和若干个叶结点。叶节点对应与决策结果,其他每个结点则对应于一个属性测试。
下面给出决策树学习的基本流程:
有训练集D,属性集A
①生成结点node
②如果D中所有样本全部属于同一类别C,这时将node标记为C类结点。结束
③如果 A为空集或者D中所有样本在A上取值相同,这时将node标记为D中样本数最多的类。结束
④从A中选取最优划分a
⑤对a中的每一个值生成子决策树
显然生成决策树的过程与生成二叉树的过程一样,是一个递归的过程。
3.如何划分
由算法可以看出,生成决策树的关键步骤是从A中找到最优划分属性a,那么a是如何求出来的呢,目前主要有三种算法:ID3算法,C4.5算法,和CART算法,接下来我们先来介绍几组概念。
3.1信息熵
‘信息熵’是度量事物不确定性的一种指标,越不确定的事物,其信息熵就越大。其计算表达式为:
E
n
t
(
X
)
=
−
∑
k
=
1
n
p
k
l
o
g
2
p
k
Ent(X)=-\sum_{k=1}^{n}{p_{k}log_{2}{p_{k}}}
Ent(X)=−k=1∑npklog2pk
n
表
示
X
可
以
取
到
的
离
散
值
的
个
数
,
p
k
n表示X可以取到的离散值的个数,p_{k}
n表示X可以取到的离散值的个数,pk为样本集合D中样本为k的概率。比如说X可以取0,1两种取值,其概率分别为
1
3
2
3
\frac{1}{3} \frac{2}{3}
3132,其信息熵为
E
n
t
(
X
)
=
−
1
3
l
o
g
2
1
3
−
−
2
3
l
o
g
2
2
3
=
1
3
l
o
g
2
3
−
−
2
3
l
o
g
2
3
Ent(X)=-\frac{1}{3}log_{2}\frac{1}{3}--\frac{2}{3}log_{2}\frac{2}{3}=\frac{1}{3}log_{2}3--\frac{2}{3}log\frac{2}{3}
Ent(X)=−31log231−−32log232=31log23−−32log32
3.2条件熵
条件熵类似于条件概率,他是来度量X在知道Y以后的不确定性。
E
n
t
(
X
∣
Y
)
=
∑
k
=
1
n
P
(
y
k
)
∗
E
n
t
(
X
∣
Y
k
)
Ent(X |Y)=\sum_{k=1}^{n}P(y_{k})*Ent(X|Y_{k})
Ent(X∣Y)=k=1∑nP(yk)∗Ent(X∣Yk)
3.3信息增益
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
a
)
Gain(D,a)=Ent(D)-Ent(D |a)
Gain(D,a)=Ent(D)−Ent(D∣a)
一般信息增益越大,意味着使用属性a来进行划分的可靠性越高。
下面来举列子来说明一下这三个值是怎么算的:
feature | labels |
---|---|
A1 | 1 |
A1 | 1 |
A1 | 1 |
A1 | 0 |
A1 | 0 |
A2 | 1 |
A2 | 1 |
A2 | 0 |
A2 | 0 |
A2 | 0 |
A3 | 1 |
A3 | 1 |
A3 | 1 |
A3 | 1 |
A3 | 0 |
样本D的信息熵为:
E
n
t
(
D
)
=
−
(
9
15
l
o
g
2
9
15
+
6
15
l
o
g
2
6
15
)
=
0.971
Ent(D)=-(\frac{9}{15}log_{2}\frac{9}{15}+\frac{6}{15}log_{2}\frac{6}{15})=0.971
Ent(D)=−(159log2159+156log2156)=0.971
样本的条件熵为:
E
n
t
(
D
∣
A
)
=
5
15
E
n
t
(
D
∣
A
1
)
+
5
15
E
n
t
(
D
∣
A
2
)
+
5
15
E
n
t
(
D
∣
A
3
)
Ent(D|A)=\frac{5}{15}Ent(D|A1)+\frac{5}{15}Ent(D|A2)+\frac{5}{15}Ent(D|A3)
Ent(D∣A)=155Ent(D∣A1)+155Ent(D∣A2)+155Ent(D∣A3)
=
−
5
15
(
3
5
l
o
g
2
3
5
+
2
5
l
o
g
2
2
5
)
−
5
15
(
2
5
l
o
g
2
2
5
+
3
5
l
o
g
2
3
5
)
−
5
15
(
4
5
l
o
g
2
4
5
+
4
5
l
o
g
2
1
5
)
=
0.888
=-\frac{5}{15}(\frac{3}{5}log_{2}\frac{3}{5}+\frac{2}{5}log_{2}\frac{2}{5})-\frac{5}{15}(\frac{2}{5}log_{2}\frac{2}{5}+\frac{3}{5}log_{2}\frac{3}{5})-\frac{5}{15}(\frac{4}{5}log_{2}\frac{4}{5}+\frac{4}{5}log_{2}\frac{1}{5})=0.888
=−155(53log253+52log252)−155(52log252+53log253)−155(54log254+54log251)=0.888
信息增益为:
G
a
i
n
(
D
,
A
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
A
)
=
0.083
Gain(D,A)=Ent(D)-Ent(D|A)=0.083
Gain(D,A)=Ent(D)−Ent(D∣A)=0.083
3.ID3算法
ID3决策树学习算法为准则信息增益来进行选择划分属性的。下面给出算法的过程:
①判断样本是否为同一类别C,如果是,则返回单节点树,标记类别为C
②判断特征是否为空,如果是则返回单节点数T,标记类别样本中输出类别为样本中的各类别实例数最多的类别
③通过计算样本各个特征的信息增益,挑选出信息增益最大的特征A1.
④按照特征A1的不同取值将对应的样本D划分成不同的子类别。
⑤对所有的子类别执行上述操作,得到决策树后返回。
ID3算法的不足:
ID3算法容易倾向于选择特征取值较多的特征作为最优特征。举了极端情况:如给上边的那个表格加上一列不同的编号,把编号也作为构造决策树的一个特征。显然,编号那列计算出来的条件熵会是0,由于信息熵一样,所以标号那列的信息增益会是最大的,根据ID3算法将增益率作为选择标准的原则,那么编号这一列会是最优特征,但这回将样本划分成15个子类别,每个子列的样本数都为1,但明显这样划分是不合理的。而且ID3算法也只能处理离散型的数据,对于连续型的数据,ID3无法运用。所以ID3算法的设计者就对此算法进行了改进,提出了C4.5算法。
4.C4.5算法
4.1连续型数据处理
对于连续型数据,C4.5思路是将连续的特征离散化。比如m个样本的连续型特征A有m个,将这m个数据由小到大排序,取相邻两个样本值得平均数作为划分点,一共会取得m-1个划分点,分别计算这m-1个点分别作为二元分类点时得信息增益,取信息增益最大得点作为该连续性特征得二元离散分类点。
图中左边为一系列年龄为特征从小到大排好顺序的数据,分别取相邻两个样本的平均值得到了右边的一列数据,假设我们要按年龄划分为大人和小孩,则就分别以右边的那列数据作为划分点来计算对应的信息增益,如17说,将小于17的划分为小孩,大于17的划分为大人,来计算其信息增益。计算出每个划分点的信息增以后,选出信息增益最大的那个对应的点作为最终的划分点。
2.C4.5的改进
对于将信息增益作为标准倾向于选择取值较多的特征的问题,C4.5引入了一个新的信息增益的比量,他是信息增益和特征熵的比值增益率。
增益率的定义:
G
a
i
n
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
A
)
E
n
t
A
(
D
)
Gain_ratio(D,a)=\frac{Gain(D,A)}{Ent_{A}(D)}
Gainratio(D,a)=EntA(D)Gain(D,A)
其中D为最终输出的特征标签,A为样本特征。特征熵的表达式为
E
n
t
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
Ent_{A}(D)=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|}
EntA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
其中n为特征A的类别数,
D
i
D_{i}
Di为特征A的第i个取值对应的样本个数。|D|为样本个数。
特征数越多的特征对应的特征熵越大,他作为分母,可以校正信息增益容易偏向取值较多的特征的问题。C4.5便是将增益率来作为选择标准。
参考自:刘建平决策树决策树算法原理