相关文章推荐
完美的双杠  ·  CMake错误。"add_subdirect ...·  1 年前    · 

决策树是一个树结构(可以是二叉树或非二叉树),其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个输出类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

决策树学习通常包含这几个方面:特征选择、决策树生成、决策树剪枝、缺失值/异常值处理、决策树集成学习。

决策树-特征属性选择划分

决策树-缺失值和连续值处理及属性划分

决策树-不同的决策树模型对比

决策树-避免过拟合预剪枝和后剪枝对比区别

决策树-算法小结及常见问题

决策树是一种分类器,通过ID3,C4.5和CART等算法可以通过训练数据构建一个决策树。但是,算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类,训练样本中的错误数据也会被决策树学习,成为决策树的部分;但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。

一般来讲,只要决策树充分地生长,就可以将训练样本中的所有个体进行完美的分类,即每个终节点里面个体的因变量取值都是一样的。但是我们都知道,现实世界中的数据总会存在不同程度的噪音,比如数据的错误、偶然以及冗余信息等,如果让模型完美拟合训练数据,实际应用时我们会受到噪音的误导。因为这些噪音并不是真实的规律,将模型应用于验证数据时,模型的精度会出现大幅度的下降,造成过拟合现象。

剪枝(pruning)的目的是为了避免决策树模型的过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning)

后剪枝(post-pruning)

REP(Reduced Error Pruning)方法

PEP(Pessimistic Error Pruning)方法

CCP(Cost-Complexity Pruning)方法

MEP(Minimum Error Pruning)方法

后剪枝方法对比

剪枝算法伪代码参考

预剪枝就是在完全正确分类训练集之前,较早地停止树的生长。 具体在什么时候停止决策树的生长有多种不同的方法:

(1) 一种最为简单的方法就是在决策树到达一定高度的情况下就停止树的生长;

(2) 到达此结点的实例具有相同的特征向量,而不必一定属于同一类, 也可停止生长;

(3) 到达此结点的实例个数小于某一个阈值也可停止树的生长;

(4) 还有一种更为普遍的做法是计算每次扩张对系统性能的增益,如果这个增益值小于某个阈值则不进行扩展;

(5) 先对每个结点在划分前进行估计, 若果当前结点的划分不能带来决策树模型泛华性能的提升 ,则不对当前结点进行划分并且将当前结点标记为叶结点;

预剪枝方法实际上是对决策树停止标准的修改。在原始的ID3算法中,节点的分割一直到节点中的实例属于同一类别时才停止。对于包含较少实例的节点,可能被分割为单一实例节点。为了避免这种情况,我们给出一个停止阈值a。当由一个节点分割导致的最大的不纯度下降小于a时,就把该节点看作是一个叶子节点。

在该方法中,阈值a的选择对决策树具有很大的影响。当阈值a选择过大时,节点在不纯度依然很高时就停止分割了。此时由于生长不足,导致决策树过小,分类的错误率过高。

但是在实际应用中,阈值a的选择存在相当大的主观性,如何精确的给出适当的阈值a以获得适当规模的决策树是十分困难的。

优点&缺点

•由于预剪枝不必生成整棵决策树,且算法相对简单, 效率很高, 适合解决大规模问题。但是尽管这一方法看起来很直接, 但是 怎样精确地估计何时停止树的增长是相当困难的。

•预剪枝有一个缺点, 即视野效果问题 。 也就是说在相同的标准下,也许当前的扩展会造成过度拟合训练数据,但是更进一步的扩展能够满足要求,也有可能准确地拟合训练数据。这将使得算法过早地停止决策树的构造。

后剪枝(post-pruning)

后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点。

后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。

这里主要介绍四种:

Reduced-Error Pruning(REP,错误率降低剪枝)

Pesimistic-Error Pruning(PEP,悲观错误剪枝)

Cost-Complexity Pruning(CCP,代价复杂度剪枝)

Minimum-Error Pruning MEP 最小错误剪枝

REP(Reduced Error Pruning)方法

REP 是一种最简单的剪枝方法, 可用的数据被分成两个样例集合:一个训练集用来形成学习到的决策树,一个分离的验证集用来评估这个决策树在后续数据上的精度,确切地说是用来评估修剪这个决策树的影响。

