2017-07-26 68 views
-1

做預測和測試在多個文件,我想訓練一個模型,並最終預測使用three column dataset(的random forest model in Python真值點擊鏈接下載完整CSV -dataset格式化爲以下Python的 - 如何使用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 

我想使用最後一個(例如:5,10,100,300,1000,...等)來預測Y(真值)的電流值數據的X點使用的sklearnrandom forest modelPython。含義[0,0,1,2,3]X列作爲inp ut爲第一個窗口 - 我想預測YY以前的值訓練的第五行值。

比方說,我們有5個痕跡在當前目錄中的數據集(a1.csv,a2.csv,a3.csv,a4.csv和a5.csv)的。對於單個跟蹤(數據集)(例如,a1.csv) - I可以做5窗口的預測,如下

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) 

我已經解決了這個問題random forest,其產生df

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 

但是,現在我想通過將訓練分爲60%的數據集來預測所有文件(a1.csv,a2.csv,a3.csv,a4.csv和a5.csv)文件名開始a和測試的文件名,其餘40%開始,在使用sklearn (意思是3條曲線將用於訓練,2條曲線用於測試)?

PS:所有文件具有相同的結構,但它們是具有不同的長度爲它們與不同的參數產生的。

+1

是否所有文件都具有相同的結構('t_stamp,X,Y')?然後將所有數據附加到一個數據框中,然後分成列車和測試。 –

+0

是的,所有文件具有相同的結構,但它們具有不同的長度,因爲它們是用不同的參數生成的。編輯我的問題。謝謝。 – Mahsolid

+0

@Mahsolid是的。這很簡單。 –

回答

1

要讀取多個文件,你需要一個輕微的擴展。從每個CSV彙總數據,然後調用pd.concat加入他們的行列:

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

df = pd.concat(df_list) 

這將在所有的CSV閱讀,你可以照常進行。獲取Xy

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 

使用sklearn.cross_validation.train_test_split數據細分:

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

你也可以看看StratifiedKFold

+0

不過我想讀他的名字開始與'了'所有文件,然後分割成數據集60%的培訓,40%的測試夥伴 – Mahsolid

+0

在這個哥們任何想法?非常感謝你提前。 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

我得到這個錯誤:'ValueError:發現輸入變量的樣本數量不一致:[14221,5689]'。我用包含在我的問題中的一小部分數據集進行了嘗試。例如,我正在用2845行嘗試它 - 然後製作它的副本,如5次(在5個單獨的csv文件中:a1.csv,a2.csv,a3.csv,a4.csv和a5.csv) – Mahsolid

+0

什麼是你的火車和測試數據幀的大小? – Linda

+0

你能重新檢查給fit()和predict()的數據框嗎? – Linda