时间序列预测算法总结

【Predictive algorithms 预测算法】- ①.主旨与概念 预测算法的目标是通过已知的信息和数据,对未来的情况进行预测。这些算法可以应用于各种领域,例如金融、销售、市场营销、天气预报、股票市场、医疗诊断等。常见的预测算法包括线性回归、逻辑回归、决策树、随机森林、支持向量机、K近邻算法、神经网络等。这些算法在建立模型时,使用不同的数学和统计技术来拟合数据,并根据模型来进行预测。它通过分析历史数据、特征和模式来建立一个模型,并使用该模型来预测未知数据或未来事件的结果。预测算法的选择取决于问题的性质、可用数据的类型和数量、算法的适用性以及预测的准确性要求。 阅读详情

一、背景介绍

        绝大部分行业场景,尤其是互联网、量化行业,每天都会产生大量的数据。金融领域股票价格随时间的走势;电商行业每日的销售额;旅游行业随着节假日周期变化的机票酒店价格等;我们称这种不同时间收到的,描述一个或多种特征随着时间发生变化的数据,为时间序列数据(Time Series Data)。而时间序列预测做的就是通过多种维度的数据本身内在与时间的关联特性,利用历史的数据预测未来这么一件事情。

二、算法汇总

时序预测从不同角度看有不同分类:

        从实现原理的角度,可以分为传统统计学,机器学习(又分非深度学习和深度学习)。
        按预测步长区分,可以分为单步预测和多步预测,简单来说就是一次预测未来一个时间单元还是一次预测未来多个时间单元的区别。
        按输入变量区分,可以分为自回归预测和使用协变量进行预测,区别在于维度中是否含有协变量,例如预测未来销售量时,如果只接受时间和历史销售量数据,则是自回归预测,如果可以接受天气、经济指数、政策事件分类等其他相关变量(称为协变量),则称为使用协变量进行预测。
        按输出结果区分,可以分为点预测和概率预测,很多模型只提供了点预测而不提供概率预测,点预测模型后再加蒙特卡洛模拟(或其他转化为概率预测的方式)往往不能准确反映模型输出的预测概念,而在大多数场景下,概率预测更贴近事实情况,对于未来的预测本身就应该是一种概率分布。
        按目标个数区分,可以分为一元、多元、多重时间序列预测。举例理解,使用历史的销售量预测未来1天的销售量为一元时间序列预测,使用历史的进店人数、销售量、退货量预测未来1天的进店人数、销售量、退货量(预测目标有三个)为多元时间序列预测,使用历史的红烧牛肉面、酸菜牛肉面、海鲜面的销售量预测未来1天的红烧牛肉面、酸菜牛肉面、海鲜面的销售量(预测目标有三种)为多重时间序列预测。 [1]

        本文接下来会从实现原理的角度切入,大致介绍一下场景的时间序列预测方法的原理以及具体python实现,大部分深度学习的实现依赖于AWS于2019开源的时间序列建模工具包Gluon Time Series(GluonTS)

2.1 传统经典时间序列预测方法

ARIMA

  • 简介

        ARIMA是一种非常流行的时间序列预测统计方法,它是自回归综合移动平均(Auto-Regressive Integrated Moving Averages)的首字母缩写。ARIMA模型建立在以下假设的基础上: 数据序列是平稳的,这意味着均值和方差不应随时间而变化。 通过对数变换或差分可以使序列平稳。

from gluonts.model.r_forecast import RForecastPredictor
# build model
arima_estimator = RForecastPredictor(freq='1D', prediction_length=args.horizon, method_name="arima")
# Predicting 
forecast_df = pd.DataFrame(columns=['id', 'target_start_date', 'point_fcst_value'])  # df_pred
for entry_, forecast_ in tqdm(zip(training_data, estimator.predict(training_data))):
     id = entry_["id"]
     forecast_df = forecast_df.append( 
                       pd.DataFrame({"id": id,
                                     "target_start_date": forecast_.index.map(lambda s: s.strftime('%Y%m%d')),
                                     "point_fcst_value": forecast_.median}))

Holt-Winters

  • 简介

        其实就是一种(三次)指数平滑方法,Holt (1957) 和 Winters (1960) 将Holt方法进行拓展用来捕获季节因素。Holt-Winters季节性方法包括预测方程和三个平滑方程:一个用于水平 ,一个用于趋势 ,另一个用于季节性分量。然后以累加或累乘的方式叠加分量组成预测。

