机器学习笔记---你真的懂决策树么?

本文深入探讨了机器学习中的决策树算法,包括ID3、C4.5和CART的区别,特征选择标准如信息增益、信息增益率和基尼指数,以及剪枝策略,如预剪枝和后剪枝中的代价复杂度剪枝。文章还讨论了连续值处理和缺失值处理方法,展示了决策树在实际问题中的应用。

点击上方“潜心的Python小屋”关注我们,第一时间推送优质文章。

前言

大家好,我是潜心。本期介绍机器学习中的决策树。主要从特征选择的标准、剪枝技术、连续值与缺失值处理展开。

本文约5k字,预计阅读25分钟。

决策树

决策论中 (如风险管理),「决策树」(Decision tree)由一个决策图和可能的结果(包括资源成本和风险)组成, 用来创建到达目标的规划。在机器学习中,决策树作为最基础、最常见的「监督学习模型」,常被用于分类问题和回归问题(这里指的是CART算法)。如果将决策树的应用到「集成学习」(ensemble learning)的思想可以得到「随机森林」、「梯度提升决策树」等模型。

决策树学习的算法是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。

  1. 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。

  2. 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。

  3. 如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点。

  4. 递归进行2,3,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。

  5. 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。

这里我们以鸢尾花(iris)分类问题为例。鸢尾花的特征有:花瓣长度(petal length)、花瓣宽度(petal width)、花萼长度(sepal length)、花萼宽度(sepal width)四个特征,它的类别有:山鸢尾(setosa)、变色鸢尾(versicolor)、安德森鸢尾(virginica)三种类别。决策树的构建(CART算法)如下图,首先判断花瓣的长度(这里选择「gini指数」作为特征的选择)是否小于2.45cm,是则产生一个叶结点,全为山鸢尾,否则进行下一步最优划分特征:花瓣宽度是否小于1.75cm,分别产生两个子结点。再递归选择特征,直至所有的鸢尾花能被准确的划分到类别中。

从上述例子我们可以看到,「如何选择最优的特征」是决策树最为关键的因素。一般而言,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。不同的最优特征选择方式也就对应了不同的决策树算法,常用的决策树算法有:ID3、C4.5、CART。

特征选择与决策树算法

信息增益---ID3

上篇文章机器学习笔记---信息熵我们提到「信息熵」是度量样本集合纯度最常用的指标。因为信息熵反映了随机变量的不确定性,即事件发生的混乱度,熵越大,则随机变量的不确定性越大。

故假设在样本集合 中第 类样本所占的比例为 ,则 的信息熵定义为:

的值越小,则所有样本属于同一类的的概率越高。

假定离散型特征 注意:这里是离散型特征,ID3算法只能处理离散型变量,鸢尾花的分类就无法采用该算法,除非采用连续值处理方法)有 个可能的取值 ,即属性(特征) 下的子属性,产生 个分支结点,第 个分支结点包含了 中在特征 上取值为 的样本,记为 ,我们可以计算出 的信息熵(该结点中分类的混乱情况)。再考虑权重的问题,赋予分支结点权重值 ,故可以计算出特征 对样本 进行划分所得到的信息增益:

「ID3算法」建立在奥卡姆剃刀(用较少的东西,同样可以做好事情)的基础上,选择了使用信息增益来作为特征的选择,ID3的算法步骤如下:

  1. 初始化特征集合和数据集合;

  2. 计算数据集合信息熵和所有特征下分类结点的信息熵(李航的《统计学习方法》将其称为经验条件熵),选择信息增益最大的特征作为当前决策节点;

  3. 更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);

  4. 重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点;

ID3算法有很多的缺点:

  • 信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;

  • 只能用于处理离散分布的特征;

  • 没有考虑缺失值;

信息增益率---C4.5

若把一个数据集中的编号作为划分标准,即每一个样本自成一类,那信息增益会很大。信息增益对可取值数目较多的特征有所偏好,为了减少这种偏好带来的不利影响,「C4.5算法」选择「信息增益率」来作为特征的划分选择,增益率如下定义:

其中

若特征 的可取数目越多,则 相对更大,故增益率准则对可取值数目较少的属性有所偏好。

