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
相关产品推荐
相关产品推荐

