使用 Scikit Learn Grid Search 时,为什么我的 train 和 cv 分数很高,但我的测试分数却低很多?

数据挖掘 机器学习 交叉验证 训练 过拟合 网格搜索
2022-01-27 19:06:45

我正在使用 scikit learn 来运行一些模型,我很困惑为什么我的测试分数比我的 cv 分数和我的 train 分数低这么多。

一开始,我进行了 80-20 的训练测试拆分。在训练集上,我使用 5 折交叉验证运行网格搜索来选择超参数。refit 设置为 true,因此在选择超参数后,模型会重新适应整个训练集,并用于预测测试集。

当我查看 cv_results_ 时,我发现我的 mean_train_score(我将其解释为每个 k 折交叉验证循环的训练分数)非常高。当我查看 mean_test_score(我称之为 cv score)时,它也非常高。但是当我使用我的外部测试分数时,分数真的很低。这适用于我正在使用的所有模型(我正在测试 10 个模型)。数字可以在下图中看到。

注意:我使用 F1 宏分数作为模型性能的衡量标准。

汇总训练、CV 和测试分数的表格

(LR)逻辑回归,(QDA)二次判别分析,(NN)最近邻,(LSVM)线性支持向量机,(RBFSVM)径向基函数支持向量机,(NB)朴素贝叶斯,(ANN)人工神经网络, (RF) 随机森林,(AB) AdaBoost 随机森林,(GB) 梯度提升随机森林

因此,由于我的测试集性能远低于我的训练分数,我确信我过度拟合了。但我不知道为什么我的简历分数会那么好?如果我的设置容易过度拟合,当我进行 5 折交叉验证时,我不会看到我的训练集的 4/5 过度拟合,这意味着我的 CV 分数也会很低吗?我不明白为什么我不会过拟合导致 5 倍 CV 步骤中的高 CV 分数,而是过拟合导致测试集中的低性能。

2个回答

以下是一些可以尝试的想法:

  1. 我会尝试通过不使用“改装”选项来调查问题。自己运行 Grid Search CV,获取最佳参数并在输入这些最佳参数后在所有训练数据上训练一个新模型。这只是为了确保 SKlearn 不会发生任何奇怪的事情。
  2. 尝试使用其他指标进行分类,如 AUC,看看是否有任何差异。
  3. 此外,如果您提供有关数据的更多信息,例如结果类型和您使用的预测变量类型,这可能会有所帮助

您如何为模型保存最佳重量?如果您有一个检查点来评估您的验证集而不是您的训练集的损失/准确性,那么您最终会得到与验证集过度拟合的权重,并且可能在测试集上表现不佳。不知道你有什么样的设置,你能告诉我你如何保存你最终应用到你的测试集的权重吗?