Перекрестная проверка регрессии лассо в R


10

Функция R cv.glm (library: boot) вычисляет предполагаемую K-кратную ошибку прогнозирования перекрестной проверки для обобщенных линейных моделей и возвращает дельту. Имеет ли смысл использовать эту функцию для регрессии лассо (library: glmnet) и, если да, то как ее можно выполнить? Библиотека glmnet использует перекрестную проверку для получения лучшего параметра поворота, но я не нашел ни одного примера, который бы проверял окончательное уравнение glmnet.


2
Это, безусловно, имеет смысл, и хотя LASSO оптимизирует только по одному (гипер-) параметру, если вы хотите получить наилучшую оценку производительности вне выборки, вам необходим внешний цикл перекрестной проверки. См. Можете ли вы тренироваться, обучая алгоритмы машинного обучения, используя CV / Bootstrap? & цитируемые документы.
Scortchi - Восстановить Монику

Рекомендуется использовать glmnet, а не glm esp. если вы делаете резюме. Насколько я помню, пакет glm становится болезненным в использовании. Кроме того, cv.glmnet предоставляет больше параметров, чем cv.glm.
SMCI

Ответы:


9

Пример того , как сделать ванильный простой кросс-проверки для лассо в glmnetна mtcars наборе данных.

  1. Загрузите набор данных.

  2. Подготовить функции (независимые переменные). Они должны быть matrixклассными. Самый простой способ преобразовать dfсодержащие категориальные переменные в matrixэто через model.matrix. Имейте в виду, по умолчанию glmnetподходит перехват, так что вам лучше убрать перехват из матрицы модели.

  3. Подготовьте ответ (зависимая переменная). Давайте закодируем автомобили с выше среднего mpgкак эффективные ('1'), а остальные как неэффективные ('0'). Преобразуйте эту переменную в фактор.

  4. Запустите перекрестную проверку через cv.glmnet. Он получит параметры по alpha=1умолчанию glmnet, о чем вы просили: регрессия лассо.

  5. Изучив результаты перекрестной проверки, вы можете быть заинтересованы по крайней мере в двух частях информации:

    • лямбда, что минимизирует перекрестную проверку ошибок. glmnetфактически обеспечивает 2 лямбды: lambda.minи lambda.1se. Это ваше суждение как практикующий статистик, который можно использовать.

    • результирующие регуляризованные коэффициенты.

Пожалуйста, смотрите код R согласно приведенным выше инструкциям:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Заключительные комментарии:

  • Обратите внимание, что вывод модели ничего не говорит о статистической значимости коэффициентов, только значения.

  • Штраф l1 (лассо), о котором вы просили, печально известен нестабильностью, о чем свидетельствует этот пост в блоге и этот вопрос по обмену стека . Лучшим способом может быть перекрестная проверка alpha, которая позволит вам выбрать правильное сочетание штрафников l1 и l2.

  • альтернативным способом перекрестной проверки может быть обращение к карету train( ... method='glmnet')

  • и, наконец, лучший способ узнать больше о cv.glmnetего исходных настройках glmnet- это, конечно ?glmnet, консоль R)))


Хороший ответ. .. также стоит запускать CV несколько раз и отклонять кривую ошибок (см.? cv.glmnet), чтобы учесть выборку.
user20650

@SergeyBushmanov ОЧЕНЬ ПОЛЕЗНО!
16:45

Привет, я знаю, что это старый пост, но я хотел задать вам вопрос. Вы упоминаете, что выходные данные модели ничего не говорят о статистической значимости коэффициентов, так как вы определяете, являются ли они значимыми или нет?
Jun Jang

@JunJang «Статистическое значение для коэффициентов не существует» - это утверждение авторов пакета, а не меня. Это утверждение дается, я точно не помню, ни в одной из книг автора пакета, ни в его виньетке. В таком случае вместо того, чтобы говорить о значимых или нет коэффициентах, вы бы предпочли, чтобы они были «полезны» или не объясняли цель посредством перекрестной проверки.
Сергей Бушманов
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.