python实现决策树


Posted in Python onDecember 21, 2017

本文实例为大家分享了python实现决策树的具体代码,供大家参考,具体内容如下

算法优缺点:

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

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

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

算法思想:

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

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

2.信息增益

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

数据需要满足的要求:

1 数据必须是由列表元素组成的列表,而且所有的列白哦元素都要具有相同的数据长度
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实现端口复用实例代码
Jul 03 Python
Python多线程实例教程
Sep 06 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
python随机取list中的元素方法
Apr 08 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
详解Python二维数组与三维数组切片的方法
Jul 18 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python中最小二乘法详细讲解
Feb 19 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
python利用sklearn包编写决策树源代码
Dec 21 #Python
python实现决策树分类算法
Dec 21 #Python
Python语言描述机器学习之Logistic回归算法
Dec 21 #Python
python Crypto模块的安装与使用方法
Dec 21 #Python
python编写Logistic逻辑回归
Dec 30 #Python
python+selenium识别验证码并登录的示例代码
Dec 21 #Python
python实现随机森林random forest的原理及方法
Dec 21 #Python
You might like
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
Python中super的用法实例
2015/05/28 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
python如何实现视频转代码视频
2019/06/17 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Python函数基本使用原理详解
2020/03/19 Python
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
出国留学自荐信模板
2015/03/06 职场文书
房地产项目合作意向书
2015/05/08 职场文书
民事二审代理词
2015/05/25 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers