Issue
I need to define a function that generates a confusion matrix. So I have two vectors, y_label
and y_predict
, the element values of which are either 0, 1, 2. The goal of the function is to create a count of labels:
| 0 | 1 | 2 |
--------------
0 | | | |
--------------
1 | | | |
--------------
2 | | | |
--------------
For example, cm[0,1]
should contain counts of elements where y_label[i] = 0 and y_predict[i] = 1, for every i.
So far, this is what I’ve done:
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
Of course, I can easily do multiple-level for
loops to count, but I want to avoid that if there are short cuts in Python / numpy.
I’m thinking also of making y_label
and y_predict
merged to become an array of tuples, then using dict-zip technique, similar to here:
How to count the occurrence of certain item in an ndarray in Python?
But the solution is still a bit hazy on my head. Please confirm if this is also possible.
Solution
Here’s a quick way to create the confusion matrix, using numpy.add.at
.
First, here’s some sample data:
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])
Create the array cm
containing zeros, and then add 1 at each index (y_label[i], y_predict[i])
:
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]])
Answered By – Warren Weckesser
This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0