决策树的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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
Python with用法实例
Apr 14 Python
Python生成不重复随机值的方法
May 11 Python
python修改操作系统时间的方法
May 18 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Python之web模板应用
Dec 26 Python
Python语言描述连续子数组的最大和
Jan 04 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
Python正则表达式学习小例子
Mar 03 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
详解python日志输出使用配置文件格式
Feb 10 Python
Python实现批量自动整理文件
Mar 16 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生成静态页
2006/11/25 PHP
CI框架中zip类应用示例
2014/06/17 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
laravel5.6实现数值转换
2019/10/23 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
销售员岗位职责范本
2014/02/03 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
采购员岗位职责
2015/02/03 职场文书
Python机器学习之基础概述
2021/05/19 Python