决策树为什么要进行剪枝处理和决策树的剪枝策略,以及后剪枝方法——代价复杂度(CCP)算法剪枝系数的计算

决策树的剪枝处理

为什么要进行决策树的剪枝处理呢?

决策树的过拟合的风险很大,因为理论上来说可以将数据完全分的开,如果树足够大,每个叶子节点就剩下了一个数据。那么,这就会造成模型在训练集上的拟合效果很好,但是泛化能力很差,对新样本的适应能力不足。所以,对决策树进行剪枝,可以降低过拟合的风险。

决策树的剪枝策略

决策树的剪枝策略分为预剪枝和后剪枝

  • 预剪枝

预剪枝就是边建立决策时边进行剪枝的操作。在决策树生成的过程中,对每个节点在划分前向首先进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶子节点。

预剪枝可以:限制树的深度,叶子节点个数,叶子节点的样本数,信息增益量等。

  • 后剪枝

当建立完决策树后再进行剪枝操作。后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶子节点进行考察,若将该节点对应的子树替换为叶子节点能够带来决策树泛化性能的提升,将该子树替换为叶子节点。

通过一定的衡量标准。这里讲的是CART算法的后剪枝方法——代价复杂度算法,即CCP算法。

CART算法请参考博文

T T T表示树

C ( T ) C(T) C(T)表示当前损失

T l e a f T_{leaf} Tleaf表示分裂后的叶子节点数

α ≥ 0 \alpha\ge0 α0为参数

C α ( T ) C_\alpha(T) Cα(T)表示损失函数的正则化

α ∣ T l e a f ∣ \alpha|T_{leaf}| αTleaf实际上是损失函数的正则项

下面是代价复杂度算法的基本思想:

C α ( T ) = C ( T ) + α ∣ T l e a f ∣ C_\alpha(T) = C(T)+\alpha|T_{leaf}| Cα(T)=C(T)+αTleaf

C ( T ) C(T) C(T)表示当前损失,实际上就是求分类后叶子节点的经验熵期望,计算方式为当前叶节点的样本数与当前叶结点的熵值的乘积。也就是说,叶子节点含有的样本数越多,那么这个分类效果就越混乱,损失值越大。

熵的计算参考我的博文

C ( T ) = ∑ t = 1 ∣ T l e a f ∣ N t H t ( T ) \begin{aligned}C(T) =\sum_{t=1}^{|T_{leaf}|} N_tH_t(T)\end{aligned} C(T)=t=1TleafNtHt(T)

N t N_t Nt表示该叶结点含有的样本点个数

那么, C α ( T ) = ∑ t = 1 ∣ T l e a f ∣ N t H t ( T ) + α ∣ T l e a f ∣ \begin{aligned}C_\alpha(T) = \sum_{t=1}^{|T_{leaf}|} N_tH_t(T)+\alpha|T_{leaf}|\end{aligned} Cα(T)=t=1TleafNtHt(T)+αTleaf

α ∣ T l e a f ∣ \alpha|T_{leaf}| αTleaf是修正项,它是基于复杂度的考虑。当叶节点分裂后与不分裂的熵值相等,实际上没有进行任何分类,但是我们认为不分类的情况更好,因为,分类后树的复杂度会更高。加了修正项后,如果 α = 0 \alpha=0 α=0表示未剪枝的树损失更小,也就是熵更小,如果 α → ∞ \alpha \to \infty α表示剪枝到根节点更好,因为叶结点的个数占了主导地位。修正项 α ∣ T l e a f ∣ \alpha|T_{leaf}| αTleaf可以避免过拟合。 α \alpha α值的设置可以更好的避免出现完全树和根节点这种极短情况,所以可以避免过拟合。

  • 剪枝系数 α \alpha α的计算

假设当前对以 t t t为根节点的子树 T t T_t Tt剪枝,剪枝后只保留 t t t本身,而删除掉所有的子节点

剪枝后的损失函数为 C α ( t ) = C ( t ) + α C_\alpha(t)=C(t)+\alpha Cα(t)=C(t)+α

剪枝前的损失函数为 C α ( T t ) = C ( T t ) + α ∣ T l e a f ∣ C_\alpha(T_t) = C(T_t)+\alpha|T_{leaf}| Cα(Tt)=C(Tt)+αTleaf

令二者相等可得到 α = C ( t ) − C ( T ) ∣ T l e a f ∣ − 1 \begin{aligned}\alpha = \frac{C(t)-C(T)}{|T_{leaf}|-1}\end{aligned} α=Tleaf1C(t)C(T),因为损失相同,那么就取复杂度小的,所以就可以剪枝。 α \alpha α就是节点 t t t的剪枝系数。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值