Creare un "punteggio di certezza" dai voti nelle foreste casuali?


36

Sto cercando di formare un classificatore che discriminerà tra Type Ae Type Boggetti con un set di addestramento ragionevolmente ampio di circa 10.000 oggetti, di cui circa la metà Type Ae metà Type B. Il set di dati è composto da 100 funzioni continue che descrivono in dettaglio le proprietà fisiche delle celle (dimensioni, raggio medio, ecc.). La visualizzazione dei dati in grafici a dispersione e densità a coppie ci dice che vi è una significativa sovrapposizione nelle distribuzioni delle cellule cancerose e normali in molte delle caratteristiche.

Attualmente sto esplorando foreste casuali come metodo di classificazione per questo set di dati e ho riscontrato buoni risultati. Usando R, le foreste casuali sono in grado di classificare correttamente circa il 90% degli oggetti.

Una delle cose che vogliamo provare e fare è creare una sorta di "punteggio di certezza" che quantificherà la nostra fiducia nella classificazione degli oggetti. Sappiamo che il nostro classificatore non sarà mai preciso al 100% e anche se si ottiene un'elevata precisione nelle previsioni, desideriamo che i tecnici qualificati identificino quali oggetti sono realmente Type Ae Type B. Quindi, invece di fornire previsioni senza compromessi su Type Ao Type B, vogliamo presentare un punteggio per ogni oggetto che descriverà come Ao è Bun oggetto. Ad esempio, se immaginiamo un punteggio che varia da 0 a 10, un punteggio di 0 può indicare che un oggetto è molto simile agli Type Aoggetti, mentre un punteggio di 10 indica che un oggetto è molto simile Type B.

Pensavo di poter usare i voti all'interno delle foreste casuali per escogitare un punteggio simile. Poiché la classificazione nelle foreste casuali viene effettuata mediante votazione a maggioranza all'interno della foresta di alberi generati, suppongo che gli oggetti votati dal 100% degli alberi siano Type Adiversi dagli oggetti votati, diciamo, dal 51% degli alberi a essere Type A.

Attualmente, ho provato a impostare una soglia arbitraria per la percentuale di voti che un oggetto deve ricevere per essere classificato come Type Ao Type B, e se la soglia non viene superata verrà classificata come Uncertain. Ad esempio, se impongo la condizione che l'80% o più degli alberi debbano concordare una decisione per il passaggio di una classificazione, trovo che il 99% delle previsioni della classe siano corrette, ma circa il 40% degli oggetti sono raggruppati come Uncertain.

Avrebbe senso, quindi, trarre vantaggio dalle informazioni di voto per valutare la certezza delle previsioni? O sto andando nella direzione sbagliata con i miei pensieri?


Assicurarsi di disporre di set di dati di test e formazione separati. Assicurati di utilizzare il set di test il meno possibile (idealmente solo una volta).
Boris Gorelik,

@bgbg Sto usando uno schema di addestramento / validazione / test, in una divisione 70/20/10. Sto formando un modello con il 70% dei dati e ottimizzando i parametri in base ai risultati sul set di validazione del 20%. Dopo aver ottimizzato i parametri su questi due set, valuto il modello sul set di test del 10%. Sebbene Breiman affermi che il tasso di errore OOB incorporato rende superfluo rendere un set di test separato, sono diffidente nei confronti della sua richiesta.
ialm,

Risposte:


19

Ha perfettamente senso e tutte le implementazioni di foreste casuali con cui ho lavorato (come MATLAB) forniscono anche risultati probabilistici per fare proprio questo.

Non ho lavorato con l'implementazione di R, ma sarei scioccato se non ci fosse un modo semplice per ottenere risultati soft dai voti e dalla decisione difficile.

Modifica: ho appena dato un'occhiata a R, e predict.randomForest ha anche delle probabilità di output.


1
Grazie per la risposta. Hai ragione, ho creato uno script che produrrà la percentuale di voti che ogni oggetto riceve. Mi chiedo, tuttavia, quanto saranno utili questi voti? Ci sono dei prossimi passi che consigli? Dovrei guardare la variabilità delle proporzioni di voto attraverso ulteriori serie di RF? Capisco che la RF ha un elemento stocastico. C'è qualche diagnostica che dovrei guardare?
ialm,

3
@Jonathan Puoi provare a guardare una trama con la frazione di oggetto reale di una classe in funzione di una frazione di voti per questa classe dalla foresta. Stavo lavorando su un problema che richiedeva un punteggio di fiducia e si è scoperto che sono riuscito a ottenere una curva logistica molto bella.

@mbq Siamo spiacenti, puoi chiarire cosa intendi con questo? Sono interessato al tuo suggerimento e lo seguirò domani!
ialm,

1
Inoltre, la variabilità in una RF arriva nella fase di addestramento, quindi eseguire campioni di test più volte attraverso la RF non cambierà i risultati. Guarderei l'AUC rispetto al numero di alberi in RF, per assicurarmi di avere abbastanza alberi, e quindi ottimizzare il parametro minimo fogliare secondo l'AUC.
Benhamner,

2
@Jonathan Penso che mbq si riferisca a qualcosa chiamato calibrazione (anche se potrebbero esserci altri nomi). Vedi ad esempio queste domande: Calibrazione di un classificatore potenziato multi-classe , a cosa si riferiscono i "valori reali" nella classificazione supervisionata?
Steffen,

17

Se stai usando R, il pacchetto del cursore ti salverà dal reinventare la ruota. Ad esempio, il codice seguente utilizza la convalida incrociata per scegliere i parametri di ottimizzazione per un modello di foresta casuale, quindi genera la deviazione media e standard di precisione per ogni piega di convalida incrociata. Infine, calcola le probabilità di classe per il modello.

library(caret)
library(PerformanceAnalytics)
data(iris)

#Make a yes/no dataset
Dataset <- iris
Dataset$Class <- ifelse(Dataset$Species=='versicolor','Yes','No')
Dataset$Class  <- as.factor(Dataset$Class)
Dataset$Species<- NULL
chart.Correlation(Dataset[-5], col= Dataset$Class)

#Fit an RF model
model <- train(Class~.,Dataset,
                method='rf',TuneLength=3,
                trControl=trainControl(
                    method='cv',number=10,
                    classProbs = TRUE))
model$results

#Predict class probabilities (i.e. 'certainty' scores)
pred <- predict(model,iris,"prob")
head(pred)

La cosa bella di Caret è che rende molto semplice il confronto tra diversi modelli predittivi. Per esempio, se si vuole provare uno SVM, è possibile sostituire il testo method='rf'con method='svmLinear'o method='svmRadial'. È inoltre possibile scegliere i parametri di sintonizzazione basate su AUC , piuttosto che la precisione con l'aggiunta di una linea al parametro trainControl: summaryFunction=twoClassSummary.

Finalmente, c'è un po 'di codice nel pacchetto PerformanceAnalytics chart.Correlation(Dataset[-5], col= Dataset$Class), che non è necessario per costruire il modello, ma fornisce una buona visualizzazione del set di dati.


Mi stai facendo diventare un fan del pacchetto di assistenza. Penso che terrò aperto un secondo thread R solo per provare diversi metodi di classificazione e fare in modo che Caret esegua CV e regolazione dei parametri da solo e vedere se ottengo risultati comparabili.
ialm,

@Jonathan felice di sentirlo! È un pacchetto meraviglioso. Prova il modelLookup()comando per un elenco di ciò che è possibile.
Zach,

Il probtipo di predictè disponibile anche usando randomForestper addestrare il tuo modello (con o senza l'uso di altri pacchetti come careto PerformanceAnalytics).
Hack-R

2

Il pacchetto randomForest in R è un pacchetto abbastanza decente per ottenere maggiori dettagli sulla tua analisi. Ti fornisce i voti (sia come frazione che come conteggi grezzi) e offre capacità integrate per l'ottimizzazione e la convalida incrociata e può anche darti ulteriori informazioni sulle tue funzionalità (se volessi sapere quali dei tuoi 100 sono il più importante in analisi).

Se stai già usando quel pacchetto, allora forse vuoi dargli un'occhiata più da vicino e se non lo sei, allora forse dai un'occhiata.

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.