Как увеличить скорость подсчета / прогнозирования одного наблюдения с помощью нескольких моделей?
Я разрабатываю решение в R, которое представляет собой серию логистических регрессий, предсказывающих разные результаты.
Все модели имеют одинаковый набор функций - около 200 функций. Идея состоит в том, чтобы развернуть модели в виде веб-службы, и чтобы эта веб-служба могла вызываться с помощью одного наблюдения и возвращать список баллов, соответствующий списку моделей логистической регрессии, которые я обучил и развернул.
К моему собственному удивлению это на самом деле работает. Вся установка работает и дает результаты, которые я хотел бы... НО результаты возвращаются слишком долго. Для моей фактической установки требуется около 6 секунд, чтобы вернуть 26 баллов, используя 26 разных моделей для одного наблюдения. При оценке того, какие части моего кода выполнялись дольше всего, я обнаружил, что 5,5 секунды тратятся на каждый цикл, который выполняет фактическую оценку.
Мой вопрос: как можно увеличить скорость прогнозирования?
Реализованное мной решение воспроизводится здесь с помощью mtcars и линейной модели:
ylist <- c("mpg", "cyl", "disp", "hp" )
flist <- c("vs", "wt")
tlist <- c(ylist, flist)
subset.mtcars <- mtcars[,tlist]
listofmodels=list()
for (y in ylist) {
form <- as.formula(paste(y,"~", paste(flist, collapse="+")))
mod <- glm(formula = form, data = subset.mtcars)
varname <- paste("Model_", y ,sep ="")
listofmodels[[varname]] <- assign(varname, mod)
}
mypredict <- function( vs, wt) {
newdata <- data.frame(vs = vs, wt = wt)
dfout <- data.frame(matrix(NA, nrow = 0, ncol = 2))
colnames(dfout) <- c("model","score")
for (modelname in names(listofmodels))
{
score <- predict(listofmodels[[modelname]], newdata, type = "response")
dfout[modelname, ] <- c(modelname, score)
}
dfout[order(dfout$score),]
}
mypredict(1, 2.32)
Используя mtcars, кажется, что он работает довольно быстро в коде, который я предоставил выше, но по какой-то причине у меня возникают проблемы с моей установкой. Так как каждый из выполняемых мной вызовов предсказания занимает около 0,2 секунды, а цикл предсказания заставляет последовательно выполняться предсказания, это заставляет мой веб-сервис работать медленно. Что мне не хватает? Есть ли более умный способ векторизации? Насколько я понимаю, lapply - это просто обертка для петли. Я ошибаюсь?
Заранее спасибо!