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

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

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

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

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

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

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

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


        决策树是一种分类器,通过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 PruningMEP最小错误剪枝

 

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)将测试数据集运用到棵新树中,再从中挑选出误判率最低的树作为最佳的决策树。

示例1:

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

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

由上述的计算我们可以知道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
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树是一种常用的机器学习算法,用于分类和回归任务。剪枝和后剪枝决策树中用于防止过拟合的技术。 1. 决策树剪枝决策树剪枝是在构建决策树的过程中,在每个节点进行划分之前,通过一些条件来判断是否进行划分。常见的剪枝条件有以下几种: - 最大深度限制:限制决策树的最大深度,防止过拟合。 - 叶子节点样本数限制:限制叶子节点的最小样本数,防止过拟合。 - 信息增益阈值:限制信息增益的最小值,当信息增益小于阈值时停止划分。 以下是一个决策树剪枝的示例代码: ```python from sklearn.tree import DecisionTreeClassifier # 创建决策树分类器对象 clf = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10, min_impurity_decrease=0.01) # 使用训练数据拟合分类器模型 clf.fit(X_train, y_train) # 使用测试数据进行测 y_pred = clf.predict(X_test) ``` 2. 决策树剪枝决策树剪枝是在构建完整的决策树之后,通过剪枝操作来减小决策树的复杂度,防止过拟合。常见的后剪枝方法有以下几种: - 代价复杂度剪枝:通过引入一个参数来平衡模型的复杂度和准确性,选择代价最小的子树作为最终的决策树。 - 错误率剪枝:通过计算剪枝前后的错误率,选择错误率最小的子树作为最终的决策树。 以下是一个决策树剪枝的示例代码: ```python from sklearn.tree import DecisionTreeClassifier from sklearn.tree import export_text # 创建决策树分类器对象 clf = DecisionTreeClassifier() # 使用训练数据拟合分类器模型 clf.fit(X_train, y_train) # 导出决策树的文本表示 tree_rules = export_text(clf, feature_names=feature_names) # 打印决策树的文本表示 print(tree_rules) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值