Как получить коэффициенты эластичной сетки?

#r #r-caret

#r #r-каретка

Вопрос:

Я использую пакет каретки для обучения модели эластичной сети в моем dataset modDat. Я использую подход поиска по сетке в сочетании с повторной перекрестной проверкой для выбора оптимальных значений параметров лямбда и дроби, требуемых функцией эластичной сетки. Мой код показан ниже.

 library(caret)
library(elasticnet)

grid <- expand.grid(
      lambda   = seq(0.5, 0.7, by=0.1),
      fraction = seq(0, 1, by=0.1)
    )

ctrl <- trainControl(
      method     = 'repeatedcv',
      number     = 5,  #folds
      repeats    = 10, #repeats
      classProbs = FALSE
    )

set.seed(1)
enetTune <- train(
          y ~ .,
          data = modDat,
          method = 'enet',
          metric = 'RMSE',
          tuneGrid = grid,
          verbose = FALSE,
          trControl = ctrl
        )
 

Я могу получать прогнозы, используя y_hat <- predict(enetTune, modDat) , но я не могу просмотреть коэффициенты, лежащие в основе прогнозов.

Я пробовал coef(enetTune$finalModel) , но единственное, что возвращается, это NULL. Я подозреваю, что мне нужно предоставить coef() функции больше информации, но не уверен, как это сделать.

Кроме того, я хотел бы создать прямоугольную диаграмму из 50 наборов коэффициентов (10 повторений по 5 раз), связанных с оптимальными параметрами лямбда и фракции.

Ответ №1:

Чтобы просмотреть коэффициенты, используйте predict :

 predict(enetTune$finalModel, type = "coefficients")
 

См ?predict.enet . Для получения дополнительной информации о том, как получить конкретные коэффициенты.

Комментарии:

1. Похоже, что я получаю коэффициенты для многих значений лямбда, которые я не нахожу интуитивно понятными. Кроме того, значения лямбда не ограничены значениями, указанными в объекте grid.

Ответ №2:

Следуя ответу @Weihuang Wong, вы можете получить коэффициенты из окончательной модели, используя следующий код:

 predict.enet(enetTune$finalModel, s=enetTune$bestTune[1, "fraction"], type="coef", mode="fraction")$coefficients
 

Ответ №3:

Для меня лучше всего работает stats::predict , как и ответ @Weihuang Wong. Однако, как указал OP в комментарии, это предоставляет список коэффициентов для каждого проверенного значения лямбда.

Здесь важно понимать, что при использовании вы predict намерены точно предсказать значение параметров, а не извлекать их. Затем вы должны знать об этом и изучить доступные варианты.

В этом случае вы могли бы использовать ту же функцию с аргументом s для параметра штрафа lambda . Помните, что вы все еще прогнозируете, но на этот раз вы получите коэффициенты, которые ищете.

 stats::predict(enetTune$finalModel, type = "coefficients", s = enetTune$bestTune$lambda)