Waz*_*aki 6 python matplotlib confusion-matrix scikit-learn
我正在使用 sklearn 库中的 ConfusionMatrixDisplay 在我拥有的两个列表上绘制混淆矩阵,虽然结果都是正确的,但有一个细节困扰着我。混淆矩阵中的颜色密度似乎与实例数量匹配,而不是与分类的准确性匹配。
这是我用来绘制混淆矩阵的代码:
target_names = ['Empty', 'Human', 'Dog', 'Dog&Human']
labels_names = [0,1,2,3]
print(classification_report(y_true, y_pred,labels=labels_names, target_names=target_names))
cm = confusion_matrix(y_true, y_pred,labels=labels_names)
disp = ConfusionMatrixDisplay(confusion_matrix=cm,display_labels=target_names)
disp = disp.plot(cmap=plt.cm.Blues,values_format='g')
plt.show()
Run Code Online (Sandbox Code Playgroud)
现在我从报告和混淆矩阵中得到的结果是:
正如您所看到的,“Dog”类和“Dog&Human”类都达到了精度 1,但“Dog”类的颜色是唯一具有浓蓝色的颜色。即使有一些错误分类实例的“空”类也有较深的颜色,使得分类看起来更好。这显然是由于每个类中的数据数量所致,但是,颜色不应该取决于分类的性能而不是正确检测到的实例数量吗?
我尝试标准化混淆矩阵,它解决了问题,但我更喜欢有一个显示实际数字而不是百分比的矩阵。有什么解决办法吗?多谢。
confusion_matrix函数允许您按行或列标准化矩阵,这有助于处理您面临的类不平衡问题。代替:
confusion_matrix(y_true, y_pred,labels=labels_names)
Run Code Online (Sandbox Code Playgroud)
只需通过:
confusion_matrix(y_true, y_pred,labels=labels_names,normalize='true')
Run Code Online (Sandbox Code Playgroud)
...按行标准化,我认为这就是你想要的。normalize='pred'将允许您按列标准化。请点击此处了解更多详情。