Genius工具比较最佳时间序列模型以进行多步时间序列建模
过Covid-19大流行预测活跃病例数
介绍与动机
全球covid-19大流行的增长强度促使研究人员通过考虑当前的统计数据并预测后续阶段中的近期术语,来评估可能在遥远的未来影响人们的最佳
机器学习模型。
虽然ARIMA / SARIMA等不同的单变量模型和传统的时间序列能够预测活跃病例数,每日恢复率,死亡人数,但它们并未考虑其他时变因素,例如医疗机构(测试量,ICU)床,医院门票,呼吸机,隔离病房,检疫中心等)。
随着这些因素变得越来越重要,我们建立了一个预测模型,该模型可以根据医疗设施的变化以及基础设施的其他变化来预测活动病例,死亡和康复的数量。
在此博客中,我们尝试根据可用于印度不同州的医学信息,使用
深度学习模型对多步时间序列预测进行建模。
多步时间序列预测
一个典型的多步预测模型如下图所示,其中前一个状态的每个预测结果都被视为下一个状态输入,以得出第二个状态的结果,依此类推。
www.tensorflow.org/tutorials/str ... e_series_files/outp ... “ alt =” png“ width =” 429“ height =” 280“ />来源
基于深度学习的多元时间序列训练和预测
下图说明了选择最佳深度学习模型所涉及的重要步骤。
基于时间序列的单/多步预测
将来自单一来源或直接可从云或其他第三方提供商获得的聚合来源的多元数据馈送到ML建模数据提取系统。
涉及缩放和规范化的数据的清理,预处理和特征工程。
将数据转换为有监督的时间序列。
将数据馈送到深度学习训练源,该训练源可以使用隐藏层,神经元,批处理大小和其他超参数的不同组合来训练不同的时间序列模型,例如LSTM,CNN,BI-LSTM,CNN + LSTM 。
分别使用单步或多步预测基于将来的远期或远期进行预测
通过将其与实际数据进行比较来评估一些错误度量标准,例如(MAPE,MAE,ME,RMSE,MPE)
当误差阈值超过时,重新训练模型并进行持续改进。
导入必要的Tensorflow库
该代码段概述了张量流所需的必要库。
from tensorflow.python.keras.layers import Dense
数据加载和选择功能
由于德里的Covid-19案件很高,因此在这里我们为“德里”州(印度国家首都)建模不同的DL模型。此外,我们保留日期范围为2020年3月25日至6月6日。培训使用数据至4月29日,而测试/预测使用4月30日至6月6日。测试数据已用于预测3个后续预测阶段的7天。
该代码演示了在训练和测试之间首先将数据分成70:30的比率(通过找到最接近的数字7),然后将每个集合重构为每周数据样本。
def split_dataset(data):
# split into standard weeks
print(np.shape(data))
split_factor = int((np.shape(data)[0]*0.7))
print("Split Factor no is"
m = 7
trn_close_no = closestNumber(split_factor
te_close_no = closestNumber((np.shape(data)[0]-split_factor)
train
print("Initials Train-Test Split --"
len_train = np.shape(train)[0]
len_test = np.shape(test)[0]
# restructure into windows of weekly data
train = array(split(train[0:len_train]
test = array(split(test
print("Final Train-Test Split --"
return train
Initials Train-Test Split-(49,23)(21,23)-----训练和测试数据集Final Train-Test Split-(7,7,23)(3,7,23) --- -将训练和测试数据集分别安排为每周7和3个每周样本。
数据集和功能已使用Min-Max Scaler进行了缩放。
scaler = MinMaxScaler(feature_range=(0
scaled_dataset = scaler.fit_transform(dataset)
将时间序列转换为监督数据集
在最棘手的部分转换的T IME系列受监管的时间序列的多步预测谎言纳入了过去数天(即历史数据的)每周数据必须考虑的问题。
通过考虑历史数据得出的序列在训练迭代期间被视为7次,在测试迭代期间被视为3次(因为它被分为(7
注意1:这是将时间序列数据表示为多步骤模型的最重要步骤
下面的代码段演示了上述内容。
# convert history into inputs and outputs
def to_supervised(train
# flatten data
data = train.reshape((train.shape[0] * train.shape[1]
X
in_start = 0
# step over the entire history one time step at a time
for _ in range(len(data)):
# define the end of the input sequence
in_end = in_start + n_input
out_end = in_end + n_out
# ensure we have enough data for this instance
if out_end <= len(data):
X.append(data[in_start:in_end
y.append(data[in_end:out_end
# move along one time step
in_start += 1
return array(X)
使用Tensorflow训练不同的深度学习模型
在本节中,我们描述如何使用Tensorflow的Keras API训练不同的DL模型。
卷积
神经网络(CNN模型)
下图通过代码片段回顾了卷积神经网络(CNN)的结构,其中显示了如何使用具有16个过滤器(内核大小为3)的一维CNN来分7步训练网络,其中每7步为7天。
资源
# train CNN model
def build_model_cnn(train
# prepare data
train_x
# define parameters
verbose
n_timesteps
# define model model = Sequential()
model.add(Conv1D(filters=16
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(10
model.add(Dense(n_outputs))
model.compile(loss='mse'
# fit network
model.fit(train_x
return model
有线电视新闻网
LSTM
以下代码段演示了在进行预测之前,我们如何训练LSTM模型,绘制图和验证损失。
# train LSTM model
def build_model_lstm(train
# prepare data
train_x
print(np.shape(train_x))
print(np.shape(train_y))
# define parameters
verbose
n_timesteps
# reshape output into [samples
train_y = train_y.reshape((train_y.shape[0]
# define model
model = Sequential()
model.add(LSTM(200
model.add(RepeatVector(n_outputs))
model.add(LSTM(200
model.add(TimeDistributed(Dense(100
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse'
# fit network
model.fit(train_x
return model
下图说明了 在对预测结果进行逆变换(以消除缩放的影响)之后,多步LSTM模型的实际结果与预测结果。
LSTM
双向LSTM
以下代码段演示了我们如何在进行预测之前训练BI- LSTM模型,绘制图和验证损失 。
资源
# train Bi-Directionsl LSTM model
def build_model_bi_lstm(train
# prepare data
train_x
print(np.shape(train_x))
print(np.shape(train_y))
# define parameters
verbose
n_timesteps
# reshape output into [samples
train_y = train_y.reshape((train_y.shape[0]
# define model
model = Sequential()
model.add(Bidirectional(LSTM(200
model.add(RepeatVector(n_outputs))
model.add(Bidirectional(LSTM(200
model.add(TimeDistributed(Dense(100
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse'
# fit network
model.fit(train_x
return model
下图说明了对预测结果进行逆变换(以消除缩放的影响)之后的多步Bi-LSTM模型的实际结果与预测结果。
商业智能
堆叠的LSTM + CNN
在这里,我们使用了带有时间分布层的Conv1d,然后将其提供给LSTM的单个层,以预测不同的序列,如下图所示。首先构建CNN模型,然后通过将CNN层的整个序列包装在TimeDistributed层中将其添加到LSTM模型中。
资源
# train Stacked CNN + LSTM model
def build_model_cnn_lstm(train
# prepare data
train_x
# define parameters
verbose
n_timesteps
# reshape output into [samples
train_y = train_y.reshape((train_y.shape[0]
# define model
model = Sequential()
model.add(Conv1D(filters=64
model.add(Conv1D(filters=64
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(RepeatVector(n_outputs))
model.add(LSTM(200
model.add(TimeDistributed(Dense(100
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse'
# fit network
model.fit(train_x
return model
预测和反比例缩放有助于产生实际的预测结果,如下所示。
带有CNN的LSTM

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!