一、方法介绍
传统方法:ARIMA模型
ARIMA模型,全称为自回归积分滑动平均模型,是时间序列分析中最经典也是最广泛使用的方法之一。其核心思想是通过对数据进行差分使其平稳,然后利用该平稳序列的滞后值和滞后预测误差来进行预测。这种方法在20世纪70年代由Box和Jenkins提出,并迅速成为经济学、金融学和环境科学中处理和预测时间序列数据的标准工具。
优势:ARIMA的主要优势在于其稳定性和解释性。它可以有效地模拟和预测具有明显线性趋势或季节性的时间序列数据。
局限性:ARIMA模型对于处理具有复杂非线性模式的数据则显得力不从心,特别是在数据存在长期依赖性时。
新型方法:LSTM网络
长短期记忆网络(LSTM)是一种先进的深度学习方法,属于循环神经网络(RNN)的一种变体,专门设计来解决传统RNN在处理长序列数据时的梯度消失问题。自1997年首次被提出以来,LSTM已经在多个领域显示出其强大的数据处理能力,尤其是在需要从时间序列中学习长期依赖关系的应用中。
优势:LSTM的优势在于其出色的灵活性和非线性建模能力。它可以通过内部的门控机制学习序列中哪些信息是重要的,从而进行长期的信息保存和短期的信息遗忘。
局限性:尽管LSTM在处理复杂和长序列数据方面表现优异,但它的计算成本较高,模型参数众多,需要大量数据进行训练,且对于模型的解释性较差。
二、数据集获取与预处理
数据获取
本文采用于Kaggle数据平台下载的“Daily Climate time series data”数据集作为研究对象,链接如下:https://www.kaggle.com/datasets/sumanthvrao/daily-climate-time-series-data
数据预处理
对原始训练集和测试集数据进行可视化分析,来决定下一步的预处理方式。
训练集
测试集
首先,对数据进行缺失值处理;观察可视化图发现,Mean Pressure数据出现异常高值,因此对此进行异常值处理;Wind Speed数据显示出高波动性,因此对此进行七天移动平均处理,使数据平滑。对处理后的数据再次可视化。
训练集
测试集
可以看到数据的异常值和平滑处理已经完成。
针对ARIMA模型,日常或小时数据可能包含大量噪声。通过重采样,可以减少数据中的随机波动,从而使得ARIMA模型更容易捕捉到数据中的主要趋势和周期性。ARIMA模型要求时间序列数据是平稳的,意味着数据的统计特性(如均值和方差)随时间保持不变。高频数据可能会展现出高波动性,通过重采样为低频数据,如月度或季度数据,可以帮助平滑这些波动,从而更接近平稳条件。本文对预处理后的数据进行按月重采样,可视化如下:
训练集
测试集
对于LSTM模型,直接使用简单预处理后的数据(不进行重采样)即可。
三、ARIMA模型参数的选择
确定ARIMA模型参数d
季节性分解和ADF测试
使用python代码对数据进行季节性分解和ADF测试
def analyze_time_series(column, period=12):
# 执行季节性分解
result = seasonal_decompose(data[column].dropna(), model='additive', period=period)
# 绘制分解结果
fig = result.plot()
fig.set_size_inches(12, 8)
plt.show()
# 进行ADF测试以检测数据的平稳性
adf_result = adfuller(data[column].dropna())
# 打印ADF检测结果
print(f'=== {column} ===')
print('ADF Statistic:', adf_result[0])
print('p-value:', adf_result[1])
print('Critical Values:')
for key, value in adf_result[4].items():
print(f'\t{key}: {value}')
# 根据ADF检测结果判断平稳性
if adf_result[1] < 0.05:
print("数据是平稳的。")
else:
print("数据不是平稳的,需要进一步处理,如差分等。")
print("\n")
以下是Mean Temp数据的季节性分解和ADF测试(只做部分展示)。分析图片得出Mean Temp数据展现出明显的季节性,其余数据类似,均展示出明显季节趋势。因此,本结果也可作为对此数据集选择ARIMA模型的实验支撑。
平稳性检测
根据结果可知,四组数据均为不平稳。因此,对所有数据进行一阶差分处理后,再次进行平稳性检测,得到结果显示据均平稳。因此在ARIMA模型中选择参数d=1。
确定模型参数p、q
1.利用AIC 和 BIC 的信息准则确定模型参数
pmax = 5 # 最大p值
qmax = 5 # 最大q值
aic_matrix = [] # 存放AIC信息
bic_matrix = [] # 存放BIC信息
# 搜索不同的p, q组合
for p in range(pmax + 1):
aic_tmp = []
bic_tmp = []
for q in range(qmax + 1):
try:
model = ARIMA(series, order=(p,1,q))
results = model.fit()
aic_tmp.append(results.aic)
bic_tmp.append(results.bic)
except:
aic_tmp.append(None)
bic_tmp.append(None)
aic_matrix.append(aic_tmp)
bic_matrix.append(bic_tmp)
# 将结果转换为DataFrame
aic_matrix = pd.DataFrame(aic_matrix)
bic_matrix = pd.DataFrame(bic_matrix)
# 找到AIC最小值的位置
p_aic, q_aic = aic_matrix.stack().idxmin()
print(f'AIC最小的p值和q值为:{p_aic}、{q_aic}')
# 找到BIC最小值的位置
p_bic, q_bic = bic_matrix.stack().idxmin()
print(f'BIC最小的p值和q值为:{p_bic}、{q_bic}')
运行python得到模型参数结果:
当使用AIC和BIC作为模型选择准则时,可能会出现不同的最优参数组合。在这种情况下,可以根据具体的需求选择使用哪种准则来确定模型参数。如果更关注模型的拟合优度和预测准确性,可以选择使用AIC最小值对应的参数作为最优模型参数。而如果更关注模型的简洁性和泛化能力,可以选择使用BIC最小值对应的参数作为最优模型参数。
2.利用ACF 和 PACF 图确定模型参数
根据ACF和PACF图确定模型参数。例如,平均温度(meantemp)ACF: 显示出明显的逐步衰减模式,表明长期的依赖关系。PACF: 初始几个延迟后迅速接近零,表明短期的自回归关系。推荐ARIMA(p, d, q)参数:p: 由于PACF在第一个或第二个延迟处显著,考虑p = 1或2。q: ACF缓慢衰减,建议尝试q = 1或2。具体参数应根据拟合模型AIC和BIC数值确定,选择AIC、BIC数值较小的模型参数。
四、模型评估
针对ARIMA算法,本文采用AIC、BIC值、Mse值和绘制拟合曲线来评价模型。对于LSTM模型,本文通过计算、Mse和绘制拟合曲线来评价模型。因为本文对两种不同的模型采用不同的数据预处理方法,因此导致两种模型的测试数据的数据量不同,所以针对于LSTM模型和ARIMA模型的比较,本文采用不依赖于数据量的“平均绝对误差”(Mean Absolute Error)作为评价标准。
ARIMA模型预测表现
通过AIC和BIC值,确定模型拟合参数为ARIMA(2,1,3),观察在测试集上预测值和实际值的曲线并结合Mse分析得出,模型对MeanTemp的预测效果较好。
LSTM模型预测表现
利用python计算得出为0.91,说明模型的拟合性能极为优秀。观察拟合曲线和均方误差得出模型对MeanTemp的预测效果较为优秀。
ARIMA模型与LSTM模型预测表现对比
针对同一数据,我们可以观察模型的拟合曲线来对比模型对数据的预测性能。例如上述MeanTemp数据,显然相较于ARIMA模型LSTM的模型的预测值曲线更贴合实际值,因此得出在此数据集上,LSTM的预测性能要优于ARIMA模型。同时,利用python计算得出Mae指标,在MeanTemp数据上,ARIMA模型的Mae值为3.772012713598656,LSTM模型的Mae值为1.4018240022540962。Mae值较小的模型通常被认为是预测性能更好的模型,因此可以判断LSTM模型在此数据上的预测性能更优秀。
本文仅对部分实验结果进行展示。