Ошибка с каретой и summaryFunction mnLogLoss: столбцы, соответствующие 'lev' - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь использовать потерю логов в качестве функции потерь для тренировок с Карет, используя данные из конкурса отбора Коби Брайанта из Kaggle.

Это мой сценарий:

library(caret)
data <- read.csv("./data.csv")

data$shot_made_flag <- factor(data$shot_made_flag)
data$team_id <- NULL
data$team_name <- NULL

train_data_kaggle <- data[!is.na(data$shot_made_flag),]
test_data_kaggle <- data[is.na(data$shot_made_flag),]

inTrain <- createDataPartition(y=train_data_kaggle$shot_made_flag,p=.8,list=FALSE)
train <- train_data_kaggle[inTrain,]
test <- train_data_kaggle[-inTrain,]

folds <- createFolds(train$shot_made_flag, k = 10)

ctrl <- trainControl(method = "repeatedcv", index = folds, repeats = 3, summaryFunction = mnLogLoss)
res <- train(shot_made_flag~., data = train, method = "gbm", preProc = c("zv", "center", "scale"), trControl = ctrl, metric = "logLoss", verbose = FALSE)

И это обратная связь об ошибке:

7: stop("'data' should have columns consistent with 'lev'")
6: ctrl$summaryFunction(testOutput, lev, method)
5: evalSummaryFunction(y, wts = weights, ctrl = trControl, lev = classLevels, 
       metric = metric, method = method)
4: train.default(x, y, weights = w, ...)
3: train(x, y, weights = w, ...)
2: train.formula(shot_made_flag ~ ., data = train, method = "gbm", 
       preProc = c("zv", "center", "scale"), trControl = ctrl, metric = "logLoss", 
       verbose = FALSE)
1: train(shot_made_flag ~ ., data = train, method = "gbm", preProc = c("zv", 
       "center", "scale"), trControl = ctrl, metric = "logLoss", 
       verbose = FALSE)

Когда я использую defaultFunction в качестве summaryFunction, и не указано metri c, указанное в train, это работает, но это не с mnLogLoss. Я предполагаю, что это ожидает данные в другом формате, чем то, что я передаю, но я не могу найти, где ошибка.

1 Ответ

1 голос
/ 10 января 2020

Из файла справки для defaultSummary:

Чтобы использовать twoClassSummary и / или mnLogLoss, аргумент classProbs элемента trainControl должен иметь значение TRUE. multiClassSummary можно использовать без вероятностей классов, но некоторые статистические данные (например, общие потери в журнале и среднее значение для каждого класса по кривым RO C) не будут в наборе результатов.

Следовательно, Я думаю, вам нужно изменить trainControl() на следующее:

ctrl <- trainControl(method = "repeatedcv", index = folds, repeats = 3, summaryFunction = mnLogLoss, classProbs = TRUE)

Если вы сделаете это и запустите свой код, вы получите следующую ошибку:

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

Вам просто нужно чтобы изменить уровни 0/1 shot_made_flag на то, что может быть допустимым именем переменной R:

data$shot_made_flag <- ifelse(data$shot_made_flag == 0, "miss", "made")

С этими изменениями ваш код будет выглядеть так:

library(caret)
data <- read.csv("./data.csv") 

data$shot_made_flag <- ifelse(data$shot_made_flag == 0, "miss", "made")
data$shot_made_flag <- factor(data$shot_made_flag)
data$team_id <- NULL
data$team_name <- NULL

train_data_kaggle <- data[!is.na(data$shot_made_flag),]
test_data_kaggle <- data[is.na(data$shot_made_flag),]

inTrain <- createDataPartition(y=train_data_kaggle$shot_made_flag,p=.8,list=FALSE)
train <- train_data_kaggle[inTrain,]
test <- train_data_kaggle[-inTrain,]

folds <- createFolds(train$shot_made_flag, k = 3)

ctrl <- trainControl(method = "repeatedcv", classProbs = TRUE, index = folds, repeats = 3, summaryFunction = mnLogLoss)
res <- train(shot_made_flag~., data = train, method = "gbm", preProc = c("zv", "center", "scale"), trControl = ctrl, metric = "logLoss", verbose = FALSE)
...