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'”