2016-12-22 1 views
1

Я столкнулся с проблемой при использовании параметров tuneGrid и элементов управления в карете. В этом примере я хотел бы установить mincriterion и max depth, но также хотел бы указать размер минимального ведра. Эта ошибка возникает, когда любые параметры передаются в ctree_control().Использование tuneGrid и элементов управления в ctree (Caret)

я получаю ошибку:

В Eval (выражение, ENVIR, Enclos): модель подходит не удалось для Fold1: mincriterion = 0,95, maxdepth = 7 ошибок в (функции (кл, имя, valueClass): присвоение объекта класса «numeric» недействительно для «maxdepth» в объекте класса «TreeGrowControl»; is (значение, «целое») не 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

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

Любая помощь очень ценится

ответ

1

Это выглядит как возможной ошибке для меня. Вы можете заставить его работать, если вы используете as.integer():

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

Причина: Если вы используете controls аргумент, что каретка делает

[email protected]@maxdepth <- param$maxdepth 
[email protected]@mincriterion <- param$mincriterion 
ctl <- theDots$controls 

Если мы посмотрим на treeControl класса это выглядит это

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

[left stuff out] 

    .. .. [email protected] stump   : logi FALSE 
    .. .. [email protected] maxdepth  : int 0 
    .. .. [email protected] savesplitstats: logi TRUE 
    .. .. [email protected] remove_weights: logi FALSE 

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

+0

Спасибо, что решил. На самом деле кажется немного очевидным сейчас - это было прямо в ошибке! Я также ценю Разум, очень полезный. – Davidws