深度学习在时间序列数据预测中的应用
创作时间:
作者:
@小白创作中心
深度学习在时间序列数据预测中的应用
引用
CSDN
1.
https://blog.csdn.net/weixin_41593193/article/details/146035884
在大数据、云计算、人工智能和物联网普及的5G时代,数据在每时每刻的生成、传输、分析。尤其是在各种智慧物联网平台中,实时指标监控是平台的一项基本功能,通过对传感器收集到的数据进行汇总统计,形成实时监控仪表盘。但在实际运行中,除了对实时指标数据的监控,我们更关心未来指标的变化趋势,从而“预知未来,提前规划”这就会涉及到时序类数据的预测问题。时序类数据的预测在很多重要领域均有应用,比如:预测销售额、预测呼叫中心的来电数量、预测太阳活动和海洋潮汐、预测股市行为等。
目前,时序类数据预测算法经过多年来的研究和实践,常用算法主要有以下几类:简单平均数、移动平均数、指数平滑法、霍尔特线性趋势预测、Holt-Winters季节性预测模型、自回归差分移动平均模型(ARIMA模型)、转化为监督学习数据集,使用xgboot/LSTM模型/时间卷积网络/seq2seq(attention_based_model)、Facebook-prophet【类似于STL分解思路】、深度学习网络(LSTM)等。
作者以某污水厂智慧水务平台的指标数据作为案例分析数据,经过大量实证交叉验证发现LSTM在时序类数据的预测中明显优于其他算法。
LSTM算法介绍
预测算法功能
实现通过一段时间内【如前300min】的辅助变量数据预测未来一段时间【如未来120min】的主导数据预测,例如:利用溶解氧含量、氨氮含量、硝氮含量等辅助变量的历史数据实现对氨氮含量这一主导变量未来一段时间【120min】的数值趋势,具体可分为单变量预测和多变量预测。
算法原理
LSTM算法是深度学习中解决序列类问题的一个常用算法,在传统RNN中引入“输入门、记忆门、输出门”,解决了传统RNN梯度爆炸和梯度消失的问题,是目前解决序列类分类和回归预算问题的一个常用算法。算法原理图如下:
算法核心代码
class AiPredictTrainor(object):
"""
AI软测量技术,实现根据辅助变量预测主导变量,多步预测
"""
def __init__(self, model_name="soft_measure_pca.h5"):
self.model_name = model_name
def deal_abnormal_sigma(self, data, thld=3):
"""异常值处理函数,3sigma原理"""
base_mean = np.mean(data)
base_std = np.std(data)
upper = base_mean + thld * base_std
lower = base_mean - thld * base_std
data = np.where(data > upper, np.NaN, data)
data = np.where(data < lower, np.nan, data)
return data
def deal_abnormal_iqr(self, data, thld=1.5):
"""异常值处理函数,IQR原理"""
q75 = np.percentile(data, 75)
q25 = np.percentile(data, 25)
iqr = q75 - q25
upper = q75 + thld * iqr
lower = q25 - thld * iqr
data = np.where(data > upper, np.NaN, data)
data = np.where(data < lower, np.NaN, data)
return data
def fill_nan(self, data):
"""值法填充缺失值"""
for f in data:
data[f] = data[f].interpolate()
data = data.fillna(method="bfill").fillna(method="ffill")
return data
def pca_data(self, data, n_component=0.98):
"主成分分析"
pca = PCA(n_components=n_component)
pca.fit(data)
data_pca = pca.transform(data)
self.pca = pca
joblib.dump(pca, self.model_name.split(".")[0]+".pkl")
return data_pca
def get_dataset(self, data, target, history_size, target_size, pca=False):
n = data.shape[0]
range_size = history_size + target_size
if pca:
data_x = self.pca_data(data)
x = [data_x[i:i + history_size] for i in range(n - range_size + 1)]
else:
x = [data[i:i + history_size] for i in range(n - range_size + 1)]
y = [data[i:i + target_size, target]
for i in range(history_size, n - target_size + 1)]
x = np.array(x, dtype=np.float32)
y = np.array(y, dtype=np.float32)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=TEST_SCALE)
return x_train, x_test, y_train, y_test
def train(self, data, target=20, history_size=300, target_size=120, pca=False, deal_abnorm=None, lstm_num=[128, 64, 32, 16, 8], full_num=[2000, 1000, 500], drop_out=False, epochs=100):
"""构建模型"""
if deal_abnorm == "sigma":
data = data.apply(self.deal_abnormal_sigma)
elif deal_abnorm == "iqr":
data = data.apply(self.deal_abnormal_iqr)
data = self.fill_nan(data)
dataset = data.values
train_mean, train_std = dataset.mean(axis=0), dataset.std(axis=0)
scaler = StandardScaler()
scaler = scaler.fit(dataset)
dataset = scaler.transform(dataset)
joblib.dump(scaler, self.model_name.split(".")[0]+"_scaler.pkl")
with open(self.model_name.split(".")[0]+"_scaler_y.pkl", "wb") as f:
thld_dict = {"mean": train_mean[target], "std": train_std[target]}
pickle.dump(thld_dict, f, True)
x_train, x_test, y_train, y_test = self.get_dataset(
dataset, target, history_size, target_size, pca=pca)
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_data.cache().shuffle(
BUFFER_SIZE).batch(BATCH_SIZE).repeat()
val_data = tf.data.Dataset.from_tensor_slices((x_test, y_test))
valid_dataset = val_data.batch(BATCH_SIZE).repeat()
STEP_PER_EPOCH = (len(data)*(1-TEST_SCALE))//BATCH_SIZE
VALIDATION_STEPS = (len(data)*TEST_SCALE)//BATCH_SIZE
checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(
filepath=self.model_name,
monitor='val_loss',
verbose=1,
save_best_only=True,
mode='min',
period=1)
lr_scheduler = tf.keras.callbacks.ReduceLROnPlateau(
monitor='val_loss', factor=0.1, patience=5, min_lr=0.0001)
early_stopping_cb = tf.keras.callbacks.EarlyStopping(
patience=30,
restore_best_weights=True
)
regressor = tf.keras.Sequential()
for cell in lstm_num:
regressor.add(tf.keras.layers.LSTM(
units=cell, return_sequences=True))
if drop_out:
regressor.add(tf.keras.layers.Dropout(0.2))
regressor.add(tf.keras.layers.Flatten())
for full_cell in full_num:
regressor.add(tf.keras.layers.Dense(full_cell, activation="relu"))
if drop_out:
regressor.add(tf.keras.layers.Dropout(0.2))
regressor.add(tf.keras.layers.Dense(units=target_size))
# 模型编译
regressor.compile(optimizer=keras.optimizers.Adam(
learning_rate=0.001, clipnorm=1.0), loss='mse')
# 模型训练
regressor.fit(train_dataset, epochs=epochs, steps_per_epoch=STEP_PER_EPOCH, validation_data=valid_dataset,
validation_steps=VALIDATION_STEPS, callbacks=[checkpoint_cb, early_stopping_cb, lr_scheduler])
算法预测结果
单变量预测结果【用自己的历史数据预测自己】
多变量预测结果【用别人的历史数据预测自己】
热门推荐
“违法停车,发生交通事故是否需要承担责任?” 法院判了!
如何制定有效的投资管理策略
王能全:全球经济低迷与需求疲软,2025年国际石油市场前景堪忧
首都机场集团:四年巨亏340亿!
如何做好寿险营销管理?2024年实战策略与数字化工具全解析
重庆交通职业学院:AI技术赋能职业教育创新实践
增强肺活量的13种锻炼方法
RTOS与RMS:嵌入式系统中的实时任务调度
羽绒服和冲锋衣哪个“抗冷”?别听导购忽悠,了解清楚再买不被坑
新疆旅游:把温情刻进DNA
恒兴国家863基地见证广东湛江水产经济20年发展
模糊层次分析法
领了失业金对退休金有影响吗
黑豆、黄豆、红豆,哪种营养更好?营养师:都好,需根据自身选择
卫子夫的悲剧人生:揭秘她的死亡之谜
2024五行金木水火土
解决咖啡机清洗故障的方法(如何正确清洗咖啡机以及常见清洗故障解决方案)
项目经理等级如何评定
怎样进行冥想?
怎样对付交往中的"冷暴力",试试这几个方法,都不行就直接离开
文化创新:一场跨越时空的对话
蕺菜(鱼腥草)百科:别名、科属及形态特征解析
蜀汉大将李恢:彻底平定南中叛乱,有力支撑诸葛亮北伐
物流各个岗位的工资,物流工作人员多少钱一个月
空调制热用不起?学邻居家的做法,比所有电暖器都省电
汉服刺绣针法:传统技艺与现代设计的融合
传承与时代共鸣——了解并欣赏传统与现代汉服融合之路
缓解充电桩供需矛盾:多方协同,补齐小区充电桩建设短板
欧亚股市今年以来跑赢美股!多家国际投行唱多中国股市
如果恐龙复活,它们能适应现代社会吗?