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

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 使用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’]]
目录
相关文章
|
2天前
|
机器学习/深度学习 数据采集 自然语言处理
如何使用深度学习模型来提高命名实体识别的准确率?
如何使用深度学习模型来提高命名实体识别的准确率?
|
2天前
|
机器学习/深度学习 自然语言处理 搜索推荐
深度学习之人机交互中的认知模型
基于深度学习的人机交互中的认知模型旨在使计算机系统能够更好地理解、预测和响应人类行为和意图,从而实现更自然和有效的交互体验。
11 2
|
9天前
|
机器学习/深度学习 边缘计算 PyTorch
PyTorch 与边缘计算:将深度学习模型部署到嵌入式设备
【8月更文第29天】随着物联网技术的发展,越来越多的数据处理任务开始在边缘设备上执行,以减少网络延迟、降低带宽成本并提高隐私保护水平。PyTorch 是一个广泛使用的深度学习框架,它不仅支持高效的模型训练,还提供了多种工具帮助开发者将模型部署到边缘设备。本文将探讨如何将PyTorch模型高效地部署到嵌入式设备上,并通过一个具体的示例来展示整个流程。
35 1
|
7天前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
|
7天前
|
机器学习/深度学习 API TensorFlow
深入解析TensorFlow 2.x中的Keras API:快速搭建深度学习模型的实战指南
【8月更文挑战第31天】本文通过搭建手写数字识别模型的实例,详细介绍了如何利用TensorFlow 2.x中的Keras API简化深度学习模型构建流程。从环境搭建到数据准备,再到模型训练与评估,展示了Keras API的强大功能与易用性,适合初学者快速上手。通过简单的代码,即可完成卷积神经网络的构建与训练,显著降低了深度学习的技术门槛。无论是新手还是专业人士,都能从中受益,高效实现模型开发。
|
19天前
|
机器学习/深度学习 API 异构计算
7.1.3.2、使用飞桨实现基于LSTM的情感分析模型的网络定义
该文章详细介绍了如何使用飞桨框架实现基于LSTM的情感分析模型,包括网络定义、模型训练、评估和预测的完整流程,并提供了相应的代码实现。
|
1月前
|
机器学习/深度学习
【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
长短时记忆网络(LSTM)的基本概念、解决梯度消失问题的机制,以及介绍了包括梯度裁剪、改变激活函数、残差结构和Batch Normalization在内的其他方法来解决梯度消失或梯度爆炸问题。
39 2
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
RNN、LSTM、GRU神经网络构建人名分类器(三)
这个文本描述了一个使用RNN(循环神经网络)、LSTM(长短期记忆网络)和GRU(门控循环单元)构建的人名分类器的案例。案例的主要目的是通过输入一个人名来预测它最可能属于哪个国家。这个任务在国际化的公司中很重要,因为可以自动为用户注册时提供相应的国家或地区选项。
|
3月前
|
机器学习/深度学习 数据采集
RNN、LSTM、GRU神经网络构建人名分类器(一)
这个文本描述了一个使用RNN(循环神经网络)、LSTM(长短期记忆网络)和GRU(门控循环单元)构建的人名分类器的案例。案例的主要目的是通过输入一个人名来预测它最可能属于哪个国家。这个任务在国际化的公司中很重要,因为可以自动为用户注册时提供相应的国家或地区选项。
|
3月前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
68 6
下一篇
DDNS