【问题标题】:sklearn pipeline error - fit() takes 1 positional argument but 3 were givensklearn 管道错误 - fit() 采用 1 个位置参数,但给出了 3 个
【发布时间】:2021-08-22 00:33:30
【问题描述】:

尝试运行以下命令:

class N1:
    def __init__(self):
        pass

    def fit(self):
        return self

    def transform(self, X):
        return X.assign(num_1="n1")

X = pd.DataFrame(
    {
        "n1": [1, 2, 3],
        "n2": [3, 4, 4],
        "c1": ["a", "b", "c"],
        "c2": ["x", "y", "z"],
    }
)

num_pipeline = Pipeline(
    [
        ("num_1", N1()),
    ]
)

num_pipeline.fit(X)
# same error with: 
# num_pipeline.fit_transform(X)

给出错误:

TypeError: fit() takes 1 positional argument but 3 were given

我真的不知道这是怎么发生的,或者如何解决。

完整的追溯:

    387                 return last_step.fit_transform(Xt, y, **fit_params_last_step)
    388             else:
--> 389                 return last_step.fit(Xt, y,
    390                                      **fit_params_last_step).transform(Xt)
    391 

TypeError: fit() takes 1 positional argument but 3 were given

我希望返回数据框 X 以及添加的列 num_1

【问题讨论】:

  • 您可以调用 transform ,因为更改是:new_df=num_pipeline.transform(X) 如果涉及 fit 函数,则需要答案部分中的 y 或 y=None。

标签: python scikit-learn pipeline


【解决方案1】:

通常,fit 还需要一个 X 和一个可选的 y 参数,因此Pipeline 可能会尝试传递这些参数。

也许尝试这样定义它:

def fit(self, X, y=None):
    return self

您可能还想查看FunctionTransformer

【讨论】:

  • 谢谢,关于“_ 通常,fit 还需要一个 X 和一个可选的 y 参数,所以 Pipeline 可能会尝试传递这些_”,是否有指向任何文档的链接?
  • @baxx 当然,scikit-learn 有大量文档:fitpipeline
  • 谢谢,来自文档:“它通常需要一些样本 X,目标 y”,表明这不是严格要求,如何知道什么是必要的?
  • @baxx 我想这取决于您尝试包含在管道中的特定转换或模型。
  • 好的,那么在这种情况下(我原来的帖子的情况),为什么需要y = None?文档似乎没有说这是必要的,所以我不明白逻辑/推理
猜你喜欢
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多