基于sklearn的岭回归重复k折交叉验证MSE获取方法咨询
你给出的代码可以正确获取每个alpha对应的25次交叉验证的验证集负MSE,只要提前导入RepeatedKFold并简写为RKF,对返回结果取负就能得到MSE,求平均即为该alpha对应的平均验证集MSE。
完整实现步骤
1. 依赖导入与基础数据拆分
注意测试集需要在最开始就和训练集完全拆分,不能参与交叉验证过程,避免数据泄露:
import numpy as np from numpy import logspace as logs from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score, RepeatedKFold, train_test_split from sklearn.metrics import mean_squared_error from matplotlib import pyplot as plt # 示例数据集,可替换为自己的X、y from sklearn.datasets import fetch_california_housing data = fetch_california_housing() X, y = data.data, data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义alpha列表和交叉验证策略 alphas = logs(-3, 3, 71) cvs = RepeatedKFold(n_splits=5, n_repeats=5, random_state=42)
2. 批量计算每个alpha对应的MSE
# 存储结果 val_mse_mean = [] test_mse = [] for al in alphas: # 获取25次验证集的负MSE,转成正的MSE neg_mse = cross_val_score(Ridge(alpha=al, random_state=42), X_train, y_train, scoring="neg_mean_squared_error", cv=cvs) current_val_mse = -neg_mse val_mse_mean.append(current_val_mse.mean()) # 获取对应alpha在测试集的MSE:用整个训练集拟合模型再预测 model = Ridge(alpha=al, random_state=42).fit(X_train, y_train) y_pred = model.predict(X_test) test_mse.append(mean_squared_error(y_test, y_pred))
3. 结果可视化
plt.figure(figsize=(10,6)) plt.plot(alphas, val_mse_mean, label='5*5折交叉验证平均验证集MSE', marker='o', markersize=3) plt.plot(alphas, test_mse, label='测试集MSE', marker='s', markersize=3) plt.xscale('log') plt.xlabel('alpha (log尺度)') plt.ylabel('MSE') plt.legend() plt.grid(True, alpha=0.3) plt.show()
cross_validate和RidgeCV的选择说明
- 如果你只需要验证集的MSE,当前使用的
cross_val_score已经足够,无需替换为cross_validate;如果需要同时获取训练集得分、拟合时间等额外信息,再选择cross_validate即可。 - 如果你不需要保留每次交叉验证的原始25个MSE值,只需要每个alpha的平均验证集得分,也可以用
RidgeCV实现,代码更简洁:
from sklearn.linear_model import RidgeCV ridge_cv = RidgeCV(alphas=alphas, cv=cvs, scoring="neg_mean_squared_error", store_cv_values=True) ridge_cv.fit(X_train, y_train) # 每个alpha对应的交叉验证MSE存储在ridge_cv.cv_values_中,直接取平均即可
内容的提问来源于stack exchange,提问作者Yuki.F
相关产品推荐
相关产品推荐

