scale_pos_weight
é usado para classificação binária como você afirmou. É uma solução mais generalizada para lidar com classes desequilibradas. Uma boa abordagem ao atribuir um valor scale_pos_weight
é:
sum(negative instances) / sum(positive instances)
Para o seu caso específico, há outra opção para ponderar pontos de dados individuais e levar em consideração seus pesos ao trabalhar com o booster, e permitir que a otimização ocorra em relação aos pesos para que cada ponto seja representado igualmente. Você só precisa usar:
xgboost.DMatrix(..., weight = *weight array for individual weights*)
Você pode definir os pesos como quiser e, ao fazê-lo, pode até lidar com desequilíbrios nas classes, bem como desequilíbrios entre diferentes classes.
Esta resposta de @KeremT está correta. Eu forneço um exemplo para aqueles que ainda têm problemas com a implementação exata.
weight
O parâmetro no XGBoost é por instância e não por classe. Portanto, precisamos atribuir o peso de cada classe a suas instâncias, o que é a mesma coisa.Por exemplo, se tivermos três classes desequilibradas com proporções
Seus pesos seriam (dividindo a menor classe por outras)
Então, se os dados de treinamento forem
nós construímos o
weight
vetor da seguinte maneira:fonte
Todo mundo se depara com essa questão ao lidar com o problema de classificação multiclasse desequilibrada usando o XGBoost em R. Eu também!
Eu estava procurando um exemplo para entender melhor como aplicá-lo. Investiu quase uma hora para encontrar o link mencionado abaixo. Para todos aqueles que procuram um exemplo, aqui vai -
/datascience//a/9493/37156
Obrigado wacax
fonte
Basta atribuir cada instância dos seus dados de trem com o peso da classe. Primeiro obtenha os pesos da classe com o
class_weight.compute_class_weight
sklearn e atribua a cada linha dos dados do trem o peso apropriado.Suponho aqui que os dados do trem tenham a coluna 'classe' contendo o número da classe. Também assumi que existem nb_classes que são de 1 a nb_classes.
fonte