Apa perbedaan antara regresi Ridge menggunakan glmnet R dan scikit-learn Python?

11

Saya akan melalui bagian LAB §6.6 tentang Ridge Regression / Lasso dalam buku 'Pengantar Pembelajaran Statistik dengan Aplikasi dalam R' oleh James, Witten, Hastie, Tibshirani (2013).

Lebih khusus lagi, saya mencoba menerapkan model scikit-learning Ridgeke dataset 'Hitters' dari paket R 'ISLR'. Saya telah membuat set fitur yang sama seperti yang ditunjukkan dalam kode R. Namun, saya tidak bisa mendekati hasil dari glmnet()model. Saya telah memilih satu parameter tuning L2 untuk dibandingkan. (Argumen 'alpha' di 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

R:

Perhatikan bahwa argumen alpha=0dalam glmnet()berarti bahwa hukuman L2 harus diterapkan (regresi Ridge). Dokumentasi memperingatkan untuk tidak memasukkan nilai tunggal untuk lambda, tetapi hasilnya sama seperti di ISL, di mana vektor digunakan.

ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)

Apa yang menyebabkan perbedaan?

Sunting:
Ketika menggunakan penalized()dari paket penalti dalam R, koefisiennya sama dengan scikit-learn.

ridge.mod2 <- penalized(y,x,lambda2=11498)

Mungkin pertanyaannya kemudian bisa juga: 'Apa perbedaan antara glmnet()dan penalized()kapan melakukan regresi Ridge?

Pembungkus python baru untuk kode Fortran aktual yang digunakan dalam paket R glmnet
https://github.com/civisanalytics/python-glmnet

Jordi
sumber
5
Sama sekali tidak terbiasa dengan regresi glmnet ridge. Tetapi secara default, sklearn.linear_model.Ridgeapakah estimasi intersep yang tidak dilakukan (standar) dan denda adalah sedemikian sehingga ||Xb - y - intercept||^2 + alpha ||b||^2diminimalkan b. Mungkin ada faktor 1/2atau 1/n_samplesatau keduanya di depan penalti, membuat hasil berbeda segera. Untuk memfaktorkan masalah penskalaan penalti, atur penalti ke 0 dalam kedua kasus, selesaikan perbedaan apa pun di sana, lalu periksa apa yang menambahkan penambahan penalti. Dan btw IMHO di sini adalah tempat yang tepat untuk menanyakan pertanyaan ini.

Jawaban:

9

Jawaban saya tidak ada faktor 1N


Berikut adalah dua referensi yang harus menjelaskan hubungan.

Dokumentasi sklearn mengatakan bahwa linear_model.Ridgemengoptimalkan fungsi tujuan berikut

|Xβy|22+α|β|22

Kertas glmnet mengatakan bahwa jaring elastis mengoptimalkan fungsi tujuan berikut

|Xβy|22+λ(12(1α)|β|22+α|β|1)

ααλα

α=0λ=2αsklearnlinear_model.Ridge

Matthew Drury
sumber
Dan saya benar-benar merindukan itu dalam komentar @eickenberg juga. Saya harus menggunakan standardize = FALSEdalam glmnet()untuk mendapatkan hasil yang identik.
Jordi
@ Jordan Anda harus terstandarisasi jika menggunakan linear_model.Ridgeuntuk analisis dunia nyata.
Matthew Drury
Saya mengerti bahwa linear_model.Ridgemodel sklearn membakukan fitur secara otomatis. Normalisasi adalah opsional. Saya bertanya-tanya mengapa saya kemudian perlu menonaktifkan standardisasi glmnet()untuk mendapatkan model untuk menghasilkan hasil yang identik.
Jordi
10

Jawaban Matthew Drury harus memiliki faktor 1 / N. Lebih tepatnya...

The dokumentasi glmnet menyatakan bahwa jaring elastis meminimalkan fungsi kerugian

1NXβy22+λ(12(1α)β22+αβ1)

The dokumentasi sklearn mengatakan bahwa linear_model.Ridgememinimalkan fungsi kerugian

Xβy22+αβ22

yang setara dengan meminimalkan

1NXβy22+αNβ22

α=0λ=2Nαsklearn

library(glmnet)
X = matrix(c(1, 1, 2, 3, 4, 2, 6, 5, 2, 5, 5, 3), byrow = TRUE, ncol = 3)
y = c(1, 0, 0, 1)
reg = glmnet(X, y, alpha = 0, lambda = 2 / nrow(X))
coef(reg)

output glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955

import numpy as np
from sklearn.linear_model import Ridge
X = np.array([[1, 1, 2], [3, 4, 2], [6, 5, 2], [5, 5, 3]])
y = np.array([1, 0, 0, 1])
reg = Ridge(alpha = 1, fit_intercept = True, normalize = True)
reg.fit(X, y)
np.hstack((reg.intercept_, reg.coef_))

output sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921

pengunjung
sumber
4
Perbedaan definisi parameter dan penskalaannya yang digunakan di perpustakaan yang berbeda adalah sumber kebingungan yang umum.
AaronDefazio
1
Aku tidak menyangka kalau aku dan Gung salah.
Michael R. Chernick
2
Ya, Anda berdua salah. Alasan Anda menolak edit saya memperjelas bahwa Anda berdua tidak melihat komentar saya "Faktor yang hilang 1 / N" di stats.stackexchange.com/review/suggested-edits/139985
pengunjung
Hasil edit Anda mungkin ditolak karena itu mengubah lebih dari hanya apa yang Anda klaim. Jika Anda ingin mengedit posting saya dan hanya mengubah faktor yang hilang, silakan lakukan, tetapi mengubah tautan dan kata-kata saya dan kode juga berlebihan. Komentar tentang perlakuan tidak adil Anda dalam jawaban Anda tidak pantas, dan tidak terkait dengan konten pertanyaan, harap hapus mereka. Kata-kata Anda juga menjabarkan jawaban saya, ini bukan cara yang tepat untuk menanggapi hasil edit yang ditolak. Kami akan senang memberikan kontribusi Anda yang berharga kepada komunitas kami, tetapi tolong jadikan diri Anda norma-norma kami sebelum mengeluarkan kami.
Matthew Drury
1
1N