Qual è l'uso corretto di scale_pos_weight in xgboost per set di dati non bilanciati?


26

Ho un set di dati molto squilibrato. Sto cercando di seguire i consigli di sintonizzazione e di utilizzare, scale_pos_weightma non sono sicuro di come sintonizzarmi.

Vedo che RegLossObj.GetGradientfa:

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

quindi un gradiente di un campione positivo sarebbe più influente. Tuttavia, secondo il documento xgboost , la statistica del gradiente viene sempre utilizzata localmente = all'interno delle istanze di un nodo specifico in un albero specifico:

  1. nel contesto di un nodo, per valutare la riduzione delle perdite di una divisione candidata
  2. nel contesto di un nodo foglia, per ottimizzare il peso attribuito a quel nodo

Quindi non c'è modo di sapere in anticipo quale sarebbe un buono scale_pos_weight- è un numero molto diverso per un nodo che finisce con un rapporto 1: 100 tra istanze positive e negative e per un nodo con un rapporto 1: 2.

Qualche suggerimento?


Probabilmente, puoi mettere a punto il parametro in CV con 5 ripetizioni 5 volte. Tuttavia, potrebbe essere necessario scrivere il codice per farlo.
— user2149631

Risposte:


22

Generalmente, Scale_pos_weight è il rapporto tra il numero di classe negativa e la classe positiva. Supponiamo che il set di dati abbia 90 osservazioni di classe negativa e 10 osservazioni di classe positiva, quindi il valore ideale di scale_pos_Weight dovrebbe essere 9. Puoi controllare il seguente link. http://xgboost.readthedocs.io/en/latest/parameter.html


1
Come si applicherebbe un set di dati multiclasse? Che ne dici di 28 lezioni? Non è chiaro per me
— Gabriel Ziegler,

1
@Gabriel Credo che sarebbe meglio scegliere pesi di classe. Puoi usare scale_pos_weight, usando un approccio vs rest. Ad esempio, crea manichini per 28 classi. Quindi è possibile utilizzare ognuno come un problema di classificazione binaria. In questo modo avrai a che fare con 28 modelli diversi.
— Harshit Mehta,

Capisco, ma quando uso onevsrest il classificatore non mi dà anche un output multilabel, giusto? Non solo una classe su 28
— Gabriel Ziegler

Come ?. Ad esempio: le classi sono A, B, C. Quindi puoi avere un classificatore binario per classificare (A / Non A), un altro sarebbe (B / Non B). Puoi farlo per 'n' numero di classi. Quindi, tra tutte le probabilità corrispondenti a ciascun classificatore, devi trovare un modo per assegnare le classi.
— Harshit Mehta,

Sono abituato a usare onevsrest per multilabel, ma ci proverò! Grazie!
— Gabriel Ziegler,

3

Tutta la documentazione dice che dovrebbe essere:

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

In pratica, funziona abbastanza bene, ma se il tuo set di dati è estremamente sbilanciato, ti consiglio di usare qualcosa di più conservativo come:

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

Ciò è utile per limitare l'effetto di una moltiplicazione di esempi positivi per un peso molto elevato.


1

Capisco la tua domanda e la tua frustrazione, ma non sono sicuro che si tratti di un calcolo analitico, ma dovresti determinare empiricamente una buona impostazione per i tuoi dati, come fai per la maggior parte dei parametri iper, usando la validazione incrociata come @ user2149631 suggerito. Ho avuto un certo successo usando SelectFPR con Xgboost e l'API sklearn per abbassare l'FPR per XGBoost tramite la selezione delle funzionalità, quindi ottimizzando ulteriormente scale_pos_weight tra 0 e 1.0. O.9 sembra funzionare bene ma, come in ogni altra cosa, YMMV dipende dai tuoi dati. Puoi anche ponderare ogni punto dati singolarmente quando lo invii a XGboost se dai un'occhiata ai loro documenti. Devi usare la loro API non il wrapper sklearn. In questo modo è possibile ponderare una serie di punti dati molto più in alto dell'altra e ciò avrà un impatto sull'algoritmo di potenziamento che utilizza.


0

Mi sono anche imbattuto in questo dilemma e sto ancora cercando la soluzione migliore. Tuttavia, ti suggerirei di utilizzare metodi come Grid Search (GridSearchCV in sklearn) per ottimizzare i parametri per il tuo classificatore. Tuttavia, se il tuo set di dati è altamente sbilanciato, vale la pena considerare i metodi di campionamento (in particolare i metodi di sovracampionamento casuale e metodi di sovracampionamento SMOTE) e l'insieme di modelli su campioni di dati con rapporti diversi di esempi di classe positivi e negativi. Ecco un tutorial bello e utile (quasi completo) sulla gestione di set di dati non bilanciati.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.