多类不平衡分类任务中K折交叉验证配置f1/召回/精确率评分的报错问题
报错核心原因
- 触发
ValueError: Target is multiclass but average='binary'的本质:sklearn内置的字符串打分值'f1'是专门给二分类场景设计的,内部固定使用average='binary'参数计算F1值,碰到4类多分类任务自然会触发参数校验错误。 - 触发
TypeError: cross_val_score() got an unexpected keyword argument 'average'的本质:这是典型的参数边界混淆——average是f1_score()指标函数的专属入参,不属于cross_val_score()接口的可接收参数范围,直接传入会被识别为非法关键字参数。
适配多分类不平衡场景的正确实现
方式1:直接使用多分类专属的内置打分字符串
针对加权平均F1的需求(适配类别不平衡,按各类样本占比加权计算最终F1,不会被小样本类别的计算结果干扰),直接替换scoring的参数值即可,无需额外传参:
accuracies = cross_val_score( estimator = classifier_RF, X = X_train, y = Y_train, cv = 10, scoring = 'f1_weighted' ) print("加权F1_Score: {:.2f} %".format(accuracies.mean()*100)) print("标准差: {:.2f} %".format(accuracies.std()*100))
其他可选的多分类F1打分值参考:
f1_micro:全局汇总所有类别的真阳性、假阳性、假阴性结果计算F1,不区分类别f1_macro:先计算每个独立类别的F1值,再取算术平均,不考虑不同类别的样本量差异f1_weighted:按每个类别的样本占比对单类F1值加权计算,最适合当前4类不平衡数据集的评估需求
方式2:自定义打分器绑定自定义参数
如果需要给F1计算设置额外规则(比如设置zero_division=0避免小类别在某一折交叉验证中无样本时触发除零警告),可以通过make_scorer提前把参数绑定到打分逻辑上,再传入交叉验证接口:
from sklearn.metrics import make_scorer, f1_score # 提前固定F1计算的参数规则 custom_f1_scorer = make_scorer( f1_score, average='weighted', zero_division=0 ) accuracies = cross_val_score( estimator = classifier_RF, X = X_train, y = Y_train, cv = 10, scoring = custom_f1_scorer )
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

