Python决策树原生版参考

#encoding:utf-8
import mathdef createDataSet():#训练数据集dataSet=[['young','myope','no','reduced','no lenses'],['young','myope','no','normal','soft'],['young','myope','yes','reduced','no lenses'],['young','myope','yes','normal','hard'],['young','hyper','no','reduced','no lenses'],['young','hyper','no','normal','soft'],['young','hyper','yes','reduced','no lenses']]#数据分为两类yes,no#labels为特征的名称labels=['age','prescript','Astigmatic','tearRate']return dataSet,labels#计算给定数据集的熵
def calcShannonEnt(dataSet):#总的训练样本条数numEntries=len(dataSet)#类标签,每条样本所属类别labelCounts={}for featVec in dataSet:#每条最后一列为各自类别currentLabel=featVec[-1]#为所有可能的类别取值建立<key,value>结构#key表示类别,value表示该类出现次数#此处初始化if currentLabel not in labelCounts.keys():labelCounts[currentLabel]=0#出现一次加一次labelCounts[currentLabel]+=1#保存信息熵shannonEnt=0.0#样本遍历完后,计算各类别占总样本的,比例,即概率#遍历词典<key,value>结构for key in labelCounts:#计算该类别的比例prob=float(labelCounts[key])/numEntries#计算信息增益,以2为底数取对数shannonEnt-=prob*math.log(prob,2)#返回数据集熵return shannonEnt#计算条件熵,划分数据集
def splitDataSet(dataSet,axis,value):#定义新变量,保存划分后的数据集retDataSet=[]#遍历数据集每一条数据for featVec in dataSet:#将符合要求的数据抽取出来存入retDataSet中if featVec[axis]==value:#除给定的特征axis及值value,整行数据被保存下来#如选取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]#当前特征下对应值去重,即每个特征值唯一#如年龄,取值3个青年、中年、老年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=infoGainbestFeature=i#返回最好的特征return bestFeature#递归构建决策树
#多数表决的方法决定叶子节点的分类
#所有特征都用完时,以数据集中类别数量最多的类别作为最终类别
def majorityCnt(classList):#<key,value>数据集中每个类别出现的次数classCount={}#遍历数据集中的类别for vote in classList:#初始类别第一次加入字典最终if vote not in classCount.keys():classCount[vote]=0#记录次数classCount[vote]+=1#遍历结束后,次数value值从大到小进行排列sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#返回数量最多的类别return sortedClassCount[0][0]#创建树
#输入:数据集、特征名
#输出:树
def createTree(dataSet,labels):#取出数据集最后列数据,即训练数据的类标签classList=[example[-1] for example in dataSet]#类别完全相同则不划分,返回类标签#具体所有数据值为同一个值,如classList[0]='yes'个数,#为整个列表长度,显然所有的值均为yesif 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#使用决策树进行分类
#输入:训练好的决策树
#构建树的类别标签向量(用于确定特征在数据集中的位置)
#测试数据
#判断测试数据testVec,属于哪个类别
def classify(inputTree,featLabels,testVec):#firstStr存放决策树的根节点名称#取得根节点名称no surfacing#firstStr='no surfacing'firstStr=inputTree.keys()[0]#secondDict值为除树根节点名称外的值#即{0:'no',1:{'filippers':{0:'no',1:'yes'}}}secondDict=inputTree[firstStr]#index方法查找当前列表中第一个匹配firstStr变量的元素的索引#即找到树根节点在所有特征列的第几列featIndex=featLabels.index(firstStr)#测试数据对应根节点下的取值key=testVec[featIndex]#secondDict[0]='no' secondDict[1]='{'flippers':{0:'no',1:'yes'}}'valueOfFeat=secondDict[key]#判断valueOfFeat的类型#valueOfFeat为dict词典类型,递归寻找if isinstance(valueOfFeat,dict):classLabel=classify(valueOfFeat,featLabels,testVec)#valueOfFeat为数值,直接返回该值#此处valueOfFeat=secondDict[key]='no' 返回noelse:classLabel=valueOfFeat#返回最终类别return classLabel#决策树的存储
#pickle序列化对象,可以在磁盘上保存对象
def storeTree(inputTree,filename):import picklefw=open(filename,'w')pickle.dump(inputTree,fw)fw.close()#并在需要的时候将其读取出来
def grabTree(filename):import picklefr=open(filename)return pickle.load(fr)myDat,labels=createDataSet()
myTree=createTree(myDat,labels)
#print myTree
storeTree(myTree,'1.txt')
Tree=grabTree('1.txt')
#print Tree
aaa=classify(Tree,['age','prescript','Astigmatic','tearRate'],['young','hypper','yes','normal'])
print aaa

