记录学习过程,每天学会一点点,早日玩转机器学习......(手动呵呵微笑)。

一.核心代码

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)

运行结果:

二.决策树的可视化

自己尝试使用简单数据集实现决策树 代码——《机器学习实战》相关推荐

  1. 机器学习实战——决策树(代码)

    最近在学习Peter Harrington的<机器学习实战>,代码与书中的略有不同,但可以顺利运行. from math import log import operator# 计算熵 d ...

  2. pytorch生成对抗网络GAN的基础教学简单实例(附代码数据集)

    1.简介 这篇文章主要是介绍了使用pytorch框架构建生成对抗网络GAN来生成虚假图像的原理与简单实例代码.数据集使用的是开源人脸图像数据集img_align_celeba,共1.34G.生成器与判 ...

  3. 入门行人重识别 尝试跑(郑哲东 简单行人重识别代码到88%准确率)过程

    来自郑哲东 简单行人重识别代码到88%准确率 运行代码和参考步骤 试运行-第一部分 prepare.py model.py train.py 试运行-第二部分 test.py 运行代码和参考步骤 代码 ...

  4. 《机器学习实战》萌新读书笔记 ② — — 第三章 决策树 内容提要、知识拓展和详细注释代码

    目录 引入: 什么是决策树? 决策树相较KNN的优势? 决策树的运作方式? 决策树模型的优缺? 决策树的构造: 构造思路 信息增益 划分数据集 递归构造决策树 绘制决策树树形图 Matplotlib注 ...

  5. 关于《机器学习实战》中创建决策树的核心代码分析

       关于<机器学习实战>中创建决策树的核心代码分析                 SIAT  nyk          2017年10月21日星期六 一.源码内容 def create ...

  6. python决策树代码实现

    python决策树代码实现 实现一个简单的决策树,可以同时处理属性值是连续和离散的情况. 使用sklearn里面的鸢尾花等数据集验证,正确率还不错(90%+) Github地址:https://git ...

  7. 决策树代码代码——python源代码,看完你就完全懂了

    决策树 决策树在周志华的西瓜书里面已经介绍的很详细了(西瓜书P73-P79),那也是我看过讲的最清楚的决策树讲解了,我这里就不献丑了,这篇文章主要是分享决策树的代码. 在西瓜书中介绍了三种决策树,分别 ...

  8. 机器学习算法(五):基于企鹅数据集的决策树分类预测

    机器学习算法(五):基于企鹅数据集的决策树分类预测 1 逻决策树的介绍和应用 1.1 决策树的介绍 决策树是一种常见的分类模型,在金融风控.医疗辅助诊断等诸多行业具有较为广泛的应用.决策树的核心思想是 ...

  9. html 语言 gif 动画,动效篇(1)--从简单CSS3动画片段代码,到生成gif动图~

    简单css动画片段代码(最终效果 ) (一)请自行下载安装Dreamweaver 在Dreamweaver编写代码(如需参考请复制下列代码) (二)HTML CSS代码详解css代码(/*详解*/) ...

最新文章

  1. arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题
  2. 成功解决_catboost.CatBoostError: Bad value for num_feature[non_default_doc_idx=0,feature_idx=0]=“FDO09“:
  3. 【干货】五天,谷歌如何制作一款App?
  4. JS实现将所有超链接指向同一个页面地址
  5. 【运维小分享】整理Apache日志
  6. JDBC 学习笔记(一)—— 基础知识 + 分页技术
  7. Redis集群环境下分布式锁方案-RedLock算法
  8. 上新:视频加密功能增加防录屏(随机水印)功能
  9. Qt获取本地ip地址
  10. MATLAB数字水印系统
  11. vue2生成图片导出pdf
  12. DIY装机之入围产品
  13. Java程序在结构上的特点_下面关于JavaApplication程序结构特点描述中,错误的是()...
  14. 通话过程中显示呼叫失败_iphone怎么总是打电话出现呼叫失败求大神解救
  15. linux命令行连接蓝牙键盘
  16. gwen语音课_想学习Vuetify? 这是Gwen Faraday的免费15部分课程
  17. 达人评测 i5 1155G7和i5 1135G7的差距大不大
  18. wire tox_Tox-rs的漫长旅程。 第1部分
  19. 淘宝店铺链接获取seller id,拿到店铺所有商品接口,店铺所有商品接口,接口接入技术解决方案
  20. 【信号处理】基于优化算法的 SAR 信号处理(Matlab代码实现)

热门文章

  1. 文件数据储存之外部储存
  2. 大数据营销方案的分析处理
  3. finalshell链接不上虚拟机提示一直登录或链接不上怎么办
  4. Android 常用RGB值以及中英文名称
  5. StellarWP 收购 LearnDash 学习管理系统
  6. Word模板生成C#源码
  7. 巴菲特和盖茨的顶级对话:实现财富自由 没有那么难
  8. 李白 三五七言·秋风词
  9. 【游戏逆向】FPS网络游戏自动瞄准漏洞分析以及实现二
  10. iOS微信发布8.0.29版本,苹果14用户快来