如何分析混淆矩阵?

4
当我打印出scikit-learn的混淆矩阵时,我会收到一个非常巨大的矩阵。我想分析哪些是真正的阳性、真正的阴性等等。我该怎么做呢?这是我的混淆矩阵的样子。我希望更好地理解它。
[[4015  336    0 ...,    0    0    2]
 [ 228 2704    0 ...,    0    0    0]
 [   4    7   19 ...,    0    0    0]
 ..., 
 [   3    2    0 ...,    5    0    0]
 [   1    1    0 ...,    0    0    0]
 [  13    1    0 ...,    0    0   11]]

顺便说一句,如果你想练习分析混淆矩阵的能力,这里有一个测验网站:https://www.mattobrien.me/ - tumultous_rooster
3个回答

7
IIUC,你的问题没有定义。 "假阳性","真阴性" - 这些术语仅适用于二元分类。请阅读有关混淆矩阵定义的更多信息。
在这种情况下,混淆矩阵的维度是N×N。每个对角线表示输入(i,i)的情况,其中预测为i且结果也是i。任何其他非对角线条目都表示某些错误,其中预测为i而结果是j。在这种情况下,“正”和“负”的含义并没有意义。
您可以使用np.diagonal轻松找到对角线元素,并在此基础上很容易求和。错误情况的总和是矩阵的总和减去对角线之和。

2

诸如真正例假正例等术语是与二元分类相关的。然而,您的混淆矩阵的维度大于二。因此,您只能谈论已知属于第i组但被预测为第j组的观察数量(混淆矩阵的定义)。


1
方法一:二分类
from sklearn.metrics import confusion_matrix as cm
import pandas as pd

y_test = [1, 0, 0]
y_pred = [1, 0, 0]
confusion_matrix=cm(y_test, y_pred)

list1 = ["Actual 0", "Actual 1"]
list2 = ["Predicted 0", "Predicted 1"]
pd.DataFrame(confusion_matrix, list1,list2)

enter image description here

方法2:多类别分类

虽然sklearn.metrics.confusion_matrix提供了一个数字矩阵,但您可以使用以下方法生成一个“报告”:

import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])

pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)

这句话的意思是:“导致了以下结果:”。
Predicted  0  1  2  All
True                   
0          3  0  0    3
1          0  1  2    3
2          2  1  3    6
All        5  2  5   12

这使我们能够看到:
  1. 对于每个类别,对角线元素显示正确分类的数量:类别0、1和2的正确分类分别为3、1和3。
  2. 非对角线元素提供了错误分类情况:例如,有2个类别2被错误地分类为0,没有任何一个类别0被错误地分类为2,等等。
  3. 每个类别在y_truey_pred中的总分类数,从"All"小计中得出。
此方法也适用于文本标签,并且对于数据集中的大量样本可以扩展以提供百分比报告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接