Матрица путаницы с табулированием Python

В моей модели логистической регрессии sklearn я получил матрицу путаницы с помощью команды metrics.confusion_matrix. Массив выглядит так

array([[51,  0],
   [26,  0]])

Игнорируя тот факт, что модель работала довольно плохо, я пытаюсь понять, как лучше всего свести эту матрицу в таблицу.

Я пытаюсь использовать пакет tabulate, и этот код частично работает для меня

print tabulate(cm,headers=['Pred True', 'Pred False']) 

как это дает вывод

  Pred True    Pred False
-----------  ------------
     51             0
     26             0

ИЗМЕНИТЬ

Чтобы вставить имена строк, я понял, что вставка элементов, а не zip, поможет

cm_list=cm.tolist()
cm_list[0].insert(0,'Real True')
cm_list[1].insert(0,'Real False')
print tabulate(cm_list,headers=['Real/Pred','Pred True', 'Pred False'])

как это дает

Real/Pred      Pred True    Pred False
-----------  -----------  ------------
Real True             51             0
Real False            26             0

Тем не менее, все же хотелось бы знать, есть ли более быстрый или альтернативный способ украсить матрицу путаницы. (Я нашел несколько примеров построения графиков в Интернете, но мне это не нужно)

Спасибо,


person PagMax    schedule 23.02.2016    source источник


Ответы (2)


Думали ли вы о создании фигуры, а не стола? Адаптировав некоторый код из примера scikit-learn, вы можете получить прилично выглядящий рисунок, который показывает, что вы хотите.

import numpy as np
from matplotlib import pyplot as plt

def plot_confusion_matrix(cm, target_names, title='Confusion matrix', cmap=plt.cm.Blues):
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(target_names))
    plt.xticks(tick_marks, target_names, rotation=45)
    plt.yticks(tick_marks, target_names)
    plt.tight_layout()

    width, height = cm.shape

    for x in xrange(width):
        for y in xrange(height):
            plt.annotate(str(cm[x][y]), xy=(y, x), 
                        horizontalalignment='center',
                        verticalalignment='center')
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

cm = np.array([[13,  0,  0],[ 0, 10,  6],[ 0,  0,  9]])
plot_confusion_matrix(cm, ['A', 'B', 'C'])

график матрицы путаницы matplotlib

person piman314    schedule 24.02.2016
comment
Выглядит хорошо, и да, я думал об этом, но я просто подумал, что это излишество для моих нужд. Тем не менее, ваш сюжет намного чище, и то, что числа появляются в полях, делает его привлекательной альтернативой. - person PagMax; 24.02.2016
comment
Ах, извините, я не понял, что вы смотрели на это. Я всегда предпочитаю визуальное представление, оно масштабируется намного лучше, чем таблица, которая может быть перегружена большим количеством меток. - person piman314; 24.02.2016

Библиотека nltk включает матрицу путаницы, которая проста в использовании и дает более приятный результат, чем scikit-learn:

from nltk import ConfusionMatrix
print(ConfusionMatrix(list(y_true_values), list(y_predicted_values)))

Вы можете увидеть пример вывода здесь. Обратите внимание, что я обернул y_true_values и y_predicted_values в функцию list(), потому что ConfusionMatrix ожидает списки Python, а не массивы NumPy, выводимые scikit-learn.

Кроме того, библиотека mlxtend включает функцию для построения матрицы путаницы, описанную здесь.

person Kevin Markham    schedule 24.02.2016