TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个

Posted

技术标签:

【中文标题】TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个【英文标题】:TypeError: fit_transform() takes 2 positional arguments but 3 were given 【发布时间】: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)

【问题讨论】:

【参考方案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

【讨论】:

以上是关于TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn - FeatureUnion - Transformer: TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个

TypeError尝试标记编码用户输入数据时

为啥 fit_transform() 总是给我零?

sklearn fit transform fit_transform

对 TfidfVectorizer.fit_transform 的返回结果感到困惑

使用 cv.fit_transform(corpus).toarray() 的内存错误