决策树的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的源码浅要剖析Python的内存管理
Apr 16 Python
Python的requests网络编程包使用教程
Jul 11 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
浅谈python之新式类
Aug 12 Python
python+os根据文件名自动生成文本
Mar 21 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Golang GBK转UTF-8的例子
Aug 26 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
JavaScript实用代码小技巧
2018/08/23 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
项目专员岗位职责
2013/12/04 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
中学生自我评价范文
2014/02/08 职场文书
主题班会演讲稿
2014/05/22 职场文书
单位租房协议范本
2014/12/03 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript