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.

Error de MultilabelBinarizer cuando está presente una clase vacía.

Estoy construyendo un clasificador multietiqueta, cuando trato de llamar al informe de clasificación, obtengo el siguiente error: ValueError: Todos las etiquetas deben estar en [0, número de etiquetas) para objetivos de múltiples etiquetas. Se obtuvo 6 > 2. A continuación, se muestra un ejemplo mínimo que produce el error:

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.metrics import classification_report

import pandas as pd

a = [
     [3, 4],
     [6],
     [3],
     [],
     [6, 4]
]
bin = MultiLabelBinarizer()
bin.fit(a)

a = bin.transform(a)
report = classification_report(
    a,
    a, 
    output_dict=True, 
    zero_division=0, 
    labels=bin.classes_
)
print(report)

Cuando intento convertir las clases a cadenas, obtengo el siguiente error:
TypeError: '>=' no es compatible entre instancias de 'str' y 'int'
. Si comento labels=bin.classes_, todo funciona, pero me gustaría tener las clases originales en el informe. ¿Cómo puedo resolverlo? ¿Es un error?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error ocurre porque bin.classes_ devuelve un arreglo de cadenas de texto, mientras que el informe de clasificación espera un arreglo de enteros. Una forma de resolver esto es crear un mapeo entre las etiquetas de clase originales y sus valores enteros correspondientes. Aquí tienes un fragmento de código actualizado que resuelve el problema:

    from sklearn.preprocessing import MultiLabelBinarizer
    from sklearn.metrics import classification_report
    
    import pandas as pd
    
    a = [
         [3, 4],
         [6],
         [3],
         [],
         [6, 4]
    ]
    
    # Crear un mapeo entre etiquetas de texto y etiquetas enteras
    label_map = {'3': 0, '4': 1, '6': 2}
    
    bin = MultiLabelBinarizer()
    bin.fit(a)
    
    a = bin.transform(a)
    # Utilizar label_map para convertir bin.classes_ a enteros
    labels = [label_map[label] for label in bin.classes_]
    
    report = classification_report(
        a,
        a, 
        output_dict=True, 
        zero_division=0, 
        labels=labels
    )
    print(report)
    

    En este código, creamos un diccionario label_map que mapea las etiquetas de texto a sus valores enteros correspondientes. Luego, utilizamos este mapeo para convertir bin.classes_ a un arreglo de enteros, que pasamos como parámetro labels a la función classification_report. Esto debería mostrar el informe de clasificación con las etiquetas de clase originales.

Comments are closed.