使用 sklearn 管道过度拟合 - 为什么?

数据挖掘 scikit-学习 交叉验证 过拟合 特征缩放
2022-02-26 17:23:20

所以....

我已经玩这个太久了,我真的需要一些建议。

大多数人在 kaggle concat 训练和测试集上,然后对数据进行预缩放,这似乎在评分时提供了很好的结果,但我认为这是数据泄漏和在现实世界解决方案中执行的不正确过程。

我将 15% 的数据作为保留集,其余的用于 CV。

我遇到的问题是,如果我将缩放器放入管道中,CV 的每一折上的缩放都会发生变化,并且如果我在超参数调整之前预缩放整个数据集,则会得到截然不同的结果。

一旦我适合整个训练数据(包括保持集),我什至会得到更糟糕的结果,这表明它对较小的数据集过度拟合。

我能做些什么来解决这个问题吗?

难道我做错了什么?(我应该将缩放器放入管道中吗?)

或者这就是现实世界中的样子?

关于过度拟合等的任何其他帮助都会令人惊叹。

3个回答

如果您的数据集为不同的折叠提供了非常不同的结果,而您的管道中只有一个缩放器和一个模型,则可能出于不同的原因:

  • 由于某种原因,您的验证拆分有不同的困难。有些很容易预测你没有选择正确的验证和交叉折叠。这方面的一个例子是存在时间依赖性而您没有得到它。如果是这种情况,我的建议是选择适当的验证和交叉折叠。

  • 其他可能的问题是特征分布不均,这意味着存在一些异常值。如果缩放时存在异常值,您将有不同的间隔。如果是这种情况,我会说在对整个数据集进行更复杂的预处理之前。

注意:当您将模型投入生产时,像 Kagglers 那样将训练和测试连接起来可能会很危险。

好的,首先,我认为将任何东西的训练集和测试集连接起来不是一个好主意,而且你说的数据泄漏问题是正确的。

现在,预计在 cv 中使用缩放器时会得到不同的结果。这是因为,对于 cv 的每次迭代,数据集都会发生变化。例如如果 cv = 3,那么对于第一次迭代,它将考虑不同的训练和有效集,对于第二次迭代,训练和有效集将不同等等。如果我执行 CV,我曾经在我的 RandomForest 模型中为每次迭代获得不同的 MAE 值。

至于解决方案,我可以建议执行以下操作:

在拟合或做任何事情之前缩放训练集和测试集。此外,无论您对训练集进行何种预处理,都应使用相同的测试集参数进行完全相同的处理,以避免泄漏!

如前文所述,同时对训练集和测试集进行预处理会导致实际应用中出现严重的泛化错误。所以,我在这一点上完全同意你的看法。

当谈到缩放器问题时,我想出的第一件事是您可以评估缩放特征相对于目标值的重要性。然后,您可以使用所有训练数据根据它们的分布和直方图(例如 if age > 18then 1 等)对这些特征进行离散化,并根据这些特征对交叉验证折叠进行分层抽样 ( )。它可以在每个折叠之间提供更好的价值分布。您唯一应该考虑的是异常值,如您所知,它们可能会扭曲缩放器。age_catage_cat

祝你好运!