2017-07-26 1 views
-1

Ich möchte ein Modell trainieren und schließlich eine Wahrheit Wert mit einem random forest model in Python der three column dataset (klicken Sie auf den Link, um die vollständige CSV -Dataset wie folgt formatiert herunterladenPython - Wie Vorhersage und Test über mehrere Dateien mit sklearn

t_stamp,X,Y 
0.000543,0,10 
0.000575,0,10 
0.041324,1,10 
0.041331,2,10 
0.041336,3,10 
0.04134,4,10 
0.041345,5,10 
0.04135,6,10 
0.041354,7,10 

ich wollte, den aktuellen Wert von Y (den wahren Wert) unter Verwendung der letzten (zB 5, 10, 100, 300, 1000, ..etc) vorherzusagen, Datenpunkte unter Verwendung Xrandom forest model von sklearn in Python. Bedeutung unter [0,0,1,2,3] von X Spalte als ein Inp ut für das erste Fenster - ich möchte den Wert der fünften Zeile von Y, der auf den vorherigen Werten von Y trainiert wurde, vorhersagen.

Nehmen wir an, wir haben 5 Spuren des Datensatzes (a1.csv, a2.csv, a3.csv, a4.csv und a5.csv) im aktuellen Verzeichnis. Für eine einzelne Spur (Datensatz) (zum Beispiel a1.csv) - Ich kann als die folgenden

import pandas as pd 
import numpy as np 
from io import StringIO 
from sklearn.ensemble import RandomForestRegressor 
from sklearn.metrics import mean_squared_error 
from sklearn.metrics import accuracy_score 
import math 
from math import sqrt 

df = pd.read_csv('a1.csv') 

for i in range(1,5): 
    df['X_t'+str(i)] = df['X'].shift(i) 

print(df) 

df.dropna(inplace=True) 


X=pd.DataFrame({ 'X_%d'%i : df['X'].shift(i) for i in range(5)}).apply(np.nan_to_num, axis=0).values 


y = df['Y'].values 


reg = RandomForestRegressor(criterion='mse') 
reg.fit(X,y) 
modelPred = reg.predict(X) 
print(modelPred) 

print("Number of predictions:",len(modelPred)) 
modelPred.tofile('predictedValues1.txt',sep="\n",format="%s") 

meanSquaredError=mean_squared_error(y, modelPred) 
print("Mean Square Error (MSE):", meanSquaredError) 
rootMeanSquaredError = sqrt(meanSquaredError) 
print("Root-Mean-Square Error (RMSE):", rootMeanSquaredError) 

ich gelöst habe dieses Problem mit random forest, die Vorhersage eines 5-Fenster tun, die df ergibt:

rolling_regression') 
      time X Y X_t1 X_t2 X_t3 X_t4 
0  0.000543 0 10 NaN NaN NaN NaN 
1  0.000575 0 10 0.0 NaN NaN NaN 
2  0.041324 1 10 0.0 0.0 NaN NaN 
3  0.041331 2 10 1.0 0.0 0.0 NaN 
4  0.041336 3 10 2.0 1.0 0.0 0.0 
5  0.041340 4 10 3.0 2.0 1.0 0.0 
6  0.041345 5 10 4.0 3.0 2.0 1.0 
7  0.041350 6 10 5.0 4.0 3.0 2.0 
......................................................... 
    [2845 rows x 7 columns] 
[ 10. 10. 10. ..., 20. 20. 20.] 

RMSE: 0.5136564734333562 

Allerdings möchte ich jetzt die Vorhersage über alle Dateien (a1.csv, a2.csv, a3.csv, a4.csv und a5.csv) machen, indem ich das Training in 60% der Datensätze dividiere, deren Dateiname Beginnen Sie mit a und die restlichen 40% zum Testen, deren Dateiname mit a unter Verwendung sklearn inbeginnen(bedeutet, dass 3 Traces für das Training und 2 Dateien für das Testen verwendet werden)?

PS: Alle Dateien haben die gleiche Struktur, aber sie haben unterschiedliche Längen, da sie mit verschiedenen Parametern erzeugt werden.

+1

Haben alle Dateien dieselbe Struktur ('t_stamp, X, Y')? Dann füge einfach alle Daten in einen einzigen Datenrahmen ein und dividiere dann in Zug und Test. –

+0

Ja, alle Dateien haben die gleiche Struktur, aber sie haben unterschiedliche Längen, da sie mit unterschiedlichen Parametern erzeugt werden. Redigiert meine Frage. Danke. – Mahsolid

+0

@Mahsolid Ja. Das ist einfach. –

Antwort

1

Um mehrere Dateien einzulesen, benötigen Sie eine leichte Erweiterung. Aggregierte Daten aus jeder csv, dann rufen Sie pd.concat sie verbinden:

df_list = [] 
for i in range(1, 6): 
    df_list.append(pd.read_csv('a%d.csv' %i)) 

df = pd.concat(df_list) 

Dies wird in allen CSVs lesen, und Sie können wie gewohnt weitermachen. Holen X und y:

X = pd.DataFrame({ 'X_%d'%i : df['X'].shift(i) for i in range(5)}).apply(np.nan_to_num, axis=0).values 
y = df['Y'].values 

Verwenden sklearn.cross_validation.train_test_split segmentieren Ihre Daten:

from sklearn.cross_validation import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4) 

Sie auch bei StratifiedKFold aussehen kann.

+0

Aber ich möchte alle Dateien lesen, deren Name mit 'a' beginnen und dann teilen Sie den Datensatz in 60% Training und 40% Testpartner – Mahsolid

+0

Irgendeine Idee auf diesem Freund? Vielen Dank im Voraus. https://stackoverflow.com/questions/45399525/matplotlib-how-to-plot-both-the-predictor-and-predicted-value-in-the-same-grap?noredirect=1# – Mahsolid

2
import glob, os  
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "a*.csv")))) 
# get your X and Y Df's 
x_train,x_test,y_train,y_test=sklearn.cross_validation.train_test_split(X,Y,test_size=0.40) 
+0

Ich bekomme diesen Fehler : 'ValueError: Eingangsvariablen mit inkonsistenter Anzahl von Samples gefunden: [14221, 5689]'.Ich habe es mit einem kleinen Teil des Datensatzes ausprobiert, den ich in meine Frage aufgenommen habe. Ich versuche es zum Beispiel mit 2845 Zeilen - dann mache ich eine Kopie davon 5 Mal (in 5 separaten CSV-Dateien: a1.csv, a2.csv, a3.csv, a4.csv und a5.csv) – Mahsolid

+0

Was ist die Größe deines Zuges und Testdatenrahmens? – Linda

+0

Könnten Sie die Datenfelder erneut überprüfen, die für fit() und predicted() übergeben wurden? – Linda

Verwandte Themen