从两个向量构建混淆矩阵

时间:2018-04-25 12:07:09

标签: python numpy

我需要定义一个生成混淆矩阵的函数。所以我有两个向量,y_labely_predict,其元素值为0,1,2。该函数的目标是创建标签计数:

  | 0 | 1 | 2 |
--------------
0 |   |   |   |
--------------
1 |   |   |   |
--------------
2 |   |   |   |
--------------

例如,cm[0,1]应该包含每个i的y_label [i] = 0和y_predict [i] = 1的元素计数。

到目前为止,这就是我所做的:

def get_confusion_matrix(y_label, y_fit):

    cm = np.ndarray([3,3])

    for i in range(3):
        for j in range(3):
            cm[i, j] = ....

    return cm

当然,我可以轻松地进行多级for循环来计算,但是如果Python / numpy中存在捷径,我想避免这种情况。

我也在考虑将y_labely_predict合并成一个元组数组,然后使用dict-zip技术,类似于这里:

How to count the occurrence of certain item in an ndarray in Python?

但是我的解决方案仍然有些朦胧。请确认是否也可以。

2 个答案:

答案 0 :(得分:2)

您可以使用scikit learn中的confusion_matrix函数。它似乎产生了你所追求的。

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)

答案 1 :(得分:2)

以下是使用numpy.add.at创建混淆矩阵的快捷方法。

首先,这里有一些示例数据:

In [93]: y_label
Out[93]: array([2, 2, 0, 0, 1, 0, 0, 2, 1, 1, 0, 0, 1, 2, 1, 0])

In [94]: y_predict
Out[94]: array([2, 1, 0, 0, 0, 0, 0, 1, 0, 2, 2, 1, 0, 0, 2, 2])

创建包含零的数组cm,然后在每个索引(y_label[i], y_predict[i])添加1:

In [95]: cm = np.zeros((3, 3), dtype=int)

In [96]: np.add.at(cm, [y_label, y_predict], 1)

In [97]: cm
Out[97]: 
array([[4, 1, 2],
       [3, 0, 2],
       [1, 2, 1]])