目录
代码部分参考决策树python源码实现(含预剪枝和后剪枝)_王路ylu的博客-优快云博客_构建决策树代码
一、决策树剪枝策略
1.1剪枝目的
决策树过拟合(数据在训练集上表现的很好,在测试集上表现的不好)风险很大,理论上可以完全分的开数据(想象一下,如果树足够庞大,每个叶子节点就一个数据)
“剪枝”是决策树学习算法对付“过拟合”的主要手段
可以通过“剪枝”来一定程度避免因决策分支过多,以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合
1.2剪枝策略
预剪枝:边建立决策树边进行剪枝的操作(更实用)
后剪枝:当建立完决策树后进行剪枝操作
1.3判断决策树泛化性能是否提升的方法
留出法:预留出一部分数据用作“验证集”以进行性能评估
二、预剪枝 (prepruning)
2.1概述
决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点记为叶结点,其类别标记为该结点对应训练样例数最多的类别。
策略:
- 限制深度(例如数据集有十个特征,限制树的深度为3,即只能用其中三个特征创建树)
- 叶子结点个数(最多只能有五个叶子结点)
- 叶子结点样本数(一个叶子结点最少得有20个样本)
- 信息增益
这样说可能还是有点难理解预剪枝怎么做,用西瓜书中的例子简单说明一下
根据信息增益(具体计算过程在机器学习——创建决策树_装进了牛奶箱中的博客-优快云博客 )我们可以得到一棵未剪枝的树:
(1)首先,我们先判断“脐部”,如果我们不对“脐部”进行划分,也就是说这棵决策树是这样的:
这样下来,也就是说无论你什么瓜过来我都判断它是好瓜。使用验证集进行验证,验证的精准度为:
如果进行划分(其中红色字体的表示验证集中被划分正确的编号):
如果只划分脐部这个属性,,我们可以通过其来划分好瓜和坏瓜,通过验证机去测试,我们可以得到划分后的精确度为: ,71.4%>42.9%所以选择划分
(2)再看“脐部=凹陷“这个分支
如果不划分,验证集精度为71.4%
如果划分(其中红色字体的表示验证集中被划分正确的编号),验证集中编号为{4,8,11,12}的样例被划分正确:
划分后的精确度为 ,57.1%<71.4%所以选择取消划分
(3)对每个结点进行剪枝判断,结点2,3都禁止划分,结点4本身为叶子结点。最终得到仅有一层划分的“决策树桩”
2.2预剪枝优缺点
优点:降低过拟合风险,显著减少训练时间和测试时间开销。
缺点:欠拟合风险:有些分支的当前划分虽然不能提神泛化性能,但在其基础上进行的后续划分却有可能显著提高性能。预剪枝基于“贪心”本质禁止这些分支展开,带来了欠拟合分险。
2.3代码实现
以福建省选调生报考条件和上述判断西瓜好坏为例,选调生数据集如下: