如何分析混淆矩阵?

时间:2016-01-28 13:19:32

标签: python matrix scikit-learn confusion-matrix

当我打印出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]]

3 个答案:

答案 0 :(得分:6)

IIUC,您的问题未定义。 “误报”,“真正的否定” - 这些是仅为二元分类定义的术语。详细了解confusion matrix的定义。

在这种情况下,混淆矩阵的维度为 N X N 。对于条目(i,i),每个对角线表示预测为 i 并且结果也是 i 的情况。任何其他非对角线条目表示预测为 i 且结果为 j 的一些错误。在这种情况下,“积极”和“消极”没有任何意义。

您可以使用np.diagonal轻松找到诊断元素,然后很容易将它们相加。错误情况的总和是矩阵减去对角线总和的总和。

答案 1 :(得分:1)

true positive false positive 等术语指二进制分类。而混淆矩阵的维数大于2。因此,您只能谈论已知在第i组中但预测在第j组中的观测数量(混淆矩阵的定义)。

答案 2 :(得分:1)

方法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中每个班级的分类总数,来自"所有"小计
  4. 此方法也适用于文本标签,并且可以扩展数据集中的大量样本以提供百分比报告。