机器学习实战——3.1 决策树的构造
目录
1. 信息增益
2. 划分数据集
2.1 按照给定特征划分数据集
2.2 选择最好的数据集划分方式
3. 递归构建决策树
3.1 多数表决的方法
3.2 创建树
1. 信息增益
在划分数据集之前之后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择。集合信息的度量方式称为香农熵或简称为熵。
此代码的功能式计算给定数据集的熵:
def calcshannonent(dataset):numentries = len(dataset)labelcounts = {}for featvec in dataset:currentlabel = featvec[-1] # 创建一个数据词典,它的键值是最后一列的数值if currentlabel not in labelcounts.keys():labelcounts[currentlabel] = 0 # 如果当前键值不存在,则扩展字典并将当前键值加入字典labelcounts[currentlabel] += 1shannonent = 0.0for key in labelcounts:prob = float(labelcounts[key])/numentriesshannonent -= prob*log(prob, 2) # 以2为底求对数return shannonent
我们可以利用creatdataset()函数得到简单鱼鉴定数据集:
def creatdataset():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 = creatdataset()
print("mydata:", mydata)
print("labels:", labels)
print("香农熵:", calcshannonent(mydata))
输出结果:
熵越高,则混合数据也越多,这里我们增加第三个名为maybe的分类,测试熵的变化:
mydata[0][-1] = 'maybe'
print("mydata:", mydata)
print("香农熵:", calcshannonent(mydata))
输出结果:
2. 划分数据集
2.1 按照给定特征划分数据集
def splitdataset(dataset, axis, value):retdataset = [] # 创建一个新的列表对象for featvec in dataset: # 遍历数据集中的每个元素if featvec[axis] == value: # 如果发现符合要求的值reducedfeatvec = featvec[:axis]reducedfeatvec.extend(featvec[axis+1:])retdataset.append(reducedfeatvec)return retdataset
查看划分结果:
mydata, labels = creatdataset()
print(mydata)
print(splitdataset(mydata, 0, 1))
print(splitdataset(mydata, 0, 0))
输出结果:
2.2 选择最好的数据集划分方式
接下来我们将遍历整个数据集,循环计算香农熵和splitdataset()函数,找到最好的特征划分方式。
def choosebestfeaturetosplit(dataset):numfeatures = len(dataset[0])-1bestentropy = calcshannonent(dataset) # 计算整个数据集的原始香农熵bestinfogain = 0.0; bestfeature = -1for i in range(numfeatures): # 遍历数据集中的所有特征featlist = [example[i] for example in dataset]uniquevals = set(featlist) # 得到列表中唯一元素值newentropy = 0.0for value in uniquevals: # 遍历当前特征值中的唯一属性值subdataset = splitdataset(dataset, i, value) # 对每个唯一属性划分一次数据集prob = len(subdataset)/float(len(dataset))newentropy += prob*calcshannonent(subdataset) # 对所有唯一特征值得到的熵求和infogain = bestentropy - newentropy # 信息增益if (infogain > bestinfogain) :bestinfogain = infogainbestfeature = ireturn bestfeature # 返回最好特征划分的索引值
查看最好的用于划分数据集的特征:
mydata, labels = creatdataset()
print("choose best feature to split:", choosebestfeaturetosplit(mydata))
输出结果:
可知第0个特征是最好的用于划分数据集的特征
3. 递归构建决策树
3.1 多数表决的方法
如果数据集已经处理了所有属性,但是类标签依然不是唯一的,在这种情况下,我们通常会采用多数表决的方法决定该叶子节点的分类
import operator
def majoritycnt(classlist):classcount = {}for vote in classlist:if vote not in classcount.keys(): classcount[vote] = 0classcount[vote] += 1sortedclasscount = sorted(classcount.iteritems(),\key = operator.itemgetter(1), reverse=True)return sortedclasscount[0][0]
3.2 创建树
def createtree(dataset, labels):classlist = [example[-1] for example in dataset] # classlist中包含数据集的所有类标签if classlist.count(classlist[0]) == len(classlist):return classlist[0] # 递归的第一个停止条件是所有类标签完全相同,直接返回该类标签if len(dataset[0]) == 1: # 递归的第二个停止条件是使用完了所有特征,仍不能将数据集划分为仅包含唯一类别的分组return majoritycnt(classlist) # 返回挑选次数最多的类别bestfeat = choosebestfeaturetosplit(dataset) # 当前数据集选取的最好特征存储在变量bestfeat中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
查看树结构信息:
mydata, labels = creatdataset()
mytree = createtree(mydata, labels)
print("my tree:", mytree)
输出结果:
机器学习实战——3.1 决策树的构造相关推荐
- 机器学习实战2(决策树篇)
目录 1.决策树 2.决策树的构造 3.决策树的可视化 4.测试和存储决策树 1.决策树 你是否玩过二十个问题的游戏,游戏的规则很简单:参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提 ...
- 机器学习实战3.4决策树项目案例03:使用Sklearn预测隐形眼镜类型
搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...
- 机器学习实战读书笔记--决策树
1.决策树的构造 createBranch伪代码: 检测数据集中的每个子项是否属于同一分类: IF SO RETURN 类标签 ELSE 寻找划分数据集的最好特征 划分数据集 创建分支节点 FOR 每 ...
- 机器学习实战3.3决策树项目案例02:预测隐形眼镜类型
搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...
- 机器学习实战笔记:决策树(Decision Tree)
PS 该部分内容所设计到的程序源码已经存在我的github上,地址奉上: https://github.com/AdventureSJ/ML-Notes/tree/master/DecisionTre ...
- 机器学习实战6-sklearn训练决策树实现分类和回归
简介: 与SVM一样,决策树也是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务.它们功能强大,能够拟合复杂的数据集.决策树同时也是随机森林(参见第7章)的基本组成部分,后者是现今 ...
- 机器学习实战python版决策树以及Matplotlib注解绘制决策树
这一章代码比较难懂,主要是matplotlib的函数调用参数多,调用灵活,让初学者费解. <span style="font-size:18px;"><span ...
- 机器学习实战ch03: 使用决策树预测隐形眼镜类型
决策树的一般流程 1.收集数据 2.准备数据:树构造算法只适用标称型数据,因此数据值型数据必须离散化 3.分析数据 4.训练算法 5.测试数据 6.使用算法 决策树的优点 1.数据形式非常容易理解 2 ...
- 《机器学习实战》chapter03 决策树
分类生成决策树 import operator from math import log import pickle# 计算香农熵 def calcShannonEnt(dataSet):" ...
最新文章
- puppet企业架构部署
- 【摩天好课推荐】2 Python语言入门
- Java创建cookie和删除cookie
- 深度学习之卷积神经网络(13)DenseNet
- 我就想加个索引,怎么就这么难?
- 文字不间断滚动(转)
- new Date()浏览器兼容性问题
- jQuery调用WebService详解
- 线性表的链式存储结构——链表及其操作(创建,查找,插入,输出,删除)
- LeetCode1818:绝对差值和
- Drupal8 自定义主题开发实战记录
- php验证是否为整数(0、正整数、负整数)
- linux服务器架设篇 下载_后渗透系列——下载(Windows篇)
- IBM X3650M3存储raid阵列瘫痪的恢复过程
- 群体智能算法:细菌觅食算法
- 华为nova8计算机功能在,华为nova8隐藏功能怎么开启(华为nova8的隐藏功能)
- JVM之JVM面试题整理(长期更新)
- Dev-C++的使用(一):下载、安装与基本使用
- 使用FFMPEG——4.2.2版本实现提取视频编码解码文件,ffmpeg基础学习。
- c# 定时器 每隔几秒执行一次