之前我们介绍过用逻辑回归根据鸢尾花萼片、花瓣的长度和宽度进行鸢尾花类别的判定;也通过朴素贝叶斯模型分享了如何根据男生专业和身高两大属性,判断其是否有女朋友。而本期我们将介绍另外一种有监督的机器学习分类模型----决策树(也可以实现基本的回归),重点介绍决策树的基本原理和实现,并且借助python的sklearn库中的决策树算法实现上述两类数据分类展示。

决策树的基本原理

想必大家都有疑问,好多机器学习算法均可实现分类,那不同之处是什么呢?

对于逻辑回归,我们已知它是基于线性模型,通过对数据特征给予权重相加得到新的一个回归值,再进行Sigmoid变换将回归值约束在(0,1)之间,进而通过值的大小判断所属的类型(一般情况实现的是线性分割,输入特征x与logit之间是线性的,除非对x进行多维映射)。

而朴素贝叶斯模型则是基于贝叶斯定理、条件概率、特征独立分布的,根据样本特征计算其属于特定类别的概率,然后根据概率大小确定其最终的分类结果。

决策树算法简单来说就是带有判断规则(if-then)的一种树,可以依据树中的决策规则来预测未知样本的类别或数值(分类和回归)。其核心是对数据进行一个一个特征的筛选和处理,并且对特征阈值实现非线性分割,根据得出的抉择结果依次建立树模型。其主要优点是树形模型更接近人的思维方式,分类速度快,易于理解,可产生可视化、可解释的的分类规则。

比如:当我们想要出门时,会根据降雨、雾霾、气温、活动范围是室内还是室外等等特征综合进行考虑和判断,做出最后决定。下图是一个简单判断是否出门的4层决策树分类结果。结果表明,下雨时,一定不出门;而如果不下雨却有雾霾也不会出门。。。。。。

image.png

整个分类结果 一目了然,而且结构像一棵树,有分叉的节点(数据特征)和树叶(判定结果)。其中根节点(图中降雨属性)表示在此次分类中筛选出的最重要的特征;分叉处的父节点和子节点表示目标的某一个特征或属性,而结果节点也称为叶子节点,是完成判断后产生的最终决策结果(出门or不出门)。

看到这里可能会有疑问,为什么要选择降雨作为决策树的根节点,而不是雾霾情况或气温等?****而对于时间属性(连续型)的分割,为何是以18°,30°,35°为临界?这就是实现决策树过程要解决的核心问题:如何依次选择数据的属性;如何计算每个属性的决策规则(完成数据的分裂);什么时候可以停止分裂(防止过拟合)。下面详细通过决策树算法来解决这些疑问,并通过实例完成建树和剪枝。

决策树算法

决策树算法简介

决策树算法通常是递归地选择最优特征,也就是会把每个特征都计算一遍,选取能够使分类分的最好的一个特征,然后用这个最优特征构建根结点,依次对数据集进行分割。

比如该特征为离散型有几种值就分割为几个子集;而如果特征是连续型的则通过离散化处理后得到分割阈值后再分割子集;每个子集再分别递归调用特征选择方法,依次返回结点,返回的结点也就是上一层的子结点;直到所有特征都已经用完,或者数据集只有一维特征时停止。

为了防止过拟合问题,计算每个节点的分类错误,进行剪枝处理。(先剪枝,在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造;后剪枝,先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。)

一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别(也就是当下雨时得出的分类结果都是不出门),即节点的“纯度”越来越高。就是保证目标变量要分得足够开(将y=出门和y=不出门两种情况按照不同天气特征判定尽可能分离)。

此时我们将寻找最纯净的划分方法,决策树中常用的方法有ID3、C4.5、和CART,其中ID3算法使用信息增益作为不纯度;C4.5算法使用信息增益率作为不纯度;CART算法对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成决策树。

**来,咱继续唠~~~**

鉴于ID3算法要求数据特征为离散值,而且特征中的类型数量会影响信息增益值;而c4.5算法生成的多叉树,运算强度较高;因此我们直接以CART算法实现二叉分类树为例,进行完整介绍:

假设有K个类的样本D(A属性,Y类别)属于第i类的概率为:pi,则分类后的基尼指数为:

image

它表示训练数据的不确定性,值越大表明特征所对应的类型越不确定。

如二分类问题中,假设样本x属于类别1的概率为p,则基尼指数为:

Gini(x)=2p(1-p),

当两类情况的可能均为1/2时,其不确定性最大为1/2。

对于个给定的样本D,假设有K个类别, 第k个类别的数量为Ck,则样本D的基尼系数为:

![image](http://upload-images.jianshu.io/upload_images/11382441-f06c757bf4876374?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

根据数据特征A将样本D的空间分为两块y1,y2。两块样本数据大小分别为:D1,D2。

则在特征A的条件下,基尼系数为:

![image](http://upload-images.jianshu.io/upload_images/11382441-c6f41021e8548b0d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

选择使该基尼系数最小的属性A,作为父节点,得出对应的子节点或叶子节点。然后依次递归其他所有属性,依次选择基尼系数最下的属性,作为优先判断的属性。

其中如果属性是连续的数据,将对这些数据进行离散化处理,处理的基本思路是:

(1)选取该属性的所有n个数值,取相邻两样本值的中位数,一共取得n-1个划分点,对于这n-1个点,分别计算以该点作为二元分类点时的基尼系数

(2)选择基尼系数最小的点作为该连续特征的二元离散分类点。

比如取到的基尼系数最小的点为at,则小于at的值为类别1,大于at的值为类别2,这样我们就做到了连续特征的离散化。其中这些属性后面还可以参与子节点的产生选择过程。

关于建树和剪枝

建树具体流程为:

输入:训练集D,基尼系数的阈值,样本个数阈值。

输出:分类决策树T。

流程:(根节点依次往下)

对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。

计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。

3)计算当前节点现有的各个特征值对数据集D的基尼系数。

4)选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.

对左右的子节点递归的调用1-4步,生成决策树。

对于生成的决策树做预测的时候,假如测试集里的样本A落到了某个叶子节点,而节点里有多个训练样本。则对于A的类别预测采用的是这个叶子节点里概率最大的类别。

停止分裂的条件

(1)最小节点数

当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。

(2)基尼值(信息熵)小于阀值

基尼值大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度时,节点停止分裂。

(3)决策树的深度达到指定的条件

节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。

(4)所有特征已经使用完毕,不能继续进行分裂

被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。

决策数的Python实现

# 构建模型def tree_module(trainData,labels): decision_tree = tree.DecisionTreeClassifier(max_depth=4) decision_tree_one = decision_tree.fit(trainData, labels) return decision_tree_one# 绘制决策树图def pic_tree(decision_tree,filename,columns,theclass,save_path): # 保存模型 with open (filename, 'w') as f: f = tree.export_graphviz (decision_tree, out_file=f) dot_data = tree.export_graphviz (decision_tree, out_file=None, feature_names=columns, class_names=theclass, filled=True, rounded=True, special_characters=True) graph = pydotplus.graph_from_dot_data (dot_data)

分类结果

鸢尾花分类结果:

image

"能找到对象的男生"特征分类结果:

image

结果说明:

从决策树的结果分类来看:对于区分鸢尾花类型,花瓣的宽度是最核心属性。而且在决策树深度为4的条件下:仅有3个样本未完全区分开,其余的gini指数都为0,保证了完全区分。

而在根据男生特征对是否有女朋友的判断中,不同于我们上次贝叶斯分类得出的判断,只要是数学专业的男生无论身高特征几乎都是有女朋友的,而在分类树中身高的高低是最重要的判定因素,更加符合我们的常识判断。

