Я изучаю раздел 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, устраните все расхождения и проверьте, что делает добавление штрафа. И между прочим, ИМХО, вот правильное место, чтобы задать этот вопрос.Ответы:
В моем ответе отсутствует коэффициент , см. Ответ @visitors ниже для правильного сравнения.1N
Вот две ссылки, которые должны прояснить отношения.
Документация sklearn говорит, что
linear_model.Ridge
оптимизирует следующую целевую функциюБумага glmnet говорит, что эластичная сеть оптимизирует следующую целевую функцию
Обратите внимание, что две реализации используют совершенно по-разному, sklearn использует для общего уровня регуляризации, в то время как glmnet использует для этой цели, резервируя для торговли между риджем и лассо-регуляризацией.α α λ α
Сравнивая формулы, похоже, что установка и в glmnet должна восстановить решение .α = 0 λ = 2 αsklearn
linear_model.Ridge
источник
standardize = FALSE
в ,glmnet()
чтобы получить одинаковые результаты.linear_model.Ridge
для анализа реального мира.linear_model.Ridge
модель sklearn стандартизирует функции автоматически. Нормализация не обязательна. Я удивляюсь, почему мне нужно деактивировать стандартизацию,glmnet()
чтобы модели давали идентичные результаты.Ответ Мэтью Друри должен иметь коэффициент 1 / N. Точнее...
В документации glmnet говорится, что эластичная сеть минимизирует функцию потерь
Документация Sklearn говорит, что
linear_model.Ridge
минимизирует функцию потерьчто эквивалентно минимизации
Чтобы получить одно и то же решение от glmnet и sklearn, обе их функции потерь должны быть равны. Это означает установку и в glmnet.α = 0 λ=2Nαsklearn
Выход glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955
выход склеарна: –0,03862178, –0,0399697, –0,07276535, 0,42727921
источник