As saídas XGBoost tendem para os extremos

15

Atualmente, estou usando o XGBoost para previsão de riscos, parece estar fazendo um bom trabalho no departamento de classificação binária, mas as saídas de probabilidade estão muito longe, ou seja, alterar o valor de um recurso em uma observação em uma quantidade muito pequena pode aumentar a probabilidade salto de saída de 0,5 para 0,99.

Eu mal vejo saídas na faixa de 0,6-0,8. Em todos os casos, a probabilidade é menor que 0,99 ou 1.

Estou ciente dos métodos de calibração pós-treinamento, como Escalonamento de Platt e Correção Logística, mas estava pensando se há algo que eu possa ajustar no processo de treinamento do XGBoost.

Eu chamo o XGBoost de diferentes idiomas usando o FFI, por isso seria bom se eu pudesse resolver esse problema sem introduzir outras bibliotecas de calibração, por exemplo, alterando a métrica de avaliação da AUC para a perda de log.

sempre aprendendo
fonte
Você verificou se alguma escala aplicada ao conjunto de treinamento também foi aplicada corretamente ao conjunto de teste?
Brads
Eu tenho o mesmo problema. Você poderia encontrar algo útil? Como uma solução temporária, classifiquei probs e normalizei em 0 a 1 com base nas ocorrências, mas não acho que seja uma boa solução.
Ilker Kurtulus
Quantas variáveis ​​categóricas você possui no seu modelo?
ngopal
Na verdade, XGBoosté bastante robusto contra discrepantes, quando comparado a outros métodos de baunilha, como SVM.
Piotr Rarus - Restabelece Monica

Respostas:

1

O XGBoost não é calibrado naturalmente em probabilidades. Você precisa usar algo como:

objective = "binary:logistic"

para garantir que a saída do modelo possa ser interpretada como uma probabilidade. Caso contrário, você poderá obter apenas pontuações, que só poderão ser usadas para classificar instâncias. Como a maioria das métricas de desempenho pode ser calculada com base nas pontuações, é um erro comum usar o que parecem probabilidades (associadas a boas métricas de desempenho) em vez de probabilidades 'reais'.

Quanto à instabilidade do modelo (aqui no sentido em que uma pequena alteração na variável explicativa altera muito a previsão), é necessário verificar novamente todo o processo de calibração: seleção de variáveis, particionamento de trem / teste, ajuste de hiper-parâmetro / validação cruzada, desempenho métricas usadas, para garantir que seu modelo não seja excessivo.

lcrmorin
fonte
0

Sim, verifique a distribuição de perda de log à medida que o número de iterações aumenta. Se ele começar a disparar antes da sua iteração de reforço final, será um ajuste excessivo.

bbennett36
fonte
0

A primeira pergunta seria "O que é proporções positivas / negativas?". Só porque tive um problema semelhante várias vezes quando as aulas estavam muito desequilibradas. Se for o seu caso, você pode tentar equilibrar o conjunto de dados ou jogar com o scale_pos_weightparâmetro XGboost. No caso das relações de 50/50 classes, as probabilidades podem ser mais ou menos normalizadas.

Além disso, é muito provável que você tenha sobreajuste ao mesmo tempo. Tente ajustar a taxa de aprendizado, os parâmetros de amostragem e os parâmetros de regularização (reg_alpha, reg_lambda).

i1bgv
fonte
-1

Primeiro, você deve ter certeza de que seus dados são grandes o suficiente ao trabalhar com algoritmos baseados em árvore como XGBoost e LightGBM, tais mudanças repentinas podem indicar super ajuste. (10.000 amostras, pelo menos, regra geral)

Segundo, como está sua cardinalidade; se você tiver 3-4 recursos, seria de esperar que uma mudança de recurso causasse tal efeito.

Terceiro, qual é a sua seleção de hiperparâmetros? Os modelos baseados em árvore são muito sensíveis às alterações dos parâmetros. Certifique-se de implementar cuidadosamente o ajuste do hiperparâmetro.

Por fim, ao lidar com classificação binária; métricas de erro se tornam realmente importantes. Você pode fazer uma combinação de perda de log binário e erro binário (o XGBoost permite escolher vários); também certifique-se de implementar a parada antecipada escolhendo early_stopping_rounds = N no método train do XGBoost, onde N é a seleção de iterações. Com isso, seu algoritmo para mais cedo em um ponto razoável em que sua perda para para diminuir, evitando o ajuste excessivo.

Ugur MULUK
fonte