Suggerimenti per l'apprendimento sensibile ai costi in un ambiente fortemente squilibrato


15

Ho un set di dati con alcuni milioni di righe e ~ 100 colonne. Vorrei rilevare circa l'1% degli esempi nel set di dati, che appartengono a una classe comune. Ho un limite di precisione minimo, ma a causa del costo molto asimmetrico non sono troppo appassionato di alcun richiamo particolare (purché non rimanga con 10 partite positive!)

Quali sono alcuni approcci che consiglieresti in questa impostazione? (link ai documenti benvenuti, link alle implementazioni apprezzate)

Risposte:


15

Ho trovato He e Garcia (2009) una utile recensione dell'apprendimento in problemi di classe squilibrati. Ecco alcune cose sicuramente non complete da considerare:

Approcci basati sui dati:

Si può sottocampionare la classe di maggioranza o sovracampionare la classe di minoranza. (Breiman ha sottolineato che questo è formalmente l'equivalente dell'assegnazione di costi di classificazione errata non uniformi.) Ciò può causare problemi: il sottocampionamento può far perdere agli studenti aspetti della classe di maggioranza; il sovracampionamento aumenta il rischio di overfitting.

Esistono metodi di "sottocampionamento informato" che riducono questi problemi. Uno di questi è EasyEnsemble , che campiona in modo indipendente diversi sottoinsiemi della classe di maggioranza e crea più classificatori combinando ciascun sottoinsieme con tutti i dati della classe di minoranza.

SMOTE (Synthetic Minority Oversampling Technique) o SMOTEBoost, (combinando SMOTE con boosting) creano istanze sintetiche della classe di minoranza creando i vicini più vicini nello spazio delle caratteristiche. SMOTE è implementato in R nel pacchetto DMwR (che accompagna il libro di Luis Torgo "Data mining con R, apprendimento con casi studio" CRC Press 2016 ).

Approcci di adattamento del modello

Applicare pesi specifici per classe nella funzione di perdita (pesi maggiori per casi di minoranza).

Per gli approcci basati su alberi, è possibile utilizzare la distanza di Hellinger come funzione di impurità del nodo, come sostenuto in Cieslak et al. "Gli alberi delle decisioni sulla distanza di Hellinger sono robusti e non inclinati" ( codice Weka qui .)

Utilizzare un classificatore di una classe , imparando (a seconda del modello) una densità di probabilità o un limite per una classe e trattando l'altra classe come valori anomali.

Naturalmente, non usare l'accuratezza come metrica per la costruzione di modelli. La kappa di Cohen è un'alternativa ragionevole.

Approcci di valutazione del modello

