线性回归中的交叉验证

Posted

技术标签:

【中文标题】线性回归中的交叉验证【英文标题】:Cross Validation in linear regression 【发布时间】:2018-09-06 10:55:41 【问题描述】:

我正在尝试在线性回归中执行交叉验证,为此我正在使用 python sklearn 库。我有一个关于对给定数据集执行交叉验证的适当方式的问题。

让我有点困惑的两个 API 是 cross_val_score() 和任何正则化交叉验证算法,例如 LassoCV()

据我了解,cross_val_score 用于根据交叉验证获得分数。并且,它可以与Lasso() 结合以实现正则化交叉验证分数(例如:here)。

相比之下,LassoCV(),正如it's documentation 所建议的那样,针对给定的调整参数范围(alpha 或 lambda)执行Lasso

现在,我的问题是:

哪种方法更好(cross_val_scoreLasso 或只是 LassoCV)。 什么是执行线性交叉验证的正确方法 回归(或其他算法,例如 Logistic、NN 等)

谢谢。

【问题讨论】:

【参考方案1】:

为了让您更加困惑 - 考虑使用 GridSearchCV,它将进行交叉验证并调整超参数。

演示:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso, Ridge, SGDRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline, FeatureUnion

X_train, X_test, y_train, y_test = \
        train_test_split(X, y, test_size = 0.33)

pipe = Pipeline([
    ('scale', StandardScaler()),
    ('regr', Lasso())
])

param_grid = [
    
        'regr': [Lasso(), Ridge()],
        'regr__alpha': np.logspace(-4, 1, 6),
    ,
    
        'regr': [SGDRegressor()],
        'regr__alpha': np.logspace(-5, 0, 6),
        'regr__max_iter': [500, 1000],
    ,
]

grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2)
grid.fit(X_train, y_train)

predicted = grid.predict(X_test, y_test)

print('Score:\t'.format(grid.score(X_test, y_test)))

【讨论】:

谢谢@MaxU!我知道我们可以将GridSearchCVLassoRidge 一起使用,而不是cross_val_score。那么,我很好奇,有哪些场景/用例,LassoCVRidgeCV 可以派上用场?【参考方案2】:

@PankajK,

在评论中回答您的问题-

当您希望模型消除最不重要的特征时,您可能会发现 Lasso 回归很有用,而 Ridge 不仅专注于拟合数据,而且还使模型权重尽可能小。

您可能想查看 - https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch04.html

【讨论】:

以上是关于线性回归中的交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

具有交叉验证的 Sklearn 线性回归返回 NA 准确度分数

在 Scikit-Learn 中获得线性回归的大交叉验证分数

R 与 scikit-learn 中用于线性回归 R2 的交叉验证

R语言回归模型构建回归模型基本假设(正态性线性独立性方差齐性)回归模型诊断car包诊断回归模型特殊观察样本分析数据变换模型比较特征筛选交叉验证预测变量相对重要度

线性回归和Ridge回归

机器学习:线性模型学习总结:线性回归