Прогнозирование вероятностей для GBM с библиотекой вставок

Аналогичный вопрос был задан, однако ссылка в ответе указывает на пример случайного леса , это, кажется, не работает в моем случае.

Вот пример того, что я пытаюсь сделать:

gbmGrid <-  expand.grid(interaction.depth = c(5, 9),
                    n.trees = (1:3)*200,
                    shrinkage = c(0.05, 0.1))

fitControl <- trainControl(
                       method = "cv",
                       number = 3,
                       classProbs = TRUE)

gbmFit <- train(strong~.-Id-PlayerName, data = train[1:10000,],
             method = "gbm",
             trControl = fitControl,
             verbose = TRUE,
             tuneGrid = gbmGrid)
gbmFit

Все идет нормально, я получаю лучшие параметры. Теперь, если я сделаю прогноз:

predictStrong = predict(gbmFit, newdata=train[11000:50000,])

Я получаю двоичный вектор прогнозов, и это хорошо:

[1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ...

Однако, когда я пытаюсь получить вероятности, я получаю сообщение об ошибке:

predictStrong = predict(gbmFit, newdata=train[11000:50000,], type="prob")

Error in `[.data.frame`(out, , obsLevels, drop = FALSE) : 
undefined columns selected

Где, кажется, проблема?

Дополнительная информация:

traceback()
5: stop("undefined columns selected")
4: `[.data.frame`(out, , obsLevels, drop = FALSE)
3: out[, obsLevels, drop = FALSE]
2: predict.train(gbmFit, newdata = train[11000:50000, ], type = "prob")
1: predict(gbmFit, newdata = train[11000:50000, ], type = "prob")

Версии:

R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: x86_64-unknown-linux-gnu (64-bit)

caret version: 6.0-29

РЕДАКТИРОВАТЬ: я видел эту тему, и я не получаю сообщения об ошибке относительно имен переменных, хотя у меня есть несколько имен переменных с символами подчеркивания, которые я предполагаю допустимыми, поскольку я использую make.names и получаю те же имена, что и оригинал.

colnames(train) == make.names(colnames(train))
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

person enedene    schedule 06.06.2014    source источник
comment
Откуда берется набор данных train? Без него этот код не запускается.   -  person MrFlick    schedule 06.06.2014
comment
Вы должны показать результаты str(train$strong). Я подозреваю, что вы выполняете регрессию (а не классификацию), поскольку прогнозируемые значения кажутся числами. Для классификации сделайте strong фактором с уровнями, отличными от 0 и 1.   -  person topepo    schedule 07.06.2014
comment
MrFlick, к сожалению, мне не разрешено делиться данными. @topepo Я не могу проверить до воскресенья, я совершенно уверен, что это фактор с уровнями 0 и 1, но я свяжусь с вами, когда смогу проверить. Конечно, я хочу сделать классификацию, а не регрессию. Спасибо.   -  person enedene    schedule 07.06.2014
comment
Если это фактор, вы должны были увидеть предупреждение при подборе модели о том, что значения уровня фактора могут вызвать ошибки (поскольку они не являются допустимыми именами переменных).   -  person topepo    schedule 08.06.2014
comment
@topepo проблема заключалась в том, что, как вы сказали, уровни были 0 и 1, изменив уровни на сильные и слабые, я получил вероятности, как вы сказали. Спасибо. Пожалуйста, дайте официальный ответ, чтобы я мог отдать вам должное и закрыть вопрос.   -  person enedene    schedule 09.06.2014


Ответы (3)


Когда запрашиваются вероятности классов, train помещает их во фрейм данных со столбцом для каждого класса. Если уровни факторов не являются допустимыми именами переменных, они автоматически изменяются (например, "0" становится "X0"). train в этом случае выдает предупреждение, которое выглядит примерно так: «По крайней мере один из уровней класса не является допустимым именем переменной R. Это может вызвать ошибки, если генерируются вероятности класса».

person topepo    schedule 08.06.2014

Как объяснялось выше, функция сбивается с толку генерируемыми именами переменных.

Если вы запустите:

make.names(levels(traintestClass_subset))

и результат отличается от того, как вы пометили классы в своей переменной результата, чем возникнет эта проблема. Просто убедитесь, что имена, сгенерированные приведенным выше фрагментом кода, совпадают с именами классов, которые вы указали для своего фактора, и это должно работать.

person bibzzzz    schedule 29.10.2015

Это ключ:

Я получаю двоичный вектор прогнозов, и это хорошо:

[1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ...

Ваши метки факторов могут быть интерпретированы как числовые. Я не знаю почему, но если вы измените, например, 0 на «а» и 1 на «б», он будет работать без ошибок.

person Vitaly Gatsko    schedule 21.11.2015