岭回归上重复 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
来解决这个问题?如果图中只显示我为每个 lambda
或 alpha
所做的 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?的主要内容,如果未能解决你的问题,请参考以下文章