决策树算法python实现_决策树之python实现ID3算法(例子)
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算法(例子)相关推荐
- python决策树原理_关于决策树算法最通俗的一次Python学习教程,你肯定得看
一. 概述 前面的一篇 有一点得先说一下,决策树在优化过程中,有3个经典的算法,分别是ID3,C4.5,和CART.后面的算法都是基于前面算法的一些不足进行改进的,我们这次的Python学习教程就先跟 ...
- python实现决策树算法sklearn_python sklearn-05:决策树及随机森林
1.决策树 2.随机森林 1.决策树(decision tree) 决策树一种简单的非线性模型,用来解决回归与分类问题. 通常是重复的将训练集解释变量分割成子集的过程.决策树的节点用方块表示,用来测试 ...
- 决策树剪枝python实现_决策树剪枝问题python代码
决策树在生长过程中有可能长得过于茂盛,对训练集学习的很好,但对新的数据集的预测效果不好,即过拟合,此时生成的模型泛化能力较差.因此,我们需要对决策树进行剪枝,使得生成的模型具有较强的泛化能力. 为了检 ...
- python实现决策树数据直接赋值导入_决策树在python中的数据实现
我为python决策树算法实现完成了以下代码:from csv import reader def load_csv(filename): file = open(filename, "rb ...
- python实现决策树归纳_决策树【python实现】
决策树思维导图.jpg 0.周董歌词中的决策树 为什麼 别人在那看漫画 我却在学画画 对著钢琴说话 别人在玩游戏 我却靠在墙壁背我的ABC 拿王牌谈个恋爱 而我不想被你教坏 还是听妈妈的话吧 晚点再恋 ...
- python决策树 value_机器学习之ID3算法详解及python代码实现
在生活中我们经常会用到决策树算法,最简单的就是二叉树了:相信大家也会又同样的困扰,手机经常收到各种短信,其中不乏很多垃圾短信.此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽.减少被骚扰的次数,同时 ...
- 2018年python薪资_最好的Python:2017和2018年至今我最喜欢的文章集
2018年python薪资 我打算发布此收藏集 (My intention with publishing this collection) Last year I only used Medium ...
- python 切片_全面解读Python高级特性切片
大家好,欢迎来到Crossin的编程教室! 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slic ...
- 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程
学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...
最新文章
- POJ2955Brackets[区间DP]
- 天猫php采集列表,QueryList: QueryList是一个基于phpQuery的通用列表采集类,是一个简单、 灵活、强大的采集工具,采集任何复杂的页面 基本上就一句话就能搞定了。...
- 区块链BaaS云服务(19)趣链“联邦计算BitXmesh”
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
- php时间到期提醒功能,php还剩多长时间过期函数
- 受限玻尔兹曼机(RBM)与python在Tensorflow的实现
- vsftpd 在linux 中的环境配置【部分原创】
- 老将回归,英特尔的复兴之路
- webpack-dev-server启动后, localhost:8080返回index.html的原理
- IT界那些性感的让人尖叫的程序员
- 分享不可不知的CAD经典技巧
- 个人简历表格 个人简历word百度云 完整个人简历样本
- rtthread学习之(3)——STM32系列BSP外设驱动使用教程
- EXCEL的去重去除某个字段后全部操作
- 微信更新,干掉手机输入法
- 三年磨一剑大话数据结构——数据结构起源、概念和术语
- ubuntu16.04安装ros kinetic及遇到的问题
- 惠普硬盘测试工具_超好用的电脑硬件检测工具
- Linux下创建用户并设置权限
- 考研复试面试题(本科课程--运筹学篇)----2020考研
热门文章
- 风控人应知的坏账准备金知识
- LeetCode-151 Reverse Worlds in a String
- HTML不熟悉方法总结
- BZOJ_1629_[Usaco2007_Demo]_Cow_Acrobats_(贪心)
- WPF学习:分页控件
- JPA还是JDBC?
- Varnish由于cookie过大返回503
- 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
- [kuangbin带你飞]专题五 并查集 A - Wireless Network
- hadoop eclipse 插件