决策树的原理
引出
书中从如何从邮箱中分类垃圾邮件开始入手,设置了三个问题,第一个问题是检查域名是否是’myEmployer.com’,如果是的,则判定为’Email to read when bored’,如果不是则继续判断邮件中是否含有‘曲棍球’这个单词,如果有则表明是朋友发来的,则判定为’Email from friends; read immediately’, 如果不是则判定邮件为垃圾邮件,即’Spam, don’t read.’,这就可以构成一颗简易的决策树,具体的分支如下图所示:
这就是最简单的决策树的例子,决策树可以帮助我们很好地理解数据,而且决策树可以很好地将数据提炼为知识。
优缺点
优点:计算代价小,学习得出的结果很好理解,允许缺失值,可以处理一些不相关的特征
缺点:容易过拟合
常用于:Numeric values, nominal values
分支原理
用于分支的方法有很多种,不同的方法就成为了不同种类的决策树,当然我们也可以根据实际情况,有依据地自行指定分支方法,这样会更适用于实际问题。
分支的整体过程是,从根节点开始,我们需要找到能够得到最好结果的一个分类特征,根据这个特征取值,可以将数据集分为多个不同的子数据集(subsets),这样我们就实现了从根节点的第一次分支,然后我们判断各个子数据集中的数据是否是一个类别的,如果是,则该子数据集不用再继续分解,而该子集的类别就是当前数据的类别;如果子数据集中不止一个类别,则继续执行第一步,直至将所有的数据分类完毕。下面是算法:
在了解了整体的分解机制之后,我们现在来讨论从根节点向子节点分支的判定依据,也就是我们的分支条件,注意,在这里我们讨论的不仅仅是二分类问题,而是普遍的多分类问题。
ID3算法
ID3算法是决策树分类算法最经典的一种,这是依靠一组数据的信息增益大小来进行决策,信息增益更大的特征将会获得优先分支的权利,即某一个特征(维度)上的信息增益更大,则就会优先以该特征作为节点的分支标准进行分支。
那么怎样来计算信息增益,我们使用的是香浓提出来的香农熵,通过以某一特征分支前和分支后的香农熵之差来作为以该特征进行分类的信息增益。
香农熵的公式为:
l
(
x
i
)
=
log
2
p
(
x
i
)
.
l(x_i) = \log_2p(x_i).
l(xi)=log2p(xi).
我们需要将该特征每一种分类的香农熵进行加和,才能得到最后的信息熵,求和的公式为:
H
=
−
∑
i
=
1
n
p
(
x
i
)
log
2
p
(
x
i
)
H = -\sum_{i=1}^n p(x_i)\log_2 p(x_i)
H=−i=1∑np(xi)log2p(xi)
其中n表示所分支出来的分支的数量
这些用python代码实现是这样的:
from math import log
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys(): # 没有当前类别则生成当前类别
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1 # 对各个类别的频数生成字典
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key]) / numEntries # 计算每个类在数据集中所占的比例
shannonEnt -= prob * log(prob, 2)
return shannonEnt
这个也是ID3算法的核心代码,原理十分简单。
而决策树除了ID3算法之外还有Cart和C4.5算法,在这里先不做描述,在后面回归算法用的时候会进一步探讨。
总结
决策树除了单独作为一种算法独立存在之外,他还可以通过随机森林等集成算法进行分类。
参考资料:
《Machine Learning in Action》