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

理解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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:52:42