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之入门(五)缩进和选择
May 27 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
在Python中使用next()方法操作文件的教程
May 24 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
浅谈python中的占位符
Nov 09 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Python之循环结构
Jan 15 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
Python实现手势识别
Oct 21 Python
python创建字典及相关管理操作
Apr 13 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php常用Stream函数集介绍
2013/06/24 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
python 基础教程之Map使用方法
2017/01/17 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
python如何求100以内的素数
2020/05/27 Python
婴儿地球:Baby Earth
2018/12/25 全球购物
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
网络工程师职业规划
2014/02/10 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
煤矿安全协议书
2014/08/20 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
招商银行工作证明
2015/06/17 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Java实现房屋出租系统详解
2021/10/05 Java/Android