python决策树怎么选择_【机器学习+python(8)】分类决策树的介绍与实现相关推荐

  1. python决策树怎么选择_机器学习|决策树分类与python实现

    目录: 1.决策树简介 2.决策树生成 a) 选择标准--熵 b) 信息增益--ID3算法 c) 信息增益率--C4.5算法 d) Gini系数--CART算法 e) 评价标准--评价函数 3.剪枝操 ...

  2. python聚类分析成绩反思_机器学习python实践——二分K-means聚类

    说这算法之前的话,前期的准备工作,请看我前面的博客.上一篇,我说到了K-means聚类算法,但是有很多的不足,有很多能够改进的地方,例如,怎样使得聚类效果达到全局最优(可能的最好结果)呢? 那么接下来 ...

  3. python dict批量选择_用python实现word内容批量替换

    本文讨论一下如果使用python来批量替换word中的内容. 一.目标: 在word文档中,将水果的名称由中文替换为英文. 而且我们有多份word文档. 二.实现: 使用了python-docx 这个 ...

  4. Python 散点图线性拟合_机器学习之利用Python进行简单线性回归分析

    前言:在利用机器学习方法进行数据分析时经常要了解变量的相关性,有时还需要对变量进行回归分析.本文首先对人工智能/机器学习/深度学习.相关分析/因果分析/回归分析等易混淆的概念进行区分,最后结合案例介绍 ...

  5. python tfidf特征变换_机器学习的“万能模板” - 数据分析

    最后是文本变量.很遗憾Titanic数据集中没有合适的文本变量.一般我们处理文本变量的方法是,合并所有的文本形成一个变量,然后调用Count Vectorizer或者TfidfVectorizer算法 ...

  6. python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建

    数据分析和机器学习 大数据基本都是建立在Hadoop系统的生态上的,其实一个Java的环境.很多人喜欢用Python和R来进行数据分析,但是这往往对应一些小数据的问题,或者本地数据处理的问题.如何将二 ...

  7. boost原理与sklearn源码_机器学习sklearn系列之决策树

    一. Sklearn库 Scikit learn 也简称 sklearn, 自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了.支持包括分类.回归.降维和聚类四大机器 ...

  8. 用python进行营销分析_用python进行covid 19分析

    用python进行营销分析 Python is a highly powerful general purpose programming language which can be easily l ...

  9. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

最新文章

  1. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
  2. 洛谷——P1547 Out of Hay
  3. Windows编程之定时器的使用和定时销毁桌面出现的窗口,以及窗口句柄的获取
  4. 计算机网络-VRRP
  5. pcl_view简单使用
  6. 中金财富:如何获取不“平均”的收益?
  7. Android中转到定义怎么,Android中添加自己的模块 【转】
  8. 网吧管理软件常见漏洞四节课
  9. Gephi教程-根据邻接矩阵构建复杂网络有向图
  10. 子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2
  11. 大工《画法几何与机械制图》课程设计大作业离线作业
  12. 安工大matlab实验报告王朋飞,计算机仿真实验
  13. scss exceeded maximum budget. Budget 4.00 kB was not met by 130 bytes with a total of 4.13 kB.
  14. 2022年电力电缆操作证考试题模拟考试平台操作
  15. AWS如何安全顺利关闭所有的免费服务
  16. html5项目心得体会,HTML5开发心得。
  17. 这就是传说中的一行代码一句注释?Python每日一练----种花
  18. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组
  19. 南开大学计算机考博参考书目,南开大学考博参考书
  20. css股票曲线图图解,如何看懂股票曲线图,一文搞懂这些曲线所代表的含义!

热门文章

  1. php curl获取响应,php – cUrl – 获取html响应正文
  2. python删除为空值的列_python如何删除列为空的行
  3. 通信 / DHCP 四次握手
  4. Cpp / Hash 所得字符串转成 Hex 字符串。
  5. 洞悉linux下的Netfilteriptables
  6. eclipse开发android的好处,从Eclipse切换到IntelliJ IDEA for Android开发的好处
  7. linux mysql安装 读写分离_linux下安装mysql-proxy 配置读写分离
  8. 超过200m文件发送_微信支持发送大文件了,高清视频不再压缩
  9. 两平面平行方向向量关系_立体几何平行证明的四大必杀绝技------赞!很赞!!非常赞!!!...
  10. 解题报告 『活动安排(贪心)』