Saltar al contenido

XGboost Python – ¿Opción de peso de clase de clasificador?

Solución:

cuando se usa el contenedor sklearn, hay un parámetro para el peso.

ejemplo:

import xgboost as xgb
exgb_classifier = xgboost.XGBClassifier()
exgb_classifier.fit(X, y, sample_weight=sample_weights_data)

donde el parámetro debería ser una matriz como, longitud N, igual a la longitud objetivo

Recientemente me encontré con este problema, así que pensé que dejaría una solución que probé

from xgboost import XGBClassifier

# manually handling imbalance. Below is same as computing float(18501)/392318 
on the trainig dataset.
# We are going to inversely assign the weights
weight_ratio = float(len(y_train[y_train == 0]))/float(len(y_train[y_train == 
1]))
w_array = np.array([1]*y_train.shape[0])
w_array[y_train==1] = weight_ratio
w_array[y_train==0] = 1- weight_ratio

xgc = XGBClassifier()
xgc.fit(x_df_i_p_filtered, y_train, sample_weight=w_array)

No estoy seguro, por qué, pero los resultados fueron bastante decepcionantes. Espero que esto ayude a alguien.

[Reference link] https://www.programcreek.com/python/example/99824/xgboost.XGBClassifier

Simplemente asigne cada instancia de los datos de su tren con su peso de clase. Primero obtenga los pesos de la clase con class_weight.compute_class_weight de sklearn luego asigne a cada fila de los datos del tren su peso apropiado.

Supongo aquí que los datos del tren tienen la columna ‘clase’ que contiene el número de clase. Supuse también que hay nb_classes que van de 1 a nb_classes.

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype="float")
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

xgb_classifier.fit(X, y, sample_weight=w_array)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *