混淆矩阵需用confusion_matrix计算后配合confusionmatrixdisplay可视化,输入为原始预测标签而非概率;roc曲线必须使用正类概率估计,多分类需onevsrestclassifier转ovr。

混淆矩阵怎么画?用 confusion_matrix 和 ConfusionMatrixDisplay 最稳
直接调 confusion_matrix 只返回一个二维数组,没法看;得配合 ConfusionMatrixDisplay 才能可视化。注意:输入必须是原始预测标签(y_pred),不是概率——如果模型输出的是概率,先用 np.argmax() 或 model.predict() 转成类别索引。
常见错误:y_true 和 y_pred 长度不一致,或类别数对不上(比如训练时有 3 类,但测试集漏了某类,显示会错位)。建议加一句 labels=np.unique(y_true) 显式指定标签顺序。
- 二分类场景下,
normalize="true"能看召回率,normalize="pred"看精确率 - 多分类时,颜色深浅依赖归一化方式,不归一容易因样本不均衡掩盖问题
- 如果模型没做
class_weight或采样,混淆矩阵里对角线外的块可能一大片非零——这不是画错了,是模型真偏了
ROC曲线必须用概率,predict_proba 别误用成 predict
roc_curve 和 auc 的输入要求是“正类的概率估计”,不是硬分类结果。用 model.predict() 得到的 0/1 值算不出 ROC——它只有一两个阈值点,画出来就是折线段,不是曲线。
不同模型获取概率的方式不同:LogisticRegression 用 predict_proba()[:, 1];RandomForestClassifier 同理;但 SVC 默认不输出概率,得设 probability=True 再训练,否则 predict_proba 报 AttributeError。
- 多分类要转为“一对全”(OvR):用
OneVsRestClassifier包一层,再对每个类单独算 ROC -
roc_curve返回的fpr/tpr是数组,直接传给plt.plot(fpr, tpr)就行,别用scatter - 如果 AUC roc_auc_score 对正类标签敏感
sklearn 1.2+ 的 RocCurveDisplay.from_estimator 省事但有坑
这个接口封装了预测、计算、绘图全流程,一行就能出图:RocCurveDisplay.from_estimator(clf, X_test, y_test)。但它默认只处理二分类,且要求 y_test 是二值(0/1),不能是字符串或从 1 开始的整数(如 [1, 2])。
容易被忽略的点:它内部调用 predict_proba,所以 SVC 还是得提前开 probability=True;另外,如果数据里正例比例极低(
- 想标出某个特定阈值点(比如 0.5),加参数
drop_intermediate=False并手动找最近的fpr/tpr - 和混淆矩阵共用同一组
y_test时,确保两者标签编码一致(都用LabelEncoder处理过) - 该方法不支持自定义
pos_label参数,如果正类不是 1,得先重映射标签
多分类 ROC 不能直接套用二分类逻辑
多分类没有单一的 ROC 曲线,标准做法是:对每个类,把它当正类、其余当负类,分别算 OvR ROC,再平均(宏平均或微平均)。sklearn 的 roc_auc_score 支持 multi_class="ovr",但前提是输入是 predict_proba 的完整二维数组(shape=(n_samples, n_classes)),不能只取某一列。
宏平均(average="macro")给每个类等权重,适合类别不平衡场景;微平均(average="micro")按样本数加权,更反映整体判别能力。两者结果常不一致——如果某类样本极少但 AUC 很低,宏平均会明显拉低总分,而微平均可能掩盖它。
- 别用
classification_report里的 f1-score 混淆 ROC 解读:F1 关注阈值 0.5,ROC 关注所有阈值 - 如果有类别语义层级(比如疾病分级),需考虑层次化 ROC,sklearn 不原生支持,得自己实现
- 绘图时建议用不同线型区分各类 ROC,避免颜色盲用户无法分辨
y_test 编码方式、predict_proba 维度、正类定义这三处错一个,ROC 就会偏移或报错。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











