Среднее прогнозируемое значение в каретном резюме - PullRequest
1 голос
/ 17 апреля 2020

Я хотел бы получить среднее прогнозируемое значение по CV-повторениям с использованием каретки в R.

require("caret")
data("iris")
fitControl <- trainControl(method = "repeatedcv",   
                             number = 10,
                             repeats = 10, savePredictions = 'final')
model.cv <- train(Sepal.Length ~ Sepal.Width,
                    data = iris,
                    method = "lm", 
                    trControl = fitControl)

head(model.cv$pred)
#  intercept     pred obs rowIndex     Resample
#1      TRUE 5.809386 4.7        3 Fold01.Rep01
#2      TRUE 5.838487 4.6        4 Fold01.Rep01
#3      TRUE 5.460174 5.7       16 Fold01.Rep01
#4      TRUE 5.634780 5.7       19 Fold01.Rep01
#5      TRUE 5.722083 5.2       28 Fold01.Rep01
#6      TRUE 6.071295 4.5       42 Fold01.Rep01

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

mean(model.cv$pred[model.cv$pred$rowIndex==1, "pred"])
#[1] 5.745675

РЕДАКТИРОВАТЬ

После ответа @ Obim, Я проверил сроки трех предложенных решений. Версия dplyr намного быстрее. Обратите внимание, что я немного изменил версию sapply, добавив сортировку к уникальному rowINdex, чтобы его выходные данные были согласованными и интерпретируемыми.

library("plyr")
library("dplyr")
library("tictoc")

tic("plyr")
for(i in 1:100) meansplyr = ddply(model.cv$pred, ~rowIndex, summarise, mean = mean(pred))
toc()
#plyr: 5.56 sec elapsed

tic("dplyr")
for(i in 1:100) meansdplyr = model.cv$pred %>% group_by(rowIndex) %>% summarise(pred = mean(pred))
toc()
#dplyr: 0.08 sec elapsed

tic("sapply")
for(i in 1:100) {
  meanssapply = sapply(
  X = sort(unique(model.cv$pred$rowIndex)), # added sort to keep the output consistent
  FUN = function(x){mean(model.cv$pred$pred[model.cv$pred$rowIndex %in% x])}
  )
}
toc()
#sapply: 0.73 sec elapsed

# the outputs are exactly the same
sum(abs(meansplyr$mean - meansdplyr$pred))
#[1] 0

sum(abs(meansplyr$mean - meanssapply))
#[1] 0

1 Ответ

1 голос
/ 17 апреля 2020

Один вкладыш с ddply:

library(plyr)
ddply(model.cv$pred, ~rowIndex, summarise, mean = mean(pred))

Или с dplyr:

library(dplyr)
model.cv$pred %>% 
  group_by(rowIndex) %>% 
  summarise(pred = mean(pred))

Другой способ с sapply (хотя и по-прежнему повторяется для каждого rowIndex). Как указал @ DataD'Oh, входные данные должны быть отсортированы для интерпретации выходных данных:

sapply(
  X = sort(unique(model.cv$pred$rowIndex)), 
  FUN = function(x){mean(model.cv$pred$pred[model.cv$pred$rowIndex %in% x])}
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...