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

时间:2017-10-06 19:36:16

标签: python jupyter

我在“动手机器学习”一书中处理问题4(第2章)时遇到此错误。这是一个问题“尝试创建一个完整数据准备和最终预测的管道”。该解决方案在Github链接中可用,但解决方案是给出了标题中提到的错误。我使用住房数据作为我的例子。请帮帮我。

我写了这个命令,它发出了以下错误:

prepare_select_and_predict_pipeline = Pipeline([
('preparation', full_pipeline),
('feature_selection', TopFeatureSelector(feature_importances, k)),
('svm_reg', SVR(**rnd_search.best_params_))
])

prepare_select_and_predict_pipeline.fit(housing,housing_labels)

错误:

TypeError: fit() takes 2 positional arguments but 3 were given

我想附上Github的解决方案 Solution of Question 2 from Github

但这不适合我。 :(

1 个答案:

答案 0 :(得分:0)

警告,我将在这里大致简化,但我希望这会有所帮助。

在Python中,如果在对象上调用函数,则对象本身始终作为第一个参数传递(除非它是静态或类方法)。这通常由我们称为self的参数捕获。

因此,如果您致电object.function(),则会将参数传递给function,即object本身。

class C:
    def f(self):
        print(self)

o = C()
o.f()         # <__main__.C object at 0x7f1049993f28>
o.f('hello')  # TypeError: f() takes 1 positional argument but 2 were given

在您的情况下,您正在调用prepare_select_and_predict_pipeline.fit(housing, housing_labels),因此您传递的函数为fit 三个参数:prepare_select_and_predict_pipelinehousing和{ {1}}。

如果检查housing_labels方法的定义,您可能会发现它确实只需要两个参数。我猜第一个将被称为fit