Использование tuneGrid и элементов управления в ctree (Caret)

У меня возникла проблема при использовании параметров tuneGrid и элементов управления в каретке. В этом примере я хотел бы установить минимальный критерий и максимальную глубину, но также хотел бы указать минимальный размер сегмента. Эта ошибка возникает, когда в ctree_control () передаются какие-либо параметры.

Я получаю сообщение об ошибке:

В eval (expr, envir, enclos): не удалось подобрать модель для Fold1: mincriterion = 0.95, maxdepth = 7 Ошибка в (function (cl, name, valueClass): присвоение объекта класса «numeric» недопустимо для @ ' maxdepth 'в объекте класса «TreeGrowControl»; is (значение, «целое число») НЕ ИСТИНА »

Это можно воспроизвести, запустив:

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))

Я пробую этот подход на основе ответа, опубликованного здесь: Запустите cforest с помощью controls = cforest_unbiased (), используя пакет каретки

Судя по виду ошибки, это как-то связано с тем, как каретка передает максимальную глубину в ctree, но я не уверен, есть ли что-то в этом роде. Запуск ctree напрямую с ctree_control работает нормально.

Любая помощь приветствуется


person Davidws    schedule 22.12.2016    source источник


Ответы (1)


Мне это кажется возможной ошибкой. Вы можете заставить его работать, если используете 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, он выглядит так

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 будет целым числом, а курсор пытается назначить число (которое может быть целым числом, но не целым числом класса), но только если указано 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, если вам интересно.

person thie1e    schedule 22.12.2016
comment
Спасибо, что решили это. На самом деле сейчас это кажется немного очевидным - это было прямо там, в ошибке! Я тоже ценю Причину, очень полезную. - person Davidws; 23.12.2016