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
相关产品推荐
相关产品推荐

