Sklearn Lasso Regression 比 Ridge Regression 差几个数量级?

Posted

技术标签:

【中文标题】Sklearn Lasso Regression 比 Ridge Regression 差几个数量级?【英文标题】:Sklearn Lasso Regression is orders of magnitude worse than Ridge Regression? 【发布时间】:2016-06-13 09:22:25 【问题描述】:

我目前使用 sklearn.linear_model 模块实现了 Ridge 和 Lasso 回归。

但是,Lasso 回归在同一数据集上的表现似乎差了 3 个数量级!

我不确定出了什么问题,因为从数学上讲,这不应该发生。这是我的代码:

def ridge_regression(X_train, Y_train, X_test, Y_test, model_alpha):
    clf = linear_model.Ridge(model_alpha)
    clf.fit(X_train, Y_train)
    predictions = clf.predict(X_test)
    loss = np.sum((predictions - Y_test)**2)
    return loss

def lasso_regression(X_train, Y_train, X_test, Y_test, model_alpha):
    clf = linear_model.Lasso(model_alpha)
    clf.fit(X_train, Y_train)
    predictions = clf.predict(X_test)
    loss = np.sum((predictions - Y_test)**2)
    return loss


X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y, test_size=0.1, random_state=0)
for alpha in [0, 0.01, 0.1, 0.5, 1, 2, 5, 10, 100, 1000, 10000]:
    print("Lasso loss for alpha=" + str(alpha) +": " + str(lasso_regression(X_train, Y_train, X_test, Y_test, alpha)))

for alpha in [1, 1.25, 1.5, 1.75, 2, 5, 10, 100, 1000, 10000, 100000, 1000000]:
    print("Ridge loss for alpha=" + str(alpha) +": " + str(ridge_regression(X_train, Y_train, X_test, Y_test, alpha)))

这是我的输出:

Lasso loss for alpha=0: 20575.7121727
Lasso loss for alpha=0.01: 19762.8763969
Lasso loss for alpha=0.1: 17656.9926418
Lasso loss for alpha=0.5: 15699.2014387
Lasso loss for alpha=1: 15619.9772649
Lasso loss for alpha=2: 15490.0433166
Lasso loss for alpha=5: 15328.4303197
Lasso loss for alpha=10: 15328.4303197
Lasso loss for alpha=100: 15328.4303197
Lasso loss for alpha=1000: 15328.4303197
Lasso loss for alpha=10000: 15328.4303197
Ridge loss for alpha=1: 61.6235890425
Ridge loss for alpha=1.25: 61.6360790934
Ridge loss for alpha=1.5: 61.6496312133
Ridge loss for alpha=1.75: 61.6636076713
Ridge loss for alpha=2: 61.6776331539
Ridge loss for alpha=5: 61.8206621527
Ridge loss for alpha=10: 61.9883144732
Ridge loss for alpha=100: 63.9106882674
Ridge loss for alpha=1000: 69.3266510866
Ridge loss for alpha=10000: 82.0056669678
Ridge loss for alpha=100000: 88.4479064159
Ridge loss for alpha=1000000: 91.7235727543

知道为什么吗?

谢谢!

【问题讨论】:

您能否提供数据以使其可重现? 当然,ieor.berkeley.edu/~ieor265/homeworks/winequality-red.csv Y 是最后一列“质量”。 X 是前 11 行。 我像这样生成 X 和 Y:data = np.genfromtxt ('winequality-red.csv', delimiter=";") data = data[1:,:] X = data[:, :-1] Y = data[:, -1:] 我可以肯定地确认我看到的是同样的东西,而且你从弹性网络得到的结果与从套索得到的结果相同,给定相同的 alpha。它很奇怪。我想知道这是否可能是数据的特征?引入 CrossValidated 来帮助解决这个问题可能会很好。 好吧,我现在要继续前进,感谢您的帮助!真的很感激。如果我有时间,我会回过头来尝试找出它为什么不起作用...:/ 【参考方案1】:

有趣的问题。我可以确认这不是算法实现的问题,而是对您输入的正确响应。

这是一个想法:我认为您的描述中的数据没有标准化。这可能会导致不稳定,因为您的特征具有显着不同的数量级和方差。 Lasso 比 ridge 更“全有或全无”(您可能已经注意到它选择的 0 系数比 ridge 多得多),因此不稳定性被放大了。

尝试标准化您的数据,看看您是否更喜欢您的结果。

另一个想法:这可能是伯克利老师有意为之,以突出山脊和套索之间根本不同的行为。

【讨论】:

以上是关于Sklearn Lasso Regression 比 Ridge Regression 差几个数量级?的主要内容,如果未能解决你的问题,请参考以下文章

Linear least squares,Lasso,ridge regression有何本质区别

如何在执行 10 倍交叉验证时在每次拆分时获得 Lasso Regression 中的系数?

当我在 Lasso Regression 中拆分训练集和测试集时,R^2 为负数

机器学习方法:回归:稀疏与正则约束ridge regression,Lasso

sklearn中正则化的Lasso问题

sklearn中正则化的Lasso问题