2013-07-16 12 views
7

Sto lavorando all'identificazione dei punti 3D usando il metodo RandomForest di scikit. Uno dei problemi su cui continuo a correre è che certe classi sono presenti più spesso delle altre classi. Ciò significa che nel processo di generazione di previsioni dal classificatore addestrato, se il classificatore è incerto su una classe di punti, è più probabile che assuma che appartenga a una delle classi comuni piuttosto che alla classe meno comune.Come ponderare le classi in un'implementazione RandomForest

Vedo che nella documentazione di scikit for random forests esiste un parametro sample_weight nel metodo di adattamento. Da quello che posso dire che pesa solo alcuni campioni generali (diciamo che ho 50 file da cui mi sto allenando, peserà il primo campione il doppio rispetto a tutto il resto) piuttosto che le classi. Questo non risolve il problema perché le classi meno comuni sono quasi rare in tutti i campioni che ho. È solo la natura di quella particolare classe.

Ho trovato alcuni documenti su foreste casuali bilanciate e foreste casuali ponderate. Ma non ho visto nulla su come usare questo in scikit. Spero di sbagliarmi - c'è un modo per aggiungere classi di peso? Dovrei scrivere qualcosa di separato che uniformi artificialmente il peso delle diverse classi nei miei campioni?

* EDIT per chiarire la mia comprensione di sample_weight * Sample_weight secondo la documentazione sembra riferirsi a campioni e non il peso della classe. Quindi, se ho i file A, B e C e classi 1, 2 e 3 E diciamo:

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

Guardando sopra abbiamo una situazione, molto semplificata, in cui abbiamo molto pochi di classe 3 rispetto al le altre classi. La mia situazione ha 8 classi e si sta allenando su milioni di punti, ma il rapporto è ancora incredibilmente distorto rispetto a due classi particolari.

Utilizzando sample_weight, che utilizza una matrice di dimensione m (m essendo il numero di campioni), sarei in grado di valutare il peso di ognuno di questi tre file. Quindi la mia comprensione è che posso fare un sample_weight = [1 1 2] che renderebbe il campione C doppio rispetto agli altri due campioni. Ma questo non aiuta molto perché il mio problema è che la classe 3 è super rara (nei dati effettivi è 1k punti su milioni invece di 1 su 12). Aumentare il peso di un dato campione non aumenterà il peso di particolari classi a meno che non simuli alcuni dati in cui il campione è composto quasi da nient'altro che quella particolare classe.

Ho trovato sklearn.preprocessing.balance_weights(y) nella documentazione ma non riesco a trovare nessuno che lo utilizza. In teoria, fa quello che mi serve, ma non vedo come posso inserire l'array di pesi nella mia foresta casuale.

+4

Non capisco: ". Questo non risolve il problema perché le classi meno comuni sono circa come rare in tutti i campioni che ho E 'solo la natura di quel particolare classe" Se si mettono i pesi campione in 'sample_weight = (1/n_samples_in_same_class)' ciò darebbe valori ragionevoli per i pesi delle classi. – ogrisel

+0

sample_weight in base alla documentazione sembra riferirsi ai campioni e non al peso della classe. – Nahkki

+1

Sì, ma è possibile assegnare lo stesso peso campione a tutti i campioni della stessa classe e si sta effettivamente pesando come se avessi fornito pesi di classe. È possibile simulare il peso delle classi fornendo il peso del campione ma non viceversa. – ogrisel

risposta

2

Suppongo che questo si applichi solo alla versione più recente di scikit-learn, ma ora puoi usarlo.

rf = RandomForestClassifier(class_weight="balanced")