1 #-*- coding: utf-8 -*-

2 from math importlog3 importoperator4 importpickle5 '''

6 输入:原始数据集、子数据集(最后一列为类别标签,其他为特征列)7 功能:计算原始数据集、子数据集(某一特征取值下对应的数据集)的香农熵8 输出:float型数值(数据集的熵值)9 '''

10 defcalcShannonEnt(dataset):11 numSamples =len(dataset)12 labelCounts ={}13 for allFeatureVector indataset:14 currentLabel = allFeatureVector[-1]15 if currentLabel not inlabelCounts.keys():16 labelCounts[currentLabel] =017 labelCounts[currentLabel] += 1

18 entropy = 0.0

19 for key inlabelCounts:20 property = float(labelCounts[key])/numSamples21 entropy -= property * log(property,2)22 returnentropy23

24 '''

25 输入:无26 功能:封装原始数据集27 输出:数据集、特征标签28 '''

29 defcreatDataSet():30 dataset = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,0,'no']]31 labels = ['no surfacing','flippers']32 returndataset,labels33

34 '''

35 输入:数据集、数据集中的某一特征所在列的索引、该特征某一可能取值(例如,(原始数据集、0,1 ))36 功能:取出在该特征取值下的子数据集(子集不包含该特征)37 输出:子数据集38 '''

39 defgetSubDataset(dataset,colIndex,value):40 subDataset = [] #用于存储子数据集

41 for rowVector indataset:42 if rowVector[colIndex] ==value:43 #下边两句实现抽取除第colIndex列特征的其他特征取值

44 subRowVector =rowVector[:colIndex]45 subRowVector.extend(rowVector[colIndex+1:])46 #将抽取的特征行添加到特征子数据集中

47 subDataset.append(subRowVector)48 returnsubDataset49

50 '''

51 输入:数据集52 功能:选择最优的特征,以便得到最优的子数据集(可简单的理解为特征在决策树中的先后顺序)53 输出:最优特征在数据集中的列索引54 '''

55 defBestFeatToGetSubdataset(dataset):56 #下边这句实现:除去最后一列类别标签列剩余的列数即为特征个数

57 numFeature = len(dataset[0]) - 1

58 baseEntropy =calcShannonEnt(dataset)59 bestInfoGain = 0.0; bestFeature = -1

60 for i in range(numFeature):#i表示该函数传入的数据集中每个特征

61 #下边这句实现抽取特征i在数据集中的所有取值

62 feat_i_values = [example[i] for example indataset]63 uniqueValues =set(feat_i_values)64 feat_i_entropy = 0.0

65 for value inuniqueValues:66 subDataset =getSubDataset(dataset,i,value)67 #下边这句计算pi

68 prob_i = len(subDataset)/float(len(dataset))69 feat_i_entropy += prob_i *calcShannonEnt(subDataset)70 infoGain_i = baseEntropy -feat_i_entropy71 if (infoGain_i >bestInfoGain):72 bestInfoGain =infoGain_i73 bestFeature =i74 returnbestFeature75

76 '''

77 输入:子数据集的类别标签列78 功能:找出该数据集个数最多的类别79 输出:子数据集中个数最多的类别标签80 '''

81 defmostClass(ClassList):82 classCount ={}83 for class_i inClassList:84 if class_i not inclassCount.keys():85 classCount[class_i] =086 classCount[class_i] += 1

87 sortedClassCount =sorted(classCount.iteritems(),88 key=operator.itemgetter(1),reverse =True)89 returnsortedClassCount[0][0]90

91 '''

92 输入:数据集,特征标签93 功能:创建决策树(直观的理解就是利用上述函数创建一个树形结构)94 输出:决策树(用嵌套的字典表示)95 '''

96 defcreatTree(dataset,labels):97 classList = [example[-1] for example indataset]98 #判断传入的dataset中是否只有一种类别,是,返回该类别

99 if classList.count(classList[0]) ==len(classList):100 returnclassList[0]101 #判断是否遍历完所有的特征,是,返回个数最多的类别

102 if len(dataset[0]) == 1:103 returnmostClass(classList)104 #找出最好的特征划分数据集

105 bestFeat =BestFeatToGetSubdataset(dataset)106 #找出最好特征对应的标签

107 bestFeatLabel =labels[bestFeat]108 #搭建树结构

109 myTree ={bestFeatLabel:{}}110 del(labels[bestFeat])111 #抽取最好特征的可能取值集合

112 bestFeatValues = [example[bestFeat] for example indataset]113 uniqueBestFeatValues =set(bestFeatValues)114 for value inuniqueBestFeatValues:115 #取出在该最好特征的value取值下的子数据集和子标签列表

116 subDataset =getSubDataset(dataset,bestFeat,value)117 subLabels =labels[:]118 #递归创建子树

119 myTree[bestFeatLabel][value] =creatTree(subDataset,subLabels)120 returnmyTree121

122 '''

123 输入:测试特征数据124 功能:调用训练决策树对测试数据打上类别标签125 输出:测试特征数据所属类别126 '''

