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多线程用法实例详解
Jan 15 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
Redis使用watch完成秒杀抢购功能的代码
May 07 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
在keras里实现自定义上采样层
Jun 28 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
plt.figure()参数使用详解及运行演示
Jan 08 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 前一天或后一天的日期
2008/06/28 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python实现删除文件但保留指定文件
2015/06/21 Python
Python每天必学之bytes字节
2016/01/28 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
模范家庭事迹材料
2014/02/10 职场文书
师德师风自我评价范文
2014/09/11 职场文书
西安大雁塔导游词
2015/02/10 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python