自己尝试使用简单数据集实现决策树 代码——《机器学习实战》
记录学习过程,每天学会一点点,早日玩转机器学习......(手动呵呵微笑)。
一.核心代码
1.数据集部分
上图为所给的海洋生物数据,则以1代表可以付出水面、有脚蹼;0代表无法浮出水面、无脚蹼;yes为属于鱼类、no为不属于鱼类
则创建数据集的代码可以表示为:
from math import log
"""
加载得到简单的鉴定鱼的数据集
"""
def createDataSet():#根据所给的数据表构造数据集dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]labels = ['no surfacing','flippers']#两个标签:是否浮出水面、是否有蹼return dataSet,labels
实例化测试一下结果:
myData,labels = createDataSet()
print(myData)
打印为:
2.计算香农熵的部分
前面几篇博客已经讲过香农熵的计算公式,下面用代码实现一下计算过程,其实无非就是用代码实现一下计算公式,仔细看就能看得懂,相关部分我也做了注释。记住,每一个键值都是记录当前类别在数据集中出现的次数,那一个if语句的意思就是:在遍历的过程中,如果这个键值不存在,就从这一步开始扩展它,记下来,如果存在,则把计数的参数更新一下,即做加一处理,留作下面计算概率。后面就接着计算每一个类别出现的概率,并使用这个概率去计算香农熵:
"""
计算香农熵
"""
def calShannonEnt(dataSet):numEntries = len(dataSet)#长度labelCounts = {}
#为所有可能类别创建字典,它的键值是最后一列的数值,如果当前键值不存在,则扩展字典并将当前键值加入字典。
#!!!每一个键值都是记录当前类别在数据集中出现的次数for featVec in dataSet:currentLabel = featVec[-1]if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1shannonEnt = 0.0for key in labelCounts:#使用所有类别标签的发生频率计算类别出现的概率prob = float(labelCounts[key])/numEntries#用这个概率结合香农熵公式来计算香农熵shannonEnt -= prob*log(prob,2)return shannonEnt
可以用该方法来计算一下上面数据集的香农熵:
输出香农熵:
3.划分数据集
分类算法不仅要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确划分了数据集。将对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征进行划分数据集是最好的划分方式。
在函数的开始声明一个新列表对象,因为该函数代码在同一数据及上被调用多次,为了不修改原始数据集,应创建一个新的列表对象。
数据集这个列表中的各个元素也是列表,我们要遍历数据集中的每个元素,一旦发现符合条件的值,就将其添加到新创建的列表中。简单理解为:当我们按照某个特征划分数据集时,就需要将所有符合要求的元素抽取出来。代码中使用了extend()和append()方法,两者结果大有不同:
append()方法:
extend()方法:
"""
3.划分数据集的部分
"""
def splitDataSet(dataSet,axis,value):#在这三个参数中,首先dataSet是待划分的数据集、axis是划分数据集的特征、value是特征的返回值retDataSet = []#创建新的list对象for featVec in dataSet:if featVec[axis] == value:reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis+1:])retDataSet.append(reducedFeatVec)return retDataSet
测试一下这个划分的方法:
#(myData,0,1)中,myData是要划分的数据集,0是第一次划分数据集,要找的是第一列为1的数据列的后两个值,也可以从上面的表里面看出是啥
#print(splitDataSet(myData,0,1))
#(myData,0,0)中,myData是要划分的数据集,要找的是第一列为0的数据列的后面两个值
#print(splitDataSet(myData,0,0))
输出划分结果为:
4.选择最好的划分方式来划分数据集
计算出条件熵,然后求出信息增益,
并找到最大的信息增益,最大的信息增益就是找到最好的划分数据集的特征
第一个for循环用于循环遍历数据集中的所有特征;
使用列表推导来创建新的列表,将数据集中所有可能存在的值写在新的列表之中;
使用Python语言原生的集合(set)数据类型,集合数据类型与列表类型相似,
不同之处在于集合数据类型中的每个值都互不相同,从列表中创建集合是Python语言得到列表
中唯一元素值得最快方式;
遍历当前特征中的所有唯一属性值,对每个特征划分一次数据集,然后计算数据集中的新香农熵值,并对所有唯一特征值得到的熵求和。最后比较所有特征中的信息增益,返回最好特征划分的索引值。
"""
4.选择最好的划分方式来划分数据集:计算出条件熵,然后求出信息增益,
并找到最大的信息增益,最大的信息增益就是找到最好的划分数据集的特征
"""
def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1baseEntropy = calcShannonEnt(dataSet)#计算出原始的香农熵bestInfoGain = 0.0;bestFeature =-1for i in range(numFeatures):#创建唯一的分类标签列表featList = [example[i] for example in dataSet]
#使用Python语言原生的集合(set)数据类型,集合数据类型与列表类型相似,
#不同之处在于集合数据类型中的每个值都互不相同,从列表中创建集合是Python语言得到列表
# 中唯一元素值得最快方式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 - newEntropyprint("第%d个特征的信息增益为%.3f"%(i,infoGain))#计算最好的信息增益if(infoGain > bestInfoGain):bestInfoGain = infoGain#找出最好的划分数据集的特征bestFeature = ireturn bestFeature
测试一下:
mydata,labels = createDataSet()
print(mydata)
print("最优特征索引值:"+str(chooseBestFeatureToSplit(mydata)))
输出最好的划分方式为以特征0划分:
运行结果告诉我们,第0个特征是最好的用于划分数据集的特征。
5.统计classList中出现此处最多的元素(类标签)
该函数使用分类名称的列表,创建键值为classList中唯一值得数据字典,字典对象存储了classList中每一个类标签出现的频率,最后利用Operator操作键值排序字典,并返回出现次数最多的分类名称。
"""
5.统计classList中出现此处最多的元素(类标签)
"""
def majorityCnt(classList):classCount = {}#统计classLisfor vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0]
6.建树
"""
6.开始建树
"""
def createTree(dataSet,labels,featLabels):classList = [example[-1] for example in dataSet]#若类别完全相同,则停止继续划分if classList.count(classList[0]) == len(classList):return classList[0]#遍历完所有特征时返回出现次数最多的if len(dataSet[0]) == 1:return majorityCnt(classList)bestFeat = chooseBestFeatureToSplit(dataSet)#选择最优特征bestFeatLabel = labels[bestFeat]#最优特征的标签featLabels.append(bestFeatLabel)myTree = {bestFeatLabel:{}}del(labels[bestFeat])#删除已经使用特征标签featValues = [example[bestFeat] for example in dataSet]#得到训练集中所有最优特征的属性值uniqueVals = set(featValues)#去掉重复的属性值for value in uniqueVals:#遍历特征,创建决策树。myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),labels,featLabels)return myTree
if __name__ == '__main__':dataSet,labels = createDataSet()featLabels = []myTree = createTree(dataSet,labels,featLabels)print(myTree)
运行结果:
二.决策树的可视化
自己尝试使用简单数据集实现决策树 代码——《机器学习实战》相关推荐
- 机器学习实战——决策树(代码)
最近在学习Peter Harrington的<机器学习实战>,代码与书中的略有不同,但可以顺利运行. from math import log import operator# 计算熵 d ...
- pytorch生成对抗网络GAN的基础教学简单实例(附代码数据集)
1.简介 这篇文章主要是介绍了使用pytorch框架构建生成对抗网络GAN来生成虚假图像的原理与简单实例代码.数据集使用的是开源人脸图像数据集img_align_celeba,共1.34G.生成器与判 ...
- 入门行人重识别 尝试跑(郑哲东 简单行人重识别代码到88%准确率)过程
来自郑哲东 简单行人重识别代码到88%准确率 运行代码和参考步骤 试运行-第一部分 prepare.py model.py train.py 试运行-第二部分 test.py 运行代码和参考步骤 代码 ...
- 《机器学习实战》萌新读书笔记 ② — — 第三章 决策树 内容提要、知识拓展和详细注释代码
目录 引入: 什么是决策树? 决策树相较KNN的优势? 决策树的运作方式? 决策树模型的优缺? 决策树的构造: 构造思路 信息增益 划分数据集 递归构造决策树 绘制决策树树形图 Matplotlib注 ...
- 关于《机器学习实战》中创建决策树的核心代码分析
关于<机器学习实战>中创建决策树的核心代码分析 SIAT nyk 2017年10月21日星期六 一.源码内容 def create ...
- python决策树代码实现
python决策树代码实现 实现一个简单的决策树,可以同时处理属性值是连续和离散的情况. 使用sklearn里面的鸢尾花等数据集验证,正确率还不错(90%+) Github地址:https://git ...
- 决策树代码代码——python源代码,看完你就完全懂了
决策树 决策树在周志华的西瓜书里面已经介绍的很详细了(西瓜书P73-P79),那也是我看过讲的最清楚的决策树讲解了,我这里就不献丑了,这篇文章主要是分享决策树的代码. 在西瓜书中介绍了三种决策树,分别 ...
- 机器学习算法(五):基于企鹅数据集的决策树分类预测
机器学习算法(五):基于企鹅数据集的决策树分类预测 1 逻决策树的介绍和应用 1.1 决策树的介绍 决策树是一种常见的分类模型,在金融风控.医疗辅助诊断等诸多行业具有较为广泛的应用.决策树的核心思想是 ...
- html 语言 gif 动画,动效篇(1)--从简单CSS3动画片段代码,到生成gif动图~
简单css动画片段代码(最终效果 ) (一)请自行下载安装Dreamweaver 在Dreamweaver编写代码(如需参考请复制下列代码) (二)HTML CSS代码详解css代码(/*详解*/) ...
最新文章
- arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题
- 成功解决_catboost.CatBoostError: Bad value for num_feature[non_default_doc_idx=0,feature_idx=0]=“FDO09“:
- 【干货】五天,谷歌如何制作一款App?
- JS实现将所有超链接指向同一个页面地址
- 【运维小分享】整理Apache日志
- JDBC 学习笔记(一)—— 基础知识 + 分页技术
- Redis集群环境下分布式锁方案-RedLock算法
- 上新:视频加密功能增加防录屏(随机水印)功能
- Qt获取本地ip地址
- MATLAB数字水印系统
- vue2生成图片导出pdf
- DIY装机之入围产品
- Java程序在结构上的特点_下面关于JavaApplication程序结构特点描述中,错误的是()...
- 通话过程中显示呼叫失败_iphone怎么总是打电话出现呼叫失败求大神解救
- linux命令行连接蓝牙键盘
- gwen语音课_想学习Vuetify? 这是Gwen Faraday的免费15部分课程
- 达人评测 i5 1155G7和i5 1135G7的差距大不大
- wire tox_Tox-rs的漫长旅程。 第1部分
- 淘宝店铺链接获取seller id,拿到店铺所有商品接口,店铺所有商品接口,接口接入技术解决方案
- 【信号处理】基于优化算法的 SAR 信号处理(Matlab代码实现)