使用RandomizedSearchCV调优XGBoost分类器时precision_score报错怎么办
RandomizedSearchCV调用precision_score报错缺少y_pred参数问题排查
问题复现场景
- 任务目标:使用RandomizedSearchCV训练XGBoost文本分类器
- 数据预处理流程:
- 拆分数据集为训练集、测试集
- 使用
CountVectorizer完成词袋特征提取 - 使用
TfidfTransformer完成TF-IDF特征转换
- 评估配置:定义多评估指标字典,包含
precision_score、f1_score、recall_score、accuracy_score,初始化RandomizedSearchCV时指定refit='precision_score' - 异常表现:运行时报
TypeError,提示precision_score缺少必填位置参数y_pred;替换为GridSearchCV后代码可正常运行
根因分析
该问题由scikit-learn旧版本中RandomizedSearchCV与GridSearchCV对评估指标的传参逻辑不一致导致:
你直接将sklearn.metrics.precision_score这类原生指标函数传入评估字典,而RandomizedSearchCV的多指标评估逻辑要求传入的评估器必须满足scorer(estimator, X, y_true)的调用格式,原生指标函数的签名为metric(y_true, y_pred, *),传参顺序不匹配就会触发参数缺失报错;旧版本GridSearchCV对原生指标函数做了额外兼容处理,因此可以正常运行。
解决方案
方案1:用make_scorer包装原生指标函数
所有指标统一使用sklearn.metrics.make_scorer包装,适配RandomizedSearchCV的调用规范,示例代码如下:
from sklearn.metrics import make_scorer, precision_score, f1_score, recall_score, accuracy_score # 包装后的scorer会自动调用模型预测得到y_pred再传入指标函数 scoring_dict = { 'precision_score': make_scorer(precision_score), 'f1_score': make_scorer(f1_score), 'recall_score': make_scorer(recall_score), 'accuracy_score': make_scorer(accuracy_score) }
方案2:升级scikit-learn到1.0及以上版本
新版本scikit-learn已经统一了两类参数搜索工具的指标处理逻辑,原生支持直接传入(y_true, y_pred)格式的指标函数到多评估字典中。
内容的提问来源于stack exchange,提问作者tunned
相关产品推荐
相关产品推荐

