2017-11-18 5 views
0

弾性ネットは、リッジ回帰(L2正則化)とラッソ(L1正則化)のハイブリッドであると考えられています。しかし、たとえl1_ratioが0であっても、私は尾根と同じ結果を得ていないようです。私は勾配降下を使用して尾根を知っており、弾性ネットは座標降下を使用していますが、最適は同じでなければなりませんか?さらに、私はelasticnetがコンバーゼンスウォーニングを投げつけることはしばしばあります。なぜなら、ローソとリッジはそうではありません。ここでは、スニペットです:scikit learn:弾性ネット接近隆起

from sklearn.datasets import load_boston 
from sklearn.utils import shuffle 
from sklearn.linear_model import ElasticNet, Ridge, Lasso 
from sklearn.model_selection import train_test_split 

data = load_boston() 
X, y = shuffle(data.data, data.target, random_state=42) 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=43) 
alpha = 1 

en = ElasticNet(alpha=alpha, l1_ratio=0) 
en.fit(X_train, y_train) 
print('en train score: ', en.score(X_train, y_train)) 

rr = Ridge(alpha=alpha) 
rr.fit(X_train, y_train) 
print('rr train score: ', rr.score(X_train, y_train)) 

lr = Lasso(alpha=alpha) 
lr.fit(X_train, y_train) 
print('lr train score: ', lr.score(X_train, y_train)) 
print('---') 
print('en test score: ', en.score(X_test, y_test)) 
print('rr test score: ', rr.score(X_test, y_test)) 
print('lr test score: ', lr.score(X_test, y_test)) 
print('---') 
print('en coef: ', en.coef_) 
print('rr coef: ', rr.coef_) 
print('lr coef: ', lr.coef_) 

l1_ratioは(あなたが期待するようしていない尾根)弾性ネットの電車やテストのスコアは投げ縄のスコアに近い、0であっても。さらに、弾性ネットは、max_iter(最大1000000までは効果がないように見える)とtol(0.1はまだエラーをスローしますが、0.2は増加しません)を増やしても、ConvergenceWarningをスローするようです。アルファの増加(警告が示唆しているように)も効果がありません。

答えて

1

ドキュメントを読んでください。そして、あなたはこれらのどれもが、勾配降下を使用していない、より重要であることがわかります:

Ridge

enter image description here

enter image description here

Elastic Net

enter image description here enter image description here

a=1, p=0を置換するとき、示し

、その:

  • ElasticNetリッジには見出されない損失の上にもう一つのサンプルに依存する係数を有する
  • ElasticNet L2期における1つの以上の1/2係数を有する

なぜ異なるモデルですか?おそらくsklearnが標準/オリジナルR-based implementation glmnetに従っているからです。

さらに、混合ノルムの最適化を行うときに数値問題を見るのは驚きではありませんが、l1 = 0のような非混合ノルムを強制しています。特に、非混合最適化問題。

幸いにも、sklearnでもhas to say something about it:あなたはアルファの独自のシーケンスを供給しない限り、

は現在、< l1_ratio = 0.01は、信頼できるものではありません。

+0

あなたのポストは、l1_ratio = 0のとき、リッジと同じ最適化問題に一致するように、弾性ネットαをn_samplesで除算する必要があることを意味します。これは確かに事実であり、その場合弾性ネットとリッジは同じ係数につながります。 しかし、弾性ネットのConvergenceWarningはまだあります。私は理由を見ません:係数は尾根と同じです(したがって彼らは収束しました)、尾根はこの警告を出さない。あなたはまた、独自のアルファシーケンス(?)を指定しない限り、l1_ratio <= 0.01は信頼できないと述べました。 – wouterdobbels

+0

そして私は自分自身のアルファを供給しました(ElasticnetCVを使用しない場合は1つしか渡すことができません)が、l1_ratio = 0で意図した通りに動作しないようです。ElasticnetCVのドキュメントから、 [.1、.5、.7 ,.9、.95、.99、1]、明確に回避するl1_ratio = 0 ... – wouterdobbels

+0

異なるオプティマイザ、異なる前提、異なる数値問題。 '' 'll_ratio = 0'''を使うことは特別なオプティマイザでカバーされます(最適化の問題はもっと簡単です)、elasticnetを使うのは本当にお勧めできません。 – sascha

関連する問題