【问题标题】:When to use fit_transform and transform? [duplicate]何时使用 fit_transform 和 transform? [复制]
【发布时间】:2020-11-05 06:36:33
【问题描述】:
对于像 LabelEncoder 和来自 scikit-learn 的 SimpleImputer 这样的东西,为什么我们将 fit_transform 用于 X_train 数据帧,为什么我们将 transform 用于 X_valid 数据帧?
例如
for col in object_cols:
label_X_train[col] = label_encoder.fit_transform(X_train[col])
label_X_valid[col] = label_encoder.transform(X_valid[col])
两者在工作方式上有何区别?
【问题讨论】:
标签:
python
python-3.x
scikit-learn
【解决方案1】:
label_encoder.fit 使标签编码器准备好并且它没有输出。然后您可以通过label_encoder.transform(X) 使用。但是,label_encoder.fit_transform 使编码器准备就绪,然后生成输出。换句话说:
label_X_train[col] = label_encoder.fit_transform(X_train[col])
与
相同
label_encoder.fit(X_train[col])
label_X_train[col] = label_encoder.transform(X_train[col])
对于验证数据集,你不想再次fit标签编码器(因为它已经安装并且准备好了),所以你只需使用transform。
【解决方案2】:
如果您想使用插补器使用中值填充训练数据中的一些缺失值,首先需要计算该中值是多少,这就是调用fit() 时发生的情况。
现在您有了中间值,但尚未更改数据集,为此您需要更改(或转换)数据集。这就是您致电transform() 时发生的情况。通常您想计算一个中值并使用该中值替换 NaN 或其他一些非值,fit_transform() 为方便起见一次性完成上述两个步骤。
当您调用 fit() 时,您的 imputer 对象会保存适合的值,当您对测试数据调用 transform 时,此值用于插补。
回到你的例子。您使用sklearn.preprocessing.LabelEncoder 将字符串转换为整数。您在训练数据上调用 fit(),然后调用 transform(或 fit_transform())将字符串更改为整数。现在您有了测试数据,您需要使用相同的方法将测试数据中的字符串更改为整数,因此您使用已拟合的LabelEncoder 对象,并且只需要调用transform(),因为该对象已经拟合(或参数化)您的训练数据。