Se il modello restituisce probabilità previste o altri punteggi, scegliere un limite decisionale che comporti un adeguato compromesso in caso di errori (utilizzando un set di dati indipendente dall'addestramento e dai test). In R, il pacchetto OptimalCutpoints implementa una serie di algoritmi, compresi quelli sensibili ai costi, per decidere un taglio.


Grazie per la risposta dettagliata. Ho tentato di sottocampionare e fallito miseramente. I modelli mostrano eccellenti prestazioni nel campione, ma lo squilibrio è ancora presente nel set di test (e i dati del mondo reale che userò alla fine), quindi la precisione OOS dei modelli è orribile. Ho anche cercato di pesi di classe-specifici, ma la mia domanda comporta un facilmente quantificabile più elevato costo per falsi positivi che per falsi negativi. Per quanto riguarda i classificatori a una classe, ho cercato di adattare uno svm lineare (quelli non lineari sono troppo lenti) e che ha una precisione 0 anche nel campione ...
em70,

1
Mi sento per te. L'alta precisione è difficile se la stragrande maggioranza dei casi è negativa. Vorrei utilizzare pesi specifici per classe (come inversamente proporzionale alla frazione dei casi nella classe) per l'apprendimento e salvare i pesi specifici per tipo di errore per determinare la soglia di decisione. Spero che tu stia usando la validazione incrociata con la kappa di Cohen e non la precisione per la selezione del modello. Visualizzerei la densità delle probabilità per le classi nei dati di calibrazione lungo la precisione laterale e l'arricchimento (precisione / proporzione di casi positivi) in tutti i cutoff per comprendere davvero i compromessi disponibili.
MattBagg,

Ottima risposta, grazie. Sto usando una tecnica simile al citato EasyEnsemble da un po 'di tempo, ma ne ero dubbioso (nonostante le prestazioni sensate sui dati simulati). Ora so che ha senso.
Ayorgo,

5

La mia comprensione è che questa è un'area attiva di ricerca nella comunità dell'apprendimento automatico e non ci sono grandi risposte, ma piuttosto un numero crescente e crescente di potenziali soluzioni. Probabilmente otterrai risposte migliori se specifichi gli algoritmi specifici che stai prendendo in considerazione.

Se stai usando un modello parametrico (regressione logistica) questo dovrebbe essere un problema minore e puoi semplicemente variare la soglia in base alla tua funzione di perdita (costo dei falsi negativi a falsi positivi)

Se stai usando algoritmi di apprendimento automatico, questo potrebbe essere più complicato. Max Kuhn fa un tentativo equo di riassumere il problema nel capitolo 16 di "Modellazione predittiva applicata". Ma argomento impegnativo da riassumere. Se non si desidera acquistare il libro, il codice R è disponibile nel pacchetto AppliedPredictiveModeling per questo capitolo e può essere sufficiente a seconda della familiarità con R e degli algoritmi utilizzati.

Di solito la discussione ruota attorno agli algoritmi di sottocampionamento / sovracampionamento +/- sensibili ai costi. Con variazioni come jous-boost è anche possibile.
Un esempio di questo tipo di discussione: Chen et al. "Uso della foresta casuale per apprendere i dati squilibrati" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


Il problema con la variazione della soglia è che è come cambiare l'intercettazione di un modello di regressione. In realtà, potrei voler cambiare il vettore del peso per tenere conto dei costi. Ma se lo faccio, visto il già grave squilibrio, finisco con 0 precisione! Non ho optato per nessun algoritmo e ho risorse per implementare idee di ricerca all'avanguardia, se promettenti. Daremo un'occhiata al libro che hai suggerito.
em70,

Il capitolo è così così. Sforzo solido, ma argomento difficile da riassumere. Molte affermazioni non supportate pubblicate su vari metodi. Penso che il sottocampionamento stratificato nelle foreste casuali sia un buon inizio dal punto di vista dell'apprendimento automatico. Il codice è nel pacchetto del libro.
charles,

0

Puoi dare un'occhiata all'implementazione di scikit-learn. presta attenzione all'argomento class_ weight che può avere valori di un dizionario di pesi di classe o 'auto':

class sklearn.svm.SVC (C = 1.0, kernel = 'rbf', grado = 3, gamma = 0.0, coef0 = 0.0, restringimento = Vero, probabilità = Falso, tol = 0,001, cache_size = 200, class_weight = None, verbose = Falso, max_iter = -1, random_state = Nessuno)

Puoi giocare con il valore dell'argomento class_weight che può essere un dizionario di peso di classe o 'auto'. In modalità "auto" l'algoritmo di apprendimento assegnerà automaticamente pesi a ciascuna classe in base al numero di campioni all'interno di ciascuna di esse.

scikit-learn ha molti altri algoritmi di classificazione, alcuni dei quali accettano pesi di classe.


Puoi dire di più su come i pesi di classe possono essere utilizzati per raggiungere gli obiettivi del PO? Penso che sia implicito nel tuo post, ma questa non è ancora una risposta.
gung - Ripristina Monica

Sì, l'argomento class_weight può avere un valore 'auto' se qualcuno esamina la documentazione o può avere un valore di dizionario che ha i pesi di classe. In caso di "auto", l'algoritmo di apprendimento stesso rileva il peso di ciascuna classe in base al numero di campioni in ciascuna.
Ash,
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.