对于完全决策树中的每一个非叶子节点的子树,我们尝试着把它替换成一个叶子节点,该叶子节点的类别我们用子树所覆盖训练样本中存在最多的那个类来代替,这样就产生了一个简化决策树,然后比较这两个决策树在测试数据集中的表现,如果简化决策树在测试数据集中的错误比较少,那么该子树就可以替换成叶子节点。该算法以 bottom-up 的方式遍历所有的子树,直至没有任何子树可以替换使得测试数据集的表现得以改进时,算法就可以终止。

这个方法的动机是:即使学习器可能会被训练集中的随机错误和巧合规律所误导,但验证集合不大可能表现出同样的随机波动。所以验证集可以用来对过度拟合训练集中的虚假特征提供防护检验。

该剪枝方法考虑将书上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:

1) 将决策树的某个非叶子节点作为剪枝的候选对象,如果将其子孙节点删除(对应的两个叶节点),则处的节点就变成了叶节点。

2) 利用投票原则,将此处叶节点中频数最高的类别用作分类标准(如图中剪枝后该叶节点属于类A)。

3) 利用剪枝后的新树在测试数据集上进行预测,然后对比新树与老树在测试集上的误判样本量,如果新树的误判样本量低于老树的误判样本量,则将处的中间节点替换为叶节点,否则不进行剪枝。

4) 重复前面的三步,直到新的决策树能够最大限度地提高测试数据集上的预测准确率。

因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)。

REP是最简单的后剪枝方法之一,不过由于使用独立的测试集,原始决策树相比,修改后的决策树可能偏向于过度修剪。这是因为一些不会再测试集中出现的很稀少的训练集实例所对应的分枝在剪枝过。如果训练集较小,通常不考虑采用REP算法。

尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。

REP方法剪枝优点:

REP 是当前最简单的事后剪枝方法之一。

它的计算复杂性是线性的。

和原始决策树相比,修剪后的决策树对未来新事例的预测偏差较小。

REP方法剪枝缺点:

但在数据量较少的情况下很少应用。 REP方法趋于过拟合( overfitting) ,这是因为训练数据集中存在的特性在剪枝过程中都被忽略了,当剪枝数据集比训练数据集小得多时 ,这个问题特别值得注意.

PEP(Pessimistic Error Pruning)方法

PEP方法为了克服 REP方法需要独立剪枝数据集的缺点而提出的,它不需要分离的剪枝数据集,并且该方法的剪枝过程恰好与误差降低剪枝法相反,它是自顶向下的剪枝过程。

主要是根据剪枝前后的错误率来判定子树的修剪。该方法引入了统计学上连续修正的概念弥补REP中的缺陷,在评价子树的训练错误公式中添加了一个常数,假定每个叶子结点都自动对实例的某个部分进行错误的分类。

把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代的话,在训练集上的误判率肯定是上升的,但是在新数据上不一定。于是我们需要把子树的误判计算加上一个经验性的惩罚因子。对于一颗叶子节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为:

这样的话,我们可以看到一颗子树虽然具有多个子节点,但由于加上了惩罚因子,所以子树的误判率计算未必占到便宜。剪枝后内部节点变成了叶子节点,其误判个数J也需要加上一个惩罚因子,变成J+0.5。那么子树是否可以被剪枝就取决于剪枝后的错误J+0.5在的标准误差内。对于样本的误差率e,我们可以根据经验把它估计成各种各样的分布模型,比如是二项式分布,比如是正态分布。

那么一棵树错误分类一个样本值为1,正确分类一个样本值为0,该树错误分类的概率(误判率)为e(e为分布的固有属性,可以通过统计出来),那么树的误判次数就是伯努利分布,我们可以估计出该树的误判次数均值和标准差:

把子树替换成叶子节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶子节点的误判次数均值为

使用训练数据,子树总是比替换为一个叶节点后产生的误差小,但是使用校正后有误差计算方法却并非如此,当子树的误判个数大过对应叶节点的误判个数一个标准差之后,就决定剪枝:

