Con una classe sbilanciata, devo utilizzare sotto campionamento i miei set di dati di validazione / test?


13

Sono un principiante nell'apprendimento automatico e sto affrontando una situazione. Sto lavorando a un problema di offerta in tempo reale, con il set di dati IPinYou e sto provando a fare una previsione di clic.

Il fatto è che, come forse saprai, il set di dati è molto sbilanciato: circa 1300 esempi negativi (senza clic) per 1 esempio positivo (clic).

Questo è ciò che faccio:

  1. Carica i dati
  2. Dividi il set di dati in 3 set di dati: A = Formazione (60%) B = Convalida (20%) C = Test (20%)
  3. Per ogni set di dati (A, B, C), effettuare un sottocampionamento su ciascuna classe negativa per avere un rapporto di 5 (5 esempi negativi per 1 esempio positivo). Questo mi dà 3 nuovi set di dati che sono più bilanciati: A 'B' C '

Quindi alleno il mio modello con il set di dati A 'e la regressione logistica.

La mia domanda è:

  1. Quale set di dati devo utilizzare per la convalida? B o B '?

  2. Quale set di dati devo utilizzare per i test? C o C '

  3. Quali sono le metriche più pertinenti per valutare il mio modello? F1Score sembra essere una metrica ben utilizzata. Ma qui a causa della classe sbilanciata (se uso i set di dati B e C), la precisione è bassa (sotto 0,20) e F1Score è molto influenzato da un basso richiamo / precisione. Sarebbe più preciso usare aucPR o aucROC?

  4. Se voglio tracciare la curva di apprendimento, quali metriche dovrei usare? (sapendo che l'errore% non è rilevante se uso il set di dati B per la convalida)

Grazie in anticipo per il tuo tempo!

Saluti.

Risposte:


9

Ottima domanda ... Ecco alcune risposte specifiche alle tue domande numerate:

1)Dovresti incrociare la convalida su B, non su B`. Altrimenti, non saprai quanto funziona bene il tuo bilanciamento di classe. Non potrebbe far male incrociare la convalida su B e B` e sarà utile in base alla risposta a 4 di seguito.

2) Dovresti testare su C e C` in base a 4 di seguito.

3)Continuerei con la F1 e potrebbe essere utile usare ROC-AUC e questo fornisce un buon controllo di integrità. Entrambi tendono ad essere utili con classi sbilanciate.

4)Questo diventa davvero complicato. Il problema è che il metodo migliore richiede di reinterpretare l'aspetto delle curve di apprendimento o di utilizzare sia i set di dati ricampionati che quelli originali.

L'interpretazione classica delle curve di apprendimento è:

  • Overfit - Le linee non si incontrano del tutto;
  • Underfit - Le linee si uniscono ma a un punteggio F1 troppo basso;
  • Giusto - Le linee si uniscono a un punteggio di F1 ragionevole.

Ora, se ti stai allenando su A` e testando su C, le linee non si uniranno mai completamente. Se ti stai allenando su A` e stai testando su C` i risultati non saranno significativi nel contesto del problema originale. Allora cosa fai?

La risposta è allenarsi su A` e testare su B`, ma anche test su B. Ottieni il punteggio F1 per B` dove vuoi che sia, quindi controlla il punteggio F1 per B. Quindi fai i test e genera curve di apprendimento per C. Le curve non si uniranno mai, ma avrai un'idea del pregiudizio accettabile ... è la differenza tra F1 (B) e F1 (B`).

Ora, la nuova interpretazione delle tue curve di apprendimento è:

  • Overfit - Le linee non si uniscono e sono più distanti rispetto a F1 (B`) -F1 (B);
  • Underfit - Le linee non si uniscono ma la differenza è inferiore a F1 (B`) -F1 (B) e il punteggio F1 (C) è inferiore a F1 (B);
  • Giusto - Le linee non si uniscono ma la differenza è inferiore a F1 (B`) -F1 (B) con un punteggio F1 (C) simile a F1 (B).

Generale : suggerisco fermamente che per le classi sbilanciate si provi innanzitutto ad adattare i pesi delle classi nel proprio algoritmo di apprendimento invece di sovracampionare / sottocampionare poiché evita tutto il rigore morale che abbiamo delineato sopra. È molto facile in biblioteche come scikit-learn e codice abbastanza facile da consegnare in qualsiasi cosa utilizzi una funzione sigmoid o un voto di maggioranza.

Spero che sia di aiuto!


Grazie mille @ AN605. È così carino da parte tua! Ho alcuni quesitoni: Per il 4) - Quando dici "allenarsi su A 'e testare su B" ", intendi convalidare? - "genera curve di apprendimento per C" e "il punteggio F1 (C) è inferiore / simile a F1 (B)". Pensavo che, per la curva di apprendimento, dovevamo tracciare la metrica di errore per il set di addestramento (A o A 'qui) e la metrica di errore solo per il set di convalida (B o B'). Non "convalidi" su C qui?
jmvllt,

Sull'utilizzo dei "pesi di classe", correggimi se sbaglio (ho appena dato una rapida occhiata a questo proposito) ma, questo trucco comporta "modificare" la funzione di costo aggiungendo un coefficiente / peso "k" davanti al classe sbilanciata, giusto? : 􏲏 Costo (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) In questo modo, l'algoritmo dovrebbe considerare un'errata classificazione della classe positiva come più importante. Ma il fatto è che "devo" usare Apache Spark e MLlib per creare il mio modello completo. E non sono sicuro di poter modificare facilmente la mia funzione di costo con spark. Grazie comunque per il tuo tempo!
jmvllt

5

Per 1)e 2), vuoi

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Pertanto, per tali set di dati, non è necessario bilanciare le classi.

Potresti anche provare a usare i pesi di classe invece di sotto / sovracampionamento, poiché questo si prende cura di questa decisione per te.

Per 3)probabilmente desidera ottimizzare utilizzando qualsiasi metrica saranno segnati (se si tratta di una gara). Ma se questa non è una considerazione, tutti quei modelli sono ottime scelte. La F1 può essere influenzata dalla bassa precisione, ma vuoi che sia catturato. È proprio quando modelli ingenui (come indovinare la classe di maggioranza) possono ottenere buoni risultati da alcune metriche che punteggi come la F1 sono rilevanti.

Per quanto riguarda 4)non c'è nulla di sbagliato nel mostrare qualunque metrica finisca per ottimizzare.


Ciao @jamesmf, grazie per la bella risposta. Per il F1Score, il problema che ho avuto è che potrei voler concentrarmi maggiormente sull'eliminazione del Falso positivo più che del Falso negativo. Sarebbe giusto aggiungere "peso" diverso per FP e FN nel calcolo della precisione e del richiamo?
jmvllt,

Questo ha senso per me. Anche la tua descrizione della ponderazione della classe è corretta e non la vedo implementata in MLib, ma potrebbe valere la pena di richiedere una funzione
jamesmf

Ok grazie James! Attualmente sto provando a farlo da solo estendendo la classe LogisticGradient e sovrascrivendo il metodo di calcolo. Ti farò sapere se questo mi dà buoni risultati. Buona giornata.
jmvllt,

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.