2013-01-08 7 views
5

dire che ho un set di dati come questo:difficoltà a capire in uscita dal scikit foresta casuale

5.9;0.645;0.12;2;0.075;32;44;0.99547;3.57;0.71;10.2;5 
6;0.31;0.47;3.6;0.067;18;42;0.99549;3.39;0.66;11;6 

dove il 1 ° 11 colonne indicano caratteristiche (acidità, cloruri, ecc) e l'ultima colonna indica il rating attribuito alla voce (ad esempio 5 o 6).

Il set di dati è addestrato in tal modo:

target = [x[11] for x in dataset] 
train = [x[0:11] for x in dataset] 

rf = RandomForestClassifier(n_estimators=120, n_jobs=-1) 
rf.fit(train, target) 

predictions = rf.predict_proba(testdataset) 
print predictions[0] 

che stampa qualcosa come

[ 0.   0.01666667 0.98333333 0.   0.   0.  ] 

Ora, perché non emette una classificazione singola, ad esempio una valutazione 5 o 6?

La documentazione dice "Le probabilità di classe previste di un campione di input sono calcolate come probabilità medie della classe prevista degli alberi nella foresta", che non riesco a capire.

Se si utilizza

print rf.predict(testdataset[-1]) 
[ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.] 

Esso stampa qualcosa di più come ci si aspetterebbe - almeno sembra valutazioni - ma io ancora non capisco perché ci sia una previsione per ogni funzione e non una sola previsione di prendere in considerazione tutte le funzionalità?

+0

btw I dati provengono da set di dati del vino qui: http://www3.dsi.uminho.pt/pcortez/wine/ – Sofia

+0

Qual è la forma di testdatasets? –

risposta

9

Oltre alla risposta di Diego:

RandomForestClassifier è un classificatore per prevedere l'assegnazione di classe per un numero discreto di classi senza ordinare tra le etichette di classe.

Se si desidera generare una valutazione continua a virgola mobile, provare a utilizzare un modello di regressione come RandomForestRegressor.

Potrebbe essere necessario bloccare l'uscita nell'intervallo [0, 6] in quanto non vi è garanzia che il modello non emetta previsioni come 6.2 ad esempio.

Modificare per rispondere al secondo punto, il metodo predict prevede un elenco di campioni. Quindi dovresti fornirgli un elenco di un campione nel tuo caso.Prova:

print rf.predict([testdataset[-1]]) 

o in alternativa:

print rf.predict(testdataset[-1:]) 

Mi chiedo perché non si ottiene un errore in quel caso.

Modifica: l'uscita non ha davvero senso: qual è la forma dei set di dati?

>>> print np.asarray(train).shape 

>>> print np.asarray(target).shape 

>>> print np.asarray(testdataset).shape 
+0

Sono al lavoro ora. Più avanti risponderò, ma ecco un post che esplora gli stessi set di dati: http://fastml.com/predicting-wine-quality/ – Sofia

+0

In effetti avevo un bug in questo caso usando rf.predict ([test [-1]]) ora produce un risultato ragionevole di [6.]. Le forme qui sono: np.asarray (target) .shape -> (1597,), np.asarray (train) .shape -> (1597, 11), np.asarray (test) .shape -> (1599 11). Sono come dovrebbero essere? – Sofia

+0

Le forme sembrano buone. Sono contento che abbia risolto il bug. – ogrisel

3

Dalla documentazione, predict_proba ritorni:

p: array di forma = [N_SAMPLES, n_classes], o un elenco di n_outputs tali matrici se n_outputs> 1. Le probabilità di classe dei campioni di ingresso. Le classi sono ordinate per ordine aritmetico.

La chiave qui è l'ultima frase "classi sono ordinate per ordine aritmetico". La mia ipotesi è che alcuni dei tuoi campioni di allenamento abbiano una classe inferiore a 5, che a predict_proba ha una probabilità pari a zero, mentre le classi 5 e 6 hanno probabilità 0,01666667 e 0,98333333, mentre altre 3 classi, tutte> 6, hanno anche probabilità zero.

+0

Salve, le valutazioni vanno da 3 a 8. Quindi da quanto ho capito predict_proba sta emettendo l'elenco di probabilità per ogni classificazione, in modo che nell'esempio dato [0. 066666667 0,98333333 0, 0, 0] la valutazione più probabile è 5 con una probabilità di 0,983. Più chiaro ora grazie :) – Sofia