You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现KNN分类时混淆矩阵输出双矩阵无法绘图问题

问题根因

报错和数据集无关,是代码中混淆矩阵函数导入错误导致的。
你当前代码把sklearn.metrics里的multilabel_confusion_matrix重命名为confusion_matrix调用,这个函数的设计逻辑是给多标签/多分类任务的每个类别单独生成一个二分类混淆矩阵:你的情感分类是二分类任务,它就会分别输出负类、正类两个独立的2*2矩阵,最终返回形状为(2,2,2)的三维数组。而seaborn的heatmap仅支持二维数组输入,自然会抛出维度不匹配的错误。

修改方案

第一步:替换混淆矩阵导入语句

把原代码里的导入行:

from sklearn.metrics import multilabel_confusion_matrix as confusion_matrix

替换为标准的全局混淆矩阵导入:

from sklearn.metrics import confusion_matrix

替换后调用confusion_matrix()会直接返回单个二维矩阵:二分类场景下就是你需要的2*2结构,完全匹配绘图的输入要求。

第二步:优化绘图逻辑(避免标签错位)

原代码存在两个细节问题:一是混淆矩阵的参数顺序写反了(第一个参数应传真实标签,第二个传预测标签),二是直接写死tick标签为False/True很容易和实际标签顺序错位,建议计算混淆矩阵时显式指定标签顺序,对应调整标签文本即可,参考代码如下:

# labels里的0、1替换成你数据集里实际的负向、正向情感对应的取值
cm = confusion_matrix(Y_test, Y_pred_knn, labels=[0, 1]) 
cr = classification_report(Y_test, Y_pred_knn)
print(cm)
print(cr)

plt.figure(figsize=(6,5))
ax = sns.heatmap(cm, annot=True, cmap='Blues', fmt='d')
ax.set_title('KNN分类混淆矩阵\n\n')
ax.set_xlabel('\n预测标签')
ax.set_ylabel('真实标签')
# 标签顺序和上面labels参数的顺序一一对应
ax.xaxis.set_ticklabels(['负向', '正向'])
ax.yaxis.set_ticklabels(['负向', '正向'])
plt.show()

额外说明:你代码前面写的TF-IDF特征计算逻辑没有实际用到训练流程里,后续如果计划用TF-IDF代替CountVectorizer做文本特征可以自行调整,这部分不影响本次报错的修复。

内容的提问来源于stack exchange,提问作者Hollywrith T. Nainggolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:48:21