C4.5算法相对于ID3算法的缺点对应有以下改进方式:

  • 引入信息增益率作为划分标准;

  • 将连续特征离散化;

  • 引入悲观剪枝策略进行后剪枝;

  • 对于缺失值进行了处理;

C4.5的缺点:

  • C4.5 用的是多叉树,用二叉树效率更高;

  • C4.5 只能用于分类;

  • C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;

  • C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。

基尼指数---CART

「CART决策树算法」(Classification and Regression Tree)使用「基尼指数」作为划分属性的标准。基尼指数(Gini)描述的是数据的纯度,定义如下:

基尼指数反映了从数据集 中随机抽取两个样本,其类别标记不一致的概率。因此,基尼指数越小,数据 的纯度越高。

故特征 的基尼指数定义为:

CART 在 C4.5 的基础上进行了很多提升。

  • C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;

  • CART 既可以分类也可以回归;

  • CART 使用 Gini 系数作为变量的不纯度量,减少了大量的对数运算;

  • CART 采用代理测试来估计缺失值;

  • CART 采用“基于代价复杂度剪枝”方法进行剪枝,而 C4.5 采用悲观剪枝方法。

ID3、C4.5、CART的差异

  • 特征选择的标准:ID3使用了信息增益,会倾向于取值较多的特征,C4.5对ID3进行了优化,使用信息增益率来对取值数目多的特征进行惩罚,避免出现过拟合的特性,提升决策树的泛化能力。而CART进一步使用Gini指数作为判别标准,减少了大量的对数运算,提高了算法的执行效率。

  • 样本类型:ID3只能处理离散型变量,而C4.5和CART都可以处理连续型变量。C4.5通过二分法(见下文),对于CART,由于其构建时每次都会对特征进行二值划分,因此可以很好的适用于连续型变量。

  • 应用方面:ID3和C4.5只能用于分类任务,CART还可以应用于回归任务。

  • 缺失值处理:ID3对缺失值比较敏感,C4.5和CART对缺失值有不同的处理方式。

  • 剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。

剪枝策略

剪枝是决策树学习算法对付“过拟合”的主要手段。决策树的剪枝策略通常有两种方法,「预剪枝」(Pre-Pruning)和「后剪枝」(Post-Pruning)。

预剪枝

预剪枝指在决策树生成过程中,对每个结点在划分前先进行估计,若当前的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点。

预剪枝何时停止决策树的生长有以下几种方法:

  1. 当树到达一定深度时,停止树的生长;

  2. 当到达当前结点的样本数量小于某个阈值时,停止;

  3. 计算每次分裂对测试集准确度的提升,当小于某个阈值,则不再继续扩展;

预剪枝有思想直接、算法简单、效率高等特点,不仅降低了过拟合的风险,还显著减少了决策树训练时间的开销和测试时间开销。但预剪枝基于「贪心」本质禁止这些分支展开,会给决策树带来欠拟合的风险。

后剪枝

后剪枝的思想是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。

后剪枝决策树的欠拟合风险小,泛化性能优于预剪枝决策树。但后剪枝是在决策树生成之后进行的,要自底向上对树中所有叶结点进行逐一考察,因此训练时间开销比预剪枝大得多。

常见的后剪枝方法包括错误率降低剪枝(REP)、悲观剪枝(PEP)、代价复杂度剪枝(CCP)等。

代价复杂度剪枝(CCP)

CART决策树算法使用了CCP剪枝方法。CCP主要包含以下两个步骤:

(1)从完整决策树 开始,生成一个子树序列 ,其中 生成, 为树的根结点。

(2)在子树序列中,根据真实误差选择最佳的决策树。

步骤(1)从 开始,裁剪 中关于训练数据集合误差增加最小的分支以得到 。具体地,当一棵树 在结点 处剪枝时,它的误差增加可以用 表示,其中 表示进行剪枝之后的该结点误差, 表示未进行剪枝时子树 的误差。考虑到树的复杂度因素,我们用 表示子树 的叶子结点个数,则树在结点 处剪枝后的误差增加率为:

在得到 后,我们每步选择 最小的结点进行相应剪枝。

步骤(2)中,我们需要从子树序列中选出真实误差最小的决策树。CCP给出两种常用的方法:一种是基于独立剪枝数据集;另一种是基于k折交叉验证,将数据集分成k份,前k-1份生成决策树,最有一份用于选择最优决策树。重复进行N次,再从这N个子树中选择最优的子树。

