2013-01-09 5 views
5

Ich versuche, Trainings- und Testdaten von einem CSV zu laden, den Random Forest Regressor in scikit/sklearn auszuführen und dann die Ausgabe aus der Testdatei vorherzusagen.Python Scikit Random Forest Regressor Fehler

Die Datei TrainLoanData.csv enthält 5 Spalten; Die erste Spalte ist die Ausgabe und die nächsten 4 Spalten sind die Features. Die TestLoanData.csv enthält 4 Spalten - die Features.

Wenn ich den Code ausführen, bekomme ich Fehler:

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

Was bedeutet das?

Hier ist mein Code:

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() 

Antwort

5

Der Rückgabewert von einem RandomForestRegressor ist ein Array von Schwimmern:

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]) 

Also sind Sie indizieren einen Schwimmer wie (-0.6)[1] versuchen, was nicht möglich ist.

Als Randnotiz gibt das Modell keine Wahrscheinlichkeiten zurück.

2

Erstens ist es immer hilfreich, um auch die Beispieldaten haben, um Ihr Problem zu reproduzieren und zu debuggen. Wenn sie zu groß oder geheim sind, könnten Sie den interessanten Teil von ihnen extrahieren.

Der Inhalt der Variablen predicted_probs scheint nicht so zu sein, wie Sie es erwarten. Es scheint eine Liste (oder Array) von ganzen Zahlen zu sein, und das ist auch, was ich erwarten würde.

In Sklearn, die X.train() Methode immer die Trainingsdaten und ihre entsprechenden Klassen (in der Regel ganze Zahlen oder Strings). Die Methode X.predict() nimmt dann nur Validierungsdaten und gibt die Vorhersageergebnisse zurück, d. H. Für jede Menge in den Validierungsdaten eine Klasse (wiederum eine Ganzzahl oder eine Zeichenkette).

Wenn Sie wissen möchten, wie gut die Genauigkeit des trainierten Klassifikators ist, müssen Sie nicht nur trainieren und vorhersagen, sondern Sie müssen eine Kreuzvalidierung durchführen, dh wiederholt trainieren und validieren und jedes Mal überprüfen, wie viele Vorhersagen korrekt waren . sklean hat eine ausgezeichnete Dokumentation, ich bin sicher, dass Sie den entsprechenden Abschnitt finden werden. Wenn nicht, frag mich.

+0

Eigentlich ist das Ergebnis von 'predicate 'eine Reihe von Schwimmern. Ein 'RandomForestRegressor' ist ein Regressionsmodell, kein Klassifikator. –

+0

Sicher hast du recht. –

1

Versuchen Sie, numpy's "genfromtxt" anstelle von "csv_io.read_data" für das Laden von Datasets zu verwenden - es wird automatisch Ihre Daten in csv in numpy Array umwandeln. Und lesen Getting Started With Python For Data Science Artikel wird für Sie nützlich sein ...

Verwandte Themen