决策树的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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
python进阶教程之文本文件的读取和写入
Aug 29 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
详解Python中的__new__()方法的使用
Apr 09 Python
python和bash统计CPU利用率的方法
Jul 10 Python
Python深度优先算法生成迷宫
Jan 22 Python
python实现简易版计算器
Jun 22 Python
python3+requests接口自动化session操作方法
Oct 13 Python
Python终端输出彩色字符方法详解
Feb 11 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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/10/09 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP中使用BigMap实例
2015/03/30 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
Java程序员面试90题
2013/10/19 面试题
银行会计业务的个人自我评价
2013/11/02 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
投诉书范文
2015/07/02 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
nginx+lua单机上万并发的实现
2021/05/31 Servers