在 ctree (Caret) 中使用 tuneGrid 和控件

Using tuneGrid and Controls in ctree (Caret)

我 运行 在插入符号中使用 tuneGrid 和控件选项时遇到问题。在此示例中,我想设置 mincriterion 和最大深度,但也想指定最小桶大小。当任何选项传递给 ctree_control() 时,似乎会发生此错误。

我收到错误:

在 eval(expr, envir, enclos) 中: Fold1 的模型拟合失败:mincriterion=0.95,maxdepth=7 错误(函数(cl,名称,valueClass): class“numeric”对象的赋值对于class“TreeGrowControl”对象中的@‘maxdepth’无效; is(value, "integer") 不是 TRUE"

这可以通过 运行 复制:

library(caret)
data("GermanCredit")

trainCtrl <- trainControl(method = 'cv', number = 2, sampling = 'down', 
verboseIter = FALSE, allowParallel = FALSE, classProbs = TRUE, 
                      summaryFunction = twoClassSummary)

tune <- expand.grid(.mincriterion = .95, .maxdepth = seq(5, 10, 2))

ctree_fit <- train(Class ~ ., data = GermanCredit, 
method = 'ctree2', trControl = trainCtrl, metric = "Sens", 
tuneGrid = tune, controls = ctree_control(minbucket = 10))

我正在根据此处发布的答案尝试这种方法: Run cforest with controls = cforest_unbiased() using caret package

从错误的外观来看,它与 caret 将最大深度传递给 ctree 的方式有关,但我不确定是否与此有关。 运行 ctree 直接用 ctree_control 工作正常。

非常感谢任何帮助

我觉得这可能是一个错误。如果你使用 as.integer():

就可以让它工作
tune <- expand.grid(.mincriterion = .95, 
                    .maxdepth = as.integer(seq(5, 10, 2)))

原因: 如果您使用 controls 参数,插入符的作用是

theDots$controls@tgctrl@maxdepth <- param$maxdepth
theDots$controls@gtctrl@mincriterion <- param$mincriterion
ctl <- theDots$controls

如果我们看一下 treeControl class 它看起来像这样

Formal class 'TreeControl' [package "party"] with 4 slots
  ..@ varctrl  :Formal class 'VariableControl' [package 
  ..@ tgctrl   :Formal class 'TreeGrowControl' [package "party"] with 4 slots

[left stuff out]

  .. .. ..@ stump         : logi FALSE
  .. .. ..@ maxdepth      : int 0
  .. .. ..@ savesplitstats: logi TRUE
  .. .. ..@ remove_weights: logi FALSE 

所以它期望 maxdepth 是整数并且插入符号尝试分配一个数字(可能是整数但不是 class 整数),但前提是指定了 controls .

如果您不指定 controls,它会指定

ctl <- do.call(getFromNamespace("ctree_control", "party"), 
                                      list(maxdepth = param$maxdepth,
                                           mincriterion = param$mincriterion))

...然后以一种我现在仅通过查看源代码还不能完全理解的方式从那里开始。如果您有兴趣,请查看 https://github.com/topepo/caret/blob/master/models/files/ctree2.R