决策树——剪枝处理

剪枝处理

1:剪枝处理的原因

“剪枝”是决策树学习算法对付“过拟合”的主要手段,因此,可通过“剪枝”来一定程度避免因决策分支过多,以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合

2:剪枝的基本策略

预剪枝、后剪枝

3:剪枝后效果如何判断

判断决策树泛化性能是否提升的方法采用留出法,即预留一部分数据用作“验证集”以进行性能评估

4:例子

 5:预剪枝(通过提前停止树的构建而对树剪枝)

(1)预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。

(2)主要方法:

1.当决策树达到预设的高度时就停止决策树的生长

2.达到某个节点的实例具有相同的特征向量,即使这些实例不属 于同一类,也可以停止决策树的生长。

3.定义一个阈值,当达到某个节点的实例个数小于阈值时就可以 停止决策树的生长。

4.通过计算每次扩张对系统性能的增益,决定是否停止决策树的 生长。

(3)例子:

 这个数据集根据信息增益可以构造出一颗未剪枝的决策树:

前面博客讲过用信息增益怎么构造决策树,这边还是用信息增益构造决策树,先来计算出所有特征的信息增益值,通过计算因为色泽和脐部的信息增益值最大,所以从这两个中随机挑选一个,这里选择 脐部来对数据集进行划分,这会产生三个分支,如下图所示:

下面来看看是否要用脐部进行划分, 划分前:所有样本都在根节点,把该结点标记为叶结点,其类别标记为训练集中样本数量最多的类别,因此标记为 好瓜,然后用验证集对其性能评估,可以看出样本{4,5,8}被正确分类,其他被错误分类,因此精度为43.9%。 划分后: 划分后的的决策树为: 

则验证集在这颗决策树上的精度为:5/7 = 71.4% > 42.9%。因此,用  脐部 进行划分。 
        接下来,决策树算法对结点 (2) 进行划分,再次使用信息增益挑选出值最大的那个特征,这里我就不算了,计算方法和上面类似,信息增益值最大的那个特征是“色泽”,则使用“色泽”划分后决策树为: 

但到底该不该划分这个结点,还是要用验证集进行计算,可以看到划分后,精度为:5/7=0.571<0.714,因此,预剪枝策略将禁止划分结点 (2) 。对于结点 (3) 最优的属性为“根蒂”,划分后验证集精度仍为71.4%,因此这个划分不能提升验证集精度,所以预剪枝将禁止结点 (3) 划分。对于结点 (4) ,其所含训练样本已属于同一类,所以不再进行划分。 
        所以基于预剪枝策略生成的最终的决策树为:

(4) 预剪枝的优缺点

优点:降低过拟合风险,显著减少训练时间和测试时间开销。

缺点 :欠拟合风险

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树模型是一种常用的分类算法,可以用于鸢尾花分类。剪枝是为了解决过拟合问题而进行的一种策略。在剪枝之前和剪枝之后,我们可以通过交叉验证来评估模型的正确率。 下面是一个示例代码,演示了使用决策树模型对鸢尾花数据集进行分类,并比较了剪枝前后的正确率: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 构造决策树模型(剪枝前) clf_before_pruning = DecisionTreeClassifier() clf_before_pruning.fit(X_train, y_train) # 预测并计算剪枝前的正确率 y_pred_before_pruning = clf_before_pruning.predict(X_test) accuracy_before_pruning = accuracy_score(y_test, y_pred_before_pruning) # 构造决策树模型(剪枝后) clf_after_pruning = DecisionTreeClassifier(ccp_alpha=0.1) # ccp_alpha为剪枝参数 clf_after_pruning.fit(X_train, y_train) # 预测并计算剪枝后的正确率 y_pred_after_pruning = clf_after_pruning.predict(X_test) accuracy_after_pruning = accuracy_score(y_test, y_pred_after_pruning) print("剪枝前的正确率:", accuracy_before_pruning) print("剪枝后的正确率:", accuracy_after_pruning) ``` 运行以上代码,可以得到剪枝前和剪枝后的正确率。剪枝后的正确率可能会有所下降,但剪枝可以减少过拟合问题,提高模型的泛化能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值