Lstm长期预测如何划分测试集?

比如我用前100个数据预测后20个数据,特征为一个,数据总量10000(经过滑动窗口之后),则x大小为(10000,100, 1),y大小为(1000…
关注者
8
被浏览
23,792
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

最近刚好在研究时序预测方面的东西,就贴个划分数据集的代码,可以参考一下。

在某SDN上看了很多时序预测划分数据集的帖子,其中比较合适的方式是将时序数据集转化为最常见的监督学习问题,即特征和标签的形式。

比如我想前一时刻的数据(t-1)来预测当前时刻(t)。我可以将t-1的数据当作训练数据,这个数据可以是单个变量也可以是多个变量,将t的值当作标签,然后构造n条这样的数据,直接用索引取值的方式就可以划分训练集和测试集了。

这里以一个空气污染数据集为例,数据集地址:

简单进行了一下数据处理:

import pandas as pd 
df = pd.read_csv('weather.csv')
df['date'] = pd.to_datetime(df[['year','month','day','hour']])
df = df.loc[:,['date','pm2.5','DEWP','TEMP','PRES','Iws','Is','Ir']]
df.set_index('date',inplace=True)
df.columns = ['pollution','dew','temp','press','wndspd','snow','rain']
df.pollution.fillna(0,inplace=True)
df = df[24:]
num = len(df.columns)

数据处理完是这个样子的:

这里进行了一下归一化处理:

scaler = MinMaxScaler(feature_range=(0, 1),copy=True)
df.iloc[:,0:num] = scaler.fit_transform(df.iloc[:,0:num])

之后就是将时序数据转化为监督问题数据的方法了:

这里如果不明白可以一步一步单独拿出来用print打印,我这个也是ctrl+c ,ctrl+v又改了改的~

def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    df = pd.DataFrame(data)
    columns = df.columns
    cols, names = [],[]

    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        #names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
        names += [('%s(t-%d)' % (columns[j], i)) for j in range(n_vars)]

    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            # names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
            names += [('%s(t)' % (columns[j])) for j in range(n_vars)]
        else:
            # names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
            names += [('%s(t+%d)' % (columns[j], i)) for j in range(n_vars)]

    agg = pd.concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg

调用方法:

我这里做的是多变量时序预测,是用前一时刻天的7个变量来预测其下一时刻的7个变量,为了方便观看,我又将数据逆归一化处理了一下,但实际训练时是需要归一化的。

reframed = series_to_supervised(df, 1, 1)
reframed.head(3) 

生成的数据就是下面的样子:

如果你做的是单变量时序预测的话,可以将不需要的特征列删除

reframed = series_to_supervised(df, 1, 1)
reframed.drop(reframed.columns[[1,2,3,4,5,6,8,9,10,11,12,13]], axis=1, inplace=True) 
reframed.head(3) 

生成的数据就是这个样子的了:

之后的思路就很简单了,就是按行索引切分数据就可以了,我这里取了一年的数据作为训练集,测试集为剩下的数据。因为数据的时间粒度是到小时的,所以一年就是365*24。

n_train_hours = 365 * 24
train = reframed.iloc[:n_train_hours, :].values
test = reframed.iloc[n_train_hours:, :].values

然后就是划分“特征”和“标签”:

这里的变量num是在第一个代码块计算的特征数量

train_X, train_y = train[:, :-num], train[:, -num:]
test_X, test_y = test[:, :-num], test[:, -num:]

之后的步骤我在这里就不写下去了,深度学习做时序预测只需要把数据reshape成神经元需要的形式就可以了。

相关资料:

LSTM实践多变量时间序列预测

LSTM进阶:使用LSTM进行多维多步的时间序列预测

基于Keras的LSTM多变量时间序列预测