根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益

根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益_第1张图片

CSDN:

https://blog.csdn.net/weixin_45814668

微信公众号:qiongjian0427Git:

https://github.com/qiongjian/Machine-learning/​github.com

运行环境:anaconda—jupyter notebook

Python版本:Python3

1. 简介

k-近邻算法最大的缺点就是无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。

下图所示决策树,长方形代表判断模块(decision block),椭圆形代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作分支(branch),它可以到达另一个判断模块或者终止模块。

根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益_第2张图片

1.1 优缺点

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能会产生过度匹配问题。

适用数据类型:数值型和标称型。

1.2 流程

(1) 收集数据:可以使用任何方法。
(2)准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3)分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4) 训练算法:构造树的数据结构。
(5) 测试算法:使用经验树计算错误率。
(6)使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

1.3 决策树的构造

构造决策树需要解决的第一个问题就是,当前数据集那个特征在划分数据时起决定性作用。为了找到这个特征,需要对所有的特征进行评估。
(1)选择一个决定性特征,将训练数据集分成子集,这些子集分布在第一个决策点的分支上。
(2)如果某个分支上的子集属于同一类,则说明这个子集在当前条件下是最好的分类,不需要再进行分割。
(3)如果某个分支上的子集不属于同一类,说明子集不能够被正确的分类,那么就对这些子集选择新的特征,继续分割,直至所有子集都属于同一类。

创建分支的伪代码createBranch()如下:

检测数据集中的每个子项是否属于同一分类:
   If so return 类标签
   Else
       寻找划分数据集的最好特征
       划分数据集
       创建分支节点
           for 每个划分的子集
               调用函数createBranch并增加返回结果到分支节点中      
       return 分支节点

1.4 海洋生物数据

本文使用ID3算法划分数据集,每次划分数据集时我们只选取一个特征属性。

下表展示了海洋生物数据,特征包括:不浮出水面是否可以生存,和是否有脚蹼。

现在我们想要决定依据第一个特征还是第二个特征划分数据。在回答这个问题之前,我们必须采用量化的方法判断如何划分数据。
表1:海洋生物数据

根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益_第3张图片

2. 信息增益

2.1 几个概念

(1)划分数据的大原则:将无序的数据变得更加有序。

(2)信息论:量化处理信息的分支科学。

(3)信息增益:划分数据之前之后信息发生的变化。信息增益最高的特征就是最好的选择。

(4)香农熵(简称熵entropy):集合信息度量的方式。定义为信息的期望值。来源于信息论之父克劳德.香农。

(5)如果待分类的事务可能划分在多个分类之中,则符号Xi的信息定义为:

28453f77d8c065304a66dfa33d4e7e4c.png

p(xi)是选择该分类的概率。

为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值,通过下面的公式得到:

87ed74e4e0b5f9b4f983c59224918e07.png

n是分类的数目。

2.2 计算给定数据集的熵

python代码如下:

from math import log
def calcShannonEnt(dataSet):
    # 求list的长度,表示计算参与训练的数据量
    numEntries = len(dataSet)
    # 计算分类标签label出现的次数
    labelCounts = {}
    # the the number of unique elements and their occurance
    for featVec in dataSet:
        # 将当前实例的标签存储,即每一行数据的最后一个数据代表的是标签
        currentLabel = featVec[-1]
        # 为所有可能的分类创建字典,如果当前的键值不存在,则扩展字典并将当前键值加入字典。每个键值都记录了当前类别出现的次数。
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    # 对于 label 标签的占比,求出 label 标签的香农熵
    shannonEnt = 0.0
    for key in labelCounts:
        # 使用所有类标签的发生频率计算类别出现的概率。
        prob = float(labelCounts[key])/numEntries
        # 计算香农熵,以 2 为底求对数
        shannonEnt -= prob * log(prob, 2)
    return shannonEnt

利用createDataSet()函数得到表1中鱼类的鉴定数据集:

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()
print(myDat)
print(calcShannonEnt(myDat))

根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益_第4张图片

熵越高则混合的数据越多。我们可以在数据集中添加更多的分类,观察熵是如何变化的。

如添加第三个名为maybe的分类,测试熵的变化:

根据信息增益率构造决策树_机器学习实战:决策树(一)信息增益_第5张图片

END.

你可能感兴趣的:(根据信息增益率构造决策树)