理解scikit-learn GridSearchCV:参数调优与训练验证测试原理实现
详解scikit-learn中GridSearchCV的训练-验证-测试流程实现
咱们一步一步拆解GridSearchCV是怎么严格遵循训练-验证-测试原则的,结合实际代码会更清楚:
第一步:拆分数据集,隔离预留测试集
首先要把原始数据集分成两部分:75%用于后续的参数调优(训练+交叉验证),剩下25%作为完全隔离的预留测试集——这部分数据从始至终不会参与参数选择,只用来最后评估模型的真实泛化能力。
代码示例:
from sklearn.model_selection import train_test_split # 假设dataset是你的原始数据集 X_train_val, X_test, y_train_val, y_test = train_test_split( dataset.data, dataset.target, test_size=0.25, random_state=42 )
第二步:定义待搜索的参数网格
接下来要明确你想调优的参数以及对应的候选值,GridSearchCV会遍历所有参数组合来找出最优解。
代码示例(以SVM模型为例):
param_grid = { 'C': [0.1, 1, 10], # 正则化参数 'gamma': [1, 0.1, 0.01], # RBF核的带宽参数 'kernel': ['linear', 'rbf'] # 核函数类型 }
第三步:用交叉验证完成参数调优
这一步是GridSearchCV的核心:它会把前面得到的75%调优集(X_train_val, y_train_val)自动拆分成5折交叉验证子集(你也可以通过cv参数指定其他折数)。
对于每一组参数组合,它会执行5轮训练+验证:
- 每轮用**4折数据(也就是75%×4/5=60%的原始数据)**训练模型
- 用剩下的**1折数据(75%×1/5=15%的原始数据)**验证模型性能
- 取5轮验证分数的平均值,作为该参数组合的最终交叉验证得分
代码示例:
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV # 初始化基础模型 svc = SVC() # 初始化GridSearchCV:指定模型、参数网格、5折交叉验证、评估指标 grid_search = GridSearchCV( estimator=svc, param_grid=param_grid, cv=5, scoring='accuracy' ) # 拟合调优集,开始参数搜索 grid_search.fit(X_train_val, y_train_val)
GridSearchCV会自动对比所有参数组合的交叉验证得分,选出得分最高的那组参数作为最优参数,你可以通过grid_search.best_params_查看。
第四步:用最优参数训练最终模型并评估
参数调优完成后,GridSearchCV会自动用全部75%的调优集和最优参数重新训练一个完整模型(可以通过grid_search.best_estimator_获取)。这时候,终于可以用之前隔离的25%预留测试集来评估模型的真实泛化能力了:
代码示例:
# 获取用最优参数训练好的最终模型 best_model = grid_search.best_estimator_ # 用预留测试集评估模型 test_accuracy = best_model.score(X_test, y_test) print(f"预留测试集上的模型准确率: {test_accuracy:.2f}")
核心原则总结
- 绝对不能让预留测试集参与参数调优,否则会导致模型“记住”测试集数据,泛化能力被高估
- 交叉验证是在调优集内部进行的,目的是公平对比不同参数的性能,避免单一次划分带来的偶然性
- 最终模型要用全量调优数据训练,预留测试集只做最终的、无偏的泛化能力评估
内容的提问来源于stack exchange,提问作者Ziqi
相关产品推荐
相关产品推荐

