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.

añadir curvas de precisión-recuperación para representar usando una función

Tengo un dataframe con la precisión y el recall de muchos clasificadores, cada uno ejecutado con 4 valores diferentes del umbral de confianza:

MODELO     UMBRAL_DE_CONFIANZA     PRECISIÓN       RECALL

0 Modelo1 0.25 0.992647 0.950704
1 Modelo1 0.45 1.000000 0.929577
2 Modelo1 0.35 0.992537 0.936620
3 Modelo1 0.30 0.992593 0.943662
4 Modelo2 0.45 0.992647 0.950704
5 Modelo2 0.30 0.992647 0.950704
6 Modelo2 0.35 0.992647 0.950704
7 Modelo2 0.25 0.992701 0.957746
8 Modelo3 0.30 0.978417 0.957746
9 Modelo3 0.35 0.978102 0.943662

Me gustaría crear una gráfica de curva de precisión y recall en JupyterLab, y agregar una curva de precisión y recall para cada modelo. Dado que la lista de modelos puede cambiar en el futuro, me gustaría hacer esto con una función de Python en lugar de codificar los nombres de los modelos en el código de Matplotlib. He escrito algo así:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib widget

df = pd.read_csv(“results.csv”)

plt.title(‘Curvas de Precisión-Recall’)
plt.legend(loc=’lower right’)

def plot_precision_recall_curve(df, model, plt):
df = df.loc[df[‘MODELO’] == model, [‘MODELO’, ‘PRECISIÓN’, ‘RECALL’]]
plt.plot(df[‘RECALL’], df[“PRECISIÓN”], ‘b’, label=model)

plot_precision_recall_curve(df, ‘Modelo1’, plt)
plt.show()

Pero obtengo una gráfica vacía, con el mensaje:

No se encontraron artistas con etiquetas para agregar a la leyenda. Tenga en cuenta que los artistas cuya etiqueta comienza con un guión bajo se ignoran cuando se llama a la función legend() sin argumentos.

Además, cabe destacar que en mi código intenté trazar la curva de precisión-recall de un solo modelo, pero en realidad me gustaría agregar a la misma gráfica las curvas de precisión-recall de todos los modelos incluidos en el dataframe. ¿Puedes ayudarme?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para trazar las curvas de precisión-recall para todos los modelos incluidos en el dataframe, puedes modificar el código de la siguiente manera:

    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib widget
    
    df = pd.read_csv("results.csv")
    
    plt.title('Curvas de precisión-recall')
    plt.legend(loc='lower right')
    
    def trazar_curva_precision_recall(df, modelo, plt):
        df = df.loc[df['MODEL'] == modelo, ['PRECISION', 'RECALL']]
        plt.plot(df['RECALL'], df["PRECISION"], label=modelo)
    
    modelos = df['MODEL'].unique()
    
    plt.plot([], [], label='')
    
    for modelo in modelos:
        trazar_curva_precision_recall(df, modelo, plt)
    
    plt.show()
    

    En este código, primero extraemos la lista de modelos únicos del dataframe utilizando el método unique. Luego, iteramos sobre cada modelo y llamamos a la función trazar_curva_precision_recall para ese modelo. Dentro de la función, solo seleccionamos las filas en el dataframe que corresponden al modelo actual, y luego trazamos la curva de precisión-recall para ese subconjunto de datos.

    Ten en cuenta que eliminamos la columna ‘MODEL’ de la selección del dataframe dentro de la función trazar_curva_precision_recall, ya que ya estamos filtrando por el nombre del modelo. También eliminamos el argumento ‘b’ de la llamada a plt.plot ya que causaba que la línea se trazara en azul, lo que podría dificultar distinguir entre diferentes modelos con colores similares.

    Con respecto al mensaje de advertencia que recibiste, indica que la leyenda no tiene ningún elemento (es decir, gráficos) con etiquetas porque aún no hemos trazado nada en el código que llama a trazar_curva_precision_recall. Solucionamos esto agregando plt.plot([], [], label='') antes del bucle de modelos, lo que crea un gráfico ficticio sin datos solo para proporcionar una etiqueta para la leyenda.

Comments are closed.