😀😀😀😀😀😀😀😀😀😀😀😀😀😀
别再说你不懂决策树!😁 完整项目请查看Github
Content
Decision Tree
在介绍决策树之前我们先看看决策树长什么样。我们这个决策树是判定一个人是否要去相亲。
学过软件工程的朋友应该接触过判定树,判定树也称为决策树,只不过呢在机器学习的决策树中如何向下分割节点要由更复杂的计算公式决定。
我们先来看一下决策树的整体流程:
- 我们观察决策树可以发现,决策树是一个从根节点到叶子结点逐渐递归的过程
- 在每个中间节点我们要找到一个划分的属性。这个划分的属性就是我们一会要重点解释的,也就是决策树是怎么划分出来的。
再解释如何寻找可以划分的属性之前,我们再来分析一下决策树分到什么程度可以停止:
- 当前节点包含的样本全属于同一类别,无需再进行划分
- 当前节点划分之后这个属性为空,或者是样本的所有属性取值都相同,无法划分
- 当前节点包含的样本集合为空,不能划分
注:这里说的属性也就是每个样本的特征。
确定了整体流程,也确定了最后的终止条件,我们就来看一下决策树中的属性划分是如何决定的。
按照属性划分的原理不同我们可以划分出三种不同的决策树:
- 按照信息增益分割节点:就是ID3决策树
- 按照信息增益率分割节点:就是C4.5决策树
- 按照基尼系数分割节点:就是CART决策树
在介绍这几种决策树之前我们先引入一个信息熵的概念:
Entropy
所谓的信息熵就是度量一个样本集合"纯度/不确定度"的指标,如何理解呢,我们来举个例子:
假设你在医生办公室的候诊室里和三个病人谈话。 他们三个人都刚刚完成了一项医学测试,经过一些处理,产生了两种可能的结果之一: 疾病要么存在,要么不存在。 他们已经提前研究了特定风险概率,现在急于找出结果,病人 a 知道,根据统计,他有95% 的可能性患有这种疾病。 对于病人 b,被诊断为患病的概率是30% 。 相比之下,患者 c 的概率是50 %。
现在我们想集中讨论一个简单的问题。 在其他条件相同的情况下,这三个病人中哪一个面临最大程度的不确定性?
答案很清楚: 病人 c 经历了"最多的不确定性"。 在这种情况下,他所经历的是最大程度的不确定性: 就像抛硬币一样。但是我们如何精确的来计算这种不确定度呢?就有了下面这个公式:
其中 就是第
个事件发生的概率,也可以看作在整个集合中第
类样本所占的比例。规定若
则
。计算出的信息熵最小值为0,最大值为
,当我们计算出的结果越小,代表当前这个数据越纯,也就是不确定度越低。
我们在用一个具体的例子来解释信息熵是如何计算的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nd826FK5-1584193483374)(github.com/Knowledge-P…)]
在这个例子中我们数据集共有17条数据,其中包含好瓜和坏瓜两个类别,其中好瓜/正例占,坏瓜/负例占
。
那么现在这个集合的信息熵为:
可以看到我们当前的这个数据集合计算出来的值很大,也就代表当前的数据还是很混乱的,因为正负两个样本基本上各占一半。
信息增益
我们刚说完信息熵,下面就让我们来看一下什么是信息增益。
我们假设某个离散属性的取值为:
代表所有样本在属性
上取值为
的样本集合。
那么以属性A对数据集D进行划分,所得到的信息增益为:
其中代表按照属性a划分之前的信息熵,代表属性a取值为v时在所有样本中所占的权重,样本越多代表当前属性的这个取值越重要。
我们还是用之前西瓜的那个例子来说明,假设我们以色泽属性进行分割,那么就对应着三个数据子集:
代表青绿色,对应的数据编号为
,共有6个样本,其中正例3个,负例3个。
代表乌黑色,对应的数据编号为
,共有6个样本,其中正例4个,负例2个。
代表浅白色,对应的数据编号为
,共有5个样本,其中正例1个,负例4个。
正例仍代表好瓜与负例仍代表坏瓜。
则按照色泽进行划分之后的到的信息熵分别为:
则根据属性色泽划分之后的信息增益为:
信息增益率
说完信息增益,下面我们再来看一下什么是信息增益率。
信息增益率:
其中
属性A的可能取值越多即V越多,则IV(A)的值越大。
我们仍以西瓜数据集为例,计算一下信息增益率,首先我们来计算一下IV(A):
接下来计算一下信息增益率:
基尼系数
与之前那两个基于熵的不同,基尼系数采用新的算法来计算数据的不确定度/纯度,基尼系数越小,数据的纯度越高,不确定度越低。我们来看一下基尼系数到底长什么样。
在一个分类问题中,假设有v个类别,第v个类别的概率为,则基尼系数为:
对于给定样本D,假设其中有k个类别,切第k个类别的数量为,则样本D的基尼系数为:
具体来说,我们假设某个离散属性的取值为:
代表所有样本在属性
上取值为
的样本集合。
那么以属性A对数据集D进行划分,所得到的基尼系数为:
我们还是用西瓜数据集为例,计算一下基尼系数,假设我们以色泽属性进行分割,那么就对应着三个数据子集:
代表青绿色,对应的数据编号为
,共有6个样本,其中正例3个,负例3个。
代表乌黑色,对应的数据编号为
,共有6个样本,其中正例4个,负例2个。
代表浅白色,对应的数据编号为
,共有5个样本,其中正例1个,负例4个。
正例仍代表好瓜与负例仍代表坏瓜。
则按照色泽进行划分之后的到的基尼系数分别为:
则根据属性色泽划分之后的基尼系数为:
接下来我们就看一下在决策树中是如何应用上面的公式的
ID3
我们根据刚才的信息增益公式来计算一下按照其他属性分割得到的信息增益
显然根据纹理进行分割是信息增益最大的,故首先按照纹理来划分样本
之后按照这个规则继续分割,直到达到了停止条件则决策树完成创建。
ID3算法不足:
- 没有考虑连续特征
- 假如某个属性具有好多个取值,甚至是把编号作为属性了,按照这种情况计算就会导致决策树创建之后效果并不好
- 没有考虑缺失值的情况
所以这才引入了C4.5。
C4.5
本部分来源见参考文献[20]
对于ID3存在的几个问题,C4.5是这样处理的
- 将连续特征离散化,加入说某连续特征是
共9个数,那么我们取相邻两个数的平均值
,就会产生8个分割点,分别计算以每个分割点为中心进行分割时的信息增益,例如以3.5为划分点的话,小于3.5为第一类,大于3.5为第二类。选择信息增益最大的分割点。
- 将信息增益率作为特征选择的标准,这样按照公式样本越多分母就会越大,计算的数值就越小
- 对确实值的处理主要分为两个部分:
- 一是对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例。
- 二是选定了划分属性,对于在该属性上缺失特征的样本的处理。可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9
虽然C4.5解决了ID3中的大部分问题,但还有很多改进的空间。
- 决策树算法非常容易过拟合,所以要对决策树进行剪枝。主要有两种剪枝的方式:1. 预剪枝 2. 后剪枝
- C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
- C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
- C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
CART
我们上面介绍完了基尼系数的计算,但是CART决策树在创建过程中有一些细节值得注意:
- 与上面的C4.5一样,CART决策树叶具有处理连续值的能力,只不过在处理连续值的过程中,它获取完分割点后采用的是基尼系数进行运算
- CART决策树是一个二叉树,不同于我们在基尼系数中的计算将色泽分为三类,分别算完基尼系数求和,CART决策树在计算过程中是这样的。他会将A分为三组:{A1}和{A2,A3},{A2}和{A1,A3},{A3}和{A1,A2},然后分别计算这三组怎样分基尼系数最小,选取最小的那一个组合来建立决策树。
我们可以先看一下最开始的情况他是按照纹理来进行切分
回归树
上面我们介绍完分类的决策树,接下来再看一下CART回归树。
分类树输出的是离散值,用叶子结点里概率最大的类别作为当前结点的预测类别;回归树输出的是连续值,是最终叶子结点的均值或者中位数作为输出
回归树与分类树最大的不同:
对于连续值的处理,我们知道CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。这比较适合分类模型,但是对于回归模型,我们使用了常见的和方差的度量方式,CART回归树的度量目标是,对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。
我们来看一下回归树是是长什么样的:
参考文献
[1] Yeh James: 決策樹(Decision Tree)以及隨機森林(Random Forest)介紹
[2] Madhu Sanjeevi ( Mady ): Decision Trees Algorithms
[3] Savan Patel: Decision Tree Classifier — Theory
[4] Diogo Menezes Borges: Boosting with AdaBoost and Gradient Boosting
[5] Joseph Rocca: Ensemble methods: bagging, boosting and stacking
[6] Will Koehrsen: Random Forest in Python
[7] Tony Yiu: Understanding Random Forest
[8] Will Koehrsen: Random Forest Simple Explanation
[9] 终于有人把XGBoost 和 LightGBM 讲明白了,项目中最主流的集成算法!
[10] 深入理解LightGBM
[11] 一文详尽系列之CatBoost
[12] 最常用的决策树算法!Random Forest、Adaboost、GBDT 算法
[13] Yeh James: Kaggle機器學習競賽神器XGBoost介紹
[14] Alvira Swalin: CatBoost vs. Light GBM vs. XGBoost
[15] Vishal Morde: XGBoost Algorithm: Long May She Reign!
[16] Pushkar Mandot: What is LightGBM, How to implement it? How to fine tune the parameters?
[17] 陈旸: 极客时间:决策树
[18] Entropy is a measure of uncertainty
[19] 周志华: 机器学习
[20] 刘建平: 决策树算法原理(上)
[21] 刘建平: 决策树算法原理(下)
欢迎大家关注我们的公众号:知识沉淀部落。