Matlab&python绘制混淆矩阵求解绘图,带百分比的混淆矩阵,颜色多变风格多样。


最近在模型评估的时候发现,带百分比的混淆矩阵比纯数字版本直观太多了。今天直接上代码,聊聊Matlab和Python两种实现方案,顺便分享几个配色魔改小技巧。

先说Matlab党怎么玩

官方自带的confusionchart函数其实藏了不少彩蛋。先看基础操作:

% 生成混淆矩阵
C = confusionmat(actual,predicted);
% 画图
figure;
cm = confusionchart(C, class_names);
cm.Title = 'Confusion Matrix (Counts)';

这时候出来的图只有原始数值。想要百分比?手动给每个格子加上标签:

% 转换为百分比
C_percent = C ./ sum(C,2) * 100; % 按行归一化

% 绘制双标签混淆矩阵
figure;
cm = confusionchart(C, class_names, ...
    'Title','Confusion Matrix with Percentage',...
    'Colormap', parula); % 换色秘籍在这

% 魔改标签内容
textObjs = cm.NodeChildren;
for i = 1:numel(textObjs)
    if strcmp(textObjs(i).Type, 'text')
        original = str2double(textObjs(i).String);
        percent = C_percent(textObjs(i).UserData==1);
        textObjs(i).String = sprintf('%.0f\n(%.1f%%)', original, percent);
    end
end

这里有个骚操作:通过NodeChildren属性挖出底层Text对象,把数值和百分比拼接显示。配色方案推荐试jet、hsv这类彩虹色系,注意别用默认的淡色系,对比度太低打印容易翻车。

Python选手这边更简单

sklearn+seaborn组合拳直接搞定:

import seaborn as sns
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_true, y_pred)
cm_percent = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] * 100

plt.figure(figsize=(10,8))
ax = sns.heatmap(cm, annot=True, fmt='d', 
                cmap='RdYlGn',  # 红黄绿经典配色
                linewidths=0.5,
                cbar_kws={'shrink': 0.8})

for i in range(cm.shape[0]):
    for j in range(cm.shape[1]):
        ax.text(j+0.5, i+0.5, 
                f"{cm[i,j]}\n({cm_percent[i,j]:.1f}%)",
                ha='center', va='center',
                color='black' if cm[i,j] < cm.max()/2 else 'white')  # 自动反色

重点是这个颜色判断逻辑——当格子底色太深时自动切换文字为白色,避免看不清。想玩点新配色可以试试cubehelix调色板,或者自定义渐变色:

from matplotlib.colors import LinearSegmentedColormap

custom_cmap = LinearSegmentedColormap.from_list(
    'diy', 
    ['#FFEEEE', '#FF9999', '#FF4444']  # 粉红渐变
)

最后提醒:混淆矩阵的归一化方向(按行/按列)直接影响百分比计算,医疗领域常用敏感度特异度得按行归一化,分类任务可能用总量归一化,别搞混了。可视化只是工具,背后的统计逻辑才是核心。


(代码测试环境:Matlab R2021a / Python 3.8 + sklearn 1.0.2)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