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
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()