【问题标题】:Shall I regroup the train and test set before doing analysis in Machine Learning and Deep Learing projects?在机器学习和深度学习项目中进行分析之前,我应该重新组合训练集和测试集吗?
【发布时间】:2019-12-04 13:25:57
【问题描述】:

我通过在机器学习和深度学习领域制作项目来训练自己。为此,我注册了 Kaggle 比赛,例如 Titanic Dataset

当我们加载数据时,有两个数据集:train 和 test。现在我只对训练集进行分析,每次创建新特征或进行一些更改时,我都会通过执行相同的操作对两个数据集进行循环。

现在,我要估算缺失值,并执行一些预处理操作,因此,我将对数据使用一些聚合,对分类特征进行编码等。但我想知道我是否应该同时使用训练和测试集来计算平均值或标记特征或只是训练集。

因为据我所知,测试集应该衡量一个模型在它从未见过的数据上的表现,所以我认为直到现在我应该只使用训练集来做出决定。

但有时它可能是“错误的”,例如如何处理测试集可能具有训练集没有的新类别的事实?

问题

  1. 在深度学习或机器学习项目中填充缺失值并执行预处理操作时,最好同时使用训练集和测试集还是只使用训练集?

  2. 即使在 Kaggle 比赛中会更好,那么生产项目呢?或许我们应该考虑一下新数据有可能包含看不见的类别的情况?

【问题讨论】:

  • 最好远离测试集,以匹配实时场景。你用的是什么插补技术?
  • 一个例子:为了估算缺失的年龄值,我将计算年龄缺失的相关乘客组的平均值或中位数。该组取决于他购买的机票类别、名称等。所以对于测试集,我应该只使用训练数据来计算这个平均值?
  • @agupta 是对的——这是建模的一般黄金法则; Should Feature Selection be done before Train-Test Split or after? 中的两个答案(免责声明:我的),尽管与您的上下文不同(特征选择),但可能会有所帮助。
  • 您在训练模型时从不接触测试数据。

标签: python pandas machine-learning scikit-learn deep-learning


【解决方案1】:

训练集应该用于构建您的机器学习模型。对于训练集,我们为每位乘客提供结果(也称为“ground truth”)。您的模型将基于乘客的性别和等级等“特征”。您还可以使用特征工程来创建新特征。

应该使用测试集来查看您的模型在看不见的数据上的表现。对于测试集,我们不提供每位乘客的真实情况。预测这些结果是你的工作。对于测试集中的每位乘客,使用您训练的模型来预测他们是否在泰坦尼克号沉没中幸存下来。

所以题目的线索是:如果测试集在数据之前是已知的,那就意味着你在预测的时候就会有结果。你不要改变它,因为那样你只会比较结果,而不是预测它。

【讨论】:

  • 所以答案是只使用训练集对测试集进行数据预处理?这意味着如果我对一个特征的训练数据执行 onehotencoder,并且该特征在测试集上有一个新类别,那么 onehotencoder 只会为相关行输入零?对我来说这没关系,因为这是测试集应该为现实世界的应用程序做的事情,但我想知道我是否会因为丢失信息而在比赛中失去排名。
  • 测试集中不需要一个热编码变量,因为它们不会给你任何有价值的信息。例如,在泰坦尼克号挑战中,您需要预测某人是否会幸存下来,因此从测试集中您只需要该信息来比较结果
  • 但是如果我在训练集上执行 onehotencoder,我必须对测试集执行相同的操作,这样我的模型才能做出预测,对吧?否则我的两个数据集不会有相同数量的特征,所以我看不到我的模型如何能够在测试集上执行任何计算。
【解决方案2】:

1) 在训练模型时,您从不接触测试数据。测试集仅用于检查预测的准确性。

2) 一般来说,我们希望训练数据具有所有可能的结果(因此需要更大的数据源,而 Kaggle 确实提供了相当大的数据集,因此您不必担心),就生产而言担心和在这种情况下看不见的情况,你倾向于改进你的模型,以便它可以处理这些新的情况。这可能需要重新训练它。

【讨论】:

  • 完全同意(+1);如需更详细的说明,以及一个实际的编码示例,说明在数据准备过程中混合训练集和测试集时可能出现的问题,我在 Should Feature Selection be done before Train-Test Split or after? 中的 2 个答案可能会有所帮助。
  • 感谢您提供更详细的回答和@desertnaut 的链接。当我说我在测试集上进行了一些更改时,我认为我不够清楚,我的意思是如果在训练集中我注意到我可以提取一个特征,我会在测试集上做同样的事情。例如,如果我在训练集上看到人们的年龄可以通过标记范围分为 4 个不同的范围。我这样做是为了训练和测试集。我不应该那样做吗?因为如果训练集和测试集的特征不同,我看不到如何测试我的模型。
  • @SmileyProd 这是不同的东西,当然你应该这样做 - 事实上,正如你已经怀疑的那样,你不能这样做。 agupta 和我的论点在这里说您不应该主动使用 测试集来指导您的建模管道。你在这里说的只是在最后,在完成你的模型之后,在你给它输入测试集之前,它当然不仅有效而且是强制性的
  • 完美,非常感谢,这是我最初的想法,但是通过查看其他内核,我看到很多人在所有建模管道期间连接数据帧并在最后拆分他们又来了,所以我想我可能错过了一些东西。
猜你喜欢
  • 2015-12-21
  • 2019-06-14
  • 2020-02-21
  • 2020-07-01
  • 2016-01-03
  • 2010-11-28
  • 2019-04-20
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多