概述
以下内容来源于《Machine Learning in Action》
决策树
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型。
在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类
时起决定性作用。为了找到决定性的特征,划分出最好的结果,我们必须评估每个特征。 完成测
试之后,原始数据集就被划分为几个数据子集。这些数据子集会分布在第一个决策点的所有分支
上。如果某个分支下的数据属于同一类型,则当前无需阅读的垃圾邮件已经正确地划分数据分类,
无需进一步对数据集进行分割。如果数据子集内的数据不属于同一类型,则需要重复划分数据子
集的过程。如何划分数据子集的算法和划分原始数据集的方法相同,直到所有具有相同类型的数
据均在一个数据子集内。
创建分支的伪代码函数createBranch()如下所示:
检测数据集中的每个子项是否属于同一分类:
If so return 类标签;
Else
寻找划分数据集的最好特征
划分数据集
创建分支节点
for 每个划分的子集
调用函数createBranch并增加返回结果到分支节点中
return 分支节点
上面的伪代码createBranch是一个递归函数,在倒数第二行直接调用了它自己。后面我们
将把上面的伪代码转换为Python代码,这里我们需要进一步了解算法是如何划分数据集的。
决策树的一般流程
(1) 收集数据:可以使用任何方法。
(2) 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4) 训练算法:构造树的数据结构。
(5) 测试算法:使用经验树计算错误率。
(6) 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据
的内在含义。
信息增益
划分数据集的大原则是:将无序的数据变得更加有序。我们可以使用多种方法划分数据集,
但是每种方法都有各自的优缺点。组织杂乱无章数据的一种方法就是使用信息论度量信息,信息
论是量化处理信息的分支科学。我们可以在划分数据之前使用信息论量化度量信息的内容。
在划分数据集之前之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以
计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
在可以评测哪种数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集
合信息的度量方式称为香农熵或者简称为熵,这个名字来源于信息论之父克劳德·香农。
图片来源于https://blog.csdn.net/cxjoker/article/details/79501887
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是该分类的概率
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob*log(prob,2) #以2为底求对数
return shannonEnt
测试代码
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#//若没有该键,则使用字典的自动添加进行添加值为0的项,取0是因为下一行代码
labelCounts[currentLabel]+=1 #对currentlabel计数,每有一个key:currentlabel,就在对应的key的值上加1
shannonEnt=0.0
for key in labelCounts:
#prob是该分类的概率
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob*log(prob,2) #以2为底求对数
return shannonEnt
划分数据集
上面我们学习了如何度量数据集的无序程度,分类算法除了需要测量信息熵,还需要划分数
据集,度量花费数据集的熵,以便判断当前是否正确地划分了数据集。我们将对每个特征划分数
据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。想象一个分
布在二维空间的数据散点图,需要在数据之间划条线,将它们分成两部分,我们应该按照x轴还
是y轴划线呢?
#按照给定特征划分数据集
#三个输入参数:待划分的数据集、划分数据集的特征(索引)、特征的返回值
# Python语言在函数中传递的是列表的引用,在函数内部对列表对象的修改,将会影响该列表对象的整个生存周期。
# 为了消除这个不良影响,我们需要在函数的开始声明一个新列表对象。
def splitDataSet(dataSet,axis,value):
retDataSet=[]
for featVec in dataSet:
if featVec[axis]==value
最后
以上就是外向雨为你收集整理的决策树分类1(学习记录)的全部内容,希望文章能够帮你解决决策树分类1(学习记录)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复