from statsmodels.tsa.holtwinters import ExponentialSmoothing
data = pd.Series(data)
yhat = ExponentialSmoothing(data, seasonal_periods=4, trend='add', seasonal='add').fit(use_boxcox=True)

 

Facebook Prophet

  • 简介

        prophet 算法是基于时间序列分解(同上:seasonal、trend、residual)和机器学习的拟合来做的,它最适用于具有强烈季节性影响和多个季节历史数据的时间序列。Prophet 对缺失数据和趋势变化具有稳健性,并且通常可以很好地处理异常值。

from gluonts.model.prophet import ProphetPredictor
# build model
prophet_estimator = ProphetPredictor(freq='1D',
                             prediction_length=args.horizon,
                             prophet_params={'daily_seasonality': True,
                                             'weekly_seasonality': True,
                                             'changepoint_prior_scale': 0.03,
                                             'changepoint_range': 0.5,
                                             'seasonality_mode': 'multiplicative'
                                                         }
# Predicting 
# same as above

2.2 特征工程+ML类方法

GBM类回归算法

  • 简介

        Boosting 是集成学习中非常重要的一类算法,其基本原理是串行生成一系列弱学习器(weak learner),这些弱学习器直接通过组合到一起构成最终的模型。Boosting 算法可以用于解决分类和回归问题,主要的算法包括早期的AdaBoost 和 后续的Gradient Boosting。

        而GBDT(Gradient Boosting Decision Tree)是弱学习器使用 CART 回归树的一种 Gradient Boosting,使用决策树作为弱学习器的一个好处是:决策树本身是一种不稳定的学习器(训练数据的一点波动可能给结果带来较大的影响),从统计学的角度单棵决策树的方差比较大。而在集成学习中,弱学习器间方差越大,弱学习器本身泛化性能越好,则集成学习模型的泛化性能就越好。因此使用决策树作为弱学习器通常比使用较稳定的弱学习器(如线性回归等)泛化性能更好。

        包括后续演变而出的XGBoost和LightGBM算法等基于GBM的衍生算法,在早年由于泛化性好,训练速度快等优点在Kaggle等比赛中得到广泛使用。

from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split

# 重新分割训练和测试数据
dm_trainDF = dm_allDF[:len(trainDF)]
dm_testDF = dm_allDF[len(trainDF):]

# 去掉id号
train_data = dm_trainDF.drop(['Id'],axis=1).values
train_label = trainDF_label.values

X_test_ids = dm_testDF['Id'].values
X_test = dm_testDF.drop(['Id'],axis=1).values

# 分割训练集和验证集
X_train, X_valid, Y_train, Y_valid = train_test_split(train_data, train_label,test_size=0.2)

xgb = XGBRegressor(n_estimators=500, learning_rate=0.05, min_child_weight=5, max_depth=4)
xgb.fit(X_train,Y_train)
print "Validation:",xgb.score(X_valid,Y_valid)

predict = xgb.predict(X_test)

2.3 深度学习类方法

2.3.1 Seq2Seq类

如RNN、LSTM、DeepAR等

DeepAR

  • 简介

        DeepAR 是一个自回归循环神经网络,使用递归神经网络 (RNN) 结合自回归 AR 来预测标量(一维)时间序列。可以冷启动预测,直接学习概率分布的参数,但受限于RNN框架,对于较长时间的周期季节等信息则难以补获。

from gluonts.model.deepar import DeepAREstimator
# build model  
deepar_estimator = DeepAREstimator(
        freq="1D",
        num_layers=num_layers,
        num_cells=num_cells,
        cell_type=cell_type,
        dropout_rate=dropout_rate,
        prediction_length=args.horizon,
        trainer=Trainer(epochs=80))

# Predicting 
# same as above
  • 协变量引入实现
确定输入的协变量的参数:
        use_feat_dynamic_real:是否启用时变连续变量作为协变量,如果我们调用天气信息作为协变量,需要设置为True
        use_feat_static_cat:是否采用时不变类别变量作为协变量,这里我们设置为True,因为我们需要提供观测点的信息​。对于上文提到的管网和测点分布,如果合理分析,可以提取更多有用的时不变类别信息
        use_feat_static_real:是否启用时不变连续变量作为协变量,这里我们设置为False
        lags_seq:显式设置lag参数,否则系统自动计算lag
        time_features:显式设置时间特征,否则系统自动计算

        输入数据的格式相对简单,因为GluonTS对输入数据格式ListDataset要求比较宽松。多重时间序列用list表示,每个时间序列需要指定一个字典:

  • Target:预测对象
  • start:预测起始值
  • FieldName.FEAT_STATIC_CAT:时不变类别变量
  • FieldName. FEAT_DYNAMIC_REAL:时变连续变量
  • 等等其他FieldName

详见: 数据如琥珀:多重时序高阶算法-DeepAR(供水管网压力预测Baseline)

对deepAR引入的协变量是“动态cat feature”还是 “静态cat feature”区分的讨论:
https://github.com/awslabs/gluon-ts/issues/392
马东什么:temporal fusion transformer
  • context length澄清:context_length即滑动窗口长度。我们要训练 DeepAR 模型,让它能基于之前的 context_length 值预测下一个 prediction_length 值。 DeepAR 模型并不是对每个未来的时间点提供单一的预测值,而是针对每个输出点给出一个参数化的概率分布。[3]
import tqdm
from gluonts.model.deepar import DeepAREstimator

# Building training dataset
train_data_list = []
def _split_times_series(df, data_list, dynamic_real_1, dynamic_cat_1, dynamic_cat_2):
    new_df = df.sort_values(by=date_col, ascending=True)
    time_series_dict = {
            "item_id": new_df[id_col].values[0],
            "start": pd.to_datetime(new_df[date_col].min()),
            "target": new_df[target_col].values,
            "dynamic_real_1": [dynamic_real_1.T], # 主要是这行的差别
            "dynamic_cat_1": dynamic_cat_1,
            "dynamic_cat_2": dynamic_cat_2,
    }
    data_list.append(time_series_dict)

tqdm.pandas(desc='progress: ')
train_df.groupby(train_df[id_col]).progress_apply(_split_times_series,
       data_list=train_data_list,
       dynamic_real_1=camp_df_real_features_for_train,
       dynamic_cat_1=camp_df_cat1_features_for_train,
       dynamic_cat_2=camp_df_cat2_features_for_train)

training_data = ListDataset(train_data_list, freq="1D")

# build model 
rmv_imputation = RollingMeanValueImputation(10)
estimator = DeepAREstimator(
                freq="1D",
                num_layers=num_layers,
                num_cells=num_cells,
                prediction_length=args.horizon,
                imputation_method=rmv_imputation,
                impute_missing_values=True,
                use_feat_dynamic_real=True,
                trainer=Trainer(epochs=epochs))

# Predicting 
# same as above
  • Does DeepAR need features and target to be normalized?

https://github.com/aws/amazon-sagemaker-examples/issues/1312

2.3.2 CNN类

如TCN、WaveNet等

WaveNet

  • 简介

        WaveNet是DeepMind于2016年9月提出的一种基于空洞因果卷积式的语音生产模型,后面专家们发现它也可被用于时间序列的预测,他的感受野较大,网络结构可以自动的在不同时间尺度上提取周期信息。

rom gluonts.model.wavenet import WaveNetEstimator
# build model  
wavenet_estimator = WaveNetEstimator(
        freq="1D",
        n_residue=n_residue,
        embedding_dimension=embedding_dimension,
        act_type=act_type,
        n_skip=n_skip,
        prediction_length=args.horizon,
        trainer=Trainer(epochs=50, learning_rate=learning_rate)
    )

# Predicting 
# same as above

2.3.3 参数回归类

N-BEATS

  • 简介

        N-BEATS是Bengio团队于2019年5月提出的用于时间序列预测的深度网络,主要结构包括前向后向残差链接以及不同的模块分解。他的可解释性相较其他深度学习模型会强一些(通过模块分解),但由于其存在复原原序列的过程,因此预测结果的稳定性要差一些。

from gluonts.model.n_beats import NBEATSEstimator
# build model
nbeats_estimator = NBEATSEstimator(
                freq="1D",
                widths=[64, 64],
                num_stacks=2,
                num_blocks=[3],
                num_block_layers=[10],
                stack_types=['T', 'S'],
                prediction_length=args.horizon,
                trainer=Trainer(epochs=30))

# Predicting 
# same as above

2.3.4 Attention类

如Transformer、Informer、TFT等

Transformer

  • 简介

        Transformer是Google 在 2017 年提出的一种 用于NLP任务的模型,可以用来做时间序列预测。它可以关注到序列的长期依赖信息,且支持并行化计算,但其本身没有序列的概念,需要增加position embedding是网络学习到序列位置信息。

from gluonts.model.transformer import TransformerEstimator
# build model
transformer_estimator = TransformerEstimator(
        freq="1D",
        embedding_dimension=15,
        model_dim=64,
        num_heads=4,
        prediction_length=args.horizon,
        trainer=Trainer(epochs=50)
    )

# Predicting 
# same as above

TFT[4]

  • 简介

        来源鱼arxiv上的一篇文章《Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting》,用于可解释多元时间序列预测的时间融合变换器。

import tqdm
from gluonts.model.tft import TemporalFusionTransformerEstimator
# Building training dataset
train_data_list = []
def _split_times_series(df, data_list, dynamic_real_1, dynamic_cat_1, dynamic_cat_2):
    new_df = df.sort_values(by=date_col, ascending=True)
    time_series_dict = {
            "item_id": new_df[id_col].values[0],
            "start": pd.to_datetime(new_df[date_col].min()),
            "target": new_df[target_col].values,
            "dynamic_real_1": np.array(dynamic_real_1, ndmin=2),
            "dynamic_cat_1": dynamic_cat_1,
            "dynamic_cat_2": dynamic_cat_2,
    }
    data_list.append(time_series_dict)
tqdm.pandas(desc='progress: ')
train_df.groupby(train_df[id_col]).progress_apply(_split_times_series,
       data_list=train_data_list,
       dynamic_real_1=camp_df_real_features_for_train,
       dynamic_cat_1=camp_df_cat1_features_for_train,
       dynamic_cat_2=camp_df_cat2_features_for_train)

training_data = ListDataset(train_data_list, freq="1D")
# build model
estimator = TemporalFusionTransformerEstimator(
        freq="1D",
        prediction_length=args.horizon,
        batch_size=batch_size,
        context_length=context_length,
        dropout_rate=dropout_rate,
        trainer=Trainer(batch_size=batch_size, epochs=epochs),
        # 数值型协变量dimension引入
        dynamic_feature_dims={"dynamic_real_1": 1},
        # 非数值型协变量引入
        dynamic_cardinalities={"dynamic_cat_1": cat1_cardinality, "dynamic_cat_2": cat2_cardinality},
        num_heads=num_heads,
        hidden_dim=hidden_dim)

# Predicting 
# same as above

 

 

PBA.常用人工智能预测分析算法 相同的数据型态,利用不同的方法分析,就可以解决不同的课题。例如目前已相当纯熟的人脸识别技术,在国防应用可以进行安保工作;企业可做员工门禁系统;可结合性别、年龄辨识让卖场进行市调分析,或结合追踪技术进行人流分析等。 阅读详情

相关推荐

算法应用场景:20种流行的时间序列预测算法

本文整理了20种流行的时间序列预测算法,涵盖传统统计方法、机器学习与深度学习等类别。这些算法覆盖多变量/单变量、线性/非线性、平稳/非平稳等不同场景,可根据数据特性(长度、维度、平稳性)和预测需求(短期/长期、精度/效率)选择适用方法。

m0_56592100的博客 1931

预测算法用java实现

最近事情比较多,所以很久没有来更新日志了,关于预测,有太多的说法,意义也重大。由其是关乎我们切身利益的股票走势,彩票等等,所以一个预测系统有很大的经济价值。我们完全可以此为切入点进行创业。 常见的预测算法有1.简易平均法,包括几何平均法、算术平均法及加权平均法;2.移动平均法,包括简单移动平均法和加权移动平均法;3,指数平滑法,包括一次指数平滑法和二次指数平滑法,三次指数平滑法;...

Knowledge&&Imagination 4900

时间序列预测算法---Prophet

本文探讨了Prophet算法在时间序列预测中的应用,分析了其优势及适用场景。通过实际数据验证,Prophet在处理季节性、趋势变化等方面表现出色,预测精度高。文章为时间序列预测领域提供了一种高效、实用的方法,对相关研究和实践具有指导意义。

u012121721的博客 1万+

MATLAB 时间序列预测算法(有代码)

##MATLAB 时间序列预测算法(有代码) #最近在学习时间序列,找了很多资料,都需要会员,充值,本着共同进步的原则,给大家分享一下我找到的学习资料,里面大部分代码能实现,只有ARMA部分不能,因为现在的库中没有garchset了,所以还在找替代的方法,有大佬知道了解,也希望伸出援助之手帮助我这个渣渣,谢谢。 我是为了方便学习,就写在一个文档里了,你们实现的时候只要把你想用的算法前面的%去掉就好...

qq_37834658的博客 7万+

时间序列数据预测分类算法

时间序列数据是一系列按时间顺序排列的观测值,反映了系统随时间变化的状态。其关键特征包括。

weixin_41306281的博客 1997

时间序列预测算法---ARIMA

本文探讨了ARIMA(自回归积分滑动平均模型)在时间序列预测中的应用。通过分析序列的平稳性、自相关性和偏自相关性,构建了合适的ARIMA模型。研究结果表明,ARIMA模型能有效捕捉时间序列的动态特征,提高预测精度,为各类时间序列数据分析提供了有力工具。

u012121721的博客 5421

时间序列预测算法---LSTM

文章目录一、前言1.1、深度学习时间序列一般是几维数据?每个维度的名字是什么?通常代表什么含义?1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路?1.4、RNN存在哪些问题?二、LSTM的基本架构2.1 记忆细胞2.2 遗忘门2.3 输入门2.4 输出门三、应用案例3.1 TensorFlow版3.2 PyTorch版3.2.1 LSTM的输入参数3.2.2 LSTM的三个输出3.2.3 LSTM进行时间序列预测的基本流程3.2.4 案例四、拓展

u012121721的博客 7213

时间序列预测:用电量预测 07 灰色预测算法

🌮开发平台:jupyter lab 🍖运行环境:python3、TensorFlow2.x

d_eng_的博客 1678

FACEBOOK 时间序列预测算法 PROPHET 的研究

转载 zr9558ChallengeHub Prophet 简介 Facebook 去年开源了一个时间序列预测的算法,叫做fbprophet,它的官方网址与基本介绍来自于以下几个网站: Github:https://github.com/facebook/prophet 官方网址:https://facebook.github.io/prophet/ 论文名字与网址:Forecasting at scale,https://peerj.com/preprints/3190...

yanqianglifei的专栏 1938

【时间序列预测算法】——Holt-Winters算法介绍及代码实现

背景 一阶二阶三阶指数平滑方法拟合效果均较好,通过结合数据自然属性,数据自身、趋势变化、季节性,提出了这三个角度的衡量量,可以说,理解起来更自然、更亲切。 公式 一阶: sts_tst​是t时刻对xtx_txt​的估计值,这里只有一个参数α,是数据本身的平滑属性的体现。 二阶: 引入了时间趋势变量btb_tbt​,优化了一下一阶的公式。同时还可以预测t+m时刻的值: 三阶: 又引入了季节性周期描述变量ctc_tct​,优化了一下二阶的公式。同时还可以预测t+m时刻的值: NOTE:ct

BlackValley的博客 1万+

时序预测 | python实现仿生算法优化LSTM时间序列预测(全网最全仿生算法)

时序预测 | python实现仿生算法优化LSTM时间序列预测(全网最全)

dujuant的博客 2746

基于LMS算法的Mackey Glass时间序列预测附Matlab代码

Mackey-Glass时间序列是混沌动力学中一种经典的非线性时序数据,因其复杂的行为模式,常被用于评估时间序列预测算法的性能。本文深入探讨了基于最小均方误差(Least Mean Squares, LMS)算法的Mackey-Glass时间序列预测方法。首先,阐述了Mackey-Glass时间序列的生成机制和特性,随后详细介绍了LMS算法的原理及其在时间序列预测中的应用。进一步地,探讨了LMS算法的关键参数对预测性能的影响,并通过实验验证了LMS算法在Mackey-Glass时间序列预测中的有效性。

j_jinger的博客 1657

遗传算法优化LSTM回归预测,ga-lstm时间序列的预测

LSTM时间序列回归预测,GALSTM时间序列回归预测,LSTM神经网络原理,遗传算法原理

abc991835105的博客 1122

时间序列预测算法——DeepAR

时间序列预测算法——DeepAR DeepAR概述 DeepAR是亚马逊提出的一种针对大量相关时间序列统一建模的预测算法,该算法采用了深度学习的技术,通过在大量时间序列上训练自回归递归网络模型,可以从相关的时间序列中有效地学习全局模型,并且能够学习复杂的模式,例如季节性、数据随时间的不确定性增长,从而对各条时间序列进行预测。 DeepAR原理和实现过程 上图左边是模型的训练过程,右边是模型的预测...

weixin_44377866的博客 1万+

Prophet 时间序列预测算法

Prophet 时间序列预测算法

ideal-lingyun 1158

时间序列预测 — 预测数据集(负荷、风电、光伏、销量等)

GEFCom2014 “负荷预测数据”为竞赛的公共数据集,GEFCom2014 的负荷预测轨迹为概率负荷预测。

几度春风里的博客 2万+
上一篇: GNN 推荐系统综述 - Graph Neural Networks in Recommender Systems: A Survey
下一篇: 图结构学习最新综述:研究进展与未来展望
山科智能信息处理实验室
博客等级 码龄6年 808粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值