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

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

二、问题简析:首先我们简单的介绍一下什么是决策树。决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的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. 安利7款珍藏已久的windows软件,每一个都非常强大
  2. 【Android 文件管理】分区存储 ( 创建与查询图片文件 )
  3. 机器学习业务实践之路-李博-专题视频课程
  4. php绑定变量,php动态绑定变量的用法
  5. 腾讯微博Android客户端开发——OAuth认证介绍
  6. 表达式的计算结果必须为节点集 调试
  7. UILabel的高度自适应
  8. 调研了下 AI 作曲,顺便做了期视频...快进来听歌!
  9. 一个人的旅行(HDU-2066)
  10. 图书管理系统(说明文档与相关代码)
  11. 《Web性能实践日志》一1.5 浏览器的发展
  12. 二叉树先序、中序、后序的递归算法---《数据结构》
  13. 卸载centos7自带java,安装oracle的jdk8
  14. 模糊控制器设计基本方法
  15. 视频教程-程序员的数学:线性代数-Python
  16. pyqt 事件更新图片显示_暗黑战神3D网游ARPG实战案例(Unity 2017.3)更新
  17. IDEA 去掉 pom 文件标签名称下划线
  18. 2022年全球市场重疾险总体规模、主要企业、主要地区、产品和应用细分研究报告
  19. 视频号匹配时事热点创作内容效果更好
  20. 最小模糊聚类算法的并行化——PFM算法

热门文章

  1. java个人网站源码下载_创建一个基于JAVA的个人网站(有源码也行)
  2. 简单个人网页设计作业 静态HTML旅行主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页Dreamweaver设计作业
  3. cloud2声卡_带你解惑HyperX Cloud2(飓风)和Alpha(阿尔法)的终极选择
  4. 基于单片机的空气质量监测
  5. linux下载tftpd服务,Linux tftpd服务安装与配置
  6. Mac OSX安装MongoDB
  7. matlab gui 毕业论文,MATLAB GUI课件设计
  8. 传奇架设gom引擎常见问题
  9. css3魔方3乘3每层旋转_纯CSS做3D旋转魔方
  10. android切图规范,APP切图详细规范终极指南