机器学习算法系列

  1. 机器学习 之线性回归
  2. 机器学习 之逻辑回归及python实现
  3. 机器学习项目实战 交易数据异常检测
  4. 机器学习之 决策树(Decision Tree)
  5. 机器学习之 决策树(Decision Tree)python实现
  6. 机器学习之 PCA(主成分分析)
  7. 机器学习之 特征工程

这次,我们来看下决策树算法

决策树(Decision Tree)

决策树是一种常见的机器学习方法,它是从根节点开始,一步一步决策,直到走到叶子节点。
最终,所有的样本数据都会落到叶子节点,显然,决策过程的最终结论对应了我们所希望的判定结果 。
它即可以做分类问题,也可以做回归问题。

决策树组成

一般,一棵决策树包含一个根节点,若干个内部节点(非叶子节点)和若干个叶子节点。

  1. 根节点:第一个选择点
  2. 内部节点(非叶子节点):中间决策过程
  3. 叶子节点:最终的决策结果

决策树的训练流程

如何从给点定的训练集中去构造一棵决策树呢? 其实,决策树的构建就是一个递归过程,从根节点开始,根据选择的特征,将原始数据集切分为几个分支,然后依次遍历每个分支,在剩下的特征集中继续选择一个特征,进行对应划分,就是这个流程,一直递归下去,直到不可再分。
那么,什么情况下会不可再分呢?有三种情况:

  1. 当前节点包含的样本全属于同一类别,不需要再划分
  2. 当前属性集已为空,或者 当前节点中的所有样本在当前所剩属性集中取值相同,无法再分
  3. 当前节点包含的样本集为空,无法划分

具体的算法流程,这块贴下周志华大佬的《机器学习》中的一个图,大家可以看下

我们可以发现,上述算法中,最重要的一点,就是在每个节点上,选择最优的划分特征,也就说,每次在节点处划分时,我们都需要考虑,选择剩余特征集中的哪个属性进行划分,可以更好的划分数据呢?这个,也就是决策树算法的核心

决策树划分选择

通过上述,我们直到,决策树算法的核心是,如何选择最优的划分特征,我们希望随着划分的进行,我们经过每次划分后的分支节点所包含的样本尽可能的属于同一类别,也就是节点中所包含的样本纯度越来越高。从而,我们引入信息熵这个衡量标准

信息熵

信息熵表示的是随机变量不确定性的度量,熵越大,不确定性越强,也就是说纯度越低;
熵越小,不确定性越弱,纯度越高

设置样本集合D中总共有类样本,其中第类样本所占的比例为,则的信息熵定义为:


对于一个二分类问题,我们可以画出信息熵的图像看看

上述图像中,X轴表示正样本的概率,Y轴表示对应信息熵。可以看到,当概率为0.5时,对应信息熵最大,也就是说此时不确定度最大,大于0.5,或者小于0.5时,信息熵都会减小。

信息增益

那么,通过信息熵,我们如何进行决策树划分选择的衡量呢,我们引入信息增益这个概念

我们假设特征集中有一个离散特征,它有个可能的取值,
如果使用特征a来对样本进行划分,那么会产个分支节点,其中第个分支节点中包含的样本集。我们记为
于是,可计算出特征a对样本集D进行划分所获得的信息增益为:


解释下上面公式,其实特征a对样本集D进行划分所获得的信息增益 即为 样本集D的信息熵 减去 经过划分后,各个分支的信息熵之和。由于每个分支节点,所包含的样本数不同,所有在计算每个分支的信息熵时,需要乘上对应权重,即样本数越多的分支节点对应的影响越大

下面,我们具体看个栗子

上那个那个是某人在某月的1到14号的打球记录,我们看下,对应特征有四个,分别为天气(outlook,我们就认为是天气吧- -),温度,湿度,是否有风。输出值为是否打球

显然,我们的样本总类, ,其中,正例占比,负例占比首先,我们看下,根节点所包含的样本集D对应的信息熵为:


然后,我们需要计算当前特征集合(天气,温度,湿度,风级)中每个特征的信息增益。
以天气这个特征为例,如果以天气划分,则可将数据集D划分为三个子集,分别标记为:

划分以后,三个分支节点的熵值分别为:


然后,我们可以算出,特征outlook(天气)对应的信息增益是:


同样的,我们可以依次算出其他特征所对应的信息增益,然后判断哪个信息增益最大,则就以此特征来作为当前节点的划分。
假设最后算得,采用outlook来进行当前根节点的划分,则对于生成的三个节点分支,依次再对应每个分支节点进行上述流程(算在此分支节点的数据集上,剩余的特征集合中哪个信息增益最大,作为当前分支节点的分割特征,一直递归下去)

这其实就是ID3算法,以信息增益作为准则来进行划分特征

信息增益率

我们思考下,上面说的以信息增益作为准则来进行划分属性,有什么缺点没?

假设对于上面的数据集,我们增加一列特征,为 data(日期),针对上面的14个样本数据,对应的值为,根据上式可计算出,data(日期)所对应的的信息增益为:,
我们发现,它所对应的信息增益远大于其他特征,所以我们要以data特征,作为第一个节点的划分依据吗?这样划分的话,将产生14个分支,每个分支对应只包含一个样本,可以看到,每个分支节点的纯度已达到最大,也就是说每个分支节点的结果都非常确定。但是,这样的决策树,肯定不是我们想要的,因为它根本不具备任何泛化能力。

这就是ID3算法,也就是信息增益准则的一个缺点,它在选择最优划分特征时,对可取数目比较多的特征有所偏好,如何避免这个问题呢,我们引入增益率这个概念,改为使用增益率来作为最优划分特征的标准,同样,选择增益率最大的那个特征来作为最优划分特征,这也就是C4.5决策树算法

同样假设有数据集D,以及特征a,它有个可能的取值,

如果数据集在以特征作为划分特征时,增益率定义为:


其中


我们来看下上述增益率公式,其实 就是特征a本身的信息熵,也就说对应根据特征a的可能取值,所对应求得的信息熵,
举个栗子,对于outlook这个特征,总共有三个类别(sunny,overcast,rainy),所对应类别的数据的个数为为(5,4,5) 则outlook本身的信息熵为:


特征a的对应种类越多,也就是说越大,则的值通常会越大,从而增益率越小。这样,就可以避免信息增益中对可取数目比较多的特征有所偏好的缺点

那直接以信息增益率作为划分的衡量标准,有没有什么缺点呢,其实也有,增益率准则一般对可取数目较少的属性有所偏好。
所以,C4.5中的做法是:先从当前所有特征中找出信息增益高于平均值的的部分特征,再从中选择增益率最高的作为最优划分特征

基尼指数

还有一种决策树算法,称为CART决策树,它是使用基尼值来作为衡量标准的。具体流程其实和信息增益的衡量标准类似,只是将信息熵,改为了基尼值


反映了从数据集D中随机抽取两个样本,其类别标记不一样的概率,所以,越小。则数据集的纯度越高

连续型特征处理

前面我们所讲的都是基于离散型特征进行划分生成决策树,那对于连续性特征,我们需要怎么来处理呢?这个时候就需要用到连续型特征离散化的方法。最简单的即为二分法。下面我们来具体看下

给定样本集和连续特征, 假设特征在样本集中总共有个不同的取值。

  1. 个取值进行从小到大排序,记为
  2. 基于一个划分点,将划分为两部分,其中不大于的部分对应的数据集为,大于的部分对应的数据集为
  3. 我们知道,对于将进行二分,我们有种分法,另外对于相邻的属性取值来说
    在区间中取任意值产生的划分结果相同,依次,t的取值集合为:

  1. 然后,对于每个划分点,我们进行信息增益的计算,选择最大的信息增益对应的那个划分点,作为连续型特征a的划分点。公 式为:


决策树剪枝操作

我们想想,如果我们不加限制,最后训练出来的决策树,每个叶子节点的数据都会分成纯净的,这样真的好吗?要知道,我们是希望训练出的决策树模型,对于新给的数据,能够准确预测出对应结果。

所以,决策树,非常容易出现过拟合问题。为了避免这个问题,提供决策树的泛化能力,我们需要进行剪枝操作。一般有两种剪枝操作,“预剪枝”和“后剪枝”

预剪枝

预剪枝即是指在决策树的构造过程中,对每个节点在划分前需要根据不同的指标进行估计,如果已经满足对应指标了,则不再进行划分,否则继续划分。

那么,具体指标都有哪些呢?

  1. 直接指定树的深度
  2. 直接指定叶子节点个数
  3. 直接指定叶子节点的样本数
  4. 对应的信息增益量
  5. 拿验证集中的数据进行验证,看分割前后,精度是否有提高。

由于预剪枝是在构建决策树的同时进行剪枝处理,所以其训练时间开销较少,同时可以有效的降低过拟合的风险
但是,预剪枝有一个问题,会给决策树带来欠拟合的风险,1,2,3,4指标,不用过多解释,对于5指标来说,
虽然,当前划分不能导致性能提高,但是,或许在此基础上的后续划分,却能使性能显著提高呢?

后剪枝

后剪枝则是先根据训练集生成一颗完整的决策树,然后根据相关方法进行剪枝。

常用的一种方法是,自底向上,对非叶子节点进行考察,同样拿验证集中的数据,来根据精度进行考察。看该节点划分前和划分后,精度是否有提高,如果划分后精度没有提高,则剪掉此子树,将其替换为叶子节点。

相对于预剪枝来说,后剪枝的欠拟合风险很小,同时,泛化能力往往要优于预剪枝,但是,因为后剪枝先要生成整个决策树后,然后才自底向上依次考察每个非叶子节点,所以训练时间长。

