为何GridSearchCV用accuracy_score报错,scoring='accuracy'却正常?
GridSearchCV使用accuracy_score报错的原因与解决
问题场景
以下代码在VS Code的Jupyter笔记本中可正常运行:
from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import GridSearchCV X, y = load_iris(return_X_y=True, as_frame=True) gs = GridSearchCV(estimator=KNeighborsClassifier(), param_grid=[{'n_neighbors': [3]}], scoring='accuracy') # scoring=accuracy_score) gs.fit(X, y)
但取消注释scoring=accuracy_score并注释scoring='accuracy'后,会触发TypeError: too many positional arguments错误,同时伴随评分失败、测试分数为nan的警告。
错误原因
GridSearchCV的scoring参数对传入的对象有明确要求:
- 当传入字符串(如
'accuracy')时,sklearn会自动将其映射为适配GridSearchCV的评分器对象,这类评分器的调用签名是scorer(estimator, X, y),能接收模型实例、测试数据、真实标签三个参数,内部会自动用模型预测X的结果,再和y计算评分。 - 而直接传入
accuracy_score函数的话,它的原生签名是accuracy_score(y_true, y_pred, ...),只需要真实标签和预测标签两个核心参数,无法处理GridSearchCV传入的额外的estimator和X参数,因此会触发“参数过多”的类型错误。
解决方法
有两种可行的解决方式:
- 使用
make_scorer包装accuracy_score,将其转换为符合GridSearchCV要求的评分器:
from sklearn.metrics import make_scorer, accuracy_score gs = GridSearchCV(estimator=KNeighborsClassifier(), param_grid=[{'n_neighbors': [3]}], scoring=make_scorer(accuracy_score))
- 继续使用字符串
'accuracy',这是sklearn内置的标准化评分标识,无需额外包装,最简便。
内容的提问来源于stack exchange,提问作者Evan Aad
相关产品推荐
相关产品推荐

