如何防止测试数据泄漏到机器学习算法的训练过程中?

数据挖掘 机器学习 训练 评估 数据泄露
2022-02-14 15:57:42

我阅读了许多不同的来源,我需要将我的数据分成训练集和测试集。然后我必须确保算法只在训练数据上进行训练,并尽我所能防止测试数据泄漏到训练过程中。

为了避免学习数据的无关紧要的细节(这将增加算法的泛化能力),我可以进一步将我的训练数据分成适当的训练集和验证集多次,并选择算法的参数,以提供最佳的平均性能所有这样的分裂。

最后我在测试集上评估我的算法,并得到一些数字:MSE、RMSE 等。但是这些数字真的说明了我的算法有多好,它们不受测试集的影响吗?

当然,我在训练期间没有使用我的测试数据,但我得到的算法参数仅对这种特定的训练集和测试集拆分有效。如果我以不同的方式拆分数据,我将得到不同的 MSE、RMSE 和不同的最优参数。

然后我可以对训练/测试进行许多不同的拆分,并计算每个拆分的误差。在那种情况下,它与我在第一次拆分期间所做的交叉验证有何不同?我是否需要将我的训练数据进一步划分为正确的数据集和验证集?

如果我对训练和测试集进行了许多不同的拆分,这是否意味着我的测试数据会泄漏到训练过程中,因为有些数据在测试集中进行一次拆分,但在训练集中进行了另一次拆分?

1个回答

只是为了澄清(我认为你说得对,但我只是要小心),最好的做法是:

1:将数据拆分为训练和测试

2:将 train 拆分为 train 和 eval

3:对超参数进行网格搜索,对于每个组合,在训练中训练,在 eval 上进行评估。选择允许您在评估集上获得最佳分数的超参数

4:使用最佳模型(在步骤 3 中确定),使用在步骤 1 中创建的测试数据集计算测试损失。使用您在步骤 4 中的答案来获得模型在生产中的性能的最佳估计。

非常清楚,第 4 步不是关于超参数选择,超参数由第 3 步固定。第 4 步是为了更好地估计生产性能,因为您从第 3 步得到的结果可能过于乐观,因为用于过度优化(过度拟合)到特定训练评估拆分的特定超参数组合。

您可以多次重复步骤 1-4,但您不应该做的是尝试以任何方式使用此重复,以找到最佳超参数,您正在使用它来回答问题“我的模型可能执行得有多好关于看不见的数据”。例如,您可能会运行 10 次并获得 65%-67% 的准确度分布。然后你可以告诉你的老板,如果你在生产中部署这个模型,它可能有 65%-67% 的准确度(或者你更量化一点,你说这是平均值标准误差)±

这留下了一个问题,“我如何选择我最好的超参数?”。毕竟,您已经多次运行步骤 1-4,而步骤 3 每次都为您提供了不同的最佳超参数组合。

这是您需要再次运行第 3 步的地方,但略有不同。这一次,您不需要进行训练测试拆分。您只需获取所有数据,然后进行训练评估拆分。然后,您运行另一个超参数网格搜索,这就是您在 prod 中使用的模型(或者您可以结合训练和评估集,并使用这些超参数再训练一次,具体取决于您是否使用需要用于提前停止的评估集,如神经网络/xgboost 或不喜欢随机森林的)。但是,在这个阶段,您忽略了训练过程告诉您的准确性/性能指标。当您多次运行步骤 1-4 时,您已经估计了您的生产精度/性能,这就是这样做的重点。

我希望这能回答您的问题,包括如何进行拆分,以及说明为什么测试数据在任何时候都不会泄漏到训练数据中