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 相关文章推荐
Unicode和Python的中文处理
Mar 19 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
Dec 15 Python
Python自定义简单图轴简单实例
Jan 08 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python之mock模块基本使用方法详解
Jun 27 Python
python3实现绘制二维点图
Dec 04 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
python开根号实例讲解
Aug 30 Python
如何用Python进行时间序列分解和预测
Mar 01 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
微信JS接口大全
2016/08/25 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
python中的列表推导浅析
2014/04/26 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Python中一些深不见底的“坑”
2019/06/12 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
python中rb含义理解
2020/06/18 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
MIS软件工程师的面试题
2016/04/22 面试题
社区党员公开承诺书
2014/08/30 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android