这个条件就是剪枝的标准。当然并不一定非要大一个标准差,可以给定任意的置信区间,我们设定一定的显著性因子,就可以估算出误判次数的上下界。

话不多说,上例子:

计算过程补充:

在上述例子中T8种的类1可以认为是识别错误的T4这课子树的估计错误为5,T4子树的最后叶子节点为3个

PEP方法被认为是当前决策树事后剪枝方法中精度较高的算法之一

PEP 方法不需要分离的剪枝数据集, 这对于事例较少的问题非常有利

它的计算时间复杂性也只和未剪枝树的非叶节点数目成线性关系 .

PEP是唯一使用自顶向下剪枝策略的事后剪枝方法, 这种策略会带来与事前剪枝方法出现的同样问题, 那就是树的某个节点会在该节点的子孙根据同样准则不需要剪裁时也会被剪裁。

PEP算法实用的从从上而下的剪枝策略,这种剪枝会导致和预剪枝同样的问题,造成剪枝过度。

PEP剪枝会出现剪枝失败的情况。

CCP(Cost-Complexity Pruning)方法

目前在CART、GBDT等集成树模型中的剪枝方法是后剪枝,重点关注CCP剪枝的流程。

从字面理解,该剪枝方法涉及两则信息,一则是代价,是指将中间节点替换为叶节点后误判率会上升;另一则是复杂度,是指剪枝后叶节点的个数减少,进而使模型的复杂度下降。为了平衡上升的误判率与下降的复杂度,需要加入一个系数α,故可以将代价复杂度剪枝法的目标函数写成:

该算法为子树Tt定义了代价(cost)和复杂度(complexity),以及一个可由用户设置的衡量代价与复杂度之间关系的参数α,其中,代价指在剪枝过程中因子树Tt被叶节点替代而增加的错分样本,复杂度表示剪枝后子树Tt减少的叶结点数,α则表示剪枝后树的复杂度降低程度与代价间的关系。

CCP剪枝算法分为两个步骤:

1.对于完全决策树T的每个非叶结点计算α值,循环剪掉具有最小α值的子树,直到剩下根节点。在该步可得到一系列的剪枝树{T0,T1,T2......Tm},其中T0为原有的完全决策树,Tm为根结点,Ti+1为对Ti进行剪枝的结果;

2.从子树序列中,根据真实的误差估计选择最佳决策树。

(1) 对于一棵充分生长的树,不妨含有4个非叶子节点和5个叶子节点,根据计算a值的公式,可以得到所有非叶子节点对应的a值。

(2) 挑选出最小的a值,不妨为,然后对进行剪枝,使其成为叶子节点,便得到一棵新树。

(3) 接下来重新计算剩余非叶子节点所对应的a值。

(4) 不断重复(2)和(3),直到决策树被剪枝成根节点,最终得到棵新树。

(5) 将测试数据集运用到棵新树中,再从中挑选出误判率最低的树作为最佳的决策树。

上面是一个女孩子们是否愿意相亲见面的一棵决策树,我们如何对这棵决策树进行剪枝呢?

首先我们根据上述的误差增加率公式对每个节点的误差增加率进行计算:

由上述的计算我们可以知道t3​的误差增加率最低,我们就对t3​节点进行剪枝,剪枝完成之后如下图所示:

那么这个时候t3​没有了子叶,自身由节点变成了子叶。我们再继续上述的计算:

所以我们这个时候应该对t1​或者t2​节点进行剪枝:

通过这样的剪枝方法,我们可以将完全生长的决策树进行剪枝,直到不能剪了为止,我们可以在生成决策树之前,留一部分数据进行测试验证,将我们每次剪枝得到的决策树拿去验证,选取效果最好的那颗决策树就可以了。

MEP(Minimum Error Pruning)方法

后剪枝方法对比

如上介绍的三种决策树后剪枝方法都是比较常见的,其思路也比较通俗易懂,对比如下:

对比预剪枝和后剪枝,能够发现,后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险小,泛华性能往往也要优于预剪枝决策树。但后剪枝过程是在构建完全决策树之后进行的,并且要自底向上的对树中的所有非叶结点进行逐一考察,因此其训练时间开销要比未剪枝决策树和预剪枝决策树都大得多。

