为什么我的模型在训练测试拆分中的准确率很高,但实际上比在验证集中的机会差?

人工智能 机器学习 预言
2021-11-13 07:20:38

我已经训练了一个 XGboost 模型来预测Kaggle Titanic ML 比赛的生存。

与所有 Kaggle 比赛一样,有一个包含目标变量的数据集train和一个test不包含目标变量的数据集,Kaggle 使用它来计算决定你的排行榜排名的最终准确度得分。

我的问题:

我已经构建了一个相当简单的集成分类器(基于 XGboost)并通过train数据的标准训练测试拆分对其进行评估。我从这个验证中得到准确度约为 80%,这很好,但按照公共排行榜标准(不包括 100% 的作弊者)来说并不令人惊讶。

我查看的这个标准模型的结果和所有 KPI 对我来说并不表示严重的过度拟合等。

然而,当我提交我对test集合的预测时,我的公开分数约为 35%,这甚至低于随机机会模型。太糟糕了,我什至通过简单地反转模型中的所有预测来提高我的分数。

为什么我的模型在test.

我知道 Kaggle 计算他们的分数与我在本地计算的分数有些不同,另外数据集之间可能存在一些差异。大多数参加比赛的人都注意到他们的本地考试成绩和公开成绩之间至少存在一些差异。

然而,我的差异确实很大,并且确实扭转了预测提高了我的分数。这对我来说没有意义,因为反转我的本地验证的预测会导致垃圾预测,所以这不是一个普遍反转预测的简单问题。

所以你能帮我理解这两个问题是如何同时发生的吗?

  • 局部准确率和公开分数之间的巨大差异
  • 倒车实际上会带来更好的公众分数。

这是我的代码笔记本(请忽略错误,它们只是因为代码仅在本地不适用于 kaggle 内核):

https://www.kaggle.com/fnguyen/titanicrising-test

2个回答

查看您的代码,一组数据转换应用于训练数据,另一组转换应用于测试数据。不同的数据转换可以解释不同的评估指标性能。

将所有数据转换放在一个函数中是最佳实践,这样它们就可以以类似的方式应用于所有数据。

由于您使用的是 scikit-learn,sklearn.compose.ColumnTransformer因此是为此目的而设计的。Titanic 数据集的示例代码在这里

@BrianSpiering 指出您应该始终对训练和测试数据集应用相同的转换通常是正确的。

这是我的解决方案的关键,它更具体一些,但实际上可能会帮助遇到类似问题的其他人。

具体来说,我的错误是由于Imputation造成的!我用于模型的一些因素NA同时在训练和测试数据集中。为了完成数据,我简单地分别使用均值和众数来估算这些缺失。但是,由于我在两组上分别进行了这些转换,因此使用的实际平均值/众数差异很大!通过对完整数据进行插补,我还为所有缺失的案例插补了相同的数据,从而解决了我的错误。

我在公共排行榜上的准确率现在为 74.2%,与我的本地测试分数 79.6% 相当接近。