关于数据挖掘:Python用Keras的LSTM神经网络进行时间序列预测天然气价格例子

11次阅读

共计 3463 个字符,预计需要花费 9 分钟才能阅读完成。

原文链接:http://tecdat.cn?p=26519 

一个简略的编码器 - 解码器 LSTM 神经网络应用于工夫序列预测问题:预测天然气价格,预测范畴为 10 天。“进入”工夫步长也设置为 10 天。) 只须要 10 天来推断接下来的 10 天。能够应用 10 天的历史数据集以在线学习的形式从新训练网络。

数据集是 天然气价格,具备以下性能:

  • 日期(从 1997 年到 2020 年)- 为 每天数据
  • 以元计的天然气价格

读取数据并将日期作为索引解决

# 固定日期工夫并设置为索引
dftet.index = pd.DatetimeIndex

# 用 NaN 来填补缺失的日期(当前再补)dargt = f\_arget.reindex(ales, fill\_value=np.nan)

# 查看
print(d_tret.dtypes)
df_aget.head(10)

解决缺失的日期

# 数据演绎(,应用 "向前填充"-- 依据之前的值进行填充)。dfaet.fillna(method='ffill', inplace=True)

特色工程

因为咱们正在应用深度学习,所以特色工程将是最小的。

  • One-hot 编码“is_weekend”和星期几
  • 增加行的最小值和最大值(可选)

通过设置固定的下限(例如 30 倍中位数)修复异样高的值

# 在 df_agg 中修复任何十分高的值 - 归一化为中值
for col in co\_to\_fi_ies:
    dgt\[col\] = fixnaes(dftget\[col\])

增加滞后

# 减少每周的滞后性
df\_tret = addag(d\_aget, tare\_arble='Price', step\_ak=7)
# Add 30 day lag
df\_get = ad\_ag(df\_ret, tagt\_able='Price', sep_bck=30)

# 合并后删除任何有 NA 值的列
d_gt.dropna(inplace=True)
print(dfget.shape)

tie\_nx = df\_art.index

归一化

  • 归一化或最小 - 最大尺度(须要减小较宽的数值范畴,以便 LSTM 收敛)。
# 标准化训练数据 \[0, 1\]
sclr = prcsing.Maxcaer((0,1))

筹备训练数据集

  • 工夫步数 = 1
  • 工夫步数 = nsteout 小时数(预测范畴)

在这里,咱们将数据集从 [samples, features] 转换为 [samples, steps, features] – 与算法 LSTM 一起应用的形态。上面的序列拆分应用“walk-forward”办法来创立训练数据集。

# 多变量多步骤编码器 - 解码器 lstm 示例
# 抉择一个工夫步骤的数量



# 维度变成 \[样本数、步骤、特色 \]
X, y = splices(datasformed, n\_ep\_in, n\_ep\_out)

# 分成训练 / 测试
et_ut = int(0.05*X.shpe\[0\]) 
X\_tain, X\_est, ytrain, y\_tst = X\[:-tetaont\], X\[-tes\_ont:\], y\[:-tstmunt\], y\[-es_unt:\]

训练模型

这利用了长期短期记忆算法。

# 实例化和训练模型
print
model = cre\_odel(n\_tps\_in, n\_tep\_out, n\_feures, lerig_rate=0.0001)

 

摸索预测

%%time
#加载特定的模型

model = lod\_id\_del(
                           n_stepin, 
                           n\_sep\_out, 
                           X_tan.shape\[2\])

# 展现对一个样本的预测
testle_ix = 0
yat = mdel.predict(X\_tet\[est\_amle\_ix\].reshape((1,n\_sep_in, nfatues)),erbose=Tue)

# 计算这一个测试样本的均方根误差
rmse = math.sqrt

plot\_result(yhat\[0\], scaler, saved\_columns)

均匀 RMSE

# 收集所有的测试 RMSE 值
rmesores = \[\]
for i in range:
    yhat = oel.predict(Xtet\[i\].reshape((1, \_stes\_in, _faues)), verbose=False)
    # 计算这一个测试样本的均方根误差
    rmse = math.sqrt(mensqaerror(yhat\[0\], y_test\[i\]))

训练整个数据集

# 在所有数据上实例化和训练模型
modl\_l = cret\_mel(nsep\_in, steps\_ou, n_etures,learnnrate=0.0001)
mde\_all, ru\_ime, weighfie = trin(md_all, X, y, batcsie=16, neohs=15)

样本内预测

留神:模型曾经“看到”或训练了这些样本,但咱们心愿确保它与预测统一。如果它做得不好,模型可能会欠拟合或过拟合。要尝试的事件:

  • 减少或缩小批量大小
  • 减少或缩小学习率
  • 更改网络中 LSTM 的暗藏层数
# 取得 10 个步
da\_cent = dfret.iloc\[-(ntes\_in*2):-nsps_in\]

# 标准化
dta_ectormed = sclr.rasfrm(daareent)

# 维度变成 \[样本数、步骤、特色 \]
n_res = dtcentorm.shape\[1\]
X\_st = data\_recn\_trsrd.reshape((1, n\_tps\_n, n\_feares))

# 预测
foecst = mlll.predict(X_past)

# 扩充规模并转换为 DF
forcast = forast.resape(n_eaturs))
foect = saer.inese_transform(forecast)
fuure\_dtes  df\_targe.ide\[-n\_steps\_out:\] 

# 绘图
histrcl = d_aet.ioc\[-100:, :1\] # 取得历史数据的 X 步回溯
for i in ane(oisae\[1\]):
    fig = plt.igre(fgze=(10,5))
    
    # 绘制 df_agg 历史数据
    plt.plot(.iloc\[:,i\]
    
    # 绘制预测图
    plt.plot(frc.iloc\[:,i\])

    # 标签和图例
    plt.xlabel

预测样本外

# 获取最初 10 步
dtareent = dfargt.iloc\[-nstpsin:\]。# 缩放
dta\_ecntranfomed = scaler.trasorm(data\_recent)


# 预测
forct = meall.rict(_past)

# 扩充规模并转换为 DF
foreast = foecs.eshape(\_seps\_ut, n_eatures))
foreast = sclerinvers_tranorm(focast)
futur\_daes = pd.daternge(df\_argetinex\[-1\], priods=step_out, freq='D')


# 绘图
htrical = df_taet.iloc\[-100:, :1\] # 取得历史数据的 X 步回溯
# 绘制预测图
    plt.plot(fectoc\[:,i\])


 

最受欢迎的见解

1. 在 python 中应用 lstm 和 pytorch 进行工夫序列预测

2.python 中利用长短期记忆模型 lstm 进行工夫序列预测剖析

3. 应用 r 语言进行工夫序列(arima,指数平滑)剖析

4.r 语言多元 copula-garch- 模型工夫序列预测

5.r 语言 copulas 和金融工夫序列案例

6. 应用 r 语言随机稳定模型 sv 解决工夫序列中的随机稳定

7.r 语言工夫序列 tar 阈值自回归模型

8.r 语言 k -shape 工夫序列聚类办法对股票价格工夫序列聚类

9.python3 用 arima 模型进行工夫序列预测

正文完
 0