2013-01-09 14 views
5

Sto provando a caricare i dati di addestramento e test da un csv, a eseguire il regressore foresta casuale in scikit/sklearn e quindi a prevedere l'output dal file di test.Python Scikit Errore regressione foresta casuale

Il file TrainLoanData.csv contiene 5 colonne; la prima colonna è l'output e le successive 4 colonne sono le caratteristiche. TestLoanData.csv contiene 4 colonne: le funzionalità.

Quando eseguo il codice, ottengo l'errore:

predicted_probs = ["%f" % x[1] for x in predicted_probs] 
IndexError: invalid index to scalar variable. 

Cosa significa?

Ecco il mio codice:

import numpy, scipy, sklearn, csv_io //csv_io from https://raw.github.com/benhamner/BioResponse/master/Benchmarks/csv_io.py 
from sklearn import datasets 
from sklearn.ensemble import RandomForestRegressor 

def main(): 
    #read in the training file 
    train = csv_io.read_data("TrainLoanData.csv") 
    #set the training responses 
    target = [x[0] for x in train] 
    #set the training features 
    train = [x[1:] for x in train] 
    #read in the test file 
    realtest = csv_io.read_data("TestLoanData.csv") 

    # random forest code 
    rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1) 
    # fit the training data 
    print('fitting the model') 
    rf.fit(train, target) 
    # run model against test data 
    predicted_probs = rf.predict(realtest) 
    print predicted_probs 
    predicted_probs = ["%f" % x[1] for x in predicted_probs] 
    csv_io.write_delimited_file("random_forest_solution.csv", predicted_probs) 

main() 

risposta

5

Il valore restituito da un RandomForestRegressor è un array di carri:

In [3]: rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1) 

In [4]: rf.fit([[1,2,3],[4,5,6]],[-1,1]) 
Out[4]: 
RandomForestRegressor(bootstrap=True, compute_importances=False, 
      criterion='mse', max_depth=None, max_features='auto', 
      min_density=0.1, min_samples_leaf=1, min_samples_split=2, 
      n_estimators=10, n_jobs=-1, oob_score=False, 
      random_state=<mtrand.RandomState object at 0x7fd894d59528>, 
      verbose=0) 

In [5]: rf.predict([1,2,3]) 
Out[5]: array([-0.6]) 

In [6]: rf.predict([[1,2,3],[4,5,6]]) 
Out[6]: array([-0.6, 0.4]) 

Quindi si sta cercando di indice di un galleggiante come (-0.6)[1], che non è possibile.

Come nota a margine, il modello non restituisce probabilità.

2

In primo luogo, è sempre utile avere anche i dati di esempio per riprodurre ed eseguire il debug il problema. Se sono troppo grandi o segreti, potresti estrarne la parte interessante.

Il contenuto della variabile predicted_probs sembra non essere come previsto. Sembra essere una lista (o array) di interi, e questo è anche quello che mi aspetterei.

In sklearn, il metodo X.train() acquisisce sempre i dati di formazione e le relative classi corresonding (in genere numeri interi o stringhe). Il metodo X.predict() quindi prende solo i dati di convalida e restituisce i risultati di previsione, ad esempio, per ciascun set nei dati di convalida una classe (sempre un numero intero o una stringa).

Se vuoi sapere quanto è buona la precisione del classificatore addestrato, non devi solo allenarti e prevedere, ma devi fare una convalida incrociata, cioè allenarti e convalidare ripetutamente e verificare ogni volta quante previsioni erano corrette . sklean ha una documentazione eccellente, sono sicuro che troverai la rispettiva sezione. Altrimenti, chiedimi.

+0

In realtà, il risultato di "prevedere" è un array di float. Un 'RandomForestRegressor' è un modello di regressione, non un classificatore. –

+0

Certo, hai ragione. –

1

Provare a utilizzare "genfromtxt" di numpy invece di "csv_io.read_data" per il caricamento del set di dati: trasformerà automaticamente i dati in array csv in numpy. E leggere l'articolo Getting Started With Python For Data Science ti sarà utile ...