извлечь прогнозируемые значения из каретных моделей машинного обучения в R - PullRequest
0 голосов
/ 08 октября 2019

Я новичок в stackoverflow, поэтому заранее извиняюсь за любые ошибки, которые я совершаю.

Я использую различные модели машинного обучения в R, используя caret package- Логистическая регрессия, SVM, дерево решений, усиленное дерево, нейронная сеть и K-ближайшие соседи .

Я использую каретку, так как реализация всех этих моделей - это просто вопрос изменения названия метода.

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

Я исследовал и смог найти следующий код:

results<-extractPrediction(models, testX = NULL, testY = NULL, unkX = NULL, unkOnly = !is.null(unkX) & is.null(testX), verbose = FALSE)

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

Во-первых, код выдавал ошибку, если не был выполнен следующим образом, но давайте оставим это на мгновение.

results<-extractPrediction(models)

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

Во-вторых, модели, передаваемые в функцию, содержат только обучающий набор, а не тестовый набор. Мне нужно вывести прогнозируемые значения как для тренировочного, так и для тестового набора, объединенного и в правильном порядке для сравнения.

Возможно ли то, что я пытаюсь сделать, или я просто снимаю для звезд ??

Я также привожу пример моделей, которые я использую для справки:

Внедрение линейного SVM в набор данных

    cl <- parallel::makeCluster(detectCores(logical=TRUE), type='PSOCK')
    doParallel::registerDoParallel(cl)

   start.time <- Sys.time()
   trnControl <- trainControl(method='cv',number=5, allowParallel = T,verboseIter = T) 

   set.seed(11)
   ds1lnrsvm <- train(shortflag~., data=trnds1,method="svmLinear",
                   trControl=trnControl)
   ds1lnrsvm_t<- Sys.time() - start.time

   parallel::stopCluster(cl)
   registerDoSEQ()


## Implementing Linear SVM model on test dataset
   ds1lnrsvmres <- predict(object=ds1lnrsvm, newdata=testds1) 

## confusion matrix to check performance
   confusionMatrix(data=ds1lnrsvmres, reference=testds1$shortflag,positive="1")

Будем весьма благодарны за любую помощь или предложения относительно того, как этого добиться.

Заранее благодарим за ваши предложения.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

только исходя из того, что вы уже описали, все должно быть возможно в caret.

Мой подход к этой проблеме заключается в использовании функции lappy для списка всех типов моделей, которые вы хотите оценить. Хорошая вещь в этом заключается в том, что когда вы закончите, все train объекты будут аккуратно сгруппированы вместе, что вы можете назвать, а затем легко извлечь любую информацию, которую вы ищете.

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

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

Так, например:

# set model names
models <- c("plr", "svmLinear", "rpart", "ada", "nnet", "knn")  

# set train control params
trnControl <- trainControl(method='cv',number=5, allowParallel = T,verboseIter = T) 

# fit models
set.seed(11)

train_models <- lapply(models, function(model){ 
    print(model)
    train(shortflag ~ ., method = model, data = trnds1, trControl = trnControl) 
}) 

# name the models in your list
names(train_models) <- models

С этим у вас есть хороший список. Если вы сделаете View(train_models), вы можете просмотреть и развернуть все различные списки и посмотреть, что вы можете извлечь из них. Так, например, вы можете сделать что-то вроде этого, чтобы получить точность обучения, которая возвращает именованный список, чтобы вы знали, что к чему:

# extract training accuracy
elapsed <- sapply(train_models, function(object) 
    object$results["Accuracy"])

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

# extract test accuracy
test_accuracy = sapply(train_models, function(x){
    pred = predict(x, newdata = testds1)
    cm = confusionMatrix(pred, reference = testds1$shortflag)
    return(cm[["overall"]]["Accuracy"])

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

Надеюсь, это поможет!

0 голосов
/ 08 октября 2019

Я не могу воспроизвести вашу проблему без trnds1 / testds1,, но, возможно, ниже вы захотите.

library(dplyr)

pred <- extractPrediction(list(NAME = ds1lnrsvm),   # extractPrediction want list(model)
                          testX = select(testds1, -shortflag),
                          testY = pull(testds1, shortflag))

trnds1 %>%                  # train data 
  bind_rows(testds1) %>%    # bind_rows with testdata
  bind_cols(pred) # %>%     # add cols of predict
  # select(-shortflag) # shortflg is the same as obs, if you want please delete the col.
...