standardization/normalization 与 K 折交叉验证结合使用的正确方法是什么?

What is the correct way to use standardization/normalization in combination with K-Fold Cross Validation?

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

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

现在,如果我要在新数据上使用此模型,我只需保存 'scaler' 并将其加载到任何新脚本即可。

我在理解 K-fold CV 的工作原理时遇到了问题。在每次折叠时重新安装和改造定标器是最佳做法吗?我可以理解这是如何构建模型的,但是如果我以后想使用这个模型怎么办。我应该保存哪个洁牙器?

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

Is it best practice to re-fit and transform the scaler on every fold?

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

Just as it is important to test a predictor on data held-out from training, preprocessing (such as standardization, feature selection, etc.) and similar data transformations similarly should be learnt from a training set and applied to held-out data for prediction.

Which scaler should I save?

保存缩放器(以及任何其他预处理,即 pipeline)和在 所有 训练数据上训练的预测器,而不仅仅是 (k-1) /k 来自 cross-validation 或来自单个拆分的 70%。

  • 如果你做的是回归模型,就这么简单。

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