剪枝的目的是为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning):
其中{1,2,3,6,7,10,14,15,16,17}为测试集,{4,5,8,9,11,12,13}为训练集。
再回顾一下预剪枝:预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
使用以上数据集,根据信息增益可以构造出一颗未剪枝的决策树(图片来自西瓜书):
具体构造过程如下:
(1)分别计算所有特征的信息增益,据此选出决策树的根节点
由上述计算结果可知:信息增益值:脐部(0.276)=色泽(0.276)>纹理(0.174)=敲声(0.174)>根蒂(0.115)>触感(0)
(2)因为色泽和脐部的信息增益值最大,所以从这两个中随机挑选一个,这里选择脐部来对数据集进行划分,即为决策树的第①个节点;这会产生三个分支,分别是凹陷、稍凹、平坦,对应节点②,节点③,节点④;
而此时是预剪枝。需要判断是否按照“脐部”进行划分,判断标准:看划分前后的泛化性能是否有提升,如果划分后泛化性能有提升,则划分;否则,不划分,具体计算如下:
(4)在对“脐部”进行划分的基础上,再对节点③进行划分,再次使用信息增益挑选出训练集{6,7,5,17}值最大的那个特征为“根蒂”、“敲声”、“触感”(三个的增益值同样最大),随便选一个,选的是根蒂,再对“根蒂”进行划分,即下图所示,此时与(1)步骤相同,分别计算划分前后,对验证集的泛化性能是否有提升,有,划分;否则,越划越差就别划了
看圈出来的部分,可见按照“根蒂”进行划分后,验证集精度不变,所以别划分“根蒂”这个特征了(禁止划分);
(5)对于结点 ④ ,其所含训练样本已属于同一类,所以不再进行划分。
所以基于预剪枝策略生成的最终的决策树为:
预剪枝的优点:
降低过拟合风险和显著减少了训练的时间和测试时间
预剪枝的缺点:
带来了欠拟合风险。因为有些分支的当前划分虽然不能提升泛化性能,但在其基础上进行的后续划分却有可能导致性能显著提高
再回顾一下后剪枝:后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛化性能的提升,则把该子树替换为叶结点。
之前提到,使用(一、数据集)中的数据集,根据信息增益可以构造出一颗未剪枝的决策树(图片来自西瓜书):
后剪枝步骤:
(1)首先考察上图中的结点 ⑥,若将以其为根节点的子树删除(即剪枝),即相当于把结点⑥ 替换为叶结点,替换后的叶结点包括编号为{7,15}的训练样本,把该叶结点标记为“好瓜”(因为这里正负样本数量相等,都为1,所以随便标记一个类别),此时的决策树在验证集上的精度为4/7=57.1%(而未剪枝的决策树为3/7=42.9%),所以对节点⑥决定剪枝
(2)然后考察上图中的节点⑤, 此时:未剪枝前在验证集上的精度为4/7=57.1%(即(1)中剪枝结果的精度),而剪枝之后在验证集上的精度也为4/7=57.1%,所以对节点⑤决定不剪枝
(3)同上,对节点②进行考察,发现剪枝前:4/7=57.1% ,剪枝后:5/7=71.4%,所以对节点②决定剪枝
(4)同上,对节点③进行考察,发现剪枝前:5/7=71.4% ,剪枝后:5/7=71.4%,所以对节点③决定不剪枝
(5)最后,对节点①进行考察,发现剪枝前:5/7=71.4% ,剪枝后(此时和预剪枝中要不要对节点①“脐部”进行划分时的不划分状态的精度一致):3/7=42.9%,所以对节点①决定不剪枝
所以基于后剪枝策略生成的最终的决策树为:
后剪枝优点:
后剪枝比预剪枝保留了更多的分支,欠拟合风险小,泛化性能往往优于预剪枝决策树
后剪枝缺点:
后剪枝训练时间开销大,后剪枝过程是在生成完全决策树之后进行的,需要自底向上对所有非叶结点逐一考察
参考文献
[1]: 周志华 《机器学习》
[2]:决策树(decision tree)(二)——剪枝
[3]:决策树的预剪枝与后剪枝
ubuntu修改默认python之后,安装scrapy相关依赖报E: Sub-process /usr/bin/dpkg returned an error code (1)Ubuntu将默认python改为3.5后安装libssl等依赖库时一直失败且报出某些后缀为py文件Python函数库导入时无此函数,修改至符合Python3后的函数名仍不正常安装,执行apt-get update 后执行a...
最近看了一个小效果,感觉还挺不错,代码实现起来也挺简单,于是就写了些。html: //用来显示逐渐出现的文字宝贝,我好想好想你,想你想的睡不好觉,想你想的吃不下饭,我爱你爱你爱你,么么么么么么么么,啵啵啵啵啵啵啵js:var index = 0;var str = document.getElementById("string").innerHTML;fun
软件下载【软件大小】:4.54G 【软件语言】:简体中文【支持系统】:Win7/Win8/Win10【软件类别】:安装版【更新时间】:2019年6月5日ArcGIS10.2【32/64】位下载地址:www.rjazbs.me/t-449.html安装中有问题可以咨询客服微信:rjazbs软件介绍Arcgis软件是一款GSI专业的电子地图信息编辑和开发软件,它主要应用于GIS访问...
锐捷最详细的基础命令。一、锐捷交换机配置原理我们来看下锐捷的日常配置命令原理。1、进入特权模式Ruijie>enable //进入特权模式2、查看设备flash当前文件列表Ruijie#dir//查看flash当前文件列表3、将配置文件“config.text”删除Ruijie#delete config.text //删除配置文件“config.t...
使用intellij多少有点不习惯如何删除目录:先关闭窗口:会出现:鼠标移到到你像删除的项目上 然后不要点击,一点就进去了只需要按 fn+delete就可以将项目删除。很简单。哥试了好久。
from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport numpy as npplt.rcParams['font.sans-serif']=['STSong']plt.rcParams['axes.unicode_minus']=Falsefig=plt.figure()ax=fig.add_sub...
一分钟速览新闻点周鸿祎回应年会特等奖「免裁券」:编的自黑段子搜狐迟到一次罚款 500,回应:希望员工对工作有激情华为否认将推出消费级台式机:只提供芯片,不做整机微信放开5000人好友上限,但新好友不能看朋友圈谷歌 Project Zero 团队宣布新政策:漏洞披露前将有 90 天缓冲期TikTok宣布禁止"误导性信息":涉及医疗与政治选举三星电子副董事长...
SpringBoot框架下的If-else代码优化1 为什么要去if-else在开发的过程中我们可能会经常遇到if else的逻辑,写很多if else对于一位有情怀的程序员看来是不可以接受的,也影响阅读人的阅读感受,同时程序也违背了对修改关闭扩展开放的原则。在写程序的过程中我们应该尽量保证修改关闭,也就是说自己的写的代码逻辑应不该让别人在扩展逻辑的过程中进行修改,同时保证高的可扩展性。在使...
1、安装sudo apt-get install erlangsudo apt-get install rabbitmq-server2、运行查看运行状态service rabbitmq-server status运行service rabbitmq-server start/stop/restart启用管控台sudo rabbitmq-plugins enable rab...
一、显示display.scroll("Hello, World!")在micro:bit点阵上滚动显示Hello, World!,其中Hello, World!可以替换成任意字符。display.show(Image.HAPPY)在micro:bit点阵上显示笑脸的图形,MicroPython还有很多内置的图片可以显示在显示屏上,例如下面就是一个内置图像的列表:• Image.HEART• Im...
https://blog.csdn.net/qq_39403545/article/details/83903883
温馨提示该商品不是实物,不发快递,而是通过远程进行在线远程安裝服务!通过远程实现电脑维修,系统安装!电脑不能开机也可以修好!远程可解决!如:电脑死机卡顿,系统重装,开机缓慢,系统蓝屏等等!通过远程安装各种办公软件,你要的我们都可以装的哈,远程解决各种软件安装问题!功能齐全,永久使用!拍前必看注意做好备份:在维修过程中会导致盘或者其他盘数据覆盖,无法恢复,买家务必在维修之前做好数据备份,如...