类型错误:fit_transform()需要2个位置参数,但给出了3个。

4
我有一个名为df的pandas DataFrame。我想使用不同的编码器对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)
2个回答

2
根据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,你能发布一下你的数据吗?只需要前几行即可。 - Bill Chen
这是一个庞大的数据集。你有什么假设为什么会发生这种情况吗? - Fluxy
@Fluxy,可以把列名粘贴一下吗? - Bill Chen
在这种情况下有什么解决方法?感谢您找到了原因。 - Fluxy
@Fluxy,我没有数据,所以我没有执行fit_transform()步骤。 - Bill Chen
显示剩余5条评论

1
在这里的问题是,LabelEncoder 不能(而且现在仍然不能)在 ColumnTransformerPipeline 实例中使用,因为它只用于转换目标,而 ColumnTransformerPipeline 是用于特征转换的。
可以从 LabelEncoder 类的方法 .fit().transform().fit_transform() 的签名中清楚地看到这一点,它们与“更标准”的转换器的签名不同。
对于类似 LabelEncoder 的转换器(即要应用于目标的转换器)和要应用于特征的转换器,分别为 fit(y) vs fit(X[,y])transform(y) vs transform(X)fit_transform(y) vs fit_transform(X[,y])
我刚刚在Why should LabelEncoder from sklearn be used only for the target variable?上发布了一个详细的答案。
话虽如此,如果允许在 ColumnTransformer 中使用 LabelEncoder,那么你可能会遇到另一个答案中描述的问题,这是由于 LabelEncoder 的输入应该是 1D 导致的(在这种情况下,ColumnTransformer 构造函数和 make_column_transformer 方法都需要将 columns 参数作为字符串而不是字符串列表传递)。这种情况的常见用例可以在使用用于处理文本的类的实例(如 CountVectorizer)时看到,它确实需要 1D 输入(例如,请参见Sklearn custom transformers with pipeline: all the input array dimensions for the concatenation axis must match exactly)。
最终,在 sklearn 版本 0.20 中,可以用于特征向量的 LabelEncoder 的替代品是 OrdinalEncoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接