准确率在不平衡数据中失真,因全预测负类仍得高分;f1-score和roc-auc更可靠:前者平衡查准查全,后者衡量整体判别力;使用时须注意输入类型、average参数及交叉验证策略。

为什么准确率(Accuracy)在不平衡数据上会严重失真
当正样本只占0.1%,模型全预测为负,准确率仍达99.9%——这说明accuracy_score完全不可信。此时真正关键的是模型能否识别出少数类,而f1_score和roc_auc_score正是为此设计:前者平衡查准率与查全率,后者衡量分类器在所有阈值下的整体判别能力。
用f1_score评估时必须指定average参数
默认average='binary'只适用于二分类且y_pred是0/1标签;若传入的是概率或决策函数输出,会直接报错ValueError: Target is multiclass but average='binary'。常见错误操作是直接套用classification_report却忽略底层参数差异。
实操建议:
- 二分类任务中,若已有硬预测(0/1),用
f1_score(y_true, y_pred, average='binary') - 若使用概率输出(如
clf.predict_proba(X)[:, 1]),需先用threshold转为硬预测,或改用average='macro'配合pos_label - 多分类不平衡时,优先选
average='weighted',它按各类样本数加权,比macro更贴近实际业务影响
绘制ROC曲线前必须确认输入是概率或决策函数值
roc_curve和roc_auc_score都要求第二参数是连续型打分(如predict_proba的正类概率,或decision_function输出),而非0/1预测结果。传入y_pred会导致AUC恒为0.5或报错UndefinedMetricWarning: No positive samples in y_true。
实操建议:
- 对
LogisticRegression、RandomForestClassifier等支持predict_proba的模型,用y_score = clf.predict_proba(X)[:, 1] - 对SVM或LinearSVC,改用
y_score = clf.decision_function(X) - 计算AUC时,确保
y_true是二值(0/1),且至少含一个正例和一个负例,否则roc_auc_score返回nan
交叉验证中F1与ROC指标不能混用同一cv策略
用StratifiedKFold能保持每折正负样本比例一致,这对F1稳定很重要;但ROC-AUC对分布敏感——若某折里正样本极少(如仅2个),roc_curve生成的点过少,AUC估计偏差大。实践中见过5折CV中1折AUC=0.48,其余四折均>0.85,拉低整体可信度。
实操建议:
- F1评估用
StratifiedKFold(n_splits=5, shuffle=True, random_state=42) - ROC-AUC评估优先用
RepeatedStratifiedKFold(n_splits=3, n_repeats=2),增加抽样次数缓解单折偏差 - 永远检查每折的
y_true.sum(),若任意折正样本
average参数误设、y_score类型混淆、CV折内样本量不足——这三个点,任何一个没踩准,结果就失去比较意义。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











