R'nin glmnet'ini kullanan Ridge regresyonu ile Python'un scikit-learn'u arasındaki farklar nelerdir?


11

James, Witten, Hastie, Tibshirani (2013) tarafından 'R'de Uygulamalarla İstatistiksel Öğrenmeye Giriş' kitabında Ridge Regresyon / Kement ile ilgili LAB bölümü §6.6'dan geçiyorum .

Daha spesifik olarak, scikit-öğrenim Ridgemodelini R paketinden 'ISLR' 'Hitters' veri kümesine uygulamaya çalışıyorum . R kodunda gösterildiği gibi aynı özellik kümesini oluşturdum. Ancak, glmnet()modelden elde edilen sonuçlara yaklaşamıyorum . Karşılaştırmak için bir L2 ayar parametresi seçtim. (scikit-learn'da 'alfa' argümanı).

Python:

regr = Ridge(alpha=11498)
regr.fit(X, y)

http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb

R:

Not argüman alpha=0olarak glmnet()L2 ceza uygulanmalıdır aracı (Ridge regresyon). Dokümantasyon için tek bir değer girmemesi konusunda uyarır lambda, ancak sonuç bir vektörün kullanıldığı ISL ile aynıdır.

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

Farklılıklara ne sebep olur?

Düzenleme: R'deki ceza paketinden
kullanırken penalized(), katsayılar scikit-learn ile aynıdır.

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

Belki de soru şu olabilir: ' Ridge regresyonu arasındaki glmnet()ve penalized()ne zaman arasındaki fark nedir ?

R paketinde kullanılan gerçek Fortran kodu için yeni python sarmalayıcısı glmnet
https://github.com/civisanalytics/python-glmnet


5
Glmnet sırt regresyonuna tamamen aşina değilim. Ancak varsayılan olarak, sklearn.linear_model.Ridgebelirlenmemiş kesişme tahmini (standart) yapar ve cezası ||Xb - y - intercept||^2 + alpha ||b||^2en aza indirgenir b. Sonuçları hemen farklı kılan, cezanın önünde faktörler 1/2veya 1/n_samplesher ikisi olabilir . Ceza ölçeklendirme sorununu hesaba katmak için, her iki durumda da cezayı 0 olarak ayarlayın, oradaki tutarsızlıkları giderin ve ardından cezanın ne kadar geri eklendiğini kontrol edin. Ve btw IMHO burada bu soruyu sormak için doğru yer.

Yanıtlar:


9

Cevabımda faktörü eksik , lütfen doğru karşılaştırma için @visitors yanıtına bakın.1N


İşte ilişkiyi açıklığa kavuşturması gereken iki referans.

Sklearn dokümantasyonulinear_model.Ridge , aşağıdaki objektif fonksiyonu optimize ettiğini söylüyor

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

Glmnet kağıdı elastik ağın aşağıdaki objektif fonksiyonu optimize ettiğini söylüyor

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

İki uygulamanın alfa'yı tamamen farklı şekillerde kullandığına dikkat edin , sklearn genel regülasyon seviyesi için kullanırken glmnet bu amaç için kullanır , sırt ve kement düzenleme arasında ticaret için ayırır . ααλα

Formüller karşılaştırıldığında, içindeki ve ayarının çözümü kurtarması gibi görünüyor .α=0λ=2αsklearnlinear_model.Ridge


Ve @eickenberg'in yorumunda bunu tamamen kaçırdım. Ben kullanmak zorunda standardize = FALSEiçinde glmnet()özdeş sonuçlar almak.
Jordi

@ Jordi linear_model.RidgeHerhangi bir gerçek dünya analizi için kullanıyorsanız kesinlikle standartlaştırmalısınız .
Matthew Drury

Sklearn linear_model.Ridgemodelinin özellikleri otomatik olarak standardize ettiğini anlıyorum . Normalleştirme isteğe bağlıdır. glmnet()Modellerin aynı sonuçları vermesini sağlamak için neden standardizasyonu devre dışı bırakmam gerektiğini merak ediyorum .
Jordi

10

Matthew Drury'nin cevabı 1 / N faktörüne sahip olmalıdır. Daha kesin...

Glmnet dokümantasyon elastik net zarar fonksiyonunu minimize olduğu durumlar

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

Sklearn belgelerine diyor linear_model.Ridgeküçültün kayıp fonksiyonunu

Xβy22+αβ22

en aza indirmeye eşdeğer

1NXβy22+αNβ22

Aynı çözümü glmnet ve sklearn'den elde etmek için her iki kayıp fonksiyonunun da eşit olması gerekir. Bu, glmnet'te ve ayarı anlamına gelir.α=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)

glmnet çıkışı: –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_))

sklearn çıkışı: –0.03862178, –0.0399697, –0.07276535, 0.42727921


4
Parametrelerin farklı tanımları ve farklı kütüphanelerde kullanılan ölçeklendirmeleri ortak bir karışıklık kaynağıdır.
AaronDefazio

1
Hem Gung hem de ben bunu yanlış anlarsınız.
Michael R.Chernick 30'17

2
Evet, ikiniz de yanlış anladınız. Benim düzenlemeyi reddetme sebebini ikinizlede stats.stackexchange.com/review/suggested-edits/139985 de "1 / N faktörü eksik" yorumumu görmediğini temizlemek yapmak
ziyaretçi

Düzenlemeniz büyük olasılıkla reddedildiğinden, yalnızca iddia ettiğinizden çok daha fazla değişti. Gönderiyi düzenlemek ve sadece eksik faktörü değiştirmek istiyorsanız, lütfen yapın, ancak bağlantılarımı, ifadelerimi ve kodumu da değiştirmek aşırıya kaçıyor. Cevabınızdaki haksız muameleniz hakkındaki yorumlar uygun değildir ve sorunun içeriğiyle ilgisi yoktur, lütfen bunları kaldırın. İfadeleriniz de cevabımı verdi, bu reddedilen bir düzenlemeye cevap vermenin doğru yolu değil. Topluluğumuza yaptığınız değerli katkıları çok isteriz, ancak bizi tahliye etmeden önce lütfen normlarımıza uygun davranın.
Matthew Drury

1
@visitor Biraz rahatsız edersem özür dilerim. Gerçekten, siteye iyi bir potansiyel katkıda bulunduğunuzu belirtmeye çalışıyorum ve iyi bir deneyim yaşamanızı istiyorum. Tıpkı diğer gruplarda olduğu gibi bazı sosyal normlarımız var ve bunlardan haberdar olursanız daha iyi bir deneyim yaşayacaksınız. Hala "Matthew Drury'nin cevabı yanlış" olduğunu düşünüyorum, cevabımın yanlışlıkla faktörünü kaçırdığını bildirmenin daha iyi yolları var . "X'in yanıtı yanlış" kişisel saldırı olarak okuyor. 1N
Matthew Drury
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.