目录

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 决策树的构造相关推荐

  1. 机器学习实战2(决策树篇)

    目录 1.决策树 2.决策树的构造 3.决策树的可视化 4.测试和存储决策树 1.决策树 你是否玩过二十个问题的游戏,游戏的规则很简单:参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提 ...

  2. 机器学习实战3.4决策树项目案例03:使用Sklearn预测隐形眼镜类型

    搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...

  3. 机器学习实战读书笔记--决策树

    1.决策树的构造 createBranch伪代码: 检测数据集中的每个子项是否属于同一分类: IF SO RETURN 类标签 ELSE 寻找划分数据集的最好特征 划分数据集 创建分支节点 FOR 每 ...

  4. 机器学习实战3.3决策树项目案例02:预测隐形眼镜类型

    搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...

  5. 机器学习实战笔记:决策树(Decision Tree)

    PS 该部分内容所设计到的程序源码已经存在我的github上,地址奉上: https://github.com/AdventureSJ/ML-Notes/tree/master/DecisionTre ...

  6. 机器学习实战6-sklearn训练决策树实现分类和回归

    简介: 与SVM一样,决策树也是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务.它们功能强大,能够拟合复杂的数据集.决策树同时也是随机森林(参见第7章)的基本组成部分,后者是现今 ...

  7. 机器学习实战python版决策树以及Matplotlib注解绘制决策树

    这一章代码比较难懂,主要是matplotlib的函数调用参数多,调用灵活,让初学者费解. <span style="font-size:18px;"><span ...

  8. 机器学习实战ch03: 使用决策树预测隐形眼镜类型

    决策树的一般流程 1.收集数据 2.准备数据:树构造算法只适用标称型数据,因此数据值型数据必须离散化 3.分析数据 4.训练算法 5.测试数据 6.使用算法 决策树的优点 1.数据形式非常容易理解 2 ...

  9. 《机器学习实战》chapter03 决策树

    分类生成决策树 import operator from math import log import pickle# 计算香农熵 def calcShannonEnt(dataSet):" ...

最新文章

  1. puppet企业架构部署
  2. 【摩天好课推荐】2 Python语言入门
  3. Java创建cookie和删除cookie
  4. 深度学习之卷积神经网络(13)DenseNet
  5. 我就想加个索引,怎么就这么难?
  6. 文字不间断滚动(转)
  7. new Date()浏览器兼容性问题
  8. jQuery调用WebService详解
  9. 线性表的链式存储结构——链表及其操作(创建,查找,插入,输出,删除)
  10. LeetCode1818:绝对差值和
  11. Drupal8 自定义主题开发实战记录
  12. php验证是否为整数(0、正整数、负整数)
  13. linux服务器架设篇 下载_后渗透系列——下载(Windows篇)
  14. IBM X3650M3存储raid阵列瘫痪的恢复过程
  15. 群体智能算法:细菌觅食算法
  16. 华为nova8计算机功能在,华为nova8隐藏功能怎么开启(华为nova8的隐藏功能)
  17. JVM之JVM面试题整理(长期更新)
  18. Dev-C++的使用(一):下载、安装与基本使用
  19. 使用FFMPEG——4.2.2版本实现提取视频编码解码文件,ffmpeg基础学习。
  20. c# 定时器 每隔几秒执行一次

热门文章

  1. RMON学习笔记(二)
  2. 大数据营销在旅游行业的应用方案
  3. 茨威格为什么自杀(1942)?
  4. 随机密码生成(Python编程)
  5. 循环事件绑定和原型的应用
  6. Python学习a1——背景及基础
  7. 淘宝直播的定义,淘宝直播小技巧介绍,以及淘宝有哪些推广渠道和展示位?
  8. 朋友圈(java版)
  9. idea2020无限重置
  10. 微信小程序 企业微信客户服务插件【联系我】自定义样式