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.