弹性网络回归能否完美地回归y = x?

时间:2014-03-30 00:43:21

标签: python scikit-learn linear-regression

我有一个独立变量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。但这是一个更简单,更令人惊讶的结果。

1 个答案:

答案 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]

拦截永远不会正规化。