在sklearn模块并没有提供后剪枝的运算函数或“方法”。这并不意味着sklearn模块中的决策树算法没有实际的落地意义,因为它提供了决策树的预剪枝技术,如果预剪枝不够理想,读者还可以使用集成的随机森林算法,该算法综合了多棵决策树,可以很好地避免单棵决策树过拟合的可能。

剪枝算法伪代码参考

决策树生成伪代码

预剪枝算法伪代码

后剪枝算法伪代码

参考链接:https://zhuanlan.zhihu.com/p/30296061
参考链接:https://wenku.baidu.com/view/cf0501ddfe4733687e21aaa8.html#
参考链接:https://www.cnblogs.com/starfire86/p/5749334.html
参考链接:https://blog.csdn.net/Oscar6280868/article/details/86158170
参考链接:https://www.sohu.com/a/303766502_654419
参考链接:https://blog.csdn.net/am290333566/article/details/81187562
参考链接:https://wenku.baidu.com/view/cf0501ddfe4733687e21aaa8.html#

剪枝 会使得 决策树 的很多分支没有展开,也就是没有继续分类下去,这不仅降低了过 的风险,还显著减少了 决策树 的训练时间开销和测试时间开销。但是另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但是在其基础上进行的后续划分有可能导致性能显著提升。 剪枝 基于’贪心’本质,也就是... 决策树 剪枝 和后 剪枝 决策树 对训练集有很好的分类能力,但是对于未知的测试集未必有好的分类能力,导致模型的泛化能力弱,可能发生过 问题,为了防止过 问题的出现,可以对 决策树 进行 剪枝 剪枝 分为 剪枝 和后 剪枝 剪枝 :就是在构建 决策树 的时候提前停止。比如指定树的深度最大为3,那么训练出来 决策树 的高度就是3, 剪枝 主要是建立某些规则限制 决策树 的生长,降低了过 的风险,降低了建树的时间,但是有可... (一) 剪枝 算法的简介: 剪枝 一般是为了 避免 树的过于复杂,过于 而进行的一个动作, 剪枝 操作是一个全局的操作。(二) 剪枝 剪枝 就是在树的构建过程(只用到训练集),设置一个阈值,使得当在当前分裂节点中分裂前和分裂后的误差超过这个阈值则分列,否则不进行分裂操作。(三)后 剪枝 :(1)后 剪枝 是在用训练集构建好一颗 决策树 后,利用测试集进行的操作。 (2)算法: 基于已有的树切分测试数据: 决策树 生成算法递归地产生 决策树 ,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即容易出现过 现象。解决这个问题的办法是考虑 决策树 的复杂度,对已生成的 决策树 进行简化,下面来探讨以下 决策树 剪枝 算法。 一.什么是过度 数据? 过度 (overfitting)的标准定义:给定一个假设空间H,一个假设h属于H,如果存在其他的假设h'属于H,使得在训练样例上h的错误率比h'小,但在整个实例分布上h'比h的错误率小,那么就说假设h过度 训练数据. overfittingt是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的 ,但是在训练数据外的数据集上却不能很好的 数据.此时我们就叫这个假设出现了overfitting的现象. 二.产生过度 数据问题的原因有哪些? 决策树 python源码实现(含 剪枝 和后 剪枝 )         所用的环境为Ubuntu + python 3.6,在jupyter中运行。本文实现周志华《机器学习》西瓜书中的4.1 ~ 4.3中的 决策树 算法(不含连续值、缺失值处理),对应李航《统计学习方法》的5.1 ~ 5.4节。画图工具参考《机器学习实战... 决策树 剪枝 什么是 决策树 剪枝 ?为什么要 剪枝 剪枝 策略的分类 剪枝 优缺点后 剪枝 剪枝 算法的分类优缺点奥卡姆剃刀定律 告andTODOReference 什么是 决策树 剪枝 ? 对比日常生活中,环卫工人在大街上给生长茂密的树进行枝叶的修剪。在机器学习的 决策树 算法中,有对应的 剪枝 算法。将比较复杂的 决策树 ,化简为较为简单的版本,并且不损失算法的性能。 为什么要 剪枝 剪枝 决策树 算法防止过 的一种手段,...