【问题标题】:What is the correct way to use standardization/normalization in combination with K-Fold Cross Validation?将标准化/标准化与 K-Fold 交叉验证结合使用的正确方法是什么?
【发布时间】:2021-01-30 02:36:35
【问题描述】:

我一直都知道,标准化或归一化应该只适合训练集,然后用于变换测试集。所以我要做的是:

scaler = StandardScaler()
scaler.fit_transform(X_train)
scaler.transform(X_test)

现在,如果我要在新数据上使用这个模型,我可以保存“缩放器”并将其加载到任何新脚本中。

虽然我无法理解这对 K-fold CV 是如何工作的。在每次折叠时重新安装和转换缩放器是最佳实践吗?我可以理解这在构建模型时是如何工作的,但是如果我以后想使用这个模型怎么办。我应该保存哪个缩放器?

此外,我想将此扩展到时间序列数据。我了解 k-fold 如何用于时间序列,但我又如何将它与 CV 结合起来?在这种情况下,我建议保存最后一个缩放器,因为这将适合数据的 4/5(如果 k=5),使其适合最新(最近)的数据。这会是正确的方法吗?

【问题讨论】:

  • 理论上是的,您应该重新训练缩放器 k 次以进行验证。在实践中,我发现只要您在每个折叠中的样本很大,这并不重要。如果您想稍后使用该模型,则应根据所有可用的训练数据对模型和缩放器进行训练。
  • 感谢您的回答。不过我还有一个问题。你在最后一句话中所说的:'你应该让模型和缩放器在所有可用的训练数据上训练'。但是,当为每个折叠重新拟合缩放器时,我基本上创建了 5 个不同的缩放器,它们都没有适合所有数据,对吧?所以我最终不会得到一个适合所有训练数据的缩放器。
  • 使用交叉验证来估计模型的样本外性能,但是当您想使用模型进行样本外预测时,最好使用在所有可用数据上训练它,而不仅仅是 (k-1)/k 个数据,并用你的缩放器做同样的事情
  • 因此,如果我理解正确,我将首先使用 K-fold(假设 K=5)CV,带有 5 个不同的缩放器实例(每个都适合 4/5,然后转换剩余的1/5th),以评估模型性能。然后,一旦我满意,我将在整个集合上构建模型,它已经被缩放器一次 fit_transformed? (对不起,如果这些是新手问题,我对这个 lol 有点陌生)
  • 是的,没错

标签: python normalization cross-validation k-fold standardization


【解决方案1】:

最佳做法是在每次折叠时重新调整和转换缩放器吗?

是的。您可能想阅读 scikit-learn 的 doc on cross-validation

正如测试从保留的数据中提取的预测器很重要一样 训练、预处理(如标准化、特征选择、 等)和类似的数据转换类似地应该从 一个训练集并应用于保留的数据进行预测。

我应该保存哪个缩放器?

保存缩放器(和任何其他预处理,即pipeline)和在您的训练数据的所有上训练的预测器,而不仅仅是来自交叉数据的 (k-1)/k验证或一次拆分的 70%。

  • 如果你在做一个回归模型,就这么简单。

  • 如果您的模型训练需要使用超参数搜索 交叉验证(例如,网格搜索 xgboost 学习参数), 那么你已经从不同的折叠中收集了信息,所以你 需要另一个测试集来估计真实的样本外模型 表现。 (一旦你做出这个估计,你就可以重新训练 再次结合训练+测试数据。最后一步并不总是针对神经网络完成 针对特定样本大小进行参数化的网络。)

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2018-09-10
    • 2016-10-21
    • 2019-02-19
    • 2010-09-19
    相关资源
    最近更新 更多