Матрица путаницы возвращает одну матрицу - PullRequest
0 голосов
/ 22 октября 2018

Я обнаружил проблему с матрицей путаницы в Scikit.

Я использую матрицу путаницы внутри KFold, затем, когда y_true и y_pred верны на 100%, матрица путаницы возвращает одно число.Это делает мою переменную матрицы недоразумений сломанной, потому что я добавляю результат из матрицы недоразумений в каждый раз.У кого-нибудь есть решение для этого?

Вот мой код

model = MultinomialNB()
kf = KFold(n_splits=10)
cf = np.array([[0, 0], [0, 0]])
for train_index, test_index in kf.split(x):
    x_train, x_test = x[train_index], x[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test)
    cf += confusion_matrix(y_test, y_pred)

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Самый простой способ - передать список всех возможных классов в качестве аргумента 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 будет более надежным.

0 голосов
/ 22 октября 2018

Сначала вы можете проверить, все ли pred_values равны true_values.Если это так, то просто увеличьте значения 00 и 11 матрицы смешения на true_values (или pred_values).

X = pd.DataFrame({'f1': [1]*10 + [0]*10,
                  'f2': [3]*10 + [10]*10}).values
y = np.array([1]*10 + [0]*10)
model = MultinomialNB()
kf = KFold(n_splits=5)
cf = np.array([[0, 0], [0, 0]])
for train_index, test_index in kf.split(X):
    x_train, x_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test)
    if all(y_test == y_pred): # if perfect prediction
        cf[0][0] += sum(y_pred == 0) # increment by number of 0 values
        cf[1][1] += sum(y_pred == 1) # increment by number of 1 values
    else:
        cf += confusion_matrix(y_test, y_pred) # else add cf values

Результат print(cf)

>> [10  0]
   [0  10]

Будьте осторожны с переоснащением

...