如何修复使用make_pipeline时的TypeError: too many positional arguments错误
原代码
from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import make_pipeline from sklearn.model_selection import validation_curve def PolynomialRegression(degree=2, **kwargs): return make_pipeline(PolynomialFeatures(degree), LinearRegression(**kwargs)) train_score, val_score = validation_curve(PolynomialRegression(), X, y, 'polynomialfeatures__degree', degree, cv=7)
报错信息
File ~/opt/miniconda3/lib/python3.10/inspect.py:3108, in Signature._bind(self, args, kwargs, partial)
3104 else:
3105 if param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY):
3106 # Looks like we have no parameter for this positional
3107 # argument
-> 3108 raise TypeError(
3109 'too many positional arguments') from None
3111 if param.kind == _VAR_POSITIONAL:
3112 # We have an '*args'-like argument, let's fill it with
3113 # all positional arguments we have left and move on to
3114 # the next phase
3115 values = [arg_val]TypeError: too many positional arguments
问题分析与修复
错误根源在于validation_curve的参数传递逻辑:
- 模型参数错误:
validation_curve要求第一个参数是模型构造函数(而非已实例化的模型对象),你传入的PolynomialRegression()是已创建好的模型实例,导致函数无法动态生成不同参数的模型。 - 参数值未定义:代码中
degree变量未明确赋值,需要传入一个包含待测试多项式度数的列表。
修正后的代码:
from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from sklearn.pipeline import make_pipeline from sklearn.model_selection import validation_curve def PolynomialRegression(degree=2, **kwargs): return make_pipeline(PolynomialFeatures(degree), LinearRegression(**kwargs)) # 定义要测试的多项式度数范围 degrees = [1, 2, 3, 4, 5] train_score, val_score = validation_curve(PolynomialRegression, X, y, 'polynomialfeatures__degree', degrees, cv=7)
关键修正点
- 将
PolynomialRegression()改为PolynomialRegression:让validation_curve可以根据不同的degree参数动态实例化模型。 - 新增
degrees列表:明确指定要验证的多项式度数,替换未定义的degree变量。
内容的提问来源于stack exchange,提问作者zjohn

