弾性ネットは、リッジ回帰(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をスローするようです。アルファの増加(警告が示唆しているように)も効果がありません。
あなたのポストは、l1_ratio = 0のとき、リッジと同じ最適化問題に一致するように、弾性ネットαをn_samplesで除算する必要があることを意味します。これは確かに事実であり、その場合弾性ネットとリッジは同じ係数につながります。 しかし、弾性ネットのConvergenceWarningはまだあります。私は理由を見ません:係数は尾根と同じです(したがって彼らは収束しました)、尾根はこの警告を出さない。あなたはまた、独自のアルファシーケンス(?)を指定しない限り、l1_ratio <= 0.01は信頼できないと述べました。 – wouterdobbels
そして私は自分自身のアルファを供給しました(ElasticnetCVを使用しない場合は1つしか渡すことができません)が、l1_ratio = 0で意図した通りに動作しないようです。ElasticnetCVのドキュメントから、 [.1、.5、.7 ,.9、.95、.99、1]、明確に回避するl1_ratio = 0 ... – wouterdobbels
異なるオプティマイザ、異なる前提、異なる数値問題。 '' 'll_ratio = 0'''を使うことは特別なオプティマイザでカバーされます(最適化の問題はもっと簡単です)、elasticnetを使うのは本当にお勧めできません。 – sascha