决策树的python实现方法


Posted in Python onNovember 18, 2014

本文实例讲述了决策树的python实现方法。分享给大家供大家参考。具体实现方法如下:

决策树算法优缺点:

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

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

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

算法思想:

1.决策树构造的整体思想:

决策树说白了就好像是if-else结构一样,它的结果就是你要生成这个一个可以从根开始不断判断选择到叶子节点的树,但是呢这里的if-else必然不会是让我们认为去设置的,我们要做的是提供一种方法,计算机可以根据这种方法得到我们所需要的决策树。这个方法的重点就在于如何从这么多的特征中选择出有价值的,并且按照最好的顺序由根到叶选择。完成了这个我们也就可以递归构造一个决策树了

2.信息增益

划分数据集的最大原则是将无序的数据变得更加有序。既然这又牵涉到信息的有序无序问题,自然要想到想弄的信息熵了。这里我们计算用的也是信息熵(另一种方法是基尼不纯度)。公式如下:

数据需要满足的要求:

① 数据必须是由列表元素组成的列表,而且所有的列白哦元素都要具有相同的数据长度
② 数据的最后一列或者每个实例的最后一个元素应是当前实例的类别标签

函数:

calcShannonEnt(dataSet)
计算数据集的香农熵,分两步,第一步计算频率,第二部根据公式计算香农熵

splitDataSet(dataSet, aixs, value)
划分数据集,将满足X[aixs]==value的值都划分到一起,返回一个划分好的集合(不包括用来划分的aixs属性,因为不需要)

chooseBestFeature(dataSet)
选择最好的属性进行划分,思路很简单就是对每个属性都划分下,看哪个好。这里使用到了一个set来选取列表中唯一的元素,这是一中很快的方法

majorityCnt(classList)
因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类还是没有算完,这时候就会采用多数表决的方式计算节点分类

createTree(dataSet, labels)
基于递归构建决策树。这里的label更多是对于分类特征的名字,为了更好看和后面的理解。

#coding=utf-8

import operator

from math import log

import time
def createDataSet():

    dataSet=[[1,1,'yes'],

            [1,1,'yes'],

            [1,0,'no'],

            [0,1,'no'],

            [0,1,'no']]

    labels = ['no surfaceing','flippers']

    return dataSet, labels
#计算香农熵

def calcShannonEnt(dataSet):

    numEntries = len(dataSet)

    labelCounts = {}

    for feaVec in dataSet:

        currentLabel = feaVec[-1]

        if currentLabel not in labelCounts:

            labelCounts[currentLabel] = 0

        labelCounts[currentLabel] += 1

    shannonEnt = 0.0

    for key in labelCounts:

        prob = float(labelCounts[key])/numEntries

        shannonEnt -= prob * log(prob, 2)

    return shannonEnt
def splitDataSet(dataSet, axis, value):

    retDataSet = []

    for featVec in dataSet:

        if featVec[axis] == value:

            reducedFeatVec = featVec[:axis]

            reducedFeatVec.extend(featVec[axis+1:])

            retDataSet.append(reducedFeatVec)

    return retDataSet

    

def chooseBestFeatureToSplit(dataSet):

    numFeatures = len(dataSet[0]) - 1#因为数据集的最后一项是标签

    baseEntropy = calcShannonEnt(dataSet)

    bestInfoGain = 0.0

    bestFeature = -1

    for i in range(numFeatures):

        featList = [example[i] for example in dataSet]

        uniqueVals = set(featList)

        newEntropy = 0.0

        for value in uniqueVals:

            subDataSet = splitDataSet(dataSet, i, value)

            prob = len(subDataSet) / float(len(dataSet))

            newEntropy += prob * calcShannonEnt(subDataSet)

        infoGain = baseEntropy -newEntropy

        if infoGain > bestInfoGain:

            bestInfoGain = infoGain

            bestFeature = i

    return bestFeature

            

#因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类

#还是没有算完,这时候就会采用多数表决的方式计算节点分类

def majorityCnt(classList):

    classCount = {}

    for vote in classList:

        if vote not in classCount.keys():

            classCount[vote] = 0

        classCount[vote] += 1

    return max(classCount)         

    

def createTree(dataSet, labels):

    classList = [example[-1] for example in dataSet]

    if classList.count(classList[0]) ==len(classList):#类别相同则停止划分

        return classList[0]

    if len(dataSet[0]) == 1:#所有特征已经用完

        return majorityCnt(classList)

    bestFeat = chooseBestFeatureToSplit(dataSet)

    bestFeatLabel = labels[bestFeat]

    myTree = {bestFeatLabel:{}}

    del(labels[bestFeat])

    featValues = [example[bestFeat] for example in dataSet]

    uniqueVals = set(featValues)

    for value in uniqueVals:

        subLabels = labels[:]#为了不改变原始列表的内容复制了一下

        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, 

                                        bestFeat, value),subLabels)

    return myTree

    

def main():

    data,label = createDataSet()

    t1 = time.clock()

    myTree = createTree(data,label)

    t2 = time.clock()

    print myTree

    print 'execute for ',t2-t1

if __name__=='__main__':

    main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python列表append和+的区别浅析
Feb 02 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
Python生成短uuid的方法实例详解
May 29 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
浅谈pytorch和Numpy的区别以及相互转换方法
Jul 26 Python
Python Numpy计算各类距离的方法
Jul 05 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
关于Python错误重试方法总结
Jan 03 Python
python中的被动信息搜集
Apr 29 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
linux 下实现python多版本安装实践
Nov 18 #Python
centos 下面安装python2.7 +pip +mysqld
Nov 18 #Python
朴素贝叶斯算法的python实现方法
Nov 18 #Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 #Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 #Python
django 自定义用户user模型的三种方法
Nov 18 #Python
使用grappelli为django admin后台添加模板
Nov 18 #Python
You might like
php 异常处理实现代码
2009/03/10 PHP
jQuery 源码分析笔记
2011/05/25 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
PHP中header用法小结
2016/05/23 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
js日历功能对象
2012/01/12 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Django实现学生管理系统
2019/02/26 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
高三教师工作总结2015
2015/07/21 职场文书
安全生产会议制度
2015/08/06 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书