如何用ctree构建带最大深度的过拟合树以进行后剪枝?
嘿,我懂你遇到的问题了——默认的ctree参数总是小心翼翼防止过拟合,但有时候我们就是需要先让树“疯长”起来,再手动给它“剪枝塑形”对吧?我之前也折腾过这个,给你分享个靠谱的方案:
第一步:构建完全生长的ctree
要让ctree彻底放开限制、长成一棵可能过拟合的全量树,核心是调整ctree_control()里的关键参数,把所有阻止分裂的规则都关掉:
mincriterion = 0:默认是0.95(对应95%置信度的显著性检验),设为0就意味着不管分裂是否显著,都允许进行,彻底取消分裂的统计学限制minbucket = 1:每个叶子节点最少保留1个样本,不让样本量限制树的分裂maxdepth = Inf:不限制树的最大深度,让树能一直分裂到每个叶子只有单个样本(如果数据支持的话)
给你个可直接运行的示例(用经典的iris数据集):
library(partykit) # 构建完全生长的ctree full_grown_tree <- ctree(Species ~ ., data = iris, control = ctree_control( mincriterion = 0, minbucket = 1, maxdepth = Inf, testtype = "MonteCarlo", # 当mincriterion=0时该参数无实际作用,但不影响运行 nresample = 1 )) # 查看全生长树的结构(可能会非常详细) print(full_grown_tree) plot(full_grown_tree)
第二步:对全生长树进行后剪枝
partykit自带了专门的剪枝工具,我们可以用成本复杂度剪枝,或者基于AIC/BIC选择最优树结构:
- 先生成剪枝路径,查看不同剪枝程度下的树性能
- 选择你想要的剪枝参数(比如AIC最小的节点,或者你认为合适的树规模)
- 用
prune()函数得到剪枝后的树
示例代码如下:
# 生成成本复杂度剪枝路径 ccp_prune_path <- ctree_prune(full_grown_tree, FUN = "cost_complexity") # 查看不同剪枝参数对应的树大小、误差等指标 print(ccp_prune_path) # 比如选择AIC最小的剪枝结果 best_prune_idx <- which.min(ccp_prune_path$criterion) pruned_tree <- prune(full_grown_tree, ccp = ccp_prune_path$ccp[best_prune_idx]) # 查看剪枝后的树 print(pruned_tree) plot(pruned_tree)
额外提醒几个坑
- 确保你用的是
partykit包,而不是旧版的party包,两者的控制参数逻辑有差异 - 如果你的数据集很大,全生长的树可能会占用大量内存,这时候可以适当把
minbucket设为2或更大值,不用非得卡1 - 除了成本复杂度,也可以直接基于信息准则剪枝,比如把
ctree_prune()里的FUN设为"AIC"或"BIC"
内容的提问来源于stack exchange,提问作者jardim
相关产品推荐
相关产品推荐