决策树算法详解(2)相关推荐

  1. 写给小白的机器学习之决策树算法详解(附实战源码)

    这里是实战源码,里面算法参数解释和数据可视化详解 GitHub慢的话看码云 具体ppt也已上传至csdn和GitHub 可以做分类树和回归树 现在是一个多分类任务 PPT讲解 强壮性是对若有缺失值等其 ...

  2. 【机器学习】Decision Tree 决策树算法详解 + Python代码实战

    文章目录 一.直观理解决策树 二.熵的作用 三.信息增益 四.决策树构造实例 4.1 问题描述 4.2 根节点构造 五.信息增益率和GINI系数 5.1 信息增益存在的问题 5.2 信息增益率 5.3 ...

  3. 决策树算法详解(1)

    使用决策树解决分类问题,例如 年龄在30为分界点第一次选择,第二个决策点是长相,第三个决策点是收入,在收入中等的时候还考虑是否是公务员,这就是一颗决策树 引入熵和基尼系数两个概念 熵其实就是混乱度,混 ...

  4. 机器学习之决策树算法详解

    1-1 基本流程 决策树是一个有监督分类与回归算法. 决策树的生成只考虑局部最优,相对的,决策树剪枝则考虑全局最优. 一.概念: 决策树:是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支 ...

  5. 决策树算法详解(3)

    from sklearn.tree import DecisionTreeClassifier # 1.criterion gini or entropy# 2.splitter best or ra ...

  6. CART分类决策树、回归树和模型树算法详解及Python实现

    机器学习经典算法详解及Python实现–CART分类决策树.回归树和模型树 摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用 ...

  7. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  8. 【机器学习】Java 代码实现 CART 决策树算法

    文章目录 一.决策树算法 二.CART 决策树 三.Java 代码实现 3.1 TrainDataSet 3.2 DataType 3.3 PredictResult 3.4 CartDecision ...

  9. 决策树详解python基于Kaggle的Titanic数据实现决策树分类

    决策树详解&&python基于Kaggle的Titanic数据实现决策树分类 一 决策树算法详解 1.前期准备 实验目的准备 2.决策树概述 2.1 决策树 2.2 ID3算法原理 2 ...

最新文章

  1. MFC类结构-1、CObject类
  2. 自定义控件:侧滑面板
  3. 编码和解码、调制与解调
  4. Android中使用Notification在通知栏中显示通知
  5. C语言:用单链表实现输入排序
  6. 车借给朋友好几次,满油的车每次还回来都是没油了,我觉得心里有些不舒服是我太计较吗?
  7. Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。
  8. [UI列表]LoopScrollRect无限滑动不卡顿
  9. Oracle Instant Client
  10. Java注解中produces啥意思_SpringBoot常用注解
  11. 物联网嵌入式高级C语言流行框架、学习路线图
  12. matlab分解因式虚数,[2018年最新整理]matlab中所有函数解析_太全了.doc
  13. Opencv 中的向量类Vec
  14. 超越源域的攻击:面向黑盒域制作对抗样本
  15. cesium两种方式鼠标移入移出实体显示提示框
  16. S-MSCKF(前端)代码解读
  17. Kafka多个消费者监听消费同一个Topic主题
  18. 【模拟电子技术基础】本章讨论问题答案1
  19. 计算机四级等级考试必备知识点总结
  20. vue.js中created()与activated()

热门文章

  1. NoClassDefFoundError: org/springframework/core/ErrorCoded 报错
  2. RDKit | 基于SMILES查找化合物的MACCS密钥
  3. 第五课.Linux开发基础
  4. 用 Python 帮运营妹纸快速搞定 Excel 文档
  5. FungalTraits: 超越FUNGuild的最新真菌表型数据库
  6. QIIME 2教程. 08差异丰度分析gneiss(2021.2)
  7. MPB:微生物所王军组-​人类肠道病毒粒子富集及纳米孔测序
  8. Nature综述带你读懂微生物在氮循环中的作用
  9. Gut:北京生科院赵方庆团队揭示人体口腔菌群的稳定性和动态变化规律
  10. CHM综述-建立因果关系,合成菌群在植物菌群研究中的机会