以上,就是决策树算法的基本原理,下一篇文章,我们将通过python来具体实现一个决策树算法

机器学习之 决策树(Decision Tree)相关推荐

  1. 机器学习(五)决策树(decision tree)

    决策树(decision tree)(一)--构造决策树方法 决策树算法起源于E.B.Hunt等人于1966年发表的论文"experiments in Induction",但真正 ...

  2. 机器学习:决策树(Decision Tree)介绍

    简介 决策树是一种常见的机器学习算法,它的实现方式类似于我们平时利用多个不同权重选择做决策的过程.以下介绍一个现实生活中的例子. 当父母给自己的女儿介绍对象时,女儿往往会根据对方的年龄.富贵.高矮.美 ...

  3. 机器学习笔记——决策树(Decision Tree)(1)

    决策树 1.引入   1.1定义 决策树,顾名思义,就是帮我们做出决策的树.现实生活中我们往往会遇到各种各样的抉择,把我们的决策过程整理一下,就可以发现,该过程实际上就是一个树的模型.比如相亲的时候: ...

  4. 机器学习:决策树(Decision Tree)--ID3算法

    决策树的主要算法 构建决策树的关键:按照什么样的次序来选择变量(属性/特征)作为分类依据. 根据不同的目标函数,建立决策树主要有以下三种算法 ID3(J.Ross Quinlan-1975) 核心:信 ...

  5. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...

  6. [机器学习笔记] (四)决策树 Decision Tree

    (四)决策树 Decision Tree 基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性 ...

  7. 【机器学习实验二】决策树(Decision Tree)及其在图像识别任务上的应用

    经典有监督学习算法:决策树(Decision Tree) --本篇博客的决策树算法以及实验仅针对分类问题 文章目录 经典有监督学习算法:决策树(Decision Tree) 1.算法简介 2.算法思想 ...

  8. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  9. 决策树分类python代码_分类算法-决策树 Decision Tree

    决策树(Decision Tree)是一个非参数的监督式学习方法,决策树又称为判定树,是运用于分类的一种树结构,其中的每个内部节点代表对某一属性的一次测试,每条边代表一个测试结果,叶节点代表某个类或类 ...

  10. Python数据挖掘入门与实践 第三章 用决策树预测获胜球队(一)pandas的数据预处理与决策树(Decision tree)

    作为一个NBA球迷,看到这一章还是挺激动的. 不过内容有点难,研究了半天... 要是赌球的,用这章的预测+凯利公式,是不是就能提升赢钱概率了? 数据预处理 回归书本内容,既然要分析,首先需要有数据: ...

最新文章

  1. 明星企业内推+BAT面经,长三角的开发者联合起来!
  2. 简述进程的启动、终止的方式以及如何进行进程的查看。
  3. 124第七章—逻辑卷简介及在图形界面进行管理配置
  4. 事物的开始和结束命令分别是什么_人教版小学四年级语文下册期末测试题及答案[1]...
  5. linux查看 idt日志,实现RCP的日志管理
  6. php 高效缓存类,简单高效的文件缓存php类
  7. 社会治理智慧平台、联动指挥、综合执法、数据汇集、数据研判、智慧政务、图表模板、大屏、可视化、智慧工厂、办公、能源、医疗、校园、自动化综合车间大屏、车间数据、人力资源、员工考核、医院、rp原型
  8. 聊天宝解散,多闪、马桶MT还会远吗?| 畅言
  9. ActionScript 3.0 编程
  10. map-based exploration of intrinsic shape differences and variability
  11. Linux基础——怎么样从手机 (Android安卓/IOS苹果) 通过 SSH 远程 Linux
  12. 如何设置修改 Windows 7 开机启动项
  13. Win10画图实用小功能------反色
  14. 【Python K均值聚类算法】
  15. 智能配电系统监控解决方案在长白山机场配电工程的研究与应用
  16. Android第一行代码踩坑qwq
  17. IDEA Git缓慢
  18. 安装 truffle (CentOS7 与 Windows)
  19. 2021亚太数学建模竞赛A题简要思路
  20. 逻辑函数的两种标准形式

热门文章

  1. 解读mpvue官方文档的Class 与 Style 绑定及不支持语法
  2. 10年老电脑如何提速_电脑上如何提取图片中的文字?教你3个方法,10秒轻松搞定...
  3. winform ComboBox基本操作
  4. dataframe scala 修改值_如何填补Pandas中的缺失值(机器学习入门篇)
  5. 精美js聊天窗口界面代码
  6. mysql视图子查询_MySQL:FROM子句限制中的带有子查询的视图
  7. Xcode和macOS对应关系查询网址
  8. LINUX下载编译sqlite-jdbc(支持mips64el/loongarch64的jar包下载)
  9. 编程基本功:如何拆分一个大函数
  10. cygwin/msys: fatal error LNK1104: 无法打开文件“kernel32.lib”