对训练数据进行拟合变换并对测试数据进行变换

时间:2018-02-08 18:32:49

标签: python scikit-learn

我无法理解transform()fit_transform()的合作方式。

我在训练数据集上调用fit_transform(),然后在我的测试集上调用transform()

但是如果我在测试集上调用fit_transform(),我会得到不好的结果。

有人可以解释一下这是怎么发生以及为什么会发生这种情况?

1 个答案:

答案 0 :(得分:10)

让我们举一个变换的例子,sklearn.preprocessing.StandardScaler

从文档中,这将:

  

通过删除均值和缩放到单位方差来标准化要素

假设您正在使用以下代码。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# X is features, y is label

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

当您致电StandardScaler.fit(X_train)时,它所做的是根据X_train中的值计算均值和方差。然后调用.transform()将通过减去均值并除以方差来转换所有要素。为方便起见,可以使用fit_transform()一步完成这两个函数调用。

您希望仅使用训练数据来适应定标器的原因是因为您不希望使用测试数据中的信息来偏置模型。

如果您对测试数据fit(),则计算每项功能的均值和方差。理论上,如果您的测试和训练集具有相同的分布,这些值可能非常相似,但实际上通常情况并非如此。

相反,您只想使用在训练数据上计算的参数来转换测试数据。