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程序实例(通讯录)
Nov 29 Python
python的re模块应用实例
Sep 26 Python
python使用htmllib分析网页内容的方法
May 08 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
python turtle 绘制太极图的实例
Dec 18 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
python实现自动清理文件夹旧文件
May 10 Python
Python OpenCV实现图形检测示例详解
Apr 08 Python
Python自动化实战之接口请求的实现
May 30 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与C#的值类型指向区别的详解
2013/05/21 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
Jquery ui css framework
2010/06/28 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
对Python 内建函数和保留字详解
2018/10/15 Python
详解Django admin高级用法
2019/11/06 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
精彩的推荐信范文
2013/11/26 职场文书
人事主管岗位职责
2014/01/30 职场文书
工程质量承诺书范文
2014/03/27 职场文书
离婚财产处理协议书
2014/09/30 职场文书
班主任先进事迹材料
2014/12/17 职场文书
社区服务活动报告
2015/02/05 职场文书
消防演习通知
2015/04/25 职场文书
紫日观后感
2015/06/05 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技