跨不同数据集扩展的最佳方法

数据挖掘 神经网络 scikit-学习 预处理 特征缩放
2021-10-06 16:28:04

我在预处理数据时遇到了一个特殊的情况。

假设我有一个 dataset A我将数据集拆分为A_trainA_testfit使用A_train任何给定的缩放器(sci-kit learn)并transform A_test使用scaler. 现在训练神经网络A_train并验证A_test效果很好。没有过拟合,性能很好。

假设我有B与 in 具有相同特征的数据集A,但特征值的范围不同。波士顿和巴黎住房数据集A一个简单示例。B为了测试上述训练模型在 上的性能B,我们transform B根据 的缩放属性A_train然后进行验证。这通常会降低性能,因为该模型从未显示来自B.

奇怪的是,如果我B直接拟合和变换而不是使用 的缩放属性A_train,性能会好很多。通常,如果我在A_test. 在这种情况下,它似乎有效,尽管它不正确。

由于我主要研究气候数据集,因此对每个数据集进行培训是不可行的。因此,我想知道使用相同特征扩展此类不同数据集以获得更好性能的最佳方法。

请有任何想法。

PS:我知道用更多数据训练我的模型可以提高性能,但我对正确的缩放方式更感兴趣。我尝试从数据集中删除异常值并应用QuantileTransformer它,它提高了性能但可能会更好。

2个回答

您的观察源于两个事实

  1. 当数据分布发生变化(移位)时,模型性能会下降。例如,当模型在波士顿数据集上训练但在巴黎数据集上测试,或者在夏季数据集上训练但在冬季数据集上测试。

  2. 当信息从测试集中泄漏时,模型评估(错误地)显示了改进。例如,当测试集使用(min,mean,std,max)等测试集的未知统计数据进行缩放时。

如果在训练时(1)没有像巴黎这样的其他城市的数据集,显然我们无能为力。在现实世界的案例中,当我们看到验证分数和测试分数之间存在显着差异时,我们假设测试集与训练集的分布不同,因此,我们尝试合并新数据并重新训练(可能不是在线学习环境中的全面再培训)。否则(2),我们可以

  1. 将所有城市合并为一个数据集,然后将其拆分为训练集和测试集(稍后,验证集将从训练集中达到峰值),即

      train = A_train U B_train U ...
      test = A_test U B_test U ...
    

    这样,来自所有城市的信息将用于扩展。我们可能会对某些城市进行过采样或过采样,以获得每个城市具有相同代表的数据集。

  2. 或者,为每个城市(或一组类似的城市)建立一个单独的(专门的)模型,从而绕过“train on A_train, and test on B”问题。

您是对所有 B 进行拟合、转换和评估,还是将 B 拆分为 B_train 和 B_test,然后基于 B_train 进行缩放并在 B_test 上进行评估?

有很多选择可以尝试,但不幸的是,处理此问题的最佳方法将取决于您的数据和手头的特定问题。