跨不同数据集扩展的最佳方法
Posted
技术标签:
【中文标题】跨不同数据集扩展的最佳方法【英文标题】:Best way to scale across different datasets 【发布时间】:2019-09-21 23:30:54 【问题描述】:我在预处理数据时遇到了一种特殊情况。
假设我有一个数据集A
。我将数据集拆分为A_train
和A_test
。我使用任何给定的缩放器(sci-kit learn)拟合A_train
,并用scaler
转换A_test
。现在使用A_train
训练神经网络并在A_test
上进行验证效果很好。没有过拟合,性能很好。
假设我有数据集B
,其特征与A
中的特征相同,但特征值的范围不同。 A
和 B
的一个简单示例可以分别是波士顿和巴黎的住房数据集(这只是一个类比,说成本、犯罪率等特征范围差异很大)。为了测试上述训练模型在B
上的性能,我们根据A_train
的缩放属性对B
进行变换,然后进行验证。这通常会降低性能,因为此模型从未显示来自B
的数据。
奇怪的是,如果我直接在B
上进行拟合和变换,而不是使用A_train
的缩放属性,性能会好很多。通常,如果我在A_test
上进行测试,这会降低性能。在这种情况下,它似乎工作,虽然它不正确。
由于我主要研究气候数据集,因此对每个数据集都进行培训是不可行的。因此,我想知道使用相同特征扩展此类不同数据集以获得更好性能的最佳方法。
任何想法,请。
PS:我知道用更多数据训练我的模型可以提高性能,但我对正确的扩展方式更感兴趣。我尝试从数据集中删除异常值并应用QuantileTransformer
,它提高了性能但可能会更好。
【问题讨论】:
如果住房数据集的并行性成立,我不明白为什么针对特定上下文训练的模型应该适用于另一个上下文。有些功能和动态可以匹配,有些则不匹配。基于错误的假设,您的模型可能存在严重缺陷。 我没有说住房数据集的并行性成立,我的意思是另一个数据集具有相同的特征,但它们完全处于不同的范围内。如果您知道巴黎或加利福尼亚的成本有多高。该引用是为了显示一个类比。这就像在美国训练气候模型并预测欧洲气候。我总是可以通过显示更多数据来提高性能,但是有一个限制。 【参考方案1】:一个可能的解决方案可能是这样的。
-
对数据集 A 进行标准化(预处理),使每个特征的范围都在一个固定的区间内,例如 [-1, 1] 之间。
在标准化集 A 上训练您的模型。
每当你得到一个像 B 这样的新数据集时:
(3.1.) 对新数据集进行归一化,以使特征具有与 A 中相同的范围 ([-1, 1])。 (3.2) 将经过训练的模型(步骤 2)应用于标准化的新集 (3.1)。由于集合 B 与其标准化版本之间存在一对一映射,因此您可以根据标准化集合 B 的预测来查看集合 B 的预测。
李>请注意,您无需提前访问集合 B(如果有数百个集合,则无需访问此类集合)。一旦给你一个并且你想在它上面测试你训练过的模型,你就可以对它们进行标准化。
【讨论】:
当然可以。但这是一个肮脏的把戏,因为你总是事先不知道数据集 B。 请帮助我正确理解问题。您获得了数据集 A,并在其上训练了一个模型,然后您想在其他数据集上使用该模型(但具有不同的特征范围)?还是有别的问题? 是的,你没看错。您错过的是,有超过 1000 个不同的数据集,例如 B,您不能将其包含在预处理中。有时,在有人对您的模型进行测试之前,您不会知道它们的存在。一般来说,缩放比例越高,模型在不同数据集上的效果就越好,因为无论如何神经网络都具有良好的泛化能力。 也许我写的不是很清楚。我编辑了那个。基本上,您不需要知道或在预处理中包含 B 组(或多个组)。您只需对集合 A 进行归一化,然后对其进行训练。一旦你得到一个新的集合,你就可以在旅途中对其进行标准化。 很抱歉,您似乎忽略了我的问题中的一些内容。您发布的解决方案已经在我的问题中。需要明确的是,您仍然在谈论A_test
而不是 B
。以上是关于跨不同数据集扩展的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章