尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

科普:从时间序列数据到LSTM多步时序预测

科普:从时间序列数据到LSTM多步时序预测 从时间序列数据中训练LSTM模型的过程中有哪些重难点首先时间序列数据不是直接的“样本”如何构造出“样本”本文从这个角度出发讨论再关的问题。1、滑动窗口构造数据集原始商品长时间序列[D1,D2,D3,D4,D5,D6,D7,… ][\text{D1},\text{D2},\text{D3},\text{D4},\text{D5},\text{D6},\text{D7},\dots][D1,D2,D3,D4,D5,D6,D7,…]采用固定窗口切分示例回看历史长度T3\boldsymbol{T 3}T3使用过去3天数据作为输入序列预测步数H4\boldsymbol{H 4}H4预测后续连续4天窗口1历史(D1,D2,D3) → 预测(D4,D5,D6,D7) 窗口2历史(D2,D3,D4) → 预测(D5,D6,D7,D8)2、样本生成规则从上述原始数据集中构造出样本集针对单一商品窗口每向后滑动一次生成一条训练样本。演示规模参数总样本数量N10\boldsymbol{N 10}N10每日特征数F2\boldsymbol{F 2}F2特征1当日销量特征2是否节假日注意该特征仅作演示用工程中的特征由业务决定。示例包含3个商品商品0、商品1、商品2。不同商品原始时序长度不一致最终滑动生成10条样本样本编号属于哪个商品历史窗口输入需要预测未来4天标签y0商品0D1,D2,D3D4,D5,D6,D71商品0D2,D3,D4D5,D6,D7,D82商品0D3,D4,D5D6,D7,D8,D93商品1D1,D2,D3D4,D5,D6,D74商品1D2,D3,D4D5,D6,D7,D85商品1D3,D4,D5D6,D7,D8,D96商品1D4,D5,D6D7,D8,D9,D107商品2D1,D2,D3D4,D5,D6,D78商品2D2,D3,D4D5,D6,D7,D89商品2D3,D4,D5D6,D7,D8,D9说明商品1原始时序更长包含D10因此额外生成样本6商品0、商品2时序截止到D9无法构造该窗口。3、X_train输入张量形状X_train.shape(10,3,2)\boldsymbol{X\_train.shape(10,3,2)}X_train.shape(10,3,2)索引规则X_train[样本号, 历史时序位置, 特征序号]以样本0商品0历史D1,D2,D3X_train[0][[D1销量,D1是否节假日],[D2销量,D2是否节假日],[D3销量,D3是否节假日]]样本7商品2历史D1,D2,D3X_train[7][[D1销量,D1是否节假日],[D2销量,D2是否节假日],[D3销量,D3是否节假日]]每一条X_train[k]对应一条独立时序样本不同商品、不同滑动窗口相互独立。4、y_train标签张量形状y_train.shape(10,4)\boldsymbol{y\_train.shape(10,4)}y_train.shape(10,4)索引规则y_train[样本号, 预测步]y_train[0][D4销量,D5销量,D6销量,D7销量]# 样本0未来4天真值y_train[1][D5销量,D6销量,D7销量,D8销量]# 样本1未来4天真值y_train[2][D6销量,D7销量,D8销量,D9销量]y_train[3][D4销量,D5销量,D6销量,D7销量]…… y_train[9][D6销量,D7销量,D8销量,D9销量]5、切片语法y_train[:, i]演示:代表选取全部样本i固定选取第iii个预测步。示例取i0i0i0预测未来第1天targety_train[:,0]# target.shape (10,)target[y_train[0,0],# 样本0 D4销量y_train[1,0],# 样本1 D5销量y_train[2,0],# 样本2 D6销量y_train[3,0],# 样本3 D4销量y_train[4,0],# 样本4 D5销量y_train[5,0],# 样本5 D6销量y_train[6,0],# 样本6 D7销量y_train[7,0],# 样本7 D4销量y_train[8,0],# 样本8 D5销量y_train[9,0]# 样本9 D6销量]6、训练逻辑多独立模型基础循环对给定下标iii提取单列标签作为目标执行训练model.fit(X_train,target)完整循环逻辑# 演示案例 range(4)真实业务预测16天改为 range(16)foriinrange(4):# \(i0\)学习历史序列 → 预测未来第1天# i1学习历史序列 → 预测未来第2天targety_train[:,i]# 新建模型并训练model.fit(X_train,target)7、方案A多个独立单输出LSTM原理循环依次取出每一列标签分别训练独立模型。模型0预测未来第1天模型1预测未来第2天……一共训练4个模型业务场景16个。简易完整代码importnumpyasnpimporttensorflowastffromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportLSTM,Dense# 模拟维度N,T,F,H10,3,2,4X_trainnp.random.rand(N,T,F)y_trainnp.random.rand(N,H)pred_result[]defbuild_single_model():modelSequential()model.add(LSTM(16,input_shape(T,F)))model.add(Dense(1))# 单输出model.compile(optimizeradam,lossmse)returnmodel# 循环训练H个独立模型foriinrange(H):targety_train[:,i]modelbuild_single_model()model.fit(X_train,target,epochs20,verbose0)predmodel.predict(X_train,verbose0)pred_result.append(pred)# 拼接得到 (N,H) 的预测矩阵pred_matrixnp.concatenate(pred_result,axis1)print(pred_matrix.shape)# (10,4)特点各预测任务参数独立、互不干扰代价是多次训练耗时更高。8、方案B单模型一体多输出LSTM改造方案原理不切片标签直接使用完整二维标签y_train (10,4)一个模型输入历史序列一次性输出4个预测值对应未来连续4天销量。简易完整代码importnumpyasnpimporttensorflowastffromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportLSTM,Dense N,T,F,H10,3,2,4X_trainnp.random.rand(N,T,F)y_trainnp.random.rand(N,H)defbuild_multi_model():modelSequential()model.add(LSTM(16,input_shape(T,F)))model.add(Dense(H))# 一次性输出H维model.compile(optimizeradam,lossmse)returnmodel modelbuild_multi_model()model.fit(X_train,y_train,epochs20,verbose0)pred_matrixmodel.predict(X_train,verbose0)print(pred_matrix.shape)# (10,4)特点仅训练一次速度更快远近预测任务共享LSTM权重存在梯度竞争。
返回列表