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)
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:
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:
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í:
Esto mostrará el dataframe con las cuatro columnas adicionales ‘a’, ‘b’, ‘c’ y ‘d’, que contienen los valores de probabilidad correspondientes.