如何基于multi-index value_counts绘制混淆矩阵热力图
混淆矩阵热力图实现方案
步骤1:将多索引计数结果转为二维矩阵
df.value_counts()返回的是多级索引的一维Series,无法直接传入热力图接口,调用unstack()即可将其转换为行对应result、列对应predict的二维混淆矩阵:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 转换为二维矩阵 confusion_mat = df[["result", "predict"]].value_counts().unstack() # 可选:手动固定行列顺序,避免布尔值排序不符合预期 confusion_mat = confusion_mat.reindex(index=[True, False], columns=[True, False])
转换后矩阵结构和给出的计数完全对应:
| predict=True | predict=False | |
|---|---|---|
| result=True | 886 | 995 |
| result=False | 35 | 28 |
步骤2:调用seaborn绘制热力图
使用seaborn.heatmap接口,开启单元格数值标注即可完成绘制:
plt.figure(figsize=(6, 5)) sns.heatmap( confusion_mat, annot=True, # 显示单元格内的计数值 fmt="d", # 指定数值格式为整数 cmap="Blues", # 指定配色 cbar=False # 可选:隐藏右侧色条,二分类混淆矩阵可以不需要 ) plt.xlabel("预测列 predict") plt.ylabel("真实列 result") plt.title("预测结果混淆矩阵") plt.show()
可选替代方案
如果不需要复用value_counts()的结果,也可以直接从原始两列数据生成矩阵,不需要手动做计数统计:
from sklearn.metrics import confusion_matrix # 直接生成混淆矩阵,labels参数指定标签顺序 confusion_mat = confusion_matrix( y_true=df["result"], y_pred=df["predict"], labels=[True, False] ) # 后续绘图代码和上述流程完全一致
内容的提问来源于stack exchange,提问作者David Davó
相关产品推荐
相关产品推荐

