Самый простой способ - передать список всех возможных классов в качестве аргумента labels
.Вот пример, который показывает проблему и ее решение (на основе поддельных данных об истинности и предсказаниях).
from sklearn.metrics import confusion_matrix
import numpy as np
y_test = np.array([1,1,1,1,1,0,0])
y_pred = np.array([0,1,1,1,1,0,0])
labels = np.unique(y_test)
cf = np.array([[0, 0], [0, 0]])
for indices in [ [0,1,2,3], [1,2,3] , [1,2,3,4,5,6]]:
cm1= confusion_matrix(y_test[indices], y_pred[indices])
cm2= confusion_matrix(y_test[indices], y_pred[indices], labels=labels)
print (cm1.shape == (2,2), cm2.shape == (2,2))
В первом подмножестве отображаются оба класса;но во втором подмножестве появляется только один класс, и поэтому матрица cm1 не имеет размер (2,2) (она получается как (1,1)).Но обратите внимание, что при указании всех потенциальных классов в labels
, cm2 всегда в порядке.
Если вы уже знаете, что метки могут быть только 0 или 1, вы можете просто назначить метки = [0,1],но использование np.unique
будет более надежным.