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
不能(并且仍然不能)在 ColumnTransformer
s 或 Pipeline
s 实例中使用,因为它仅用于转换目标,而 ColumnTransformer
s 和Pipeline
s 仅用于特征转换。
这可以从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 个
sklearn fit transform fit_transform