连续值与缺失值的处理

连续值处理

对连续属性进行离散化。在C4.5决策树算法中采用了二分法对连续属性进行处理。

假设给定样本集 和连续特征 上有 个不同的取值,将这些值从小到大进行排序,并取相邻两样本值的平均数共 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点。

且与离散属性不同,若当前结点划分属性为连续属性,则该属性还可以作为后代结点的划分属性。(见对鸢尾花分类问题构建决策树)

例如在鸢尾花分类问题中,有如下样本(1~3为山鸢尾,4~6为变色鸢尾,7~9安德森鸢尾):

[5.1 3.5 1.4 0.2]
[4.9 3.  1.4 0.2]
[4.7 3.2 1.3 0.2]
[7.  3.2 4.7 1.4]
[6.4 3.2 4.5 1.5]
[6.9 3.1 4.9 1.5]
[6.5 3.  5.5 1.8]
[7.7 3.8 6.7 2.2]
[7.7 2.6 6.9 2.3]

我们首先选择第一列花萼长度进行排序:

4.7, 4.9, 5.1, 6.4, 6.5, 6.9, 7., 7.7, 7.7

产生8个划分点(划分点的值为相邻的平均树):

4.8, 5.0, 5.75, 6.45, 6.7, 6.95, 7.35, 7.7

其中

每个点的信息增益分别为:,0.453,0.913, 0.680, 0.680, 0.913, 0.453, 0.4816, 0.192,选择最大值之一5.75作为划分点。再依次对对其他的特征进行计算信息增益。

缺失值处理

现实任务中会经常遇到不完整样本,即样本的某些属性会缺失。故需要解决两个问题:

  1. 如何在属性值缺失的情况下进行划分属性选择?(即如何计算特征的信息增益率(C4.5)或基尼指数(CART))

  2. 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

C4.5和CART决策树算法分别给出了不同的解决方法。

C4.5处理缺失值

针对问题1,C4.5的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算;假设 表示无缺失值样本所占的比例, 表示无缺失值中第 类所占的比例, 表示无缺失值样本中在特征 上取值 的样本所占的比例。故可讲信息增益推广为:

其中

针对问题2,C4.5的做法是:若样本 在划分特征 上的取值已知,则将 划入对应取值的子结点,且样本权值在子结点中保持为 。若取值未知,则将样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。

CART处理缺失值

CART采用「替代划分」的方式来处理缺失值。

对于问题 1,CART一开始严格要求分裂特征评估时只能使用在该特征上没有缺失值的那部分数据,在后续版本中,CART 算法使用了一种惩罚机制来抑制提升值,从而反映出缺失值的影响(例如,如果一个特征在结点的 20% 的记录是缺失的,那么这个特征就会减少20%或者其他数值)。

对于问题 2,CART 算法的机制是为树的每个节点都找到「代理分裂器」,无论在训练数据上得到的树是否有缺失值都会这样做。在代理分裂器中,特征的分值必须超过默认规则的性能才有资格作为代理(即代理就是代替缺失值特征作为划分特征的特征)。当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。代理分裂器可以确保无缺失训练数据上得到的树可以用来处理包含确实值的新数据。

总结

决策树算法主要分为三个步骤:

(1)进行特征选择,选择标准;

(2)通过特征选择构建决策树;

(3)进行剪枝处理;

决策树作为最基础、最常见的监督学习模型,在集成学习的思想下,还诞生了随机森林模型和梯度提升决策树模型。这是作为一个机器学习的初学者必须所要掌握的。

参考文献

[1] 周志华.机器学习[M]. 北京:清华大学出版社,2016.

[2] 诸葛越.百面机器学习[M]. 北京:人民邮电出版社,2018.

往期精彩回顾

机器学习笔记---信息熵

「通过Docs学Python」(番外)浅谈Python代码规范

「通过Docs学Python」(三)内置类型:文本、集合以及映射

「通过Docs学Python」(二)内置类型:数字与序列

「通过Docs学Python」(一)前言

爬虫实战(三)----使用百度API获取经纬度/地址

今日头条爬虫实战----爬取图片

扫码关注更多精彩

我就知道你“在看”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值