因此,弹性网应该是岭回归(L2正则化)和套索(L1正则化)之间的混合体。但是,即使l1_ratio为0,我似乎也无法获得与ridge相同的结果。我知道使用梯度下降的山脊和使用弹性下降的弹性网,但是最优值应该相同,不是吗?而且,我发现弹性网通常没有明显的原因抛出ConvergenceWarnings,而套索和山脊则没有。这是一个片段:

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,弹性网的训练和测试得分也接近套索得分(而不是您期望的岭)。而且,弹性网似乎会引发ConvergenceWarning,即使我增加max_iter(甚至达到1000000似乎也没有效果)和tol(0.1仍会引发错误,而0.2则不会)。增加alpha(如警告所示)也无效。

最佳答案

只需阅读文档即可。然后,您会发现这些都没有使用梯度下降,而更重要的是:

Ridge

machine-learning - scikit学习:弹性网接近山脊-LMLPHP

machine-learning - scikit学习:弹性网接近山脊-LMLPHP

Elastic Net

machine-learning - scikit学习:弹性网接近山脊-LMLPHP
machine-learning - scikit学习:弹性网接近山脊-LMLPHP

当替换a=1, p=0时,表明:


除了在Ridge中找不到的损失外,ElasticNet还有一个与样本有关的因素
ElasticNet在l2项中还有一个1/2因子


为什么要选择不同的型号?可能是因为sklearn遵循规范的/原始的R-based implementation glmnet

此外,当我强制执行非混合范数(例如l1 = 0)时,尤其是当存在针对两个非混合优化问题的专用求解器时,我在执行混合范数优化时不会看到数值问题。

幸运的是,sklearn甚至has to say something about it


  当前,除非您提供自己的alpha序列,否则l1_ratio

关于machine-learning - scikit学习:弹性网接近山脊,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47365978/

10-11 08:06