时序预测模型 ARIMA/SARIMA/lstm算法
时间序列
时间序列数据是指按照时间顺序收集的数据,每个数据点都与一个特定的时间点相关联。这些数据点通常按照均匀的时间间隔(如每日、每周、每月等)进行测量和记录。例如,每天的股票价格、每月的销售额、每年的人口总数等都是时间序列数据的例子。
数据会随着时间变化而变化。时间序列数据的特点是数据会随时间的变化而变化。平稳的时序数据 / 非平稳的时序数据
随机过程的特征值有均值、方差、协方差等。如果随机过程的特征随时间变化而变化,那么数据是非平稳的,相反,如果随机过程的特征随时间变化而不变化,
则此过程是平稳的。非平稳时间序列分析时,若导致非平稳的原因是确定的,可以用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等。
核心概念
趋势:趋势是时间序列数据中长期的上升或下降模式。例如,一个公司的年销售额可能会显示出持续增长的趋势。
季节性:季节性是时间序列数据中的周期性波动,这些波动通常与季节或其他固定的时间间隔有关。例如,零售业的销售额可能在节假日期间显著增加。
周期性:周期性是时间序列数据中的波动,这些波动的周期不固定,与季节性不同。例如,经济周期就是一种周期性。
随机(或不规则)波动:这是时间序列中不可预测的部分,不能被趋势、季节性或周期性解释。
自相关性:自相关性是时间序列中相邻观察值之间的相关性。例如,今天的股票价格可能与昨天的股票价格高度相关。
平稳性:平稳时间序列的统计特性(如均值、方差等)不随时间变化。许多时间序列模型都假设数据是平稳的,或可以通过某种转换(如差分)变为平稳。
滞后值:滞后值是过去的数据值。例如,在t-1时刻的值就是在t时刻的滞后值。滞后值在许多时间序列模型(如自回归模型)中都有应用。
时间序列预处理
处理缺失值:缺失值是时间序列数据中常见的问题。处理方法可能包括插值(例如,使用前后观察值的平均值填充缺失值)。
import pandas as pd # 假设df是一个DataFrame,其中有一些缺失值 df = pd.DataFrame({"value": [1, None, 2, 3, None, 4]}) # 使用线性插值填充缺失值 df = df.interpolate(method='linear')
输出 :可以看出用相邻两个数之间的值替换了缺失的Nan值
季节性调整:许多时间序列数据包含季节性变化,这可能会掩盖数据的真实趋势。季节性调整是一种方法,可以去除数据中的季节性效应,使得趋势更加明显。3
# 假设df是一个DataFrame,其中包含时间序列数据 df = pd.DataFrame({"value": [1,2,3,4,5,6,7,8,9,10,11,12]}) # 进行季节性分解 res = sm.tsa.seasonal_decompose(df.value, model='additive', period=3) # 季节性调整 df_deseasonalized = df.value - res.seasonal
去噪:时间序列数据可能包含噪声,这可能会影响预测的准确性。去噪方法可能包括平滑技术(例如,移动平均法)或者更复杂的方法(例如,使用滤波器)。
# 假设df是一个DataFrame,其中包含时间序列数据 df = pd.DataFrame({"value": [1,2,3,4,5,6,7,8,9,10,11,12]}) # 使用移动平均方法去噪 df_smooth = df.value.rolling(window=3).mean()
检查并确保平稳性:许多时间序列模型假设数据是平稳的,即数据的统计特性(如均值、方差等)不随时间变化。如果数据不是平稳的,可能需要进行一些转换(如取对数、差分等)。
# 假设df是一个DataFrame,其中包含时间序列数据 df = pd.DataFrame({"value": [1,2,3,4,5,6,7,8,9,10,11,12]}) # 进行Augmented Dickey-Fuller test result = adfuller(df.value) # 输出测试结果 print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1])
检查并处理异常值:异常值是时间序列数据中的极端值,可能会影响预测的准确性。处理方法可能包括修剪(限制极端值的大小),或者使用更复杂的方法(例如,使用模型识别并处理异常值)。
# 假设df是一个DataFrame,其中包含时间序列数据 df = pd.DataFrame({"value": [1,2,3,4,5,6,7,8,9,100,11,12]}) # 计算Z-score z_scores = np.abs((df.value - df.value.mean()) / df.value.std()) # 识别异常值 outliers = df[z_scores > 3]
特征工程在时间序列预测中的应用
时间序列预测中常用的特征工程技术:
滞后特征:滞后特征是用过去的数据作为新的特征。例如,我们可以创建一个新的特征,表示在过去一天、一周或一月的数据。
滑动窗口统计:滑动窗口统计是对过去一段时间内的数据进行统计分析,如求和、平均、最大值、最小值等。
时间特征:时间特征是从时间戳中提取的特征,如年份、月份、一周的第几天、一天的第几小时等。
趋势特征:趋势特征是表示数据的长期趋势,可以通过线性回归或其他方法来捕捉。
季节性特征:季节性特征是表示数据的周期性波动,可以通过傅立叶变换或其他方法来捕捉。
预测方法的分类概念
我们可以将时间序列预测方法分为几个主要类别,包括单变量预测、多变量预测,以及其他一些其它的预测方法。
单变量时间序列预测:单变量时间序列预测是最常见的预测方法,它只依赖于一个单一的时间序列数据源。这种类型的预测主要关注如何根据过去的数据来预测未来的数据。常见的单变量预测方法包括自回归移动平均模型(ARIMA)、指数平滑模型、随机森林和深度学习模型等。
多变量时间序列预测:与单变量预测相比,多变量时间序列预测使用两个或更多的相关时间序列来进行预测。这种方法可以帮助我们更好地理解和利用不同变量之间的相互关系。多变量预测方法包括向量自回归模型(VAR)、协整模型和多变量深度学习模型等。
单变量预测:
1.移动平均模型(Moving Average Model):移动平均模型使用时间序列过去的几个观测值的均值作为未来预测的依据。它适用于没有明显趋势或季节性的数据。
(PS:移动平均就是指根据过去未来一定时间段内的值赋予给其中的每一个值一个权重然后进行加权求和就是最新的值)
2.指数平滑(Exponential Smoothing):指数平滑模型根据时间序列的加权平均来进行预测,其中较近的数据点具有较高的权重。这种方法适用于平滑对称或非对称季节性的数据。
指数平滑一般分为三种:简单指数平滑、双指数平滑和三指数平滑(Holt-Winters) 。
3.ARIMA模型(Autoregressive Integrated Moving Average Model):ARIMA模型是一种基于时间序列自回归和移动平均的模型。它用过去观测值的线性组合来预测未来值。ARIMA模型可以处理具有明显趋势和季节性的数据。
ARIMA还有一些增强的模型包括SARIMA模型(Seasonal ARIMA Model):SARIMA模型是ARIMA模型在具有明显季节性的数据上的扩展。它考虑季节性的影响,并根据历史数据中的季节模式进行预测。
多变量预测:
当涉及多变量时间序列预测时,有几种常见的模型可以使用。
VAR模型
VAR模型是一种基于向量自回归的多变量时间序列预测模型。它基于两个关键概念:自回归(Autoregression)和向量(Vector)。自回归表示每个变量的值可以由它自身的历史值来预测。向量表示我们考虑多个变量同时作为预测变量。VAR模型假设每个变量的当前值与过去一段时间内所有变量的值相关,通过建立一个包含所有变量的回归模型来预测未来的变量值。VAR模型可以通过最小二乘法或最大似然估计进行参数估计。
LSTM模型
LSTM是一种递归神经网络(RNN)的变体,用于处理具有长期时间依赖关系的序列数据。在多变量时间序列预测中,每个变量被视为一个输入序列,模型通过学习时间序列中的模式和关联来预测未来的变量值。LSTM通过使用一种称为"门"的机制来解决传统RNN中的梯度消失和梯度爆炸问题,使其能够有效地捕捉长期依赖。LSTM模型具有记忆单元,可以处理和存储先前的信息,并根据需要更新和使用这些信息。

浙公网安备 33010602011771号