1 决策树算法概述
工作原理:
得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多余两个,因此可能存在大于两个分支的数据集划分。第一次划分后,数据将被向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据。
递归结束的条件:
程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类, 则得到一个叶子节点或终止块。任何到达叶子结点的数据必然属于叶子节点的分类。
2 创建分支 createBranch() 的伪代码
检测数据集中的每个子项是否属于同一分类:
If so
return 类标签
Else
寻找划分数据集的最好特征
划分数据集
创建分支节点
for 每个划分的子集
调用 createBranch() 函数并增加返回结果到分支节点中
return 分支节点
3 Wiki——奥卡姆剃刀原理、ID3算法、信息熵与信息增益
(1)奥卡姆剃刀原理
奥卡姆剃刀(英语:Occam’s Razor, Ockham’s Razor),意思是简约之法则。他在《箴言书注》2卷15题说
切勿浪费较多东西,去做‘用较少的东西,同样可以做好的事情’。
换一种说法,如果关于同一个问题有许多种理论,每一种都能作出同样准确的预言,那么应该挑选其中使用假定最少的。尽管越复杂的方法通常能作出越好的预言,但是在不考虑预言能力(即结果大致相同)的情况下,假设越少越好。
(2)ID3算法介绍
ID3算法是决策树的一种,它是基于奥卡姆剃刀原理的,即用尽量用较少的东西做更多的事。ID3算法,即Iterative Dichotomiser 3,迭代二叉树3代,是Ross Quinlan发明的一种决策树算法,这个算法的基础就是上面提到的奥卡姆剃刀原理,越是小型的决策树越优于大的决策树,尽管如此,也不总是生成最小的树型结构,而是一个启发式算法。
在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法的核心思想就是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策空间。
(3)信息熵(Information entropy)
在信息论中,熵是接收的每条消息中包含的信息的平均量,又被称为香农熵、信息熵、信源熵、平均自信息量。这里,“消息”代表来自分布或数据流中的事件、样本或特征。(熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。)
熵越高,混合的信息越多
假如一个随机变量
的取值为
,每一种取到的概率分别是
,那么
的熵定义为

意思是一个变量的变化情况可能越多,那么它携带的信息量就越大。
对于分类系统来说,类别
是变量,它的取值是
,而每一个类别出现的概率分别是

而这里的
就是类别的总数,此时分类系统的熵就可以表示为

(4)信息增益(Information Gain)
信息增益是针对一个一个特征而言的,就是看一个特征
,系统有它和没有它时的信息量各是多少,两者
的差值就是这个特征给系统带来的信息量,即信息增益。
接下来以天气预报的例子来说明。下面是描述天气数据表,学习目标是play或者not play。

可以看出,一共14个样例,包括9个正例和5个负例。那么当前信息的熵计算如下

在决策树分类问题中,信息增益就是决策树在进行属性选择划分前和划分后信息的差值。假设利用
属性Outlook来分类,那么如下图

划分后,数据被分为三部分了,那么各个分支的信息熵计算如下

那么划分后的信息熵为

代表在特征属性
的条件下样本的条件熵。那么最终得到特征属性
带来的信息增益为

信息增益的计算公式如下

其中
为全部样本集合,
是属性
所有取值的集合,
是
的其中一个属性值,
是
中属性
的
值为
的样例集合,
为
中所含样例数。
在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性,很显然这是一种自顶向下的贪心策略。以上就是ID3算法的核心思想。
(5)关于信息增益的深入理解
熵:表示随机变量的不确定性。
条件熵:在一个条件下,随机变量的不确定性。
信息增益:熵 - 条件熵在一个条件下,信息不确定性减少的程度!
通俗地讲,X(明天下雨)是一个随机变量,X的熵可以算出来, Y(明天阴天)也是随机变量,在阴天情况下下雨的信息熵我们如果也知道的话(此处需要知道其联合概率分布或是通过数据估计)即是条件熵。两者相减就是信息增益!
原来明天下雨例如信息熵是2,条件熵是0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为1.99,在获得阴天这个信息后,下雨信息不确定性减少了1.99!是很多的!所以信息增益大!
也就是说,阴天这个信息对下雨来说是很重要的!所以在特征选择的时候常常用信息增益,如果IG(信息增益大)的话那么这个特征对于分类来说很关键~~ 决策树就是这样来找特征的!
4 决策树的优点与缺点
(1)优点
计算复杂度不高,输出易于理解的结果,对于中间值的缺失不敏感,可以处理不相关特征数据
(2)缺点
可能会产生过度匹配问题
5 Python代码实现
(1)计算香农熵
# 划分数据集的大原则是: 将无序的数据变得更加有序(尽量使信息熵降低)
# 信息增益(information gain): 在划分数据集前后信息熵发生的变化
# 获得 信息增益 最高 的特征就是最好的选择
# 集合信息 的 度量方式称为 香农熵(ShannonEntropy) 或 熵(entropy)
def calcShannonEnt(dataSet):
"""
计算给定数据集的 香农熵
:param dataSet:
:return:
"""
# 计算输入数据集的 样本 总数
numEntries = len(dataSet)
# 创建一个用于统计 标签 出现次数的 dict
labelCounts = {}
# 遍历数据集中的 样本
for featVec in dataSet:
# 当前 样本 的 标签 为 featVec[-1]
currentLabel = featVec[-1]
# 记录标签的出现次数
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
# 香农熵 初始化
shannonEnt = 0.0
# 遍历字典 labelCounts 的 key
for key in labelCounts:
# 计算 标签 出现的 频率
prob = float(labelCounts[key])/numEntries
# 计算 香农熵
shannonEnt -= prob * log(prob, 2)
return shannonEnt
# # 熵越高,则混合的数据越多
# print(calcShannonEnt(myDat))
(2)创建数据集
def createDataSet():
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['no surfacing', 'flippers']
return dataSet, labels
myDat, labels = createDataSet()
(3)按照给定特征划分数据集
def splitDataSet(dataSet, axis, value):
"""
按照给定的特征划分数据集
遍历数据集中的每一个元素,一旦发现符合要求的值,则将其添加到新创建的列表中
:param dataSet: 待划分的数据集
:param axis: 划分数据集的特征
:param value: 需要返回的特征的值
:return: 划分后的数据集
"""
retDataSet = []
# 遍历数据集的每一个样本
for featVec in dataSet:
# 如果样本的 axis 项(指定特征)的值与输入的 value 相同
if featVec[axis] == value:
# 将 当前样本 featVec 中除了 axis 项(指定特征)之外的其余项保存到 reducedFeatVec list 中
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
# 将 reducedFeatVec 追加到 retDataSet 中
retDataSet.append(reducedFeatVec)
return retDataSet
# print(myDat)
# print(splitDataSet(myDat, 0, 1))
# print(splitDataSet(myDat, 1, 1))
"""
[[1, 'yes'], [1, 'yes'], [0, 'no']]
[[1, 'yes'], [1, 'yes'], [0, 'no'], [0, 'no']]
"""
(4)选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
"""
选择最好的数据集划分方式
选取特征,划分数据集,计算得出最好的划分数据集的特征
传入的 dataSet 需要满足:
1、数据必须是一种由列表元素组成的 list,而且所有的列表元素都要具有相同的数据长度
2、数据的最后

本文介绍了ID3算法,一种基于信息增益的决策树构建方法。详细讲解了决策树的工作原理、奥卡姆剃刀原理、信息熵和信息增益的概念,并通过Python实现展示了如何构建和使用决策树。
最低0.47元/天 解锁文章
2804

被折叠的 条评论
为什么被折叠?



