tutorial instalar español ejemplos descargar python matplotlib

instalar - Cómo trazar una matriz de confusión con un eje de cadena en lugar de un entero en Python



plot() python (3)

Estoy siguiendo un hilo anterior sobre cómo trazar la matriz de confusión en Matplotlib. El guión es el siguiente:

from numpy import * import matplotlib.pyplot as plt from pylab import * conf_arr = [[33,2,0,0,0,0,0,0,0,1,3], [3,31,0,0,0,0,0,0,0,0,0], [0,4,41,0,0,0,0,0,0,0,1], [0,1,0,30,0,6,0,0,0,0,1], [0,0,0,0,38,10,0,0,0,0,0], [0,0,0,3,1,39,0,0,0,0,4], [0,2,2,0,4,1,31,0,0,0,2], [0,1,0,0,0,0,0,36,0,2,0], [0,0,0,0,0,0,1,5,37,5,1], [3,0,0,0,0,0,0,0,0,39,0], [0,0,0,0,0,0,0,0,0,0,38] ] norm_conf = [] for i in conf_arr: a = 0 tmp_arr = [] a = sum(i,0) for j in i: tmp_arr.append(float(j)/float(a)) norm_conf.append(tmp_arr) plt.clf() fig = plt.figure() ax = fig.add_subplot(111) res = ax.imshow(array(norm_conf), cmap=cm.jet, interpolation=''nearest'') for i,j in ((x,y) for x in xrange(len(conf_arr)) for y in xrange(len(conf_arr[0]))): ax.annotate(str(conf_arr[i][j]),xy=(i,j)) cb = fig.colorbar(res) savefig("confusion_matrix.png", format="png")

Me gustaría cambiar el eje para mostrar la cadena de letras, digamos (A, B, C, ...) en lugar de números enteros (0,1,2,3, ..10). ¿Cómo puede uno hacer eso? Gracias.

musa


Esto es lo que quieres:

from string import ascii_uppercase from pandas import DataFrame import numpy as np import seaborn as sn from sklearn.metrics import confusion_matrix y_test = np.array([1,2,3,4,5, 1,2,3,4,5, 1,2,3,4,5]) predic = np.array([1,2,4,3,5, 1,2,4,3,5, 1,2,3,4,4]) columns = [''class %s'' %(i) for i in list(ascii_uppercase)[0:len(np.unique(y_test))]] confm = confusion_matrix(y_test, predic) df_cm = DataFrame(confm, index=columns, columns=columns) ax = sn.heatmap(df_cm, cmap=''Oranges'', annot=True)

Ejemplo de salida de imagen está aquí:

Si desea una matriz de confusión más completa como el valor predeterminado de matlab , con totales (última línea y última columna) y porcentajes en cada celda, consulte este módulo a continuación.

Porque rastreé Internet y no encontré una matriz de confusión como esta en python y desarrollé una con estas mejoras y la compartí en git.

ÁRBITRO:

https://github.com/wcipriano/pretty-print-confusion-matrix

El ejemplo de salida está aquí:


Esto es lo que supongo que quieres:

import numpy as np import matplotlib.pyplot as plt conf_arr = [[33,2,0,0,0,0,0,0,0,1,3], [3,31,0,0,0,0,0,0,0,0,0], [0,4,41,0,0,0,0,0,0,0,1], [0,1,0,30,0,6,0,0,0,0,1], [0,0,0,0,38,10,0,0,0,0,0], [0,0,0,3,1,39,0,0,0,0,4], [0,2,2,0,4,1,31,0,0,0,2], [0,1,0,0,0,0,0,36,0,2,0], [0,0,0,0,0,0,1,5,37,5,1], [3,0,0,0,0,0,0,0,0,39,0], [0,0,0,0,0,0,0,0,0,0,38]] norm_conf = [] for i in conf_arr: a = 0 tmp_arr = [] a = sum(i, 0) for j in i: tmp_arr.append(float(j)/float(a)) norm_conf.append(tmp_arr) fig = plt.figure() plt.clf() ax = fig.add_subplot(111) ax.set_aspect(1) res = ax.imshow(np.array(norm_conf), cmap=plt.cm.jet, interpolation=''nearest'') width, height = conf_arr.shape for x in xrange(width): for y in xrange(height): ax.annotate(str(conf_arr[x][y]), xy=(y, x), horizontalalignment=''center'', verticalalignment=''center'') cb = fig.colorbar(res) alphabet = ''ABCDEFGHIJKLMNOPQRSTUVWXYZ'' plt.xticks(range(width), alphabet[:width]) plt.yticks(range(height), alphabet[:height]) plt.savefig(''confusion_matrix.png'', format=''png'')


Simplemente use matplotlib.pyplot.xticks y matplotlib.pyplot.yticks .

P.ej

import matplotlib.pyplot as plt import numpy as np plt.imshow(np.random.random((5,5)), interpolation=''nearest'') plt.xticks(np.arange(0,5), [''A'', ''B'', ''C'', ''D'', ''E'']) plt.yticks(np.arange(0,5), [''F'', ''G'', ''H'', ''I'', ''J'']) plt.show()