对训练和测试数据进行特征缩放

数据挖掘 机器学习 数据科学模型
2021-10-12 03:47:51

据说对于:特征归一化 -

测试集必须使用与训练集相同的缩放比例。

重点是:

不要使用不同的标量来缩放训练集和测试集:这可能会导致数据中的随机偏差。

有人能解释一下这是什么意思吗?

2个回答

一般来说,最佳实践是只使用训练集来弄清楚如何缩放/归一化,然后盲目地将相同的变换应用于测试集。

例如,假设您要通过移除均值并除掉方差来对数据进行归一化。如果您使用整个数据集来计算特征均值和方差,那么您就是在使用有关测试集分布的知识来设置训练集的规模——“泄漏”信息。

正确的做法是只使用训练集来计算均值和方差,对训练集进行归一化,然后在测试时使用相同的(训练)均值和方差对测试集进行归一化。

至于您问题中的要点,想象一下使用训练均值和方差来缩放训练集并使用测试均值和方差来缩放测试集。然后,例如,在特定特征中值为 1.0 的单个测试示例与值为 1.0 的训练示例具有不同的原始值(因为它们的缩放比例不同),但模型会以相同的方式处理。这就是偏见的来源。

希望这可以帮助!

为了回答这个问题,让我们来看三个场景。

Scenario 1:
scaled_dataset = (dataset - dataset_mean) / dataset_std_deviation
train, test = split(scaled_dataset) 

Scenario 2:
train, test = split(dataset)
scaled_train =  (train - train_mean) / train_std_deviation
scaled_test = (test - test_mean) / test_std_deviation

Scenario 3:
scaled_train =  (train - train_mean) / train_std_deviation
scaled_test = (test - train_mean) / train_std_deviation

“正确”的方式是场景 3。

我同意,使用训练参数并重新使用它们来扩展测试数据集可能看起来有点奇怪。(请注意,在实践中,如果数据集足够大,我们不会注意到场景 1-3 之间的任何实质性差异,因为我们假设样本都来自相同的分布。)

再次,为什么是场景 3?原因是我们想假装测试数据是“新的、看不见的数据”。我们使用测试数据集来很好地估计我们的模型在任何新数据上的表现。

现在,在实际应用中,新的、看不见的数据可能只是我们想要分类的 1 个数据点。(如果我们只有 1 个数据点,我们如何估计均值和标准差?)这是一个直观的案例,说明了为什么我们需要保留和使用训练数据参数来扩展测试集。

概括一下:如果我们标准化训练数据集,我们需要保留参数(每个特征的均值和标准差)。然后,我们将使用这些参数来转换我们的测试数据和以后的任何数据

让我举一个动手的例子,为什么这很重要!

假设我们有一个简单的训练集,包含 3 个样本和 1 个特征列(我们将特征列称为“长度单位厘米”):

sample1: 10 cm -> class 2
sample2: 20 cm -> class 2
sample3: 30 cm -> class 1

鉴于上述数据,我们计算以下参数:

mean: 20
standard deviation: 8.2

如果我们使用这些参数来标准化相同的数据集,我们会得到以下值:

sample1: -1.21 -> class 2
sample2: 0 -> class 2
sample3: 1.21 -> class 1

现在,假设我们的模型已经学习了以下假设:它将标准化长度值 < 0.6 的样本分类为第 2 类(否则为第 1 类)。到现在为止还挺好。现在,假设我们有 3 个新的未标记数据点要分类。

sample4: 5 cm -> class ?
sample5: 6 cm -> class ?
sample6: 7 cm -> class ?

如果我们在训练数据集中查看“未标准化的“长度单位厘米”值,可以直观地说所有这些样本都可能属于第 2 类。但是,如果我们通过重新计算标准差和和意味着从新数据中,我们将在训练集中获得与以前相似的值(即标准正态分布的属性),并且我们的分类器将(可能错误地)将“类 2”标签分配给样本 4 和 5。

sample5: -1.21 -> class 2
sample6: 0 -> class 2
sample7: 1.21 -> class 1

但是,如果我们使用您的“训练集标准化”中的参数,我们将得到以下标准化值

sample5: -18.37
sample6: -17.15
sample7: -15.92

请注意,这些值比原始训练集中 sample1 的值更负,这现在更有意义了!