`

MLA Review之二:决策树

阅读更多

分类决策树是一种描述对实例进行分类的属性结构,决策树由内部节点和叶节点,内部节点表示一个特征或者属性,叶节点表示一个类。

 

Part 1 :决策树生成

用决策树分类其实是一个if-then的过程,根据一个特征值的取值将原始的数据进行分类,比如,银行往往会根据个人情况和信用进行处理是否借贷,其评比条件如下图:



 那么可能其中的一个决策树就会如下:



 分类树也就是这样。

 

 

那么这个时候问题就来了,每次进行选取一个特征,如上面根节点是选取年龄还是选择有房子呢,这是第一个问题。

 

主要有两种算法进行计算,第一个是信息增益,另外一个是信息增益比,下面会来介绍一下这两种方式

 

1,信息增益

信息增益不用多介绍,在分类问题上被用了无数次,主要就是用来选取特征值,其本质就是尽量是各个类尽量平均,用在分类树上其实实质是为了减少分类树的不均衡,这一点其实在学习数据结构的时候我们都知道有个叫AVL树和红黑树,称之为平衡树,总体要求是使树的树枝高度不相差太多

 

信息增益计算公式:



 

 2,信息增益比

信息增益比很容易计算,和信息增益差不多,只不过是信息增益与H(D)的比:



 
与特征选取的两种算法对应,决策树的生成也有两种算法:ID3和C4.5

ID3分类使用信息增益方法,C4.5分类使用信息增益比算法。

 

下面根据MLA 一书中的决策树一章使用Python语言实现一下决策树,书中使用的决策树算法是ID3,也就是使用信息增益方法进行分类选取。

 

原始问题的数据集如下:

  dataset=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
  labels=['no surfacing','flippers']

 dataset每个项里面的最后一个数据是标签,也就是分类结果,前面两个是分类依据,第一个是代表是否有surfacing,第二个代表是否有flipper,现在需要根据这个数据集构建一颗决策树。

 

代码如下:

# -*- coding: UTF8 -*-
"""
author:luchi
date:16/2/17
theme:decision tree
desc:决策树的构建,使用ID3方法构建决策树
"""

from math import  log
import operator
#计算熵值
def computeEnt(dataset):
    m=len(dataset)
    labels=[]
    for i in range(m):
        labels.append(dataset[i][-1])
    labels=set(labels)
    countLabel={}
    for i in range(m):
        clabel=dataset[i][-1]
        if not countLabel.has_key(clabel):
            countLabel[clabel]=1
        else:
            t=countLabel[clabel]+1
            countLabel[clabel]=t
    retEnt=0.0
    for label in labels:
        prob=float(countLabel[label])/m
        retEnt-=prob*log(prob,2)
    return retEnt

#产生数据集
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




"""
根据标签分割数据集
params:
    dataset:原始数据集
"""
def splitDataset(dataset,axis,value):

    m=len(dataset)
    retDataset=[]
    for i in range(m):
        if dataset[i][axis]==value:
            l=dataset[i][:axis]
            l.extend(dataset[i][axis+1:])
            retDataset.append(l)
    return retDataset





"""
获取最好的分组条件
"""
def getBestSlpit(dataset,labels):
    m=len(dataset[0])-1
    bestEnt=0.0
    bestAxis=0
    ent=computeEnt(dataset)
    length=len(dataset)
    for i in range(m):
        l=[example[i] for example in dataset] #计算每一个特征值的数组
        l=set(l) #不重复
        infoEnt=0.0
        for feature in l:
            tempSet=splitDataset(dataset,i,feature)
            size=len(tempSet)
            prob=float(size)/length
            infoEnt+=prob*computeEnt(tempSet)
        infoEnt=ent-infoEnt
        if(infoEnt>bestEnt):
            bestEnt=infoEnt
            bestAxis=i
    return bestAxis

"""
在选出了最好的分组之后,在分组终止之后,就需要判断其类别
采用的是最大投票的方法,也就是哪个类别多就这个分组为其类别
"""
def chooseClassLabel(dataset):
        labels=[example[-1] for example in dataset]
        labels=set(labels)
        labelCounts={}
        for i in range(len(dataset)):
            l=dataset[i][-1]
            if not labelCounts.has_key(l):
                labelCounts[l]=1
            else:
                m=labelCounts[l]+1
                labelCounts[l]=m
        sortedLabelCounts=sorted(labelCounts.iteritems(),key=operator.itemgetter(1),reverse=True)
        return sortedLabelCounts[0][0]

"""
递归的构造决策树
"""
def buildDecisionTree(dataset,labels):
    #判断终止条件
    classList=[example[-1] for example in dataset]
    uniClassList=set(classList)
    if len(uniClassList)==1 :
        return classList[0]
    if len(dataset[0])==1:
        return chooseClassLabel(dataset)
    bestFeat=getBestSlpit(dataset,labels)
    bestFeatLabel=labels[bestFeat] #最好的分类标签
    myTree={bestFeatLabel:{}}
    del(labels[bestFeat])
    featValues=[example[bestFeat] for example in dataset]
    uniFeat=set(featValues)
    for value in uniFeat:
        subLabels=labels[:]
        myTree[bestFeatLabel][value]=buildDecisionTree(splitDataset(dataset,bestFeat,value),subLabels)
    return myTree



if __name__=="__main__" :
    dataset,labels=createDataset()
    # ent=computeEnt(dataset)
    # print ent
    # newdateset=splitDataset(dataset ,0,1)
    # print  newdateset
    # label=chooseClassLabel(dataset)
    # print label
    # bestEnt,bestAxis=getBestSlpit(dataset,labels)
    # print bestEnt
    # print bestAxis
    mytree=buildDecisionTree(dataset,labels)
    print mytree

 运行结果如下:

 



 

使用图形表达出来就是下图:


 Part 2:决策树剪枝

决策树生成完毕,也会产生一些问题,就是和所有机器学习问题一样,会产生过拟合问题,表现在决策树上,就是分类的树过于复杂,对部分特征学习过度,忽略了整体特征。解决其问题就是剪枝。

 



 

 

如上图所示,如果一棵树的不剪枝的损失函数值大于剪枝后的损失函数值的话,那么就将子节点合并到其父节点上。决策树剪枝实质上是将一些叶节点合并到其父节点上,以此递归实现。

决策树剪枝算法也有很多种,具体见【1】P65-P67,这里不细述。

 

附1: 关于CART算法

 

CART算法可以用于决策树的生成,生成过程和上面的ID3算法大同小异,区别在于其特征选取的方法是基尼指数,听着挺高端,其实也不过是一种新的计算方法,没什么特殊的。也就是说上面的程序将信息增益的方法改变成基尼指数方法就可以了

 

附2:决策树与回归树

决策树是用来分类的,而回归树是一种预测模型。回归树和所有回归方法一样,根据已知的数据构造数据模型,然后根据需要预测对象的参数输出预测结果,回归问题会在后面的讲回归的章节中描述,所以这里不在具体描述。

 

 

参考文献:

【1】 统计学习方法,李航

【2】Machine Learning in Action

  • 大小: 117.3 KB
  • 大小: 43.4 KB
  • 大小: 78.8 KB
  • 大小: 13.5 KB
  • 大小: 11.9 KB
  • 大小: 87.1 KB
  • 大小: 61.8 KB
1
0
分享到:
评论

相关推荐

    MLA Review之三:朴素贝叶斯分类

    在这个“MLA Review之三:朴素贝叶斯分类”的主题中,我们将会深入探讨朴素贝叶斯的工作原理、优缺点以及实际应用。 首先,朴素贝叶斯分类器的核心是贝叶斯定理,该定理表示了在已知某些证据的情况下,某一假设发生...

    MLA Handbook 8thEd (MLA Handbook 第8版,PDF)

    在第二部分,即“MLA风格的细节”中,手册深入探讨了学术散文的机械性细节,其中包括人名的使用、作者及其作品标题的规范、各种类型的引用、数字和日期的格式化、缩略语的使用等。在引用方面,详细介绍了如何准确地...

    matlab匹配滤波代码-MLA2_Tracking:这是用于在MLA2实验中跟踪动物位置的代码

    matlab匹配滤波代码MLA2_Tracking 这是用于记录,跟踪和分析MLA2实验动物位置的代码。 要在新实验中使用此代码,请从Github存储库中派生或下载并从那里开始使用新数据。 工作流程大纲 盆景: Video_Acquisition....

    latex-mla-template:我个人的 LaTeX MLA 模板

    乳胶-mla-模板 用于生成 mla 格式论文的基本模板。 先决条件 make 一些最新的 LaTeX 发行版(TeXLive、MacTeX、MiKTeX 等) 安装和使用 $ git clone https://github.com/trotod/latex-mla-template <project> $ cd...

    MLA格式说明

    ### MLA格式说明知识点详解 #### 一、MLA格式简介 MLA(Modern Language Association)格式是由美国现代语言协会提出的一种引用格式标准,主要用于英语语言与文学等人文学科的学术论文写作中。这一格式旨在为学术...

    MLA格式参考文献示例.doc

    MLA 格式参考文献示例 MLA 格式参考文献示例文档提供了一些常见的文献类型的引用格式,包括期刊文章、专著、编撰书籍等。下面是对这些文献类型的详细解释和示例。 期刊文章 在 MLA 格式中,期刊文章的引用格式...

    MLA Format MLA格式.pdf

    MLA(Modern Language Association)格式是一种广泛应用于人文科学领域的引用规范,主要用于撰写文学论文。MLA格式要求在论文中正确引用他人的观点和内容,确保学术诚信。以下是关于MLA格式的一些关键要点: 1. **...

    mla-data:用于 RhetCompWriting 的 MLA JIL 数据

    MLA JIL 文本数据 该存储库包含从 MLA 工作信息列表中挖掘的文本数据语料库。 这是一个正在进行的项目,旨在提供 (1) 供其他学者分析的纯文本数据资源,以及 (2) 分析用于修辞和写作研究的 MLA JIL 数据。 该项目的...

    创意电子关于MLA系列贴片电容选型手册.pdf

    首先,我们可以确定这份文件是关于MLA系列贴片电容的选型手册。MLA系列贴片电容是指特定型号的电容器,这类电容器通常被广泛应用于各种电子设备中,用以稳定电源电压、滤波、耦合和去耦等。选型手册的作用是在众多的...

    pa.mla.unit.addon:mla unit addon mod

    "pa.mla.unit.addon:mla unit addon mod" 是一个针对特定游戏或模拟平台的扩展模组,主要由Python编程语言编写。这个模块可能是为了增强游戏中的单位(unit)功能,提供更多的自定义选项或者引入新的游戏机制。在...

    VDA 6.3 :2016 审核中P2-P7与 MLA解读、审核表格及案例分析

    在这个主题中,我们将深入探讨P2到P7的过程审核元素以及MLA(制造过程能力)的解读,结合实际的审核表格和案例分析,以帮助理解和应用这些概念。 P2-P7是VDA 6.3过程审核的核心部分,它们分别代表: 1. P2 - 过程...

    MLA正文引用+参考文献.pdf

    MLA正文引用+参考文献.pdf 本文将详细介绍MLA格式的正文引用和参考文献的撰写要求。MLA格式是由美国现代语言学会(Modern Language Association)提出的,主要应用于人文学科、社会科学和自然科学等领域。 MLA格式...

    MLA_Citation_Series_E-book_Merge

    MLA(Modern Language Association)引用格式是人文科学领域内最常用的文献引用风格之一,适用于文学、语言学、文化研究等学科的研究论文。本指南将详细介绍MLA第七版的基本引用规则,涵盖常见的书籍、电子资源及...

    第十届中国机器学习及其应用研讨会 MLA'12

    会议中可能涉及的算法有支持向量机(SVM)、决策树、随机森林和神经网络等。这些模型在图像分类、文本分类、情感分析等领域有着广泛的应用。 无监督学习则不依赖于标记数据,主要用于发现数据集内的结构和模式,如...

    mla-data-reconstruction:用于解析,重建和转换MLA测量数据的库

    《mla数据重建:Python库解析与应用》 在当今数据驱动的时代,高效的数据处理工具是科学研究和技术开发的重要支柱。本文将深入探讨“mla-data-reconstruction”这一Python库,它专为解析、重建和转换MLA(多光子...

    美硕 MLA 双稳态继电器 产品说明书.zip

    《美硕 MLA 双稳态继电器产品说明书》是一份详细阐述美硕品牌MLA系列双稳态继电器技术规格、工作原理、安装与使用的参考资料。这份说明书的重要性在于,它为使用者提供了全面了解和安全操作该产品的关键信息。 首先...

    论文的基本结构和引用文献格式MLA.doc

    在MLA格式中,论文的基本结构包括:Introduction、Literature Review、Methodology、Results、Discussions和Conclusion等部分。Introduction是指论文的引言部分,包括研究的背景、意义和预期解决的问题。Literature ...

    参考文献中MLA格式规范.doc

    MLA格式规范详解 MLA格式是Modern Language Association(现代语言学会)所制定的格式规范,广泛应用于人文学科、社会科学和自然科学等领域。MLA格式的主要特点是采用括号式注释,注释内容包括作者姓氏、作品名称、...

    VDA-Band- Maturity level assurance for-3-2022-English MLA

    《VDA Band 成熟度等级保障 - 针对新部件的3版2022年英文MLA》 该文档是2022年6月第三版修订的VDA(德国汽车工业协会)质量管理体系在供应链中的联合质量管理,特别关注新部件的成熟度等级保证。VDA-QMC(质量管理...

Global site tag (gtag.js) - Google Analytics