Eliminando filas y columnas si todas las entradas no diagonales son cero
Estoy generando una matriz de confusión para tener una idea de la predicción de mi clasificador de textos en comparación con la verdad objetiva. El propósito es entender qué intenciones se están prediciendo como otras intenciones. Pero el problema es que tengo demasiadas clases (más de 160), por lo que la matriz es dispersa, donde la mayoría de los campos son cero. Obviamente, los elementos de la diagonal probablemente no sean cero, ya que indican una predicción correcta.
Dicho esto, quiero generar una versión más simple de ello, ya que solo nos importan los elementos no cero si no están en la diagonal. Por lo tanto, quiero eliminar las filas y columnas donde todos los elementos son cero (ignorando las entradas en la diagonal), de modo que el gráfico sea mucho más pequeño y manejable de ver. ¿Cómo se hace eso?
A continuación se muestra el fragmento de código que he hecho hasta ahora, que producirá una representación para todas las intenciones, es decir, un gráfico de dimensiones (#intención, #intención).
import matplotlib.pyplot as plt
import numpy as np
from pandas import DataFrame
import seaborn as sns
%matplotlib inline
sns.set(rc={'figure.figsize':(64,64)})
confusion_matrix = pd.crosstab(df['ground_truth_intent_name'], df['predicted_intent_name'])
variables = sorted(list(set(df['ground_truth_intent_name'])))
temp = DataFrame(confusion_matrix, index=variables, columns=variables)
sns.heatmap(temp, annot=True)
TL;DR
Aquí, temp
es un dataframe de pandas. Necesito eliminar todas las filas y columnas donde todos los elementos son cero (ignorando los elementos de la diagonal, incluso si no son cero).
davy.ai
Para eliminar las filas y columnas donde todos los elementos son cero en la matriz de confusión
temp
, puedes utilizar el siguiente código:La primera línea de código eliminará todas las columnas donde todos los elementos son cero. La función
loc
se utiliza para seleccionar todas las filas:
y columnas donde al menos un elemento no es igual a cero(temp != 0).any(axis=0)
. La funciónany(axis=0)
devuelve un arreglo booleano que indica si algún elemento en cada columna no es igual a cero.La segunda línea de código eliminará todas las filas donde todos los elementos son cero. La función
loc
se utiliza para seleccionar todas las columnas:
y filas donde al menos un elemento no es igual a cero(temp != 0).any(axis=1)
. La funciónany(axis=1)
devuelve un arreglo booleano que indica si algún elemento en cada fila no es igual a cero.Esto resultará en una versión más simple de la matriz de confusión
temp
sin las filas y columnas donde todos los elementos son cero (ignorando las entradas en la diagonal).