53

我想将我的数据分成训练集和测试集,我应该在拆分之前还是之后对数据应用规范化?在构建预测模型时有什么不同吗?

4

3 回答 3

104

您首先需要将数据拆分为训练集和测试集(验证集也可能很有用)。

不要忘记测试数据点代表真实世界的数据。解释(或预测)变量的特征归一化(或数据标准化)是一种通过减去均值并除以方差来对数据进行中心化和归一化的技术。如果您采用整个数据集的均值和方差,您将在训练解释变量(即均值和方差)中引入未来信息。

因此,您应该对训练数据执行特征归一化。然后也对测试实例执行归一化,但这次使用训练解释变量的均值和方差。通过这种方式,我们可以测试和评估我们的模型是否可以很好地泛化到新的、看不见的数据点。

如需更全面的阅读,您可以阅读我的文章Feature Scaling and Normalization in a nutshell


例如,假设我们有以下数据:

>>> import numpy as np
>>> 
>>> X, y = np.arange(10).reshape((5, 2)), range(5)

其中X代表我们的特征:

>>> X
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]

Y包含相应的标签

>>> list(y)
>>> [0, 1, 2, 3, 4]

第 1 步:创建训练/测试集

>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

>>> X_train
[[4 5]
 [0 1]
 [6 7]]
>>>
>>> X_test
[[2 3]
 [8 9]]
>>>
>>> y_train
[2, 0, 3]
>>>
>>> y_test
[1, 4]

第 2 步:规范化训练数据

>>> from sklearn import preprocessing
>>> 
>>> normalizer = preprocessing.Normalizer()
>>> normalized_train_X = normalizer.fit_transform(X_train)
>>> normalized_train_X
array([[0.62469505, 0.78086881],
       [0.        , 1.        ],
       [0.65079137, 0.7592566 ]])

第 3 步:标准化测试数据

>>> normalized_test_X = normalizer.transform(X_test)
>>> normalized_test_X
array([[0.5547002 , 0.83205029],
       [0.66436384, 0.74740932]])
于 2018-03-23T07:51:42.753 回答
5

你可以使用 fit 然后变换学习

normalizer = preprocessing.Normalizer().fit(xtrain)

转换

xtrainnorm = normalizer.transform(xtrain) 
xtestnorm = normalizer.transform(Xtest) 
于 2018-10-19T12:24:13.373 回答
2

问问自己,根据您在拆分之前还是之后进行转换,您的数据是否会有所不同。如果您正在进行log2转换,则顺序无关紧要,因为每个值都独立于其他值进行转换。如果您要对数据进行缩放和中心化,那么顺序确实很重要,因为异常值会极大地改变最终分布。您允许测试集“溢出”并影响您的训练集,可能导致过于乐观的性能测量。

对于R用途,该caret软件包擅长处理测试/训练拆分。您可以将参数添加preProcess = c("scale", "center")train函数中,它会自动将训练数据的任何转换应用于测试数据。

Tl; dr - 如果数据因拆分前后的标准化而有所不同,请在拆分之前进行

于 2020-05-28T17:48:04.347 回答