Eu tenho um conjunto de dados muito desequilibrado. Estou tentando seguir o conselho de ajuste e o uso, scale_pos_weight
mas não tenho certeza de como devo ajustá-lo.
Eu posso ver que RegLossObj.GetGradient
sim:
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:
- no contexto de um nó, para avaliar a redução de perda de uma divisão de candidatos
- 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?
unbalanced-classes
xgboost
ihadanny
fonte
fonte
Respostas:
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
fonte
Toda a documentação diz que deve ser:
Na prática, isso funciona muito bem, mas se seu conjunto de dados estiver extremamente desequilibrado, recomendo usar algo mais conservador, como:
Isso é útil para limitar o efeito de uma multiplicação de exemplos positivos por um peso muito alto.
fonte
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.
fonte
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/
fonte