es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for 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:

    temp = temp.loc[:, (temp != 0).any(axis=0)]
    temp = temp.loc[(temp != 0).any(axis=1), :]
    

    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ón any(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ón any(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).

Comments are closed.