【问题标题】: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(),因为该对象已经拟合(或参数化)您的训练数据。

      【讨论】:

        猜你喜欢
        • 2022-08-20
        • 2021-03-11
        • 2018-08-25
        • 2020-06-23
        • 2021-02-18
        • 2019-01-30
        • 2016-08-25
        • 2014-07-13
        • 2016-12-06
        相关资源
        最近更新 更多