我需要定义一个生成混淆矩阵的函数。所以我有两个向量,y_label
和y_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_label
和y_predict
合并成一个元组数组,然后使用dict-zip技术,类似于这里:
How to count the occurrence of certain item in an ndarray in Python?
但是我的解决方案仍然有些朦胧。请确认是否也可以。
答案 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]])