You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scikit-Learn中交叉验证如何实现?其参数寻优机制是怎样的?

交叉验证调参及测试集验证逻辑

你看到的Scikit-Learn示意图中的“finding parameter”环节属于带超参数优化的交叉验证流程,完整逻辑如下:

1. 基础拆分规则

首先会将全量数据集按比例拆分为「训练集」和「独立测试集」,独立测试集全程不参与训练、调参环节,仅用于最终的泛化性能评估,避免数据泄露。

2. 超参数搜索逻辑

我们需要调优的是超参数(比如Lasso回归的正则系数alpha、决策树的最大深度等,这类参数需要提前人工指定,不会在模型训练过程中自动学习更新),具体流程为:

  • 预先定义超参数的搜索空间,比如Lasso的alpha候选值可设定为[0.01, 0.1, 1, 10]
  • 对第一步拆分得到的训练集做k折拆分,每一组候选超参数都会在该k折数据集上跑完完整的交叉验证:以3折为例,每组超参数都会训练3次,每次取2折做训练、1折做验证,最终取3次验证误差的平均值作为该组超参数的性能评分
  • 遍历完所有候选超参数后,选择平均验证误差最低的那一组,即为最优超参数

3. 测试集验证逻辑

得到最优超参数后,用完整的训练集(即做k折拆分的全部训练数据,不是拆分后的某一折)重新训练一个最终模型,再用这个模型在最开始预留的独立测试集上做预测,得到的评分就是模型的最终泛化性能。

疑问澄清

你提到的每折训练得到的不同模型系数(比如Lasso的betas)是同一超参数下、不同训练拆分得到的临时模型参数,仅用于计算该组超参数的验证误差,不会保留到最终环节。

代码示例(Scikit-Learn)

from sklearn.linear_model import Lasso
from sklearn.model_selection import GridSearchCV, train_test_split

# 全量数据集拆分出独立测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义Lasso的超参数搜索空间
param_grid = {'alpha': [0.01, 0.1, 1, 10]}

# 初始化网格搜索,指定3折交叉验证
lasso = Lasso()
grid_search = GridSearchCV(estimator=lasso, param_grid=param_grid, cv=3, scoring='neg_mean_squared_error')

# 自动搜索最优超参数
grid_search.fit(X_train, y_train)

# 输出最优超参数
print("最优超参数:", grid_search.best_params_)

# 最终模型在独立测试集上评估
final_model = grid_search.best_estimator_
test_r2_score = final_model.score(X_test, y_test)
print("测试集R2得分:", test_r2_score)

内容的提问来源于stack exchange,提问作者dsbr__0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:15:02