Как распараллелить альфа-канал в функции glmnet (а не cv.glmnet)

Я собираюсь использовать штрафную регрессионную модель из glmnetпакет в наборе данных панели. Наличие панели означает, что я буду тестировать модель не с перекрестной проверкой, а с вращающейся исходной точкой, поэтому я не буду использоватьcv.glmnetфункция, которая работает только с перекрестной проверкой. Вместо этого я буду использовать значение по умолчаниюglmnetфункция. У этой функции есть два параметра, которые необходимо оптимизировать:lambda а также alpha. lambdaможет быть массивом, и если да, то модель для каждого элемента в массиве подбирается, но alphaтребуется быть скаляром. Интересуюсь ходовыми моделями для разныхalphaценности. Пока я делаю это последовательно с помощью цикла for, как в следующем примере (в этом примере я используюBostonHousing набор данных для простоты, хотя это не панельные данные)

# Load libraries
library(glmnet)
library(mlbench)
library(tidyverse)

# Load dataset
data(BostonHousing)

# Split into train / test
x_train = BostonHousing %>% slice(1:400) %>%  select(-c(medv, chas)) %>% as.matrix()
x_test = BostonHousing %>% slice(401:n()) %>% select(-c(medv, chas)) %>% as.matrix()

y_train = BostonHousing %>%  slice(1:400) %>%  select(medv) %>% as.matrix()
y_test = BostonHousing %>%  slice(401:n()) %>%  select(medv) %>% as.matrix()

# Define grid for parameters
lambda_param = 10^seq(-3, 1, by=0.5)
alpha_param = seq(0, 1, 0.1)

# Sequential approach
mse_sequential = matrix(NA,length(lambda_param), length(alpha_param))
for(i in seq_along(alpha_param))
{
  fit_seq = glmnet(x=x_train, y=y_train, family='gaussian', lambda=lambda_param, alpha=alpha_param[i])
  p = predict(fit_seq, newx=x_test)
  mse_sequential[,i] = map_dbl(seq_along(lambda_param), function(j){mean((p[,j]-y_test)^2)})
}

Этот подход работает, но мне кажется крайне неэффективным, и я подумал о его распараллеливании. Я пытался использоватьfurrr пакет (который позволяет параллелизировать purrr functions), но я столкнулся с двумя проблемами:

Проблема 1

Следующий фрагмент кода (предположительно) запускается furrr последовательно:

library(furrr)
plan(sequential)
glmnet_alpha = partial(glmnet, x = x_train, y = y_train, family = "gaussian", weights = rep(1, nrow(x_train)), lambda=lambda_param)
fit = future_map(alpha_param, glmnet_alpha)

Но решение, полученное с помощью цикла for, отличается от решения, полученного с помощью furrr. Например, взглянув на коэффициенты дляlambda=10 а также alpha=0:

fit_seq = glmnet(x=x_train, y=y_train, family='gaussian', lambda=10, alpha=0)
as.vector(fit_seq$beta)
as.vector(fit[[1]]$beta[,1])

Проблема 2

Если я попытаюсь бежать furrr параллельно получаю сообщение об ошибке:

plan(multiprocess)
glmnet_alpha = partial(glmnet, x = x_train, y = y_train, family = "gaussian", weights = rep(1, nrow(x_train)), lambda=lambda_param)
fit = future_map(alpha_param, glmnet_alpha)

Error in drop(y) : objeto 'y_train' no encontrado

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

0 ответов

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