【问题标题】:Python - How to do prediction and testing over multiple files using sklearnPython - 如何使用 sklearn 对多个文件进行预测和测试
【发布时间】:2018-01-01 19:13:35
【问题描述】:

我想训练一个模型,最后使用three column datasetrandom forest model in Python 预测一个真值(点击链接下载完整的CSV-dataset,格式如下

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

我想使用random forest model 使用X 的最后一个(例如:5、10、100、300、1000、..etc)数据点来预测Y 的当前值(真实值) sklearn 中的 Python。意思是将X 列的[0,0,1,2,3] 作为第一个窗口的输入——我想预测Y 的第5 行值,该值是根据Y 的先前值进行训练的。

假设我们在当前目录中有 5 个数据集轨迹(a1.csv、a2.csv、a3.csv、a4.csv 和 a5.csv)。对于单个跟踪(数据集)(例如,a1.csv)——我可以按以下方式预测 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

但是,现在我想对所有文件(a1.csv、a2.csv、a3.csv、a4.csv 和 a5.csv)进行预测,方法是将训练分成 60% 的文件名称以a 开头,其余40% 用于测试,其文件名以a 开头,在Python 中使用sklearn(意味着3 个跟踪将用于训练,2 个文件用于测试)?

PS:所有文件的结构相同,但长度不同,因为它们是用不同的参数生成的。

【问题讨论】:

  • 所有文件是否具有相同的结构 (t_stamp,X,Y)?然后只需将所有数据附加到单个数据帧中,然后分为训练和测试。
  • 是的,所有文件都有相同的结构,但它们的长度不同,因为它们是用不同的参数生成的。编辑了我的问题。谢谢。
  • @Mahsolid 是的。这很简单。

标签: python python-3.x pandas scikit-learn random-forest


【解决方案1】:
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)

【讨论】:

  • 我收到此错误:ValueError: Found input variables with inconsistent numbers of samples: [14221, 5689]。我用我的问题中包含的一小部分数据集进行了尝试。例如,我正在尝试使用 2845 行 - 然后将其复制 5 次(在 5 个单独的 csv 文件中:a1.csv、a2.csv、a3.csv、a4.csv 和 a5.csv)跨度>
  • 你的训练和测试数据框的大小是多少?
  • 你能重新检查给 fit() 和 predict() 的数据框吗?
  • 我认为你可能做的是这个 reg.fit(X_train,y_train) 和 modelPred=reg.predict(X_test) 和 meanSquaredError=mean_squared_error(y_train, modelPred) 这是错误的。均方误差必须针对训练的 Y 和 X 或测试的 Y 和 X。使用我在上一条评论中提到的内容
  • ***均方误差必须针对训练的 Y 和预测 Y 或测试的 Y 和预测 Y。
【解决方案2】:

要读取多个文件,您需要一个小扩展名。聚合来自每个 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

【讨论】:

  • 但是我想读取所有名称以a开头的文件,然后将数据集分为60%的训练和40%的测试伙伴
  • 对这个伙伴有什么想法吗?非常感谢你。 stackoverflow.com/questions/45399525/…
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 2019-04-06
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2020-12-07
  • 2015-06-19
相关资源
最近更新 更多