使用ctree

时间:2018-04-30 09:46:01

标签: r party ctree

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

使用all variables to make the tree的堆栈溢出答案不是我想要的。我不一定想要所有变量,但我希望树的最大深度尽可能地过度生长。

基本上,如何让树尽可能多的深度?

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

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

我使用了包中的帮助+文档,但没有看到很多选项来自定义它。有前途的是控制参数,但文档并不十分详细。通过在其他论坛上搜索,我尝试了以下内容:

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

我也尝试过:

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

但是这两个代码都会抛出错误。错误:

  

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

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

1 个答案:

答案 0 :(得分:3)

来自ctree

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

执行control=mincriterioncontrol="mincriterion"不正确,因此您收到错误消息。 control期望列表包含控制参数,而不是字符值。

特别是,您想要传递以下ctree_control

  • mincriterion:充当树的深度的“调节器”, 值越小,树木越大;当mincriterion为0.8时, p值必须小于0.2才能使节点分裂
  • minsplitminbucket:设置为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)

的输出

enter image description here