Я собираюсь использовать оштрафованную модель регрессии из пакета glmnet
в наборе данных панели. Быть панелью означает, что я буду тестировать модель не с перекрестной проверкой, а с прокруткой, поэтому я не буду использовать функцию cv.glmnet
, которая работает только с перекрестной проверкой. Вместо этого я буду использовать функцию по умолчанию glmnet
. Эта функция имеет два параметра, которые необходимо оптимизировать, lambda
и alpha
. lambda
разрешено быть массивом, и если так, модель для каждого элемента в массиве подгоняется, но alpha
должен быть скалярным. Я заинтересован в запуске моделей для различных значений alpha
. До сих пор я делаю это последовательно с a для l oop, как в следующем примере (в этом примере для простоты я использую набор данных 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
), но я столкнулся с двумя проблемами:
Задача 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)
Но решение, полученное с использованием для l oop, отличается от решения, полученного с использованием 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
Так что любая помощь в понимании того, что здесь происходит, или предоставление альтернативного подхода для параллельного запуска этого процесса.