2017-08-02 266 views
1

我们试图在拟合模型以预测真值之后在同一图上绘制预测值和真值,其中使用Python中的RandomForestRegressorthree column dataset(点击链接下载完整CSV -dataset格式化为以下Python:我们如何匹配回归模型的预测值和真值的值

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 

这里是我们如何做的预测。

import pandas as pd 
import numpy as np 
import glob, os 
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 
from sklearn.cross_validation import train_test_split 

df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "data*.csv")))) 

for i in range(1,10): 
    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(10)}).apply(np.nan_to_num, axis=0).values 
y = df['Y'].values 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40) 


reg = RandomForestRegressor(criterion='mse') 
reg.fit(X_train,y_train) 


modelPred_test = reg.predict(X_test) 

print(modelPred_test) 

为了便于比较,我们希望在预测之前和预测之后生成一个图。对于真值,我们与

fig, ax = plt.subplots() 
ax.plot(df['time'].values, df['Y'].values) 

我们希望绘制(在同一图)地面实况(time为x轴和Y为y轴上的值尝试过。当我们这样做

ax.plot(df['time'].values, modelPred_test) 

我们得到以下错误。

raise ValueError("x and y must have same first dimension") 

ValueError: x and y must have same first dimension 

这意味着我们有较少的预测值比我们有时间标记在我们的数据集。为了验证这一点,我做 print(df['time'].values.shape)print(modelPred_test.shape) - 它分别输出(258523,)(103410,)。我们如何匹配哪些时间值对应于预测值,然后我可以使用我的绘图命令的时间值的子集?

+0

您可以将'np.arrage(df.shape [0])'传递给'train_test_split',并使用“test”部分作为'df ['time']。values'的索引。 –

回答

1

您必须像下面那样设置数据。

X = df.drop('Y', axis=1) 
y = df['Y'] 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40) 
X_train = X_train.drop('time', axis=1) 
X_test = X_test.drop('time', axis=1) 

,然后将数据集

index_values=range(0,len(y_test)) 
y_test.sort_index(inplace=True) 
X_test.sort_index(inplace=True) 
modelPred_test = reg.predict(X_test) 
ax.plot(pd.Series(index_values), y_test.values) 

最后排序,为y预测值做同样的情节。希望这可以帮助。

0

您需要跟踪培训和测试数据集的指标。例如,你可以定义

train_index, test_index = train_test_split(df.index, test_size=0.40)

然后X_train = X[train_index]

然后,你可以通过ax.plot(df['time'][test_index].values, modelPred_test[df.index == test_index])绘制的结果。

+0

你可以试试'X_train = df.X [train_index] .values'等等(与你刚刚提到的相同的精神?) –