多分类任务下sklearn指标计算与XGBoost随机搜索报错求助
多分类任务指标计算报错解决方法
1 前两次准确率计算相关报错原因&解决方案
- 第一个报错
TypeError: accuracy_score() got an unexpected keyword argument 'average'的直接原因:sklearn的accuracy_score接口本身没有average参数,它的计算逻辑天然就是统计所有样本中预测正确的占比,原生支持多分类场景,不需要额外设置平均方式。 - 去掉average参数后抛出的
ValueError: Target is multiclass but average='binary'错误,并非accuracy_score抛出,是你代码中同时调用的f1_score、precision_score、recall_score这类指标抛出的:这类指标默认适配二分类场景,默认配置为average='binary',多分类场景必须手动指定平均策略。
正确的准确率+关联指标计算示例:
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score model = RandomForestClassifier(random_state=2) model.fit(X_train, y_train) preds = model.predict(X_test) # 准确率直接调用即可,不需要加average参数 accuracy = accuracy_score(y_test, preds) # 其他多分类指标需指定对应平均策略 f1 = f1_score(y_test, preds, average='micro') precision = precision_score(y_test, preds, average='micro') recall = recall_score(y_test, preds, average='micro')
2 XGBoost超参数搜索阶段报错原因&解决方案
第三个报错TypeError: precision_score() missing 2 required positional arguments: 'y_true' and 'y_pred'的核心原因是:你给make_scorer传入的是已经被调用的指标函数结果,而非函数本身,同时除f1之外的其他分类指标也没有配置多分类必需的average参数。
错误写法示例:
# 错误:precision_score加了括号相当于直接调用函数,此时未传入标注和预测结果自然报错 'precision_score': make_scorer(precision_score()),
正确的scorers配置写法:
from sklearn.metrics import make_scorer, f1_score, precision_score, recall_score, accuracy_score scorers = { # 注意:传函数本身不要加括号,多分类需要的average参数作为make_scorer的额外参数传入 'f1_score': make_scorer(f1_score, average='micro'), 'precision_score': make_scorer(precision_score, average='micro'), 'recall_score': make_scorer(recall_score, average='micro'), # accuracy_score不需要average参数,直接传函数本身即可 'accuracy_score': make_scorer(accuracy_score) }
额外注意:XGBoost的多分类配置需要补全num_class参数,指定你任务的实际类别数,否则也可能出现运行报错:
# 替换n_classes为你实际的分类类别数 xgb_model = XGBClassifier(n_jobs=-1, objective='multi:softmax', num_class=n_classes)
多分类平均策略选择说明
如果不清楚如何选择平均策略可参考:
- micro:先统计所有类别的TP、FP、FN总数量再计算指标,适合样本不均衡的场景
- macro:每个类别单独计算指标后直接求算术平均,不考虑类别样本量差异
- weighted:每个类别单独计算指标后按类别样本量加权平均,是多分类场景最常用的配置
- None:返回每个类别的单独指标值
内容的提问来源于stack exchange,提问作者tunned
相关产品推荐
相关产品推荐

