Python时间序列LSTM预测系列教程(2)-单变量

来源:互联网 发布:乐视手机移动网络设置 编辑:程序博客网 时间:2024/06/05 11:59

单变量LSTM预测模型(2)


教程原文连接


数据准备


3步走:
1、将时间序列转换成监督学习问题
2、将时间序列进行处理,使之稳定
3、将观测值进行缩放

1、时间序列转监督学习数据


# coding=utf-8          from pandas import read_csv               from pandas import datetime               from pandas import DataFrame              from pandas import concat                                         #load data              def parser(x):              return datetime.strptime(x, '%Y/%m/%d')                                                                             series = read_csv('data_set/shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)                        '''                     将数据转换成有监督数据  即包含input output      训练的目的就是找到训练数据input和output的关系                                                                           此处的input是t时间步的数据,output为t+1时间步的数据                                                                     具体实现就是将整体的时间数据向后滑动一格,和原始数据拼接,就是有监督的数据                                              '''                     def timeseries_to_supervised(data, lag=1):#lag表示的是当前的值只与历史lag个时间步长的值有关,也就是用lag个数据预测下一个    df = DataFrame(data)    colums = [df.shift(i) for i in range(1, lag+1)]#原始数据时间窗向后移动lag步长    colums.append(df)#拼接数据                df = concat(colums, axis=1)#横向拼接重塑数据,格式:input putput    df.fillna(0, inplace=True)#由于数据整体向后滑动lag后,前面的lag个数据是Na形式,用0来填充    return df                                   X = series.values       supervised = timeseries_to_supervised(X,1)print(supervised.head())

2、时间序列转换成稳定数据


通过DF检验,发现shampoo数据是非稳定的,意味着数据有长期趋势/周期趋势,此处是长期的上升趋势
可以将趋势从观测值当中移除,最后再加回到预测值中
常见的去趋势的方法是差分,用当前时间步 t 的观测值减去时间步 t-1 的值 

# coding=utf-8                                                                                                              from pandas import read_csvfrom pandas import datetimefrom pandas import Series              #load data   def parser(x):                return datetime.strptime(x, '%Y/%m/%d')series = read_csv('data_set/shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)             #做差分,去趋势,获得差分序列       def difference(dataset, interval=1):    diff = list()             for i in range(interval, len(dataset)):        value = dataset[i]-dataset[i-interval]#当前时间步t的值减去时间步t-interval的值        diff.append(value)    return Series(diff)                #将预测值进行逆处理,得到真实的销售预测def inverse_difference(history, yhat, interval=1):#历史数据,预测数据,差分间隔    return yhat+history[-interval]               #数据处理                 #将数据转换成稳定的       differenced = difference(series, 1) print(differenced.head())              #逆处理,从差分逆转得到真实值       inverted = list()         for i in range(len(differenced)):       value = inverse_difference(series, differenced[i], len(series)-i)    inverted.append(value)inverted = Series(inverted)         print(inverted.head())    

3、观测值缩放


NN都希望数据在激活函数的范围内
LSTMs的默认激活函数是 tanh , 其范围为 [ -1, 1 ],这也是期望的序列数据的范围

# coding=utf-8                 from pandas import read_csv    from pandas import datetime    from pandas import Series      from sklearn.preprocessing import MinMaxScaler                                         #load data                     def parser(x):                     return datetime.strptime(x, '%Y/%m/%d')             series = read_csv('data_set/shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)print series.head()                                           #缩放                          X = series.values              X = X.reshape(len(X),1)#MinMaxScaler函数需要矩阵作为输入,所以reshape数据为矩阵scaler = MinMaxScalar(feature_range=(-1,1))#定义缩放范围scaler = scaler.fit(X)#缩放数据scalered_X = scaler.transform(X)scalered_series = Series(scalered_X[:,0])                                                                                   print scalered_series.head()                                  #逆缩放                        inverted_X = scaler.inverse_transform(scalered_X)       inverted_series = Series(inverted_X[:,0])               print inverted_series.head() 



阅读全文
0 0
原创粉丝点击