Scikit-Learn: метки не совпадают в матрице путаницы - PullRequest
1 голос
/ 14 февраля 2020

Допустим, у меня есть массив с (потенциально) 43 различными значениями, например,

import pandas as pd
Y_test = pd.Series([4,4,4,42,42,0,1,1,19], dtype=int)
Y_hat = pd.Series([4,4,2,32,42,0,5,5,19], dtype=int)

Всякий раз, когда я пытаюсь построить матрицу путаницы с:

def create_conf_mat(index, y_test, y_hat):
    cm = confusion_matrix(y_test, y_hat)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    cax = ax.matshow(cm)
    plt.title(f'Confusion Matrix ({index} features, 1 outcome)')
    fig.colorbar(cax)
    plt.xlabel('Predicted')
    plt.ylabel('Actual')
    plt.savefig(f'confm_{index}.png')
    plt.savefig(f'confm_{index}.svg')
    plt.savefig(f'confm_{index}.pdf')
    return

Я не делаю получить метки [0, 1, 2, 4, 5, 19, 32, 42], но [0, 1, 2, 3, 4, 5, 6, 7]. Я попытался установить метки явно, используя уникальные значения в y_test / y_hat в качестве аргумента меток, но это тоже не работает. Я даже пытался преобразовать целочисленные значения в строки, но при этом sklearn жалуется, что хотя бы одна метка должна быть в y_true. Кто-нибудь знает, как я мог получить фактические значения в y_test и y_pred, чтобы быть нанесены в виде меток в матрице путаницы?

1 Ответ

0 голосов
/ 14 февраля 2020

Как указано в документации , о параметре labels для confusion_matrix:

Если задано None, те, которые появляются хотя бы один раз в y_true или y_pred используются в отсортированном порядке.

Итак, нам нужно собрать вместе оба списка и извлечь список уникальных чисел:

labels = np.unique(np.concatenate([y_test.values, y_hat.values]))
plt.xticks(range(len(labels)), labels)
plt.yticks(range(len(labels)), labels)

result

Обратите внимание, что последняя версия scikit-learn теперь включает в себя интегрированную функцию для построения матрицы путаницы с примером кода .

...