TypeError: fit() 缺少 1 个必需的位置参数:'y',

Posted

技术标签:

【中文标题】TypeError: fit() 缺少 1 个必需的位置参数:\'y\',【英文标题】:TypeError: fit() missing 1 required positional argument: 'y',TypeError: fit() 缺少 1 个必需的位置参数:'y', 【发布时间】:2021-10-19 05:42:42 【问题描述】:

我想尝试库中的所有回归器。 因为我知道,一些回归器需要更多输入,所以我构建了 try 和 expept catch 块。

for name, estimator in sklearn.utils.all_estimators(type_filter='regressor'):
    model =  make_pipeline(StandardScaler(), estimator)
    try:
        scores =  cross_validate(model, X, y, scoring='r2')
        print(name, ': ', np.mean(scores['test_score']))
    except:
        print('Does not get printed.')

这会多次返回以下片段:

FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
  File "venvpath\lib\site-packages\sklearn\model_selection\_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "venvpath\venv\lib\site-packages\sklearn\pipeline.py", line 346, in fit
    self._final_estimator.fit(Xt, y, **fit_params_last_step)
TypeError: fit() missing 1 required positional argument: 'y'

在我看来这里有两个问题。 首先, exept 永远不会被调用。 其次,y输入不被识别。

我很感激任何形式的帮助。

【问题讨论】:

【参考方案1】:

all_estimators 不返回估计器的实例,而只返回它们的类(参见documentation)。在定义管道时,您应该实例化该类的对象:

for name, estimator in sklearn.utils.all_estimators(type_filter='regressor'):
    model =  make_pipeline(StandardScaler(), estimator()) # <-- change in this line

注意estimator 后面的()。现在您有了可以拟合数据的实际对象。


关于except 块:默认情况下,如果发生错误,cross_validate 只会将np.nan 分配给分数。要真正引发错误,请在 cross_validate 中设置 error_score='raise'

scores =  cross_validate(model, X, y, scoring='r2', error_score='raise')

【讨论】:

代码现在运行。 except 块仍然不适用于需要更多输入的估计器 @TomS 你需要在cross_validate 中设置error_score='raise'。编辑了答案。

以上是关于TypeError: fit() 缺少 1 个必需的位置参数:'y',的主要内容,如果未能解决你的问题,请参考以下文章

实现逻辑回归“TypeError:fit() 缺少 1 个必需的位置参数:'y'”

TypeError:fit_resample()缺少1个必需的位置参数:'y'[关闭]

“fit() 缺少 1 个必需的位置参数:'y'”错误

python缺少1个必需的位置参数[重复]

逻辑回归:fit() 缺少 1 个必需的位置参数:'y'

Python sklearn 线性回归错误:fit() 缺少 1 个必需的位置参数:'y'"