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)