首先推荐一个对LSTM一些类函数进行说明的博客: 函数说明
我的目标是用LSTM进行某种水果价格的预测,一开始我的做法是,将一种水果前n天的价格作为变量传入,即这样传入的DataFrame格式是有n+1列,结果训练出来的效果不尽人意,完全比不上之前我用ARIMA时间序列去拟合价格曲线.
之后继续浏览了很多博客,资料什么的,终于明白了一个参数:time_step的意义,LSTM,长短时训练网络,time_step这个参数才是体现其记忆的地方,比如说我要用前一百天的价格求当天的价格,time_step需要为100,且需要建立在数据是连续的基础上.而且其中还遇到了一个坑,就是传入数据的格式问题.代码过后来讲.
我的代码是基于 博客 这个博客的代码修改的,主要修改的地方就是格式的问题,这个问题在我一开始传入的X有很多列的时候是不会存在的,但在我单纯用价格来预测价格的时候,就出现问题了,如果直接按原来一样处理,会报错:
ValueError: Cannot feed value of shape (1,) for Tensor 'train/Placeholder:0', which has shape '(?, 100, 1)'
类似这样的错误,都是shape的错误引起的,一般来讲,tf.nn.dynamic_rnn()的inputs的输入格式大概是[batch_size,time_steps_size,input_size],time_steps_size便是要考虑的天数,input_size指输入的变量数batch_size是块大小,由数据量决定.在这份代码中,训练数据的获取没毛病,问题在于测试数据,比如说,我训练数据对应600条,测试数据200条.不过那是给[batch_size,time_steps_size,input_size],train_x可能是[590,10,10],train_y为[590,10,1],而test_x为[20,10,10],test_y为一个数组,主要是为了计算准确率,注意了,test_x的input_size大于1时代在处理时候比较简单,Dataframe的iloc().values获取后得到的numpy库的ndarray,比如
data[[1,2,3],[2,3,4],[3,4,5]] # 为numpy.ndarray()格式 x = data[i * time_step:(i + 1) * time_step, 1:101] # 获取多列的时候,返回多个数组 x = data[i * time_step:(i + 1) * time_step, 1] # 这个时候返回一个数组
具体的话可以print出来看看,最主要的shape问题就出现在这里,因此在数据的处理过程加入了对test_x的添加一个np.newaxis,对应成了[20,10,1],不然的话,得到的test_x shape则为[20,10]
2019-01-15更新,抽空把代码数据格式等重新整理了一遍,注释也写的比较清楚了一些。至于我文章上面的...没空去看看对不对了...以后有时间再看看
# -*- coding: utf-8 -*-
# @Time : 19-1-14
# @Author : lin
import pandas as pd
import numpy as np
import tensorflow as tf
import time
import os
from veg_final_predict.test_data_ok.solve_data_tools import SolveData
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
pd.set_option('max_colwidth', 5000)
pd.set_option('display.max_columns', 10)
pd.set_option('display.max_rows', 1000)
# 定义常量
rnn_unit = 50 # hidden layer units
input_size = 1 # 输入一个变量,即前一天的价格
output_size = 1 # 输出一个变量
def get_train_data(price_list, batch_size, time_step, train_begin, train_end):
"""
得到训练集
得到的train_x的格式为shape[len(data)-time_step,time_step,输入变量数]
得