最近在搞一些关于机器学习的小东西,其中有一部分就是关于决策树的。过程中遇到了一些小问题,现记录并与大家分享。

一、问题描述:使用西瓜数据集构建决策树,并将构建的决策树进行可视化操作。

二、问题简析:首先我们简单的介绍一下什么是决策树。决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的if/else问题中进行学习,并得出结论。然后不妨看看下面这个小思考题吧:(故事我瞎编的,看问题就好了嘛)

小鹿机缘巧合之下喜欢上了一个只有一面之缘的贝贝(一见钟情嘛)。对吧,爱情的力量是伟大的,小鹿就不顾一切的裸辞叻,去找人家。这不总算找到了人家里,但是考验接踵而至呀!人贝贝对小鹿还挺满意的哦,可姑娘的父母说还得考验一下不是?啥考验呢?

思辨:家里有两个卧室,老丈人,丈母娘各站一个卧室门外,贝贝就在其中一个卧室中。老丈人向来只说真话,丈母娘向来只说假话。现在只允许小鹿向两人中任意一个人提一个问题,只有成功问出贝贝在哪间卧室之中才能抱得美人归。小鹿该怎么提问?(答案在文章末尾)

为什么会来一个看似无关的废话连篇叻?其实问题有相通之处的,我们的目标是通过提出尽可能少的if/else问题来得到正确答案。

三、代码实现
为了控制文章篇幅,现在就直接给出问题的代码实现吧:

from random import choice
from collections import Counter
import math# 定义数据集
D = [{'色泽': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '好瓜': '是'},{'色泽': '乌黑', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '好瓜': '是'},{'色泽': '乌黑', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '好瓜': '是'},{'色泽': '青绿', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '好瓜': '是'},{'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '好瓜': '是'},{'色泽': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '软粘', '好瓜': '是'},{'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '脐部': '稍凹', '触感': '软粘', '好瓜': '是'},{'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '硬滑', '好瓜': '是'},{'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '脐部': '稍凹', '触感': '硬滑', '好瓜': '否'},{'色泽': '青绿', '根蒂': '硬挺', '敲声': '清脆', '纹理': '清晰', '脐部': '平坦', '触感': '软粘', '好瓜': '否'},{'色泽': '浅白', '根蒂': '硬挺', '敲声': '清脆', '纹理': '模糊', '脐部': '平坦', '触感': '硬滑', '好瓜': '否'},{'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '脐部': '平坦', '触感': '软粘', '好瓜': '否'},{'色泽': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '脐部': '凹陷', '触感': '硬滑', '好瓜': '否'},{'色泽': '浅白', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '脐部': '凹陷', '触感': '硬滑', '好瓜': '否'},{'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '软粘', '好瓜': '否'},{'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '脐部': '平坦', '触感': '硬滑', '好瓜': '否'},{'色泽': '青绿', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '稍糊', '脐部': '稍凹', '触感': '硬滑', '好瓜': '否'},
]# ==========
# 决策树生成类
# ==========
class DecisionTree:def __init__(self, D, label, chooseA):self.D = D  # 数据集self.label = label  # 哪个属性作为标签self.chooseA = chooseA  # 划分方法self.A = list(filter(lambda key: key != label, D[0].keys()))  # 属性集合A# 获得A的每个属性的可选项self.A_item = {}for a in self.A:self.A_item.update({a: set(self.getClassValues(D, a))})self.root = self.generate(self.D, self.A)  # 生成树并保存根节点# 获得D中所有className属性的值def getClassValues(self, D, className):return list(map(lambda sample: sample[className], D))# D中样本是否在A的每个属性上相同def isSameInA(self, D, A):for a in A:types = set(self.getClassValues(D, a))if len(types) > 1:return Falsereturn True# 构建决策树,递归生成节点def generate(self, D, A):node = {}  # 生成节点remainLabelValues = self.getClassValues(D, self.label)  # D中的所有标签remainLabelTypes = set(remainLabelValues)  # D中含有哪几种标签if len(remainLabelTypes) == 1:# 当前节点包含的样本全属于同个类别,无需划分return remainLabelTypes.pop()  # 标记Node为叶子结点,值为仅存的标签most = max(remainLabelTypes, key=remainLabelValues.count)  # D占比最多的标签if len(A) == 0 or self.isSameInA(D, A):# 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分return most  # 标记Node为叶子结点,值为占比最多的标签a = self.chooseA(D,A,self)  # 划分选择for type in self.A_item[a]:condition = (lambda sample: sample[a] == type)  # 决策条件remainD = list(filter(condition, D))  # 剩下的样本if len(remainD) == 0:# 当前节点包含的样本集为空,不能划分node.update({type: most})  # 标记Node为叶子结点,值为占比最多的标签else:# 继续对剩下的样本按其余属性划分remainA = list(filter(lambda x: x != a, A))  # 未使用的属性_node = self.generate(remainD, remainA)  # 递归生成子代节点node.update({type: _node})  # 把生成的子代节点更新到当前节点return {a: node}#  定义划分方法# 随机选择
def random_choice(D, A, tree: DecisionTree):return choice(A)# 信息熵
def Ent(D,label,a,a_v):D_v = filter(lambda sample:sample[a]==a_v,D)D_v = map(lambda sample:sample[label],D_v)D_v = list(D_v)D_v_length = len(D_v)counter = Counter(D_v)info_entropy = 0for k, v in counter.items():p_k = v / D_v_lengthinfo_entropy += p_k * math.log(p_k, 2)return -info_entropy# 信息增益
def information_gain(D, A, tree: DecisionTree):gain = {}for a in A:gain[a] = 0values = tree.getClassValues(D, a)counter = Counter(values)for a_v,nums in counter.items():gain[a] -= (nums / len(D)) * Ent(D,tree.label,a,a_v)return max(gain.keys(),key=lambda key:gain[key])#  创建决策树
desicionTreeRoot = DecisionTree(D, label='好瓜',chooseA=information_gain).root
print('决策树:', desicionTreeRoot)# 决策树可视化类
class TreeViewer:def __init__(self):from graphviz import Digraphself.id_iter = map(str, range(0xffff))self.g = Digraph('G', filename='decisionTree.gv')def create_node(self, label, shape=None):id = next(self.id_iter)self.g.node(name=id, label=label, shape=shape, fontname="Microsoft YaHei")return iddef build(self, key, node, from_id):for k in node.keys():v = node[k]if type(v) is dict:first_attr = list(v.keys())[0]id = self.create_node(first_attr+"?", shape='box')self.g.edge(from_id, id, k, fontsize = '12', fontname="Microsoft YaHei")self.build(first_attr, v[first_attr], id)else:id = self.create_node(v)self.g.edge(from_id, id, k, fontsize = '12', fontname="Microsoft YaHei")def show(self, root):first_attr = list(root.keys())[0]id = self.create_node(first_attr+"?", shape='box')self.build(first_attr, root[first_attr], id)self.g.view()# 显示创建的决策树
viewer = TreeViewer()
viewer.show(desicionTreeRoot)

四、可能出现的错误
实验中有一些库是必须要使用到的,总体上不会有太大的问题,但是我们需要特别注意一下graphviz库。一般情况下,使用AnaConda开发的话,我们会在AnaConda Prompt中直接使用pip install graphviz命令来安装包。这样使用之后,Jupyter Notebook中显示导包成功,但是有一堆报错,也无法让决策树成功可视化。上述问题的一般报错为graphviz.backend.ExecutableNotFound: failed to execute [‘dot’, ‘-Tpdf’, ‘-O’, ‘test-table.gv’], make sure the Graphviz executables are on your systems’ PATH为了解决这个问题在网上寻找了很多种方法,也基本上都尝试了一下。现在就直接给大家一个比较简便的解决方法!

解决方法:去graphviz官网上下载graphviz-2.38.msi官网下载路径,或者直接点这个链接去下载graphviz绿色简便下载

推荐使用绿色简便下载,当然要是不怕麻烦的话也可以选择去官网下载哈。下载解压完成之后还需要对graphivz进行配置,将graphviz文件夹的bin目录完整路径添加在系统变量Path中。最后重启Jupyter Notebook,便可以运行成功。

五、样例运行结果

今天要分享的到这儿就快结束了,希望我们能在学习的道路上携手共进。自己不会的有太多,希望各位大佬能给予指点,也希望小鹿的文章对小伙伴们是有帮助的,喜欢的可以点点关注和

Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)相关推荐

  1. 机器学习算法笔记--------建立西瓜数据集

    西瓜书里面常用的三个数据集,西瓜数据集2.0,3.0,4.0整理如下,注意中文容易出现乱码. 西瓜数据集2.0 西瓜数据集3.0 西瓜数据集4.0 import pandas as pddef cre ...

  2. 决策树(一)——构建决策树

    决策树 说明:这篇博客是看李航老师的<统计学习方法>做的笔记总结,博客中有很多内容是摘选自李航老师的<统计学习方法>一书,仅供学习交流使用. 决策树(decision tree ...

  3. 深入浅出python机器学习_3.3.1_对数据集进行分析

    from sklearn.datasets import load_winewine_dataset=load_wine()print('\n\n\n')print('代码运行结果')print('= ...

  4. [Python] [机器学习] 基础聚类算法(K-means、AHC、DBSCAN)简介及可视化代码

    之前写的入门级介绍,有点久远有些ref找不着了 文章目录 简介 目标 作用 类型 聚类vs分类 K-means [K-means] 伪代码 [K-means] 过程详解 [K-means] 初始点的选 ...

  5. python机器学习案例系列教程——决策树(ID3、C4.5、CART)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 决策树简介 决策树算是最好理解的分类器了.决策树就是一个多层if-else函数,就是对对象属性进行多层if-else判断,获取目标属性 ...

  6. 【机器学习算法-python实现】Adaboost的实现(1)-单层决策树(decision stump)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景      上一节学习支持向量机,感觉公式都太难理解了,弄得我有点头大.不过这一章的Adaboost线比 ...

  7. 【转】Python机器学习库

    2019独角兽企业重金招聘Python工程师标准>>> Python 在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包 ...

  8. Python机器学习工具箱

    转载自:http://www.aiuxian.com/article/p-1595268.html Python 在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用p ...

  9. Python机器学习库

    Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: 比较成熟的(广播)函数库: 用 ...

  10. python机器学习笔记:ID3决策树算法实战

    ID3算法是一种贪心算法,用来构造决策树,ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每一个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继 ...

最新文章

  1. centos 7.4 上安装neo4j并测试
  2. 自己理解接口回调入门
  3. 陈天奇:我是如何从机器学习小白一步一步成长为你们心目中的大神的
  4. 奇迹服务器维护,奇迹MU 3月31日服务器维护更新公告
  5. mysql load xml_MySQL的SQL语句 - 数据操作语句(10)- LOAD XML 语句
  6. 配置纯净版Debian
  7. [转]asp.net(c#)生成验证码 点击可刷新
  8. IOS开发之Swift学习笔记
  9. 开源Java反编译工具
  10. 漫画:为什么程序员没有女友?
  11. Redis事务深入解析和使用
  12. 最大独立匹配_新车|升级柴油国六动力,配后排独立座椅,瑞风M5新车型上市...
  13. Python面试题解答——第一部分
  14. 二叉排序树的第k个结点
  15. 吴恩达神经网络和深度学习-学习笔记-23-快速搭建你的第一个系统原型,然后迭代
  16. 从12306网站新验证码看Web验证码设计与破解
  17. AD16导出Gerber文件教程
  18. 希腊字母|罗马数字|中文数字大写
  19. oracle 定时任务 每天执行,Oracle定时任务(定时执行某个SQL语句)
  20. 如何培养一个人:从育儿谈起

热门文章

  1. 木马病毒 与后门技术
  2. vlc 网页插件的 使用与控制 API
  3. 手机如何双声道录音_如何在手机端实现电话录音功能?
  4. 微信通话服务器有录音保存吗,微信语音通话如何录音保存并回放
  5. 你的头发还好吗?大数据分析脱发城市哪里强
  6. 2022-2028年中国纳米钛酸钡行业市场调查研究及投资策略研究报告
  7. 冰点还原精灵如何修改密码
  8. Foxit PDF SDK ActiveX 5.9.4
  9. 手把手教你配置阿里云服务器搭建网站
  10. android app 尺寸,Android APP标注尺寸入门教程和app标注工具