决策树分类1(学习记录)

本文介绍了决策树的基本概念、优缺点及适用数据类型。详细讲解了决策树构建过程中的信息增益计算,用于评估特征划分数据集的效果。通过分析数据集的无序程度(熵),选择信息增益最高的特征进行划分,以此创建决策树。
摘要由CSDN通过智能技术生成

以下内容来源于《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:
            #抽取此特征前面所有特征
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值