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.

Xgboost: ¿Cómo convertir las probabilidades de predicción a nombres originales de etiquetas multiclase?

Estoy usando el clasificador multiclase xgboost como se muestra en el ejemplo a continuación. Para cada fila en el dataframe X_test, el modelo devuelve una lista cuyos elementos de lista corresponden a la probabilidad de cada categoría ‘a’, ‘b’, ‘c’ o ‘d’, por ejemplo, [0.44767836 0.2043365 0.15775423 0.19023092].

¿Cómo puedo saber qué elemento de la lista corresponde a cada clase/categoría (a, b, c o d)? Mi objetivo es crear 4 columnas adicionales en el dataframe a, b, c, d con la probabilidad correspondiente como valor de fila en cada columna.

import numpy as np
import pandas as pd
import xgboost as xgb
import random
from sklearn import preprocessing
from sklearn.model_selection import train_test_split

#Crear datos de ejemplo
np.random.seed(312)
data = np.random.random((10000, 3))
y = [random.choice('abcd') for _ in range(data.shape[0])]

features = ["x1", "x2", "x3"]
df = pd.DataFrame(data=data, columns=features)
df['y']=y

#Codificar variable objetivo
labelencoder = preprocessing.LabelEncoder()
df['y_target'] = labelencoder.fit_transform(df['y'])

#División de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(df[features], df['y_target'], test_size=0.2, random_state=42, stratify=y)

#Entrenar modelo
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

param = {'objective':'multi:softprob',
         'random_state': 20,
         'tree_method': 'gpu_hist',
         'num_class':4
        }

xgb_model = xgb.train(param, dtrain, 100)

predictions=xgb_model.predict(dtest)

print(predictions)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para determinar qué elemento de la lista corresponde a cada clase/categoría (a,b,c o d), podemos utilizar el objeto LabelEncoder que se utilizó para codificar la variable objetivo en el ejemplo.

    Primero, necesitamos obtener la correspondencia entre los valores codificados y los valores originales de la variable objetivo:

    label_mapping = dict(zip(labelencoder.transform(labelencoder.classes_), labelencoder.classes_))
    

    Esto crea un diccionario que asigna cada valor codificado con su correspondiente valor original de la variable objetivo.

    Luego, podemos usar esta correspondencia para crear cuatro columnas adicionales en el dataframe, con el valor de probabilidad correspondiente en cada columna:

    for i, label in label_mapping.items():
        df[label] = predictions[:, i]
    

    Esto recorre los elementos del diccionario y crea una nueva columna para cada valor original de la variable objetivo, utilizando el índice de la lista predictions para extraer el valor de probabilidad correspondiente.

    Poniéndolo todo junto, el código se vería así:

    import numpy as np
    import pandas as pd
    import xgboost as xgb
    import random
    from sklearn import preprocessing
    from sklearn.model_selection import train_test_split
    
    # Crear Datos de Ejemplo
    np.random.seed(312)
    data = np.random.random((10000, 3))
    y = [random.choice('abcd') for _ in range(data.shape[0])]
    
    features = ["x1", "x2", "x3"]
    df = pd.DataFrame(data=data, columns=features)
    df['y'] = y
    
    # Codificar variable objetivo
    labelencoder = preprocessing.LabelEncoder()
    df['y_target'] = labelencoder.fit_transform(df['y'])
    
    # Obtener correspondencia entre valores codificados y valores originales de la variable objetivo
    label_mapping = dict(zip(labelencoder.transform(labelencoder.classes_), labelencoder.classes_))
    
    # Dividir en Conjunto de Entrenamiento y Prueba
    X_train, X_test, y_train, y_test = train_test_split(df[features], df['y_target'], test_size=0.2, random_state=42, stratify=df['y'])
    
    # Entrenar Modelo
    dtrain = xgb.DMatrix(X_train, label=y_train)
    dtest = xgb.DMatrix(X_test, label=y_test)
    
    param = {
        'objective': 'multi:softprob',
        'random_state': 20,
        'tree_method': 'gpu_hist',
        'num_class': 4
    }
    
    xgb_model = xgb.train(param, dtrain, 100)
    
    predictions = xgb_model.predict(dtest)
    
    # Crear nuevas columnas con las probabilidades correspondientes
    for i, label in label_mapping.items():
        df[label] = predictions[:, i]
    
    print(df.head())
    

    Esto mostrará el dataframe con las cuatro columnas adicionales ‘a’, ‘b’, ‘c’ y ‘d’, que contienen los valores de probabilidad correspondientes.

Comments are closed.