Qual é o uso adequado de scale_pos_weight no xgboost para conjuntos de dados desequilibrados?

26

Eu tenho um conjunto de dados muito desequilibrado. Estou tentando seguir o conselho de ajuste e o uso, scale_pos_weightmas não tenho certeza de como devo ajustá-lo.

Eu posso ver que RegLossObj.GetGradientsim:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

portanto, um gradiente de uma amostra positiva seria mais influente. No entanto, de acordo com o documento xgboost , a estatística de gradiente é sempre usada localmente = nas instâncias de um nó específico em uma árvore específica:

  1. no contexto de um nó, para avaliar a redução de perda de uma divisão de candidatos
  2. dentro do contexto de um nó folha, para otimizar o peso atribuído a esse nó

Portanto, não há como saber com antecedência o que seria bom scale_pos_weight- é um número muito diferente para um nó que termina com uma proporção de 1: 100 entre instâncias positivas e negativas e para um nó com uma proporção de 1: 2.

Alguma dica?

ihadanny
fonte
Provavelmente, você pode ajustar o parâmetro no CV com 5 vezes 5 repetições. Mas, você pode precisar escrever o código para fazer isso.
user2149631

Respostas:

22

Geralmente, o Scale_pos_weight é a proporção do número de classe negativa para a classe positiva. Suponha que o conjunto de dados possua 90 observações da classe negativa e 10 observações da classe positiva; o valor ideal de scale_pos_Weight deve ser 9. Você pode verificar o seguinte link. http://xgboost.readthedocs.io/en/latest/parameter.html

Harshit Mehta
fonte
1
Como isso se aplicaria a um conjunto de dados de várias classes? Que tal 28 aulas? Isso não está claro para mim
Gabriel Ziegler
1
@ Gabriel Eu acredito que seria melhor ir para pesos de classe. Você pode usar scale_pos_weight, usando uma abordagem vs vs resto. Por exemplo, crie bonecos para 28 classes. Então você pode usar cada um deles como um problema de classificação binária. Dessa forma, você estará lidando com 28 modelos diferentes.
Harshit Mehta
Entendo, mas quando uso onevsrest, o classificador também não me fornece uma saída com vários rótulos, certo? Não apenas uma turma dos 28
Gabriel Ziegler
Como ?. Por exemplo: Classes são A, B, C. Então você pode ter um classificador binário para classificar (A / Não A), outro seria (B / Não B). Você pode fazer isso para 'n' número de classes. Então, dentre todas as probabilidades correspondentes a cada classificador, você precisa encontrar uma maneira de atribuir classes.
Harshit Mehta
Estou acostumado a usar onevsrest para multilabel, mas vou tentar! Obrigado!
Gabriel Ziegler
3

Toda a documentação diz que deve ser:

scale_pos_weight = count(negative examples)/count(Positive examples)

Na prática, isso funciona muito bem, mas se seu conjunto de dados estiver extremamente desequilibrado, recomendo usar algo mais conservador, como:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Isso é útil para limitar o efeito de uma multiplicação de exemplos positivos por um peso muito alto.

deltascience
fonte
1

Entendo sua pergunta e sua frustração, mas não tenho certeza de que isso possa ser calculado analiticamente. Em vez disso, você precisará determinar empiricamente uma boa configuração para seus dados, assim como para a maioria dos hiper parâmetros, usando a validação cruzada como @ user2149631 sugerido. Eu tive algum sucesso usando o SelectFPR com o Xgboost e a API do sklearn para diminuir o FPR para o XGBoost por meio da seleção de recursos e, em seguida, ajustando ainda mais o scale_pos_weight entre 0 e 1.0. O.9 parece funcionar bem, mas, como em qualquer outra coisa, YMMV, dependendo dos seus dados. Você também pode ponderar cada ponto de dados individualmente ao enviá-lo ao XGboost, se examinar os documentos deles. Você precisa usar a API deles, não o wrapper sklearn. Dessa forma, você pode ponderar um conjunto de pontos de dados muito mais alto que o outro e isso afetará o algoritmo de aumento usado.

Simon
fonte
0

Eu também me deparei com esse dilema e ainda estava procurando a melhor solução. No entanto, sugiro que você use métodos como o Grid Search (GridSearchCV no sklearn) para obter o melhor ajuste de parâmetros para o seu classificador. No entanto, se o seu conjunto de dados estiver altamente desequilibrado, vale a pena considerar os métodos de amostragem (especialmente os métodos de amostragem aleatória e SMOTE) e o conjunto de modelos em amostras de dados com diferentes proporções de exemplos de classes positivas e negativas. Aqui está um tutorial agradável e útil (quase abrangente) sobre como lidar com conjuntos de dados desequilibrados.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

Bikash Joshi
fonte