如何解释Sklearn混淆矩阵


24

我正在使用混淆矩阵来检查分类器的性能。

我正在使用Scikit-Learn,我有点困惑。我如何解释结果

from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

我该如何判断这个预测值是好还是不好。


1
最初忘了sklearn,那是一条红鲱鱼。您误会的根源似乎更为根本。在这里查看:en.wikipedia.org/wiki/Confusion_matrix。专注于Wikipedia页面上3 * 3示例的叙述。无论您有什么困惑,这很可能会解决。
2014年

Answers:


47

混淆矩阵是一种对错误分类的数量进行制表的方法,即错误分类的数量,即基于真实分类最终出现在错误分类箱中的预测分类的数量。

尽管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_true和中y_pred的所有类别的分类总数(来自“全部”小计)

此方法也适用于文本标签,并且可以扩展数据集中的大量样本以提供百分比报告。

import numpy as np
import pandas as pd

# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])

pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())

输出为:

Predicted     biscuit  cake      candy  chocolate    praline  shortbread
True                                                                    
biscuit     23.529412    10  23.076923  13.333333  15.384615    9.090909
cake        17.647059    20   0.000000  26.666667  15.384615   18.181818
candy       11.764706    20  23.076923  13.333333  23.076923   31.818182
chocolate   11.764706     5  15.384615   6.666667  15.384615   13.636364
praline     17.647059    10  30.769231  20.000000   0.000000   13.636364
shortbread  17.647059    35   7.692308  20.000000  30.769231   13.636364

现在,数字代表已分类结果的百分比(而非病例数)。

请注意,sklearn.metrics.confusion_matrix可以使用以下命令直接查看输出:

import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()

4
欢迎来到我们的网站!非常感谢您在这里给您的第一答案的关心和品质。
ub

1
第一个示例至少在pandas-0.13.1上不再有效。我刚刚升级到pandas-0.16.0,仍然收到相同的错误:AssertionError: arrays and names must have the same length
chbrown

1
@chbrown:似乎在熊猫中发生了一些变化,需要将其设置为数组或系列。我已经更新了示例代码以使用y_pred = pd.Series(...)。现在应该可以使用了。
achennu

5

在y轴上,混淆矩阵具有实际值,在x轴上,具有预测变量给出的值。因此,对角线上的计数是正确预测的数量。对角线的元素是不正确的预测。

在您的情况下:

>>> confusion_matrix(y_true, y_pred)
    array([[2, 0, 0],  # two zeros were predicted as zeros
           [0, 0, 1],  # one 1 was predicted as 2
           [1, 0, 2]]) # two 2s were predicted as 2, and one 2 was 0

这有点令人困惑(您说“#1 1被预测为2”-对角线为0),我有一个50K元素的矩阵,很难投影所有值。有什么指标可以直接给我这些结果吗?(我的意思是,如果我得到的混淆矩阵很好,或者没有)。
user3378649 2014年

1
您可以查看对角线上的元素,这些是您的正确预测,非对角线元素则是错误的预测。那是一个开始。
Akavall

我得到两个不同的结果。在目标中,我们有两个标签“ 0”或“ 1”。您能帮忙提示一下如何将这些结果相互解释。-confusion_matrix:[[0 85723] [0 77]]-confusion_matrix:[[85648 75] [75 2]]
user3378649 2014年

1

我想以图形方式指定需要理解的内容。这是一个简单的矩阵,在得出结论之前需要充分理解。因此,这是上述答案的简化解释版本。

        0  1  2   <- Predicted
     0 [2, 0, 0]  
TRUE 1 [0, 0, 1]  
     2 [1, 0, 2] 

# At 0,0: True value was 0, Predicted value was 0, - 2 times predicted
# At 1,1: True value was 1, Predicted value was 1, - 0 times predicted
# At 2,2: True value was 2, Predicted value was 2, - 2 times predicted
# At 1,2: True value was 1, Predicted value was 2, - 1 time predicted
# At 2,0: True value was 2, Predicted value was 0, - 1 time predicted...
...Like that

4
您能否编辑此内容以说明您认为它超出了已经给出的答案的方式?
mdewey

1
嘿! 我刚刚提到了Akavall的答案。他提到了所涉及的思想。我刚刚以一种更好的方式解释了他的答案,该答案往往是正确的。
Pranzell '18

@Pranzell您能否分享您的代码以绘制出如此漂亮的基于文本的表格?
富DL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.