Показатель ROC в поезде (), пакет карет - PullRequest
0 голосов
/ 01 июня 2018

df разбивается на кадры данных поезда и теста.фрейм данных поезда разделен на фреймы данных обучения и тестирования.Зависимая переменная Y является двоичной (фактор) со значениями 0 и 1. Я пытаюсь предсказать вероятность с помощью этого кода (нейронные сети, пакет карет):

library(caret)

model_nn <- train(
  Y ~ ., training,
  method = "nnet",
  metric="ROC",
  trControl = trainControl(
    method = "cv", number = 10,
    verboseIter = TRUE,
    classProbs=TRUE
  )
)

model_nn_v2 <- model_nn
nnprediction <- predict(model_nn, testing, type="prob")
cmnn <-confusionMatrix(nnprediction,testing$Y)
print(cmnn) # The confusion matrix is to assess/compare the model

Однако, это дает мнеэта ошибка:

    Error: At least one of the class levels is not a valid R variable name; 
This will cause errors when class probabilities are generated because the
 variables names will be converted to  X0, X1 . Please use factor levels 
that can be used as valid R variable names  (see ?make.names for help).

Я не понимаю, что означает "использовать уровни факторов, которые можно использовать в качестве допустимых имен переменных R".Зависимая переменная Y уже является фактором, но не является допустимым именем переменной R?.

PS: код отлично работает, если вы удалите classProbs=TRUE в trainControl() и metric="ROC" в train().Однако метрика "ROC" является моей метрикой сравнения для лучшей модели в моем случае, поэтому я пытаюсь создать модель с метрикой "ROC".

РЕДАКТИРОВАТЬ : кодпример:

# You have to run all of this BEFORE running the model
classes <- c("a","b","b","c","c")
floats <- c(1.5,2.3,6.4,2.3,12)
dummy <- c(1,0,1,1,0)
chr <- c("1","2","2,","3","4")
Y <- c("1","0","1","1","0")
df <- cbind(classes, floats, dummy, chr, Y)
df <- as.data.frame(df)
df$floats <- as.numeric(df$floats)
df$dummy <- as.numeric(df$dummy)

classes <- c("a","a","a","b","c")
floats <- c(5.5,2.6,7.3,54,2.1)
dummy <- c(0,0,0,1,1)
chr <- c("3","3","3,","2","1")
Y <- c("1","1","1","0","0")
df <- cbind(classes, floats, dummy, chr, Y)
df <- as.data.frame(df)
df$floats <- as.numeric(df$floats)
df$dummy <- as.numeric(df$dummy)

1 Ответ

0 голосов
/ 01 июня 2018

Здесь есть две отдельные проблемы.

Первая - это сообщение об ошибке, которое говорит само за себя: вы должны использовать что-то еще, кроме "0", "1" в качестве значений для вашего зависимого факторапеременная Y.

Вы можете сделать это как минимум двумя способами, после того как вы построили свой фрейм данных df;первый намекает на сообщение об ошибке, т.е. используйте make.names:

df$Y <- make.names(df$Y)
df$Y
# "X1" "X1" "X1" "X0" "X0"

Второй способ - использовать функцию levels, с помощью которой вы будете иметь явный контроль над самими именами;показывая его здесь снова с именами X0 и X1

levels(df$Y) <- c("X0", "X1")
df$Y
# [1] X1 X1 X1 X0 X0
# Levels: X0 X1

После добавления одной из вышеуказанных строк показанный код train() будет работать гладко (заменив training на df), но он все равно не будет генерировать значения ROC, выдав вместо этого предупреждение:

Warning messages:
1: In train.default(x, y, weights = w, ...) :
  The metric "ROC" was not in the result set. Accuracy will be used instead.

, что приводит нас ко второму вопросу: для использования метрики ROC необходимо добавить summaryFunction = twoClassSummary вtrControl аргумент train():

model_nn <- train(
  Y ~ ., df,
  method = "nnet",
  metric="ROC",
  trControl = trainControl(
    method = "cv", number = 10,
    verboseIter = TRUE,
    classProbs=TRUE,
    summaryFunction = twoClassSummary # ADDED
  )
)

Запуск приведенного выше фрагмента с предоставленными вами игрушечными данными все еще дает ошибку (отсутствуют значения ROC), но, вероятно, это связано с очень маленьким набором данныхиспользуется здесь в сочетании с большим количеством сгибов CV, и это не произойдет с вашим собственным полным набором данных (все будет хорошо, если я уменьшу сгибы CV до number=3) ...

...