我有一个独立变量x
和一个因变量y=x
的玩具数据集。线性回归可以找到正确的截距,0和系数,但是弹性网总是给出非零截距,通常是系数0.我知道它是正则化的,所以它想要更小的系数。但这是预期的结果吗? Python / Scikit-learn下面的代码。
#!/usr/bin/env python
import numpy as np
from sklearn.linear_model import ElasticNet, LinearRegression
X = np.zeros((10, 1))
X[:, 0] = np.random.random(10)
y = X[:, 0]
lr = LinearRegression().fit(X, y)
print "LR: ", lr.intercept_, lr.coef_
for l1_ratio in [0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99]:
enet = ElasticNet(l1_ratio=l1_ratio).fit(X, y)
print "ENet", l1_ratio, ":", enet.intercept_, enet.coef_
编辑:我之前曾问过回归y = x ^ 2。但这是一个更简单,更令人惊讶的结果。
答案 0 :(得分:1)
是的,这是正规化模型的预期结果。如果将alpha
(正则化权重)设置为较低的值(例如.01
),您将看到允许系数增长,从而导致拦截缩小:
In [12]: for l1_ratio in [0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99]:
enet = ElasticNet(l1_ratio=l1_ratio, alpha=.01).fit(X, y)
print "ENet", l1_ratio, ":", enet.intercept_, enet.coef_
....:
ENet 0.01 : 0.061675959472 [ 0.86445434]
ENet 0.05 : 0.0620121787424 [ 0.86371543]
ENet 0.25 : 0.0637498016326 [ 0.85989664]
ENet 0.5 : 0.066063739564 [ 0.85481129]
ENet 0.75 : 0.0685519831348 [ 0.84934286]
ENet 0.95 : 0.0706817244743 [ 0.84466231]
ENet 0.99 : 0.0711236518251 [ 0.84369108]
拦截永远不会正规化。