A matriz de confusão é uma maneira de tabular o número de erros de classificação, ou seja, o número de classes previstas que terminaram em uma posição errada na classificação com base nas classes verdadeiras.
Enquanto sklearn.metrics.confusion_matrix fornece uma matriz numérica, acho mais útil gerar um 'relatório' usando o seguinte:
import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
o que resulta em:
Predicted 0 1 2 All
True
0 3 0 0 3
1 0 1 2 3
2 2 1 3 6
All 5 2 5 12
Isso nos permite ver que:
- Os elementos diagonais mostram o número de classificações corretas para cada classe: 3, 1 e 3 para as classes 0, 1 e 2.
- Os elementos fora da diagonal fornecem as classificações incorretas: por exemplo, 2 da classe 2 foram classificadas incorretamente como 0, nenhuma da classe 0 foi classificada incorretamente como 2, etc.
- O número total de classificações para cada classe nos dois
y_true
e y_pred
, dos subtotais "Todos"
Esse método também funciona para rótulos de texto e, para um grande número de amostras no conjunto de dados, pode ser estendido para fornecer relatórios de porcentagem.
import numpy as np
import pandas as pd
# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())
A saída é então:
Predicted biscuit cake candy chocolate praline shortbread
True
biscuit 23.529412 10 23.076923 13.333333 15.384615 9.090909
cake 17.647059 20 0.000000 26.666667 15.384615 18.181818
candy 11.764706 20 23.076923 13.333333 23.076923 31.818182
chocolate 11.764706 5 15.384615 6.666667 15.384615 13.636364
praline 17.647059 10 30.769231 20.000000 0.000000 13.636364
shortbread 17.647059 35 7.692308 20.000000 30.769231 13.636364
onde os números agora representam a porcentagem (e não o número de casos) dos resultados que foram classificados.
Embora observe que a sklearn.metrics.confusion_matrix
saída pode ser visualizada diretamente usando:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()