用LSTM做时间序列预测的思路,tensorflow代码实现及传入数据格式

首先推荐一个对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,输入变量数]
    得
  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值