机器学习(决策树四)——简述 剪枝

随着决策树深度的增大,模型效果会变化,但增大太多就会导致过拟合的情况,对于过拟合,常见的有两咱优化方式:

1 . 剪枝优化
决策树过度拟合一般情况是由于节点太多导致的(也就是树太深,这样可不可以把某些节点给合并一下,合并之后,节点数目不就降下去了吗,降下去之后模型就应该不会存在太过拟合的问题),剪枝优化对决策树的正确率影响是比较大的,也是最常用的一种优化方式。

2 . Random Forest(随机森林,其实是另外一种算法,后续会介绍)
利用训练数据随机产生多个决策树,形成一个森林。然后使用这个森林对数据进行预测,选取最多结果作为预测结果。

剪枝分类

决策树的剪枝是决策树算法中最基本、最有用的一种优化方案,主要分为两大类:

1 . 前置剪枝

在构建决策树的过程中,提前停止(到底什么时候结束,其实这是一个超参,超参不好得到)。结果是决策树一般比较小,实践证明这种策略无法得到比较好的结果。

2 . 后置剪枝

在决策树构建好后,然后再开始裁剪,一般使用两种方式:

  • 用单一叶子节点代替整个子树,叶节点的分类采用子树中最主要的分类;
  • 将一个子树完全替代另外一棵子树。

后置剪枝的主要问题是计算效率问题,存在一定的浪费情况。

剪枝过程

1. 先来看一下后剪枝总体思路(和交叉验证思路类似):

  • 由完全树 T 0 T_0 T0 开始,剪枝部分节点得到 T 1 T_1 T1 ,再次剪枝得到 T 2 T_2 T2 …直到仅剩树根的树 T k T_k Tk
  • 在验证数据集上对这 k+1 个树进行评价,选择最优树 T a T_a Ta (也就是损失函数最小的树)

2. 接下来看一下决策树剪枝的详细过程:

对于给定的决策树 T 0 T_0 T0

  • 计算所有内部非叶子节点的剪枝系数
  • 查找最小剪枝系数(其实就是影响最小)的节点,将其子节点进行删除操作,进行剪枝得到决策树 T k T_k Tk ; 如果存在多个最小剪枝系数节点,选择包含数据项最多的节点进行剪枝操作
  • 重复上述操作,直到产生的剪枝决策树 T k T_k Tk 只有1个节点
  • 得到决策树 T 0 T 1 T 2 . . . . T k T_0 T_1 T_2 ....T_k T0T1T2....Tk
  • 使用验证样本集选择最优子树 T a T_a Ta

使用验证集选择最优子树的标准,可以使用原始损失函数来考虑:
在这里插入图片描述

剪枝损失函数及剪枝系数

原始损失函数:(就是上面那个公式)
在这里插入图片描述
叶节点越多,决策树越复杂,损失越大;修正添加剪枝系数(原始损失函数的基础上,修正一下。不是叶节点越多,不是越复杂吗,损失越大吗,这样引入叶子数leaf,同时乘上一个系数,即α*leaf,作为剪枝系数,以此来进行修正。最终结果越小越好。相当于加正则项的操作),修改后的损失函数为:
在这里插入图片描述
考虑根节点为r的子树,剪枝前后的损失函数分别为loss®和loss®,当这两者相等的时候,可以求得剪枝系数:

在这里插入图片描述
对上面这个式子进行一下推导(例如有下图这样一棵决策树):
在这里插入图片描述
对于根节点为 r r r 的子树,其他部分的损失函数是一样的过程,就不考虑。剪之前:
l o s s r ( R ) = l o s s ( R ) + α R l e a f loss_r(R) =loss(R)+αR_{leaf} lossr(R)=loss(R)+αRleaf
其中 R l e a f R_{leaf} Rleaf r r r 子树的子节点,剪之后, r r r 这棵子树就变成了一个叶子节点
l o s s α ( r ) = l o s s ( r ) + α ∗ 1 = l o s s ( r ) + α loss_α(r)=loss(r)+α*1=loss(r)+α lossα(r)=loss(r)+α1=loss(r)+α
最理想的情况就是剪之后,没什么变化,也就是 l o s s r ( R ) = l o s s α ( r ) loss_r(R)=loss_α(r) lossr(R)=lossα(r),即:
l o s s ( R ) + α R l e a f = l o s s ( r ) + α loss(R)+αR_{leaf} = loss(r)+α loss(R)+αRleaf=loss(r)+α
即得到最终的 α α α
α = l o s s ( r ) − l o s s ( R ) R l e a f − 1 α=\frac{loss(r)−loss(R)}{R_{leaf} −1} α=Rleaf1loss(r)loss(R)
分析这个式子,我们希望的是剪枝前后变化越小越好,即分子越小越好;同时希望剪去的节点越多越好,即分母越大越好。总的结果就是α越小越好。

这里补充一点:
sklearn已经封装好了决策树的实现,其中用到的是前置剪枝(后枝剪枝比较麻烦,每次都得算一下剪枝系数,而且要进行交叉验证,剪枝的过程中形成的k个模型都得验证。综合考量,性能没想象中的好,还耗时间。比较推荐是随机森林)。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
决策树模型是一种常用的分类算法,可以用于鸢尾花分类。剪枝是为了解决过拟合问题而进行的一种策略。在剪枝之前和剪枝之后,我们可以通过交叉验证来评估模型的正确率。 下面是一个示例代码,演示了使用决策树模型对鸢尾花数据集进行分类,并比较了剪枝前后的正确率: ```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) ``` 运行以上代码,可以得到剪枝前和剪枝后的正确率。剪枝后的正确率可能会有所下降,但剪枝可以减少过拟合问题,提高模型的泛化能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值