2015-12-12 19 views
16

ho problemi a utilizzare la funzione foresta casuale in formaPython foresta casuale - Sconosciuto Etichetta errore

Questo è impostato la mia formazione

  P1  Tp1   IrrPOA  Gz   Drz2 
0  0.0  7.7   0.0  -1.4  -0.3 
1  0.0  7.7   0.0  -1.4  -0.3 
2  ...  ...   ...  ...   ... 
3  49.4 7.5   0.0  -1.4  -0.3 
4  47.4 7.5   0.0  -1.4  -0.3 
... (10k rows) 

voglio prevedere P1 grazie a tutte le altre variabili utilizzando sklearn.ensemble foresta casuale

colsRes = ['P1'] 
X_train = train.drop(colsRes, axis = 1) 
Y_train = pd.DataFrame(train[colsRes]) 
rf = RandomForestClassifier(n_estimators=100) 
rf.fit(X_train, Y_train) 

Ecco l'errore che ottengo:

ValueError: Unknown label type: array([[ 0. ], 
     [ 0. ], 
     [ 0. ], 
     ..., 
     [ 49.4], 
     [ 47.4], 

Non ho trovato nulla su questo errore di etichetta, io uso Python 3.5. Qualsiasi consiglio sarebbe di grande aiuto!

+0

quale versione di sklearn che si sta utilizzando? –

risposta

21

Quando si sta passando l'etichetta (y) dati a rf.fit(X,y), si aspetta che y sia un elenco 1D. Affettare il riquadro Panda genera sempre un elenco 2D. Quindi, conflitto sollevato nel tuo caso d'uso. È necessario convertire l'elenco 2D fornito da pandas DataFrame in un elenco 1D come previsto dalla funzione di adattamento.

Provare a usare la lista 1D prima:

Y_train = list(train.P1.values) 

Se questo non risolve il problema, si può provare con la soluzione di cui al MultinomialNB error: "Unknown Label Type":

Y_train = np.asarray(train['P1'], dtype="|S6") 

Così il codice diventa,

colsRes = ['P1'] 
X_train = train.drop(colsRes, axis = 1) 
Y_train = np.asarray(train['P1'], dtype="|S6") 
rf = RandomForestClassifier(n_estimators=100) 
rf.fit(X_train, Y_train) 
+0

Ora capisco il problema, ma il tuo codice non funziona. Sto cercando altri modi per fare la conversione – Dragonfly

+0

Puoi provare con 'Y_train = list (train.P1.values)'? Fammi sapere il messaggio di errore se c'è qualche messaggio di errore –

+0

non cambia. forma Y_train sembra buono anche se di stampa (Y_train) [0. 0. 0. ..., 49.4 47.4 45.4] forma Y dà (34208,) - # 34208 è il numero di righe – Dragonfly

7

Secondo this SO post, classificatori devono interi o stringhe etichette.

Si potrebbe prendere in considerazione il passaggio a un modello di regressione, invece (che potrebbe meglio soddisfare i vostri dati, come ogni dato sembra essere un float), in questo modo:

X_train = train.drop('P1', axis=1) 
Y_train = train['P1'] 
rf = RandomForestRegressor(n_estimators=100) 
rf.fit(X_train.as_matrix(), Y_train.as_matrix()) 
+0

Grazie ma nessuna differenza – Dragonfly

+0

Da quello che ho capito su segnalazione di errori completa, dalla linea in cui io chiamo la funzione 'fit' Dal rapporto: rf.fit (X_train, Y_train) file "C: \ Anaconda3 \ lib \ site-packages \ sklearn \ ensemble \ forest.py ", riga 235, in forma y, expanded_class_weight = self._validate_y_class_weight (y) ... – Dragonfly

+0

Ho provato con il codice aggiornato, senza modifiche – Dragonfly

0

potrebbe essere un po 'tardi per la festa, ma ho appena ricevuto questo errore e risolto assicurandomi ariable era tipo (int) utilizzando

y = df['y_variable'].astype(int) 

prima di fare uno split test treno, come anche altri hanno detto si problema sembra meglio in forma con un RFReg piuttosto che RF

+0

'y_variable' spelling – JDOaktown