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中zfill()方法的使用教程
May 20 Python
Python匹配中文的正则表达式
May 11 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
python下载图片实现方法(超简单)
Jul 21 Python
在java中如何定义一个抽象属性示例详解
Aug 18 Python
python生成随机图形验证码详解
Nov 08 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
python实现动态创建类的方法分析
Jun 25 Python
3种python调用其他脚本的方法
Jan 06 Python
np.random.seed() 的使用详解
Jan 14 Python
Python简单实现词云图代码及步骤解析
Jun 04 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
生成缩略图
2006/10/09 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
Yii清理缓存的方法
2016/01/06 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
php依赖注入知识点详解
2019/09/23 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JS定时器实例
2013/04/17 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python及PyCharm下载与安装教程
2017/11/18 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
保证书格式
2015/01/16 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
音乐研修感悟
2015/11/18 职场文书
学校体育节班级口号
2015/12/25 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书