【问题标题】:TypeError: fit_transform() takes 2 positional arguments but 3 were givenTypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2020-03-27 13:36:54
【问题描述】:

我有 pandas DataFrame df。我想使用不同的编码器对df 的连续和分类特征进行编码。我发现使用make_column_transformer 很舒服,但是下面显示的代码在LabelEncoder() 下会失败,但在OneHotEncoder(handle_unknown='ignore')) 下可以正常工作。错误信息是:

TypeError: fit_transform() 需要 2 个位置参数,但 3 个是 给定

我不清楚如何解决这个问题。

代码:

from sklearn.compose import make_column_transformer
from sklearn.preprocessing import RobustScaler, OneHotEncoder, LabelEncoder

continuous_features = ['COL1','COL2']       
categorical_features = ['COL3','COL4']

column_trans = make_column_transformer(
    (categorical_features,LabelEncoder()),
    (continuous_features, RobustScaler()))

X_enc = column_trans.fit_transform(df)

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    根据https://scikit-learn.org/stable/modules/generated/sklearn.compose.make_column_transformer.html.

    make_column_transformer(
    ...     (StandardScaler(), ['numerical_column']),
    ...     (OneHotEncoder(), ['categorical_column']))
    

    所以对于你的情况:

    from sklearn.compose import make_column_transformer
    from sklearn.preprocessing import RobustScaler, OneHotEncoder, LabelEncoder
    
    continuous_features = ['COL1','COL2']       
    categorical_features = ['COL3','COL4']
    
    column_trans = make_column_transformer(
        (OneHotEncoder(), categorical_features),
        (RobustScaler(), continuous_features))
    
    X_enc = column_trans.fit_transform(df)
    

    如果要使用LabelEncoder(),只能传一列,不能传两列!

    希望这会有所帮助。

    【讨论】:

    • @Fluxy,你能发布你的数据吗?只是前几行。
    • 这是一个庞大的数据集。你有任何假设为什么会发生这种情况吗?
    • @Fluxy,可以粘贴列名吗?
    • 我有column_trans的相同输出,但是当我做column_trans.fit_transform(df)时,它失败了。
    • 我正在粘贴分类列名,因为这些会产生问题。
    【解决方案2】:

    我认为这里的问题是 LabelEncoder 不能(并且仍然不能)在 ColumnTransformers 或 Pipelines 实例中使用,因为它仅用于转换目标,而 ColumnTransformers 和Pipelines 仅用于特征转换。

    这可以从LabelEncoder 类的方法.fit().transform().fit_transform() 的签名中清楚地看出,它们与“更标准”的转换器不同。

    fit(y) 与 fit(X[,y]) |变换(y)与变换(X)| fit_transform(y) 与 fit_transform(X[,y])

    分别用于 LabelEncoder-like 转换器(即应用于目标的转换器)和应用于特征的转换器。

    我刚刚在Why should LabelEncoder from sklearn be used only for the target variable? 上发布了一个完整的答案。

    这就是说,如果ColumnTransformer 中使用LabelEncoder 是允许的,您可能会遇到另一个答案中描述的问题,并且源于@987654335 的输入@ 应该是一维的(顺便说一句,在这种情况下,ColumnTransformer 构造函数和 make_column_transformer 方法都需要将 columns 参数作为 string 而不是作为 传递字符串列表)。一个常见的用例可以在用于处理文本的类实例的使用中看到,例如CountVectorizer,它确实需要一维输入 (例如,参见Sklearn custom transformers with pipeline: all the input array dimensions for the concatenation axis must match exactly)。

    最终,从 sklearn 版本 0.20 开始,可用于特征向量的 LabelEncoder 的替代品是 OrdinalEncoder

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 2018-02-20
      • 2021-02-02
      • 2022-01-19
      • 2017-02-18
      • 2021-01-22
      • 2020-05-23
      • 2020-01-06
      • 2019-04-29
      相关资源
      最近更新 更多