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

b4s*_*you 7 python scikit-learn

我无法理解究竟如何transform()fit_transform()正在一起.

我之后调用fit_transform()我的训练数据集和transform()我的测试集.

但是,如果我打电话fit_transform()给测试集,我会得到不好的结果.

任何人都可以解释一下这是怎么发生的?

pau*_*ult 12

让我们以变换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
)
Run Code Online (Sandbox Code Playgroud)

当你打电话时StandardScaler.fit(X_train),它做的是从中的值计算均值和方差X_train.然后调用.transform()将通过减去均值并除以方差来转换所有特征.为方便起见,这两个函数调用可以一步完成fit_transform().

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

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

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