Python3.0 实现决策树算法的流程


Posted in Python onAugust 08, 2019

决策树的一般流程

检测数据集中的每个子项是否属于同一个分类

if so return 类标签
Else

  寻找划分数据集的最好特征

    划分数据集

   创建分支 节点

from math import log
import operator
#生成样本数据集
def createDataSet():
  dataSet = [[1,1,'yes'],
        [1,1,'yes'],
        [1,0,'no'],
        [0,1,'no'],
        [0,1,'no']]
  labels = ['no surfacing','flipper']
  return dataSet,labels
# 计算香农熵 香农 大神必须要膜拜啊,信息界的根目录人物啊
# no surfacing 指的是 不浮出水面能否生存 1 标识 是 0 指的是否
# flipper 指的是是否有脚
# yes no指的是否是鱼类
def calcShannonEnt(dataSet):
  numEntries = len(dataSet) # 用上面的createDataSet dataSet 这个值就是5
  #定义标签字典
  labelCounts = {}
  # 为所有可能的分类创建字典
  for featVec in dataSet:
    currentLabel = featVec[-1] #这个-1指的是去取最后一个维度 对应数据dataSet 这里取的是yes和no
    if currentLabel not in labelCounts.keys():
      # 如果当前分类标签不在 标签字典中
      labelCounts[currentLabel] = 0
    # 其他情况 分类标签分类加1
    labelCounts[currentLabel] += 1
  #定义香农熵 以2为底数求对数
  shannonEnt = 0.0
  for key in labelCounts:
    #计算 yes 或者No 出现的概率
    pro = float(labelCounts[key])/numEntries
    # 计算香农熵
    shannonEnt -= pro*log(pro,2)
  return shannonEnt
#dataSet是待划分的数据集, 划分数据集的特征 axis 特征的返回值value
#最后是创建了一个新的列表对象
def splitDataSet(dataSet, axis , value):
  # 创建新list对象
  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):
  # len(dataSet[0])是计算这一行有多少列,即有多少个特征值
  numFeatures = len(dataSet[0])-1 # -1 是最后一个特征值就不要记录在内了,算baseEntrop的时候已经算了最后一个特征值yes no
  baseEntropy = calcShannonEnt(dataSet)
  bestInfoGain = 0.0
  bestFeature = -1
  for i in range(numFeatures):
    #创建唯一的分类标签列表 也就是说提取dataSet每一行第i个值 就提取dat
    featList = [example[i] for example in dataSet]
    # 取出有几种特征值
    uniqueVals = set(featList)
    newEntropy = 0.0
    for value in uniqueVals:
      #创建特征值的子数据集
      subDataSet = splitDataSet(dataSet,i, value)
      #计算该特征值数据对总数在数据对总数出现的概率
      pro = len(subDataSet)/float(len(dataSet))
      #计算分割出来的子集香农熵
      newEntropy += pro*calcShannonEnt(subDataSet)
    #计算信息增益 得到最好的特征值 这个理论是这样的g(D,A) = H(D)-H(D/A)
    infoGain = baseEntropy-newEntropy
    #取出最大的信息增益,此时特征值最大
    if(infoGain >bestInfoGain):
      bestInfoGain = infoGain
      bestFeature = i
  return bestFeature
'''
#构建决策树是根据特征值的消耗来计算的,如果后面的特征值已经全部用完了
但是还没有分出结果,这个时候就需要使用多数表决方式计算节点分类
最后返回最大的分类
'''
def majorityCnt(classList):
  # 分类的字典
  classCount = {}
  for vote in range(classList):
    #如果不在 分类字典中
    if vote not in classCount.keys(): classCount[vote] = 0
    classCount[vote] += 1
    # 根据出现的次数大到小排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
  return sortedClassCount[0][0]
#创建决策树
def createTree(dataSet, labels):
  # 获取数据样本每组最后一组的特征值 这里是yes,no
  classList = [example[-1] for example in dataSet]
  # 如果说这个classList 全部都是 yes 或者全部是no 那肯定子返回yes 或者no
  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:{}}
  # 删除labels中的一特征值
  del(labels[bestFeat])
  #找到特征值那一列
  featValues = [example[bestFeat] for example in dataSet]
  uniqueVals = set(featValues)
  for value in uniqueVals:
    # labels列表的赋值
    subLabels = labels[:]
    myTree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
  return myTree
dataSet,lables = createDataSet()
shannonEnt= calcShannonEnt(dataSet)
my = createTree(dataSet,lables)
print(my)

总结

以上所述是小编给大家介绍的Python3.0 实现决策树算法的流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python的ORM框架SQLAlchemy入门教程
Apr 28 Python
Python的面向对象思想分析
Jan 14 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
python实现词法分析器
Jan 31 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
python 从list中随机取值的方法
Nov 16 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
Python自动化爬取天眼查数据的实现
Jun 15 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 #Python
Django rest framework jwt的使用方法详解
Aug 08 #Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 #Python
django基于restframework的CBV封装详解
Aug 08 #Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 #Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 #Python
Python generator生成器和yield表达式详解
Aug 08 #Python
You might like
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php 页面执行时间计算代码
2008/12/04 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
Python中的__init__作用是什么
2020/06/09 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
爸爸的花儿落了教学反思
2014/02/20 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技