Как увеличить скорость подсчета / прогнозирования одного наблюдения с помощью нескольких моделей?

Я разрабатываю решение в 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 - это просто обертка для петли. Я ошибаюсь?

Заранее спасибо!

0 ответов

Другие вопросы по тегам