弹性网回归能完美拟合y=x吗?
我有一个简单的数据集,其中有一个自变量 x
和一个因变量 y=x
。使用线性回归可以找到正确的截距,0,以及系数,1。但是,弹性网回归总是给出一个非零的截距,并且通常系数是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 个回答
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]
截距是不会被正则化的。