python实现决策树分类算法


Posted in Python onDecember 21, 2017

本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下

1、概述

决策树(decision tree)——是一种被广泛使用的分类算法。

相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置

在实际应用中,对于探测式的知识发现,决策树更加适用。

2、算法思想

通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

      女儿:多大年纪了?

      母亲:26。

      女儿:长的帅不帅?

      母亲:挺帅的。

      女儿:收入高不?

      母亲:不算很高,中等情况。

      女儿:是公务员不?

      母亲:是,在税务局上班呢。

      女儿:那好,我去见见。 

这个女孩的决策过程就是典型的分类树决策。

实质:通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见

假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑

python实现决策树分类算法

上图完整表达了这个女孩决定是否见一个约会对象的策略,其中:

◊绿色节点表示判断条件

◊橙色节点表示决策结果

◊箭头表示在一个判断条件在不同情况下的决策路径

图中红色箭头表示了上面例子中女孩的决策过程。 

这幅图基本可以算是一颗决策树,说它“基本可以算”是因为图中的判定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,如果将所有条件量化,则就变成真正的决策树了。 

决策树分类算法的关键就是根据“先验数据”构造一棵最佳的决策树,用以预测未知数据的类别 

决策树:是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

3、决策树构造

假如有以下判断苹果好坏的数据样本:

样本    红     大      好苹果

0         1      1         1

1         1      0         1

2         0      1         0

3         0      0         0

样本中有2个属性,A0表示是否红苹果。A1表示是否大苹果。假如要根据这个数据样本构建一棵自动判断苹果好坏的决策树。

由于本例中的数据只有2个属性,因此,我们可以穷举所有可能构造出来的决策树,就2棵,如下图所示:

python实现决策树分类算法

显然左边先使用A0(红色)做划分依据的决策树要优于右边用A1(大小)做划分依据的决策树。

当然这是直觉的认知。而直觉显然不适合转化成程序的实现,所以需要有一种定量的考察来评价这两棵树的性能好坏。

决策树的评价所用的定量考察方法为计算每种划分情况的信息熵增益

如果经过某个选定的属性进行数据划分后的信息熵下降最多,则这个划分属性是最优选择 

属性划分选择(即构造决策树)的依据:

简单来说,熵就是“无序,混乱”的程度。

通过计算来理解:

1、原始样本数据的熵:

样例总数:4

好苹果:2

坏苹果:2

熵: -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1

信息熵为1表示当前处于最混乱,最无序的状态。

2、两颗决策树的划分结果熵增益计算

树1先选A0作划分,各子节点信息熵计算如下:

0,1叶子节点有2个正例,0个负例。信息熵为:e1 = -(2/2 * log(2/2) + 0/2 * log(0/2)) = 0。

2,3叶子节点有0个正例,2个负例。信息熵为:e2 = -(0/2 * log(0/2) + 2/2 * log(2/2)) = 0。

因此选择A0划分后的信息熵为每个子节点的信息熵所占比重的加权和:E = e1*2/4 + e2*2/4 = 0。

选择A0做划分的信息熵增益G(S, A0)=S - E = 1 - 0 = 1.

事实上,决策树叶子节点表示已经都属于相同类别,因此信息熵一定为0。 

树2先选A1作划分,各子节点信息熵计算如下:

0,2子节点有1个正例,1个负例。信息熵为:e1 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1。

1,3子节点有1个正例,1个负例。信息熵为:e2 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1。

因此选择A1划分后的信息熵为每个子节点的信息熵所占比重的加权和:E = e1*2/4 + e2*2/4 = 1。也就是说分了跟没分一样!

选择A1做划分的信息熵增益G(S, A1)=S - E = 1 - 1 = 0. 

因此,每次划分之前,我们只需要计算出信息熵增益最大的那种划分即可。

先做A0划分时的信息熵增益为1>先做A1划分时的信息熵增益,所以先做A0划分是最优选择!!!

4、算法指导思想

经过决策属性的划分后,数据的无序度越来越低,也就是信息熵越来越小 

5、算法实现

梳理出数据中的属性

比较按照某特定属性划分后的数据的信息熵增益,选择信息熵增益最大的那个属性作为第一划分依据,然后继续选择第二属性,以此类推

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python求斐波那契数列示例分享
Feb 14 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
python的keyword模块用法实例分析
Jun 30 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
python高阶爬虫实战分析
Jul 29 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python实现Linux监控的方法
May 16 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 #Python
python Crypto模块的安装与使用方法
Dec 21 #Python
python编写Logistic逻辑回归
Dec 30 #Python
python+selenium识别验证码并登录的示例代码
Dec 21 #Python
python实现随机森林random forest的原理及方法
Dec 21 #Python
python编写分类决策树的代码
Dec 21 #Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 #Python
You might like
php桌面中心(二) 数据库写入
2007/03/11 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
获取body标签的两种方法
2011/10/13 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
公司营业员的工作总结自我评价
2013/10/05 职场文书
会计专业自荐信范文
2013/12/02 职场文书
自我评价200字分享
2013/12/17 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
初中英语课后反思
2014/04/25 职场文书
道德之星事迹材料
2014/05/03 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android