岭回归上重复 k 折的验证(和测试)集的 MSE?

Posted

技术标签:

【中文标题】岭回归上重复 k 折的验证(和测试)集的 MSE?【英文标题】:MSE of the validation (and test) sets from repeated k-Fold on Ridge regression? 【发布时间】:2021-11-24 04:53:33 【问题描述】:

TLDR 可能是this 的问题,但是我们如何使用sklearn 来解决这个问题?如果图中只显示我为每个 lambdaalpha 所做的 CV 的平均值,我就可以了。


大家好,如果我理解正确,我们需要在训练集上进行交叉验证,以选择alpha(如sklearn)进行岭回归。特别是,我想在训练集上执行重复 5 次的 5 倍 CV(所以 25 个 CV)。

想要alphas中的每个alpha做的是:

from numpy import logspace as logs
alphas = logs(-3, 3, 71) # from 10^-3, 10^-2.9, ..., to 10^3

我在完成每个训练集的所有 CV 后获得 25 个(不同的?)验证集上的 MSE,以及测试集上的 MSE,然后从 25 个 MSE 中取平均值以进行绘图或报告。

问题是我不知道该怎么做。这是从我们通常无法观察到的验证集中检索 25 个 MSE 的正确代码吗?

from sklearn.linear_model import RidgeCV, Ridge
from sklearn.model_selection import cross_val_score as CVS

# 5 fold now repeated all 5 times
cvs = RKF(n_splits=5, n_repeats=5, random_state=42)

# each alpha input as al
# the whole data set is generated with different RNG each time
# if you like you may take any existing data sets to explain whether I did wrong
# for each whole data set, the training set is split using the same random state
CVS(Ridge(alpha=al, random_state=42), X_train, Y_train, scoring="neg_mean_squared_error", cv=cvs)

如果不是,我应该使用cross_validate 甚至RidgeCV 来获得我想要的MSE?提前致谢。

【问题讨论】:

【参考方案1】:

您很可能需要使用 GridSearchCV,使用我们有 10 个 alpha 值的示例:

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score, RepeatedKFold
from sklearn.linear_model import RidgeCV,Ridge
from sklearn.model_selection import cross_val_score
from numpy import logspace as logs
from sklearn import datasets

alphas = logs(-3, 3, 71) 

diabetes = datasets.load_diabetes()
X = diabetes.data[:300]
y = diabetes.target[:300]

X_val = diabetes.data[300:]
y_val = diabetes.target[300:]

我们定义了重复的交叉验证,以及要适应的 alpha:

cvs = RepeatedKFold(n_splits=5, n_repeats=5, random_state=42)
parameters = 'alpha':alphas

clf = GridSearchCV(Ridge(), parameters,cv=cvs)
clf.fit(X, y)

因此分数的平均值将存储在clf.cv_results_['mean_test_score'] 下,并且您还可以在字典下获得各个结果。要进行绘图,您可以简单地执行以下操作:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()

ax.bar(np.arange(len(alphas)), height =clf.cv_results_['mean_test_score'],
       yerr=clf.cv_results_['std_test_score'], alpha=0.5,
       error_kw=dict(ecolor='gray', lw=1, capsize=5, capthick=2))

ax.set_xticks(np.arange(len(alphas)))
ax.set_xticklabels(np.round(alphas,3))

这显示了 10 个 alpha 值的分数的平均值和标准误差。

您可以查看this post,了解如何获取预定义验证集的分数。

【讨论】:

以上是关于岭回归上重复 k 折的验证(和测试)集的 MSE?的主要内容,如果未能解决你的问题,请参考以下文章

第五节 算法的分类介绍和数据集的划分

0-4 统计建模划分训练/验证/测试集的几种方法

数据集的划分

spss20.0岭回归怎么看k值?

如何将套索和岭回归拟合(Glmnet)叠加到数据上?

sklearn help之岭回归 ridge regression