3

从partykit绘制ctree模型时,我知道它选择默认值以防止过度拟合过度生长的树木。此默认值有时会导致树过于简单。要使用后修剪技术,我想使用 ctree 制作一个可能完全成熟的过拟合树,然后再进行修剪。尝试许多不同的事情,但我的代码出错了。

这个关于使用所有变量制作树的堆栈溢出答案不是我想要的。我不一定想要所有变量,但我希望一棵树的最大深度尽可能地杂草丛生。

基本上,如何让树尽可能深入?

请参阅下面的代码和输出:

treemodel <- ctree(Species ~ ., iris)
plot(treemodel)

而且我使用包中的帮助 + 文档,但没有看到很多自定义选项。有希望的是控制参数,但文档不是很详细。通过在其他论坛上搜索,我尝试了以下方法:

treemodel <- ctree(Species ~ ., iris, control=mincriterion)

我也试过:

treemodel <- ctree(Species ~ ., iris, control="mincriterion")

但是这两个代码都会引发错误。错误:

if (sum(weights) < ctrl$minsplit) return(partynode(as.integer(id))) 出错:参数长度为零

我在 mac os 上使用partykit 1.1-1 和 r。

4

1 回答 1

3

ctreefrom通过参数partykit接受参数,您可以使用该参数来控制树拟合的各个方面。ctree_controlcontrol

control=mincriterioncontrol="mincriterion"不正确,因此你得到一个错误。control需要一个带有控制参数的列表,而不是一个字符值。

特别是,您要传递到ctree_control以下内容:

  • mincriterion:充当树深度的“调节器”,较小的值会导致较大的树;当 mincriterion 为 0.8 时,p 值必须小于 0.2 才能使节点分裂
  • minsplitand minbucket: 设置为 0,因此 始终满足最小标准,因此拆分永远不会停止

来自包的作者本身:

当标准超过 ctree_control 中指定的 mincriterion 给出的值时,将执行拆分。例如,当 mincriterion = 0.95 时,p 值必须小于 0.05 才能拆分此节点。这种统计方法可确保在没有额外(后)修剪或交叉验证的情况下生长大小合适的树

因此,最终代码使用control=ctree_control()

diab_model <- ctree(diabetes ~ ., diab_train, control = ctree_control(mincriterion=0.005, minsplit=0, minbucket=0))
plot(diab_model)

第一行代码通过覆盖默认值创建决策树,第二行代码绘制ctree对象。你会得到一棵完全成熟的树,深度最大。试验 、 和mincriterionminsplitminbucket。它们也可以被视为超参数。这是输出plot(diab_model)

在此处输入图像描述

于 2018-04-30T09:52:17.877 回答