Я изучаю раздел LAB §6.6, посвященный регрессии Риджа / Лассо, в книге Джеймса Виттена «Hastie», Tibshirani (2013) «Введение в статистическое обучение с приложениями в R» .
Более конкретно, я пытаюсь применить модель scikit-learn Ridge
к набору данных 'Hitters' из пакета R 'ISLR'. Я создал такой же набор функций, как показано в коде R. Тем не менее, я не могу приблизиться к результатам glmnet()
модели. Я выбрал один параметр настройки L2 для сравнения. Аргумент «альфа» в scikit-learn.
Python:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
Р:
Обратите внимание, что аргумент alpha=0
в glmnet()
означает, что следует применить штраф L2 (регрессия Риджа). Документация предупреждает, что нельзя вводить одно значение для lambda
, но результат такой же, как в ISL, где используется вектор.
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
Что вызывает различия?
Редактировать:
при использовании penalized()
из штрафного пакета в R, коэффициенты такие же, как с scikit-learn.
ridge.mod2 <- penalized(y,x,lambda2=11498)
Возможно, тогда может возникнуть вопрос: «В чем разница между регрессией Риджа glmnet()
и penalized()
во время нее?
Новая оболочка Python для реального кода на Фортране, используемая в пакете R glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
оценка непересекаемого перехвата (стандартная) и штраф такой, что||Xb - y - intercept||^2 + alpha ||b||^2
минимизируется дляb
. Там могут быть факторы1/2
или1/n_samples
или оба перед штрафом, что сразу же меняет результаты. Чтобы устранить проблему масштабирования штрафа, установите штраф в обоих случаях на 0, устраните все расхождения и проверьте, что делает добавление штрафа. И между прочим, ИМХО, вот правильное место, чтобы задать этот вопрос.