机器学习项目:在探索性数据分析之前或之后拆分训练/测试集?
Posted
技术标签:
【中文标题】机器学习项目:在探索性数据分析之前或之后拆分训练/测试集?【英文标题】:Machine learning project: split training/test sets before or after exploratory data analysis? 【发布时间】:2019-06-14 09:31:44 【问题描述】:在进行任何探索性数据分析之前最好将您的数据分成训练集和测试集,还是仅根据训练数据进行所有探索?
我正在处理我的第一个完整机器学习项目(课程顶点项目的推荐系统),并且正在寻找有关操作顺序的说明。我的粗略大纲是导入和清理,进行探索性分析,训练我的模型,然后在测试集上进行评估。
我现在正在做探索性数据分析 - 一开始没什么特别的,只是从变量分布等开始。但我不确定:我应该在探索性分析之前还是之后将我的数据分成训练集和测试集?
我不想通过检查测试集来潜在地污染算法训练。但是,我也不想错过可能反映真实信号的视觉趋势,而我可怜的人眼在过滤后可能看不到,因此在设计我的算法时可能会错过调查一个重要且相关的方向。
我检查了其他线程,例如this,但我发现的那些似乎更多地询问诸如正则化或原始数据的实际操作之类的问题。我找到的答案有好有坏,但优先考虑拆分。但是,我不打算在拆分数据之前对数据进行任何实际操作(除了检查分布并可能进行一些因子转换)。
您在自己的工作中做什么?为什么?
感谢您帮助新程序员!
【问题讨论】:
暗示完整的数据足够小,可以轻松使用(即适合内存)我总是将完整的数据集用于 EDA。我只有在建模时才分裂成测试/训练 这个问题对于 SO 来说有点偏离主题(它偏向于“基于意见”并且与编码本身无关),但这仍然是一个非常好的问题。 Here's one perspective;您可以在 CrossValidated 或 RStudio Community 上找到其他人或其他容易接受的受众。 EDA 不需要拆分。 EDA 只是指导您未来的步骤。观察任何趋势可能有助于指导您的功能选择和/或工程。 EDA 还可以帮助您更好地清理数据。 ML 与您的数据一样好。 这是一个关于正确的机器学习数据科学管道的好问题。 【参考方案1】:要回答这个问题,我们应该提醒自己,为什么在机器学习中,我们将数据分为训练、验证和测试集(另请参阅 this question)。
训练集用于模型开发。我们经常仔细探索这些数据,以获得特征工程和机器学习模型的一般结构的想法。然后我们使用训练数据集训练模型。
通常,我们的目标是生成不仅在训练数据上表现良好的模型,而且在以前未见过的数据上表现良好。因此,我们希望避免使用捕捉数据特性的模型我们现在可以获得而不是我们将来会看到的数据的一般结构(“过度拟合”)。为此,我们通过评估我们正在训练的模型在不同数据集(验证数据上的表现)来评估它们的质量,并选择在验证数据上表现最佳的模型。
在训练完最终模型后,我们通常希望对其性能进行无偏估计。由于我们已经在模型开发过程中使用了验证数据(我们选择了性能最好的模型在验证数据上),我们不能确定我们的模型在看不见的数据上表现同样好。因此,为了评估模型质量,我们使用一组新数据(测试数据)测试性能。
这个讨论给出了你的问题的答案:我们不应该使用测试(或验证)数据集进行探索性数据分析。因为如果我们这样做,我们会冒着模型过度拟合的风险我们拥有的数据的特殊性,例如对测试数据有效的工程特征。同时,我们将失去对模型性能进行无偏估计的能力。
【讨论】:
【参考方案2】:我会反过来处理这个问题;使用测试集不好吗?
建模的目标是最终得到一个具有低方差(和小偏差)的模型:这就是为什么测试集保留一堆数据以评估你的模型如何与新的数据(即其方差)。如果您在建模期间使用测试集,您将无能为力,并且您的数据过度拟合。
EDA 的目标是了解您正在使用的数据;特征的分布、它们的关系、它们的动态等……如果你将测试集留在数据中,是否存在“过度拟合”你对数据的理解的风险?如果是这种情况,您会在 70% 的数据上观察到某些属性对于剩余的 30%(测试集)无效......知道拆分是随机的,这是不可能的,或者您已经非常倒霉。
【讨论】:
【参考方案3】:根据我对机器学习管道的理解,应在将数据拆分为训练和测试之前进行探索性数据分析。
这是我的理由:
一开始可能没有清理数据。它可能有缺失值、不匹配的数据类型和异常值。 需要了解数据集中具有目标变量的每个特征。这将有助于了解每个特征对于业务问题的重要性,并有助于推导出其他特征。 数据可视化还有助于从数据集中获取洞察信息。完成上述操作后,我们可以将数据集拆分为训练和测试。因为训练和测试的特征必须相似。
【讨论】:
以上是关于机器学习项目:在探索性数据分析之前或之后拆分训练/测试集?的主要内容,如果未能解决你的问题,请参考以下文章
Scikit-Learn One-hot-encode 在训练/测试拆分之前或之后