127 defclassify(inputTree,featlabels,testFeatValue):128 firstStr =inputTree.keys()[0]129 secondDict =inputTree[firstStr]130 featIndex =featlabels.index(firstStr)131 for firstStr_value insecondDict.keys():132 if testFeatValue[featIndex] ==firstStr_value:133 if type(secondDict[firstStr_value]).__name__ == 'dict':134 classLabel =classify(secondDict[firstStr_value],featlabels,testFeatValue)135 else: classLabel =secondDict[firstStr_value]136 returnclassLabel137

138

139 '''

140 输入:训练树,存储的文件名141 功能:训练树的存储142 输出:143 '''

144 defstoreTree(trainTree,filename):145

146 fw = open(filename,'w')147 pickle.dump(trainTree,fw)148 fw.close()149 defgrabTree(filename):150

151 fr =open(filename)152 returnpickle.load(fr)153

154

155 if __name__ == '__main__':156 dataset,labels =creatDataSet()157 storelabels = labels[:]#复制label

158 trainTree =creatTree(dataset,labels)159 classlabel = classify(trainTree,storelabels,[0,1])160 print classlabel

决策树算法python实现_决策树之python实现ID3算法(例子)相关推荐

  1. python决策树原理_关于决策树算法最通俗的一次Python学习教程,你肯定得看

    一. 概述 前面的一篇 有一点得先说一下,决策树在优化过程中,有3个经典的算法,分别是ID3,C4.5,和CART.后面的算法都是基于前面算法的一些不足进行改进的,我们这次的Python学习教程就先跟 ...

  2. python实现决策树算法sklearn_python sklearn-05:决策树及随机森林

    1.决策树 2.随机森林 1.决策树(decision tree) 决策树一种简单的非线性模型,用来解决回归与分类问题. 通常是重复的将训练集解释变量分割成子集的过程.决策树的节点用方块表示,用来测试 ...

  3. 决策树剪枝python实现_决策树剪枝问题python代码

    决策树在生长过程中有可能长得过于茂盛,对训练集学习的很好,但对新的数据集的预测效果不好,即过拟合,此时生成的模型泛化能力较差.因此,我们需要对决策树进行剪枝,使得生成的模型具有较强的泛化能力. 为了检 ...

  4. python实现决策树数据直接赋值导入_决策树在python中的数据实现

    我为python决策树算法实现完成了以下代码:from csv import reader def load_csv(filename): file = open(filename, "rb ...

  5. python实现决策树归纳_决策树【python实现】

    决策树思维导图.jpg 0.周董歌词中的决策树 为什麼 别人在那看漫画 我却在学画画 对著钢琴说话 别人在玩游戏 我却靠在墙壁背我的ABC 拿王牌谈个恋爱 而我不想被你教坏 还是听妈妈的话吧 晚点再恋 ...

  6. python决策树 value_机器学习之ID3算法详解及python代码实现

    在生活中我们经常会用到决策树算法,最简单的就是二叉树了:相信大家也会又同样的困扰,手机经常收到各种短信,其中不乏很多垃圾短信.此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽.减少被骚扰的次数,同时 ...

  7. 2018年python薪资_最好的Python:2017和2018年至今我最喜欢的文章集

    2018年python薪资 我打算发布此收藏集 (My intention with publishing this collection) Last year I only used Medium ...

  8. python 切片_全面解读Python高级特性切片

    大家好,欢迎来到Crossin的编程教室! 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slic ...

  9. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程

    学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...

最新文章

  1. POJ2955Brackets[区间DP]
  2. 天猫php采集列表,QueryList: QueryList是一个基于phpQuery的通用列表采集类,是一个简单、 灵活、强大的采集工具,采集任何复杂的页面 基本上就一句话就能搞定了。...
  3. 区块链BaaS云服务(19)趣链“联邦计算BitXmesh”
  4. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
  5. php时间到期提醒功能,php还剩多长时间过期函数
  6. 受限玻尔兹曼机(RBM)与python在Tensorflow的实现
  7. vsftpd 在linux 中的环境配置【部分原创】
  8. 老将回归,英特尔的复兴之路
  9. webpack-dev-server启动后, localhost:8080返回index.html的原理
  10. IT界那些性感的让人尖叫的程序员
  11. 分享不可不知的CAD经典技巧
  12. 个人简历表格 个人简历word百度云 完整个人简历样本
  13. rtthread学习之(3)——STM32系列BSP外设驱动使用教程
  14. EXCEL的去重去除某个字段后全部操作
  15. 微信更新,干掉手机输入法
  16. 三年磨一剑大话数据结构——数据结构起源、概念和术语
  17. ubuntu16.04安装ros kinetic及遇到的问题
  18. 惠普硬盘测试工具_超好用的电脑硬件检测工具
  19. Linux下创建用户并设置权限
  20. 考研复试面试题(本科课程--运筹学篇)----2020考研

热门文章

  1. 风控人应知的坏账准备金知识
  2. LeetCode-151 Reverse Worlds in a String
  3. HTML不熟悉方法总结
  4. BZOJ_1629_[Usaco2007_Demo]_Cow_Acrobats_(贪心)
  5. WPF学习:分页控件
  6. JPA还是JDBC?
  7. Varnish由于cookie过大返回503
  8. 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
  9. [kuangbin带你飞]专题五 并查集 A - Wireless Network
  10. hadoop eclipse 插件