【问题标题】:Should elastic net regression be able to regress y=x perfectly?弹性净回归应该能够完美地回归 y=x 吗?
【发布时间】:2014-05-09 10:51:31
【问题描述】:

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

【问题讨论】:

    标签: python scikit-learn linear-regression


    【解决方案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]
    

    截距永远不会被正则化。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 2016-08-10
      • 2020-11-13
      • 2020-07-04
      • 2019-05-15
      • 2021-10-03
      • 2015-06-10
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多