1.算法
从这部分开始,我们来讲解机器学习中最实用,效率高且效果好的决策器集成类的算法。
RF、GBR、Adboost是三个最经典的集成类算法,所谓集成类算法,就是集成了一些弱学习器的结果,综合输出一个更为可靠的结果。举个例子来说,如果有一位不知道从哪里来的天气学家突然告诉你,马上就要洪水海啸,世界末日了,你在相信这位科学家的言论之前,肯定会先考量一下他是个疯子的可能性有多大。但假如这时候世界各国都出现了很多的天气学家,每一个天气学家的语言、学术背景、研究方法都不同,但这些天气学家都告诉你,马上就要洪水海啸,地震龙卷风,世界末日了,这时,我们显然不得不考虑这个言论的可能性了。
当然在我们学习如何综合判断不同天气学家的意见之前,我们首先需要培养出不同的天气学家出来,也就是我们这一节介绍的集成算法中的三种常见弱学习器(决策树)。
1.1 信息论基础知识
1.信息量
信息量是衡量系统中某种结果发生时所携带的信息大小,可以理解为某个事件发生的概率大小,当某件事发生的概率越小但发生了之后,所携带的信息量越大,其实这与我们的直观感受是相符合的,我们会觉得火箭发射失败的消息所包含的信息量很大,因为其发生概率很小;
信息量公式:
1、p(x)是事件x发生的概率
2、用对数是为了计算方便!
3、为何前面有负号? 因为信息量与概率成反比,倒数的对数,负号可以提前!
4、底数为何是2?是其他的也行!
2.信息熵
信息熵与信息量,是系统与个体的关系。信息熵是研究系统各种可能结果及其每种结果发生的概率与整个系统的混乱度的关系。当一个系统的各种可能性相等的时候,该系统最为混乱(无序),其信息熵也是最大的。反之,如果一个系统中某个结果概率很大,其他结果概率很小,则该系统的信息熵较小,该系统较为明确(有序)!
例如:假如天气预报告诉我们:明天我市天气可能是晴天,也有可能是多云,还有可能是小雨或者大雨,四种可能概率皆为25%,这个系统十分混乱,显然我们没有得出什么有效信息;但如果天气预报这样告诉我们:明天我市天气为多云,概率为95%,这个系统显然有序得多,我们知道明天需要带伞出门。
问题来了,上面讲的系统有序程度,是一种主观的感觉。能不能用数学的方法来量化一个系统的有序程度呢?
前面提到了信息量的概念,能否用一个系统的所有可能结果发生时所携带的信息量的总和来衡量该系统的混乱程度呢?
还是以天气预报为例,该系统有四种结果:晴天,多云,小雨和大雨,若按照信息量之和来衡量混乱度,那么其混乱度的值为各个结果发生概率之倒数,再取对数并求和。
这种方式可行吗?不可行!因为概率极小的结果会对最终的结果影响很大,但是现实中,极小的结果对混乱度并无多大影响。
明天95%的概率是多云。如果我们再加上一个结果,下冰雹!!!其概率为万分之一。对这个系统的混乱度会有什么影响呢?
现实中增加了这个可能并没有影响我们对明天的判断。然而,如果用信息量直接求和来衡量混乱度的话,下冰雹这个结果增加后,系统的混乱度大大增加了,因为其发生的概率太小,导致整个系统的信息量之和明显增大。
所以,这种方法不够完善,我们需要改进一下:
用每个结果的信息量与其发生概率加权,再求和,最终得到的值便可以有效地衡量整个系统的混乱程度,值越大,越为混乱!
我们用这种方法来算一下天气预报系统的混乱度:
混乱度 = -0.95*log(0.95) - 0.02*log(0.02) - 0.01*log(0.01) - 0.01*log(0.01)
算出来的值就可以科学地衡量一个系统的混乱度了。各位观众可以做一个实验,在各种结果概率相等时,该值最大;而若是存在某个结果概率接近1的时候,该值趋向最小!
讲了那么多,我们还是没有提到信息学知识与决策树之间的联系。不要着急,我们先来看这样一张图:
这是一位姑娘在择偶时的考虑过程,事实上这个过程就是一棵决策树,黄色部分是输入的特征。假设我们已经知道这位姑娘对一些男生的选择情况,也就是我们已经有了一些训练样本,我们需要根据不同的特征划分这位姑娘选择某位输入对象的可能性,而划分的依据就是我们前面所介绍的信息学知识。
假设在数据D中有k个类别,其中第i个类别数据在总数据中占有率为pi,则熵的计算公式为:
3. 信息增益
当我们使用某一特征A对数据分类后,系统的混乱度会减小(因为数据数据有所划分)。此时的熵也会减小,假设特征A有m个类别,其计算公式为:
那么分类前后熵减小的差值就是信息增益:
我们一一计算所有变量的信息增益,选择信息增益最大的那个变量作为此分类节点,由此便引出了我们介绍的第一个决策树:ID3
1.2 ID3
我们现在已经了解了不同特征分类节点的划分依据,那么如何划分的具体过程还是不明朗,接下来我们使用一个具体事例来介绍,只要拿出纸笔跟着算一遍即可,这个过程不涉及任何复杂的公式。
我们设定一组贷款数据如下:
我们将通过年龄、是否有工作、是否有房子和信贷情况四个自变量来区分贷款的审批结果。
第一层
总体信息熵:
计算年龄A1的信息熵:
则A1的信息增益为:
按照此方法,
由此可见,我们将使用变量A3:是否有房子来作为第一分类特征。
第二层
A3 = “是"时数据如下:
发现他们的贷款审批结果都是"是”,其熵等于0,可以作为叶节点。
A3 = "否"时数据如下:
此时的总体信息熵:
至此不需要在计算Gain(A4)了,因为A2已经将数据完全划分开了。
在本数据集中,A1和A4对于数据的划分没有作用。
所得树图:
在树图中,(1/2/8/9/10/14)(3/4/13)(5/6/7/11/12/15)是三个叶节点,代表了三个分类好的子集;其他非叶节点表示的是逻辑判断。
一般而言,我们都需要对树进行剪枝。因为我们划分枝叶的根据是熵增,只要有熵增就需要分枝,这样会很有可能造成过拟合的情况。我们将在后续介绍剪枝操作。
ID3的缺点
ID3算法的缺点在于:用信息增益选择属性时偏向于选择分枝比较多的属性值,即取值多的属性。
所以,我们使用信息增益比来代替信息增益,以削弱这种情况。此算法也即是C4.5算法。
1.3 C4.5
在上一篇介绍ID3算法文章中,我们指出ID3算法采用信息增益作为标准,缺点在于会偏向分类更多的自变量,并且不能处理连续值。
在本文中,我们将介绍C4.5算法,采用信息增益比代替信息增益,从而减小某一自变量分类个数的影响。
我们假设使用的数据集为D,待计算的自变量为A,g(D,A)则信息增益比为:
其中,
与ID3比较,我们只是更换了划分标准,计算方法没什么变化,我们同样拿一个实例来介绍,请拿出纸笔仔细算一遍:
经计算,(信息增益的详细计算过程在上一节中);
下面计算自变量A1的信息增益比,
同理可得
一般而言,我们还是要选择一个信息增益比最大的变量。但是,采用信息增益比也有缺点,即它会偏向于分类较少的变量。
我们总结一下:
ID3算法使用的是信息增益,它偏向于分类较多的变量;
C4.5算法使用的是信息增益比,它偏向于分类较少的变量。
为了克服这些问题,我们采取如下方式:首先计算信息增益和信息增益比,然后选取信息增益在平均值以上的那些变量,最后在这些变量中选择信息增益比最大的变量。
例如:在上面的实例中,我们发现变量A2,A3,A4的信息增益在平均值以上。然后,我们就在A2,A3,A4三个变量中选择信息增益比最大的变量。
1.4 CART
正如之前所说,ID3/C4.5/CART算法的区别在于选择特征作为判断节点时的数据纯度函数(标准)不同。ID3算法使用的是信息增益,C4.5算法使用的是信息增益比,CART算法使用的是基尼系数(GINI)。
1. 算法思想
CART算法是一种二分递归分割方法,把当前样本划分为两个子样本,不断递归分割使得生成的每个非叶子结点都有两个分支。所以,CART算法生成的决策树是一个二叉树。由于二叉树的每个节点的选择都只有“是”和“否”两种,所以即使一个节点下需要多分类,也是把数据分成两部分。
假设数据有共n个自变量(维度),y是其标签。算法步骤为:
那么我们按照怎样的顺序选择变量呢?CART算法使用的标准是GINI系数。
2. GINI系数
总体内包含的类别越杂乱,GINI指数就越大。这个概念跟熵的概念很相似。
假设pi为某一类别所占总体的概率,共有n类,则GINI系数定义:
当我们按照变量A对数据集D进行分类时,假设变量A将数据D分成了m类,则划分后的GINI系数为:
此时,GINI系数的增加值为:
我们依次计算每一个变量的基尼系数增加值Δ,并选取最大的那个变量划分数据集。
3. 计算实例
整个数据的GINI系数为:
当按照 A3是否有房子(二分类) 来划分,GINI系数增加值的计算过程:
那么:
当按照 A1年龄(三分类) 来划分,GINI系数增加值的计算过程:
由于CART算法本质上是一个二叉树,所以我们要将数据分成一下三种情况:
{青年} ,{中年,老年};
{中年}, {青年,老年};
{老年}, {青年,中年}
这里,我们以{青年} ,{中年,老年}为例计算GINI系数增加值
那么
之后在依次计算剩下两种分组的GINI系数增加值。
综上: 虽然在原始数据中只有4个分类,但是在计算GINI系数增加值时,需要计算(3+1+1+3)中分组可能。(即A1和A4有三个分类,即有三种划分情况;A2和A3只有两个分类,即有一种划分情况)。
按照这种计算方式依次计算,每次都选取GINI系数增加最大的划分可能,直至数据没有在划分的可能或者数据已经完全分开。
值得注意的是,当数据是连续型时,我们将数据从小到大排列,去相邻两个取值的均值作为划分点。例如,数据为(60,70,80,90),我们分别取65,75,85作为划分点,并且计算划分之后的GINI增加值。
4. 缺失值处理
上文说到,模型对于缺失值的处理会分为两个子问题:
如何在特征值缺失的情况下进行划分特征的选择?
选定该划分特征,模型对于缺失该特征值的样本该进行怎样处理?
对于问题 1,CART 一开始严格要求分裂特征评估时只能使用在该特征上没有缺失值的那部分数据,在后续版本中,CART 算法使用了一种惩罚机制来抑制提升值,从而反映出缺失值的影响(例如,如果一个特征在节点的 20% 的记录是缺失的,那么这个特征就会减少 20% 或者其他数值)。
对于问题 2,CART 算法的机制是为树的每个节点都找到代理分裂器,无论在训练数据上得到的树是否有缺失值都会这样做。在代理分裂器中,特征的分值必须超过默认规则的性能才有资格作为代理(即代理就是代替缺失值特征作为划分特征的特征),当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。代理分裂器可以确保无缺失训练数据上得到的树可以用来处理包含确实值的新数据。
1.5 剪枝算法
当我们输入的原始数据有较多的变量时,通过决策树算法生成的决策树可能会非常的庞大。这样的一颗决策树在训练集上有很好的表现,但是在测试集上的表现往往不甚理想,这样的问题也被叫做过拟合问题。面对这样的问题,我们一般所采用的方法是对决策树进行剪枝操作。
决策树的剪枝
顾名思义,树的剪枝就是剪掉树的一些枝叶,考虑大决策树的枝代表着逻辑判断,也代表着分类后的子集。决策树的剪枝就是删掉一些不必要的逻辑判断,并且将子集合并。这样确实会造成在训练集上子集不纯的现象,但是因为我们最终目标是模型在测试集上的效果,所以牺牲在训练集上的效果换取解决测试集的过拟合问题这样的做法也是值得的。决策树剪枝可以分为两类,一类是预剪枝,一类是后剪枝。
剪枝算法不详细介绍原理,感兴趣的可以自行查找资料。
预剪枝
预剪枝就是在生成决策树的同时进行剪枝。正常决策树的生成是只要有信息增益就要进行分支。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。预剪枝的思想比较简单,但在实际应用中,预剪枝的表现并不是很好。所以,目前我们基本都是使用后剪枝方法。
后剪枝
后剪枝就是在决策树构造完成后进行剪枝。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。后剪枝就是删除一些子树,然后用其叶节点代替。这个叶节点代表的子集不一定都是“纯”的。那么,这个叶子节点所标识的类别通过大多数原则确定。大多数原则就是指这个叶节点所代表的子集中大多数的类别来表示这个叶节点。
常见的后剪枝算法
错误率降低剪枝法
错误率降低剪枝法(Reduced-Error Pruning)简称REP方法。
悲观剪枝法
悲观剪枝法(Pessimistic Error Pruning)简称PEP方法。
代价复杂度剪枝法
代价复杂度算法(Cost-Complexity Pruning)简称为CCP算法。
2.比较
ID3的缺点:
ID3 没有剪枝策略,容易过拟合;
信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;
只能用于处理离散分布的特征;
没有考虑缺失值。
C4.5 相对于 ID3 的缺点对应有以下改进方式:
引入悲观剪枝策略进行后剪枝;
引入信息增益率作为划分标准;
将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点;
对于缺失值的处理可以分为两个子问题:
问题一:在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)
问题二:选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
针对问题一,C4.5 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算;
针对问题二,C4.5 的做法是:将样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。
C4.5 的缺点
剪枝策略可以再优化;
C4.5 用的是多叉树,用二叉树效率更高;
C4.5 只能用于分类;
C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;
C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。
CART 在 C4.5 的基础上进行了很多提升:
C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;
C4.5 只能分类,CART 既可以分类也可以回归;
CART 使用 Gini 系数作为变量的不纯度量,减少了大量的对数运算;
CART 采用代理测试来估计缺失值,而 C4.5 以不同概率划分到不同节点中;
CART 采用“基于代价复杂度剪枝”方法进行剪枝,而 C4.5 采用悲观剪枝方法。
最后通过总结的方式对比下 ID3、C4.5 和 CART 三者之间的差异。
除了之前列出来的划分标准、剪枝策略、连续值确实值处理方式等之外,我再介绍一些其他差异:
划分标准的差异:ID3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值小的特征,CART 使用基尼指数克服 C4.5 需要求 log 的巨大计算量,偏向于特征值较多的特征。
使用场景的差异:ID3 和 C4.5 都只能用于分类问题,CART 可以用于分类和回归问题;ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快;
样本数据的差异:ID3 只能处理离散数据且缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 ;
样本特征的差异:ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征;
剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。
3.链接
随机森林通俗演义
分类算法 -- 决策树ID3算法
https://blog.csdn.net/weixin_43216017/article/details/87474045
分类算法 -- 决策树C4.5算法
https://blog.csdn.net/weixin_43216017/article/details/87609780
分类算法 -- 决策数CART算法
https://blog.csdn.net/weixin_43216017/article/details/87617727
CART 分类与回归树
https://www.jianshu.com/p/b90a9ce05b28
决策树的剪枝:REP/PEP/CCP算法
https://blog.csdn.net/weixin_43216017/article/details/87534496
【机器学习】决策树(上)——ID3、C4.5、CART(非常详细)