使用LSTM深度学习模型进行温度的时间序列单步和多步预测(二)

简介: 使用LSTM深度学习模型进行温度的时间序列单步和多步预测

timesteps-样本的长度。

功能-使用的功能数量。

建模之前的第一件事是将2D格式的数据转换为3D数组。以下功能可以做到这一点:

例如,如果我们假设整个数据是数据的前10行,那么我们将过去3个小时用作特征,并希望预测出1步:

defcreate_X_Y(ts: np.array, lag=1, n_ahead=1, target_index=0) ->tuple:
"""A method to create X and Y matrix from a time series array for the training ofdeep learning models"""#Extractingthenumberoffeaturesthatarepassedfromthearrayn_features=ts.shape[1]
#CreatingplaceholderlistsX, Y= [], []
iflen(ts) -lag<=0:
X.append(ts)
else:
foriinrange(len(ts) -lag-n_ahead):
Y.append(ts[(i+lag):(i+lag+n_ahead), target_index])
X.append(ts[i:(i+lag)])
X, Y=np.array(X), np.array(Y)
#ReshapingtheXarraytoanRNNinputshapeX=np.reshape(X, (X.shape[0], lag, n_features))
returnX, Y

例如,如果我们假设整个数据是数据的前10行,那么我们将过去3个小时用作特征,并希望预测出1步:

ts=d[
‘temp’,
‘day_cos’,
‘day_sin’,
‘month_sin’,
‘month_cos’,
‘pressure’,
‘wind_speed’].head(10).valuesX, Y=create_X_Y(ts, lag=3, n_ahead=1)

640.png

如我们所见,X矩阵的形状是6个样本,3个时间步长和7个特征。换句话说,我们有6个观测值,每个观测值都有3行数据和7列。之所以有6个观测值,是因为前3个滞后被丢弃并且仅用作X数据,并且我们预测提前1步,因此最后一个观测值也会丢失。

640.png

上图中显示了X和Y的第一个值对。

最终模型的超参数列表:

#Numberoflags (hoursback) touseformodelslag=48#Stepsaheadtoforecastn_ahead=1#Shareofobsintestingtest_share=0.1#Epochsfortrainingepochs=20#Batchsizebatch_size=512#Learningratelr=0.001#NumberofneuronsinLSTMlayern_layer=10#Thefeaturesusedinthemodelingfeatures_final= [‘temp’, ‘day_cos’, ‘day_sin’, ‘month_sin’, ‘month_cos’, ‘pressure’, ‘wind_speed’]

模型代码

classNNMultistepModel():
def__init__(
self,
X,
Y,
n_outputs,
n_lag,
n_ft,
n_layer,
batch,
epochs,
lr,
Xval=None,
Yval=None,
mask_value=-999.0,
min_delta=0.001,
patience=5  ):
lstm_input=Input(shape=(n_lag, n_ft))
#Seriessignallstm_layer=LSTM(n_layer, activation='relu')(lstm_input)
x=Dense(n_outputs)(lstm_layer)
self.model=Model(inputs=lstm_input, outputs=x)
self.batch=batchself.epochs=epochsself.n_layer=n_layerself.lr=lrself.Xval=Xvalself.Yval=Yvalself.X=Xself.Y=Yself.mask_value=mask_valueself.min_delta=min_deltaself.patience=patiencedeftrainCallback(self):
returnEarlyStopping(monitor='loss', patience=self.patience, min_delta=self.min_delta)
deftrain(self):
#Gettingtheuntrainedmodelempty_model=self.model#Initiatingtheoptimizeroptimizer=keras.optimizers.Adam(learning_rate=self.lr)
#Compilingthemodelempty_model.compile(loss=losses.MeanAbsoluteError(), optimizer=optimizer)
if (self.XvalisnotNone) & (self.YvalisnotNone):
history=empty_model.fit(
self.X,
self.Y,
epochs=self.epochs,
batch_size=self.batch,
validation_data=(self.Xval, self.Yval),
shuffle=False,
callbacks=[self.trainCallback()]
          )
else:
history=empty_model.fit(
self.X,
self.Y,
epochs=self.epochs,
batch_size=self.batch,
shuffle=False,
callbacks=[self.trainCallback()]
          )
#Savingtooriginalmodelattributeintheclassself.model=empty_model#Returningthetraininghistoryreturnhistorydefpredict(self, X):
returnself.model.predict(X)

创建用于建模之前的最后一步是缩放数据。

#Subsetingonlytheneededcolumnsts=d[features_final]nrows=ts.shape[0]
#Splitingintotrainandtestsetstrain=ts[0:int(nrows* (1test_share))]
test=ts[int(nrows* (1test_share)):]
#Scalingthedatatrain_mean=train.mean()
train_std=train.std()train= (traintrain_mean) /train_stdtest= (testtrain_mean) /train_std#Creatingthefinalscaledframets_s=pd.concat([train, test])
#CreatingtheXandYfortrainingX, Y=create_X_Y(ts_s.values, lag=lag, n_ahead=n_ahead)n_ft=X.shape[2]

