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 Ridge
ke 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=0
dalam 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
sklearn.linear_model.Ridge
apakah estimasi intersep yang tidak dilakukan (standar) dan denda adalah sedemikian sehingga||Xb - y - intercept||^2 + alpha ||b||^2
diminimalkanb
. Mungkin ada faktor1/2
atau1/n_samples
atau 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:
Jawaban saya tidak ada faktor1N
Berikut adalah dua referensi yang harus menjelaskan hubungan.
Dokumentasi sklearn mengatakan bahwa
linear_model.Ridge
mengoptimalkan fungsi tujuan berikutKertas glmnet mengatakan bahwa jaring elastis mengoptimalkan fungsi tujuan berikut
linear_model.Ridge
sumber
standardize = FALSE
dalamglmnet()
untuk mendapatkan hasil yang identik.linear_model.Ridge
untuk analisis dunia nyata.linear_model.Ridge
model sklearn membakukan fitur secara otomatis. Normalisasi adalah opsional. Saya bertanya-tanya mengapa saya kemudian perlu menonaktifkan standardisasiglmnet()
untuk mendapatkan model untuk menghasilkan hasil yang identik.Jawaban Matthew Drury harus memiliki faktor 1 / N. Lebih tepatnya...
The dokumentasi glmnet menyatakan bahwa jaring elastis meminimalkan fungsi kerugian
The dokumentasi sklearn mengatakan bahwa
linear_model.Ridge
meminimalkan fungsi kerugianyang setara dengan meminimalkan
output glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955
output sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921
sumber