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

网格搜索调参后为何需测试集评估?能否用全数据集对比模型?

问题解答

1. 为什么网格搜索找到最优参数后仍需要测试集评估?

网格搜索的交叉验证是在训练集内部完成的拆分,选出来的最优参数是针对训练集数据优化后的结果——说白了,这个参数已经“适配”了训练集的特性。如果直接拿训练集交叉验证的分数当最终性能,会高估模型的泛化能力,因为参数是在训练集的验证子集上反复试出来的,本质上已经对训练数据有了过拟合倾向。

测试集是完全独立于训练流程、模型从未接触过的数据,用它评估出来的分数,才是模型在真实未知数据上的真实泛化性能,这才是我们真正要关注的指标。所以这个最终分数绝非无关紧要,它是验证调参是否真的提升了模型实际能力的关键,能避免参数选择带来的过拟合陷阱。

2. 能不能用全数据集交叉验证找参数,再用全数据集交叉验证对比性能?

绝对不行,这会造成严重的数据泄露:

  • 第一步用全数据集交叉验证选参数时,所有数据都参与了参数优化,参数已经“记住”了全量数据的特征;
  • 第二步再用全数据集交叉验证评估,相当于用参数见过的数据去测试,得到的分数会远高于真实泛化性能,完全失去了对比的意义。

正确的对比流程:

  1. 先把整个数据集拆分成训练集和独立测试集(比如7:3比例);
  2. 调参模型:在训练集上做网格搜索(交叉验证)找到最优参数,用全训练集训练最优参数模型,再用独立测试集评估;
  3. 随机参数模型:在同一个训练集上用随机参数训练模型,再用同一个独立测试集评估;
  4. 对比两个模型在独立测试集上的分数,这样的对比才公平有效。

示例代码(修正后的对比流程):

from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris

# 1. 拆分数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)

# 2. 网格搜索调参模型
param_grid = {'C': [0.01, 0.1, 1, 10, 100],
              'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
tuned_model = grid_search.best_estimator_
tuned_score = tuned_model.score(X_test, y_test)

# 3. 随机参数模型(示例选一组随机参数)
random_model = SVC(C=0.1, gamma=10, random_state=0)
random_model.fit(X_train, y_train)
random_score = random_model.score(X_test, y_test)

# 4. 对比结果
print(f"调参模型测试集分数: {tuned_score:.4f}")
print(f"随机参数模型测试集分数: {random_score:.4f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:32:41