现在我们将数据分为训练和验证

#SplitingintotrainandtestsetsXtrain, Ytrain=X[0:int(X.shape[0] * (1test_share))], Y[0:int(X.shape[0] * (1test_share))]
Xval, Yval=X[int(X.shape[0] * (1test_share)):], Y[int(X.shape[0] * (1test_share)):]

数据的最终形状:

Shapeoftrainingdata: (243863, 48, 7)
Shapeofthetargetdata: (243863, 1)
Shapeofvalidationdata: (27096, 48, 7)
Shapeofthevalidationtargetdata: (27096, 1)

剩下的就是使用模型类创建对象,训练模型并检查验证集中的结果。

#Initiatingthemodelobjectmodel=NNMultistepModel(
X=Xtrain,
Y=Ytrain,
n_outputs=n_ahead,
n_lag=lag,
n_ft=n_ft,
n_layer=n_layer,
batch=batch_size,
epochs=epochs,
lr=lr,
Xval=Xval,
Yval=Yval,
)
#Trainingofthemodelhistory=model.train()

640.png

使用训练好的模型,我们可以预测值并将其与原始值进行比较。

#Comparingtheforecastswiththeactualvaluesyhat= [x[0] forxinmodel.predict(Xval)]
y= [y[0] foryinYval]
#Creatingtheframetostorebothpredictionsdays=d[‘dt’].values[-len(y):]frame=pd.concat([
pd.DataFrame({‘day’: days, ‘temp’: y, ‘type’: ‘original’}),
pd.DataFrame({‘day’: days, ‘temp’: yhat, ‘type’: ‘forecast’})
])
#Creatingtheunscaledvaluescolumnframe[‘temp_absolute’] = [(x*train_std[‘temp’]) +train_mean[‘temp’] forxinframe[‘temp’]]
#Pivotingpivoted=frame.pivot_table(index=’day’, columns=’type’)
pivoted.columns= [‘_’.join(x).strip() forxinpivoted.columns.values]
pivoted[‘res’] =pivoted[‘temp_absolute_original’] pivoted[‘temp_absolute_forecast’]
pivoted[‘res_abs’] = [abs(x) forxinpivoted[‘res’]]
目录
相关文章
|
6月前
|
机器学习/深度学习 算法 安全
【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
317 1
|
7月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
249 2
|
6月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
663 2
|
7月前
|
机器学习/深度学习 算法 物联网
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
273 0
|
机器学习/深度学习 API 异构计算
7.1.3.2、使用飞桨实现基于LSTM的情感分析模型的网络定义
该文章详细介绍了如何使用飞桨框架实现基于LSTM的情感分析模型,包括网络定义、模型训练、评估和预测的完整流程,并提供了相应的代码实现。
|
机器学习/深度学习 自然语言处理 监控
深入探索:深度学习在时间序列预测中的强大应用与实现
时间序列分析是数据科学和机器学习中一个重要的研究领域,广泛应用于金融市场、天气预报、能源管理、交通预测、健康监控等多个领域。时间序列数据具有顺序相关性,通常展示出时间上较强的依赖性,因此简单的传统回归模型往往不能捕捉其中复杂的动态特征。深度学习通过其非线性建模能力和层次结构的特征提取能力,能够有效地捕捉复杂的时间相关性和非线性动态变化模式,从而在时间序列分析中展现出极大的潜力。
1066 0
|
机器学习/深度学习 自然语言处理 PyTorch
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
|
机器学习/深度学习 运维 安全
深度学习在安全事件检测中的应用:守护数字世界的利器
深度学习在安全事件检测中的应用:守护数字世界的利器
504 22
|
11月前
|
机器学习/深度学习 编解码 人工智能
计算机视觉五大技术——深度学习在图像处理中的应用
深度学习利用多层神经网络实现人工智能,计算机视觉是其重要应用之一。图像分类通过卷积神经网络(CNN)判断图片类别,如“猫”或“狗”。目标检测不仅识别物体,还确定其位置,R-CNN系列模型逐步优化检测速度与精度。语义分割对图像每个像素分类,FCN开创像素级分类范式,DeepLab等进一步提升细节表现。实例分割结合目标检测与语义分割,Mask R-CNN实现精准实例区分。关键点检测用于人体姿态估计、人脸特征识别等,OpenPose和HRNet等技术推动该领域发展。这些方法在效率与准确性上不断进步,广泛应用于实际场景。
1330 64
计算机视觉五大技术——深度学习在图像处理中的应用
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
1210 6

热门文章

最新文章