Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
PyTorch系列文章目录
Python系列文章目录
机器学习系列文章目录
01-什么是机器学习?从零基础到自动驾驶案例全解析
02-从过拟合到强化学习:机器学习核心知识全解析
03-从零精通机器学习:线性回归入门
04-逻辑回归 vs. 线性回归:一文搞懂两者的区别与应用
05-决策树算法全解析:从零基础到Titanic实战,一文搞定机器学习经典模型
06-集成学习与随机森林:从理论到实践的全面解析
07-支持向量机(SVM):从入门到精通的机器学习利器
08-【机器学习】KNN算法入门:从零到电影推荐实战
09-【机器学习】朴素贝叶斯入门:从零到垃圾邮件过滤实战
10-【机器学习】聚类算法全解析:K-Means、层次聚类、DBSCAN在市场细分的应用
11-【机器学习】降维与特征选择全攻略:PCA、LDA与特征选择方法详解
12-【机器学习】手把手教你构建神经网络:从零到手写数字识别实战
13-【机器学习】从零开始学习卷积神经网络(CNN):原理、架构与应用
14-【机器学习】RNN与LSTM全攻略:解锁序列数据的秘密
15-【机器学习】GAN从入门到实战:手把手教你实现生成对抗网络
16-【机器学习】强化学习入门:从零掌握 Agent 到 DQN 核心概念与 Gym 实战
17-【机器学习】AUC、F1分数不再迷茫:图解Scikit-Learn模型评估与选择核心技巧
18-【机器学习】Day 18: 告别盲猜!网格/随机/贝叶斯搜索带你精通超参数调优
19-【机器学习】从零精通特征工程:Kaggle金牌选手都在用的核心技术
20-【机器学习】模型性能差?90%是因为数据没洗干净!(缺失值/异常值/不平衡处理)
21-【机器学习】保姆级教程:7步带你从0到1完成泰坦尼克号生还预测项目
22-【机器学习】框架三巨头:Scikit-Learn vs TensorFlow/Keras vs PyTorch 全方位对比与实战
23-【机器学习】揭秘迁移学习:如何用 ResNet 和 BERT 加速你的 AI 项目?
24-【机器学习】NLP核心技术详解:用Scikit-learn、Gensim和Hugging Face玩转文本处理 (Day 24)
25-【机器学习】解密计算机视觉:CNN、目标检测与图像识别核心技术(Day 25)
26-【机器学习】万字长文:深入剖析推荐系统核心算法 (协同过滤/内容/SVD) 与Python实战
27-【机器学习】第27天:玩转时间序列预测,从 ARIMA 到 Prophet 实战指南
文章目录
前言
欢迎来到机器学习之旅的第 27 天!今天,我们将深入探讨一个在现实世界中应用极其广泛的领域——时间序列分析与预测。从天气预报、股票价格波动、产品销售额预测,到网站流量监控、服务器性能指标分析,时间序列数据无处不在。理解并掌握处理这类具有时间依赖性数据的方法,对于数据科学家和分析师来说至关重要。
本篇文章将带您系统地了解时间序列的核心特性,掌握经典的预测模型如 ARIMA,并实战应用 Facebook 开源的强大预测库 Prophet。我们还会简要介绍深度学习在时间序列预测中的应用。无论您是刚接触时间序列的初学者,还是希望深化理解的进阶者,本文都将为您提供清晰的指引和实用的代码示例。
一、什么是时间序列数据?
1.1 时间序列的定义与特点
简单来说,时间序列数据 (Time Series Data) 是指按照时间顺序排列的一系列数据点。这些数据点通常是在相等的时间间隔内收集的(例如,每小时、每天、每周、每月)。
其最核心的特点是时间依赖性:过去的数据点可能影响未来的数据点。这与我们之前接触的许多横截面数据(在同一时间点收集不同对象的数据)有着本质的区别。
1.2 常见的时间序列数据
- 经济金融领域:股票价格、GDP、汇率、利率、失业率等。
- 商业领域:产品销售额、网站用户访问量、库存水平、广告点击率等。
- 自然科学领域:温度、湿度、降雨量、地震波数据、太阳黑子数量等。
- 工业领域:设备传感器读数、生产线产出量、电力消耗等。
二、时间序列的核心特性
理解时间序列数据,首先要认识其可能包含的几种典型模式或成分:
2.1 趋势 (Trend)
趋势是指时间序列在长期内呈现出的持续向上或向下的变动方向。它反映了数据背后的宏观、长期影响因素。例如,一个公司销售额的长期增长趋势,或者某地区气温的长期上升趋势。
2.2 季节性 (Seasonality)
季节性是指时间序列在固定的时间周期内(通常是一年、一季度、一月、一周甚至一天)呈现出的重复性波动模式。这种模式由气候、节假日、工作日/周末等周期性因素引起。例如,冰淇淋销量在夏季达到高峰,或零售额在年末节假日期间激增。
2.3 周期性 (Cyclicity)
周期性也指数据的重复性波动,但与季节性不同,其波动周期通常不固定,且持续时间较长(往往超过一年)。周期性通常与经济周期、商业周期等更广泛的宏观因素相关。识别和预测周期性比季节性更具挑战性。
2.4 随机性 (Randomness/Noise)
随机性,也称为不规则波动或噪声,是指剔除趋势、季节性和周期性成分后,剩余的不可预测的随机波动。它通常由各种偶然的、未知的短期因素引起。
2.5 可视化分解
为了更清晰地理解这些成分,我们常常需要将时间序列分解 (Decomposition)。常用的分解模型有加法模型(假设各成分相加)和乘法模型(假设各成分相乘)。Python 的 statsmodels
库提供了方便的时间序列分解工具。
三、平稳性:时间序列分析的基石
3.1 什么是平稳性?
平稳性 (Stationarity) 是时间序列分析中的一个核心概念。一个严格平稳的时间序列,其统计特性(如均值、方差、自协方差)不随时间推移而改变。在实践中,我们通常关注弱平稳(或协方差平稳),即:
- 均值恒定: 序列的平均值不随时间变化。
- 方差恒定: 序列的波动幅度(方差)不随时间变化。
- 自协方差恒定: 序列在任意两个时间点
t
和t+k
的协方差仅依赖于时间间隔k
,而不依赖于具体的时间点t
。
为什么平稳性如此重要?
许多经典的时间序列模型(如 ARIMA)都假设输入数据是平稳的。非平稳序列的统计特性随时间变化,这使得基于历史数据建立的模型难以推广到未来,预测效果会很差。因此,在建模之前,检验并确保序列的平稳性是关键一步。
3.2 如何检验平稳性?
(1) 可视化方法
最直观的方法是直接绘制时间序列图。观察:
- 是否存在明显的上升或下降趋势?(均值非恒定)
- 波动幅度是否随时间变化?(方差非恒定)
- 是否存在明显的季节性模式?(均值/方差可能随季节变化)
还可以绘制滚动统计量 (Rolling Statistics) 图,计算并绘制移动窗口内的均值和标准差。如果滚动均值和滚动标准差有明显的变化趋势,则序列很可能非平稳。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np # 仅用于生成示例数据
# 假设 df['value'] 是你的时间序列数据
# df.index 需要是时间类型
# 生成示例非平稳数据(带趋势)
data = np.linspace(0, 100, 100) + np.random.normal(0, 5, 100) + np.linspace(0, 50, 100)
index = pd.date_range(start='2024-01-01', periods=100, freq='D')
df = pd.DataFrame({
'value': data}, index=index)
# 计算滚动均值和标准差 (窗口大小设为 12)
rolling_mean = df['value'].rolling(window=12).mean()
rolling_std = df['value'].rolling(window=12).std()
# 绘图
plt.figure(figsize=(12, 6))
plt.plot(df['value'], color='blue', label='Original')
plt.plot(rolling_mean, color='red', label='Rolling Mean')
plt.plot(rolling_std, color='black', label='Rolling Std')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
plt.show()
(2) 统计检验方法
更严谨的方法是进行统计假设检验。最常用的是 ADF 检验 (Augmented Dickey-Fuller Test)。
- 原假设 (H0):序列存在单位根(即非平稳)。
- 备择假设 (H1):序列不存在单位根(即平稳)。
检验结果会给出一个 p 值 (p-value)。
- 如果 p 值 小于 显著性水平(通常取 0.05),则我们拒绝原假设,认为序列是平稳的。
- 如果 p 值 大于 显著性水平,则我们不能拒绝原假设,认为序列是非平稳的。
from statsmodels.tsa.stattools import adfuller
# 对 df['value'] 进行 ADF 检验
result = adfuller(df['value'])
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
# 根据 p-value 判断
if result[1] <= 0.05:
print("Conclusion: Reject H0 -> Series is likely Stationary")
else:
print("Conclusion: Fail to Reject H0 -> Series is likely Non-Stationary")
3.3 如何使序列平稳?差分技术
如果序列非平稳,最常用的处理方法是差分 (Differencing)。
- 一阶差分: 计算相邻时间点数据的差值 ∇ y t = y t − y t − 1 \nabla y_t = y_t - y_{t-1} ∇yt=yt−yt−1。这通常可以消除线性趋势。
- 季节性差分: 计算相隔一个季节周期的数据点的差值 ∇ s y t = y t − y t − s \nabla_s y_t = y_t - y_{t-s} ∇syt=yt−yt−s (s 为季节周期长度)。这有助于消除季节性。
- 高阶差分: 对已差分的序列再次进行差分。
进行差分后,需要再次进行平稳性检验,直到序列变得平稳。差分的阶数(d)是 ARIMA 模型的一个重要参数。
# 一阶差分
df['diff_1'] = df['value'].diff().dropna() # dropna() 移除第一个 NaN 值
# 再次进行 ADF 检验 (对差分后的序列)
result_diff = adfuller(df['diff_1'].dropna())
print('\nADF Test on First Difference:')
print('p-value: %f' % result_diff[1])
if result_diff[1] <= 0.05:
print("Conclusion: Reject H0 -> Differenced Series is likely Stationary")
else:
print("Conclusion: Fail to Reject H0 -> Differenced Series is likely Non-Stationary")
# 可视化差分后的序列
plt.figure(figsize=(12, 6))
plt.plot(df['diff_1'])
plt.title('First Differenced Series')
plt.show()
四、经典时间序列预测模型
在序列平稳(或通过差分变平稳)后,我们可以应用一些经典模型进行预测。
4.1 移动平均 (MA) - Smoothing Perspective
这里的移动平均更多指的是一种数据平滑技术,用于观察趋势。它计算最近 k
个数据点的平均值作为当前点的估计。它不是 ARIMA 模型中的 MA 部分。
y ^ t = 1 k ∑ i = 0 k − 1 y t − i \hat{y}_t = \frac{1}{k} \sum_{i=0}^{k-1} y_{t-i} y^t=k1i=0∑k−1yt−i
4.2 指数平滑 (ES - Exponential Smoothing)
指数平滑也是一种常用的预测方法,它对历史数据赋予指数递减的权重,即越近的数据权重越大。
- 简单指数平滑 (SES):适用于没有趋势和季节性的序列。
- 霍尔特线性趋势模型 (Holt’s Linear Trend):在 SES 基础上加入了趋势项。
- 霍尔特-温特斯季节性模型 (Holt-Winters’ Seasonal):在 Holt 模型基础上进一步加入了季节性项,能处理趋势和季节性。
4.3 ARIMA 模型
ARIMA (AutoRegressive Integrated Moving Average) 模型是时间序列预测中最经典和广泛使用的模型之一。它结合了自回归(AR)、差分(I)和移动平均(MA)三个部分。
(1) ARIMA 模型组成 (AR, I, MA)
- AR (AutoRegressive - 自回归):模型假设当前值 y t y_t yt 可以用过去若干时刻的值的线性组合来预测。阶数
p
表示使用过去多少个值。
y t = c + ϕ 1 y t − 1 + ϕ 2 y t − 2 + ⋯ + ϕ p y t − p + ϵ t y_t = c + \phi_1 y_{t-1} + \phi_2 y_{t-2} + \dots + \phi_p y_{t-p} + \epsilon_t yt=c+ϕ1yt−1+ϕ2yt−2+⋯+ϕpyt−p+ϵt - I (Integrated - 差分):表示使序列变平稳所需的差分次数,用阶数
d
表示。 - MA (Moving Average - 移动平均):模型假设当前值 y t y_t yt 与过去若干时刻的预测误差(白噪声)的线性组合有关。阶数
q
表示使用过去多少个误差项。
y t = c + ϵ t + θ 1 ϵ t − 1 + θ 2 ϵ t − 2 + ⋯ + θ q ϵ t − q y_t = c + \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \dots + \theta_q \epsilon_{t-q} yt=c+ϵt+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−q
ARIMA(p, d, q) 模型综合了这三部分。
(2) ARIMA 建模流程
- 可视化 (Visualize):绘制时间序列图,初步判断趋势、季节性等。
- 平稳化 (Stationarize):进行平稳性检验(如 ADF 检验)。如果非平稳,进行差分(确定
d
值),直到序列平稳。 - 定阶 (Identify p, q):对平稳后的序列绘制自相关函数 (ACF) 图和偏自相关函数 (PACF) 图。
- ACF 图帮助确定 MA 阶数
q
(ACF 在q
阶后截尾)。 - PACF 图帮助确定 AR 阶数
p
(PACF 在p
阶后截尾)。
(定阶有时需要经验和尝试)
- ACF 图帮助确定 MA 阶数
- 建模 (Build Model):使用确定的
p, d, q
值拟合 ARIMA 模型。 - 诊断 (Diagnose):检查模型残差是否符合白噪声假设(均值为 0,方差恒定,无自相关)。常用 Ljung-Box 检验。
- 预测 (Forecast):使用拟合好的模型进行未来值预测。
(3) 实战:使用 Statsmodels 分析股票数据 (概念与代码片段)
注意:股票价格预测非常复杂,受多种因素影响,ARIMA 可能不是最佳模型,此处仅为演示 ARIMA 应用流程。实际应用需要更复杂模型和特征。
import pandas as pd
import yfinance as yf # 需要安装: pip install yfinance
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
# 1. 获取数据 (示例:获取 Apple 股票近一年的收盘价)
ticker = "AAPL"
data = yf.download(ticker, start="2024-04-01", end="2025-04-01") # 注意日期,这里获取过去一年
ts = data['Close']
# 2. 可视化与平稳性检验 (略 - 假设已执行 ADF 检验发现非平稳)
# 3. 差分 (假设一阶差分后平稳, d=1)
ts_diff = ts.diff().dropna()
# 4. 定阶 (绘制 ACF 和 PACF 图)
fig, axes = plt.subplots(1, 2, figsize=(16, 4))
plot_acf(ts_diff, ax=axes[0], lags=40) # lags 可以调整
plot_pacf(ts_diff, ax=axes[1], lags=40)
plt.show()
# --- 根据 ACF 和 PACF 图判断 p 和 q ---
# 假设我们根据图形判断 p=1, q=1 (这需要实际观察图形)
# 5. 建模 (p=1, d=1, q=1)
# 注意:对原始数据 ts 进行拟合,并在模型中指定 d=1
model = ARIMA(ts, order=(1, 1, 1)) # (p, d, q)
model_fit = model.fit()
# 6. 诊断 (查看模型摘要,检查残差 - 略)
print(model_fit.summary())
# model_fit.plot_diagnostics(figsize=(15,12))
# plt.show()
# 7. 预测未来 30 天
forecast_steps = 30
forecast_result = model_fit.get_forecast(steps=forecast_steps)
forecast_mean = forecast_result.predicted_mean
forecast_ci = forecast_result.conf_int() # 置信区间
# 可视化预测结果
plt.figure(figsize=(12, 6))
plt.plot(ts.index, ts, label='Observed')
forecast_index = pd.date_range(ts.index[-1] + pd.Timedelta(days=1), periods=forecast_steps, freq='B') # 'B' 代表工作日
plt.plot(forecast_index, forecast_mean, label='Forecast')
plt.fill_between(forecast_index, forecast_ci.iloc[:, 0], forecast_ci.iloc[:, 1], color='k', alpha=.15)
plt.title(f'{
ticker} Stock Price Forecast (ARIMA)')
plt.legend()
plt.show()
print("\nForecasted values:")
print(forecast_mean)
常见问题与坑点:
- 定阶困难: ACF/PACF 图可能不清晰,需要结合信息准则(AIC, BIC)或尝试不同阶数组合。
- 非线性模式: ARIMA 是线性模型,难以捕捉复杂的非线性关系。
- 外部变量: 标准 ARIMA 不包含外部影响因素(如政策、事件),可考虑 ARIMAX 或 SARIMAX。
- 季节性: 对于有明显季节性的数据,应使用 SARIMA (Seasonal ARIMA) 模型,它增加了季节性参数 (P, D, Q, s)。
五、现代利器:Facebook Prophet
面对 ARIMA 定阶复杂、对参数敏感等问题,Facebook 开源了 Prophet 库,旨在提供一个更易用、更自动化、效果通常也不错的时间序列预测工具。
5.1 Prophet 简介与优势
- 易用性: API 设计简洁,用户无需深入了解底层模型细节即可快速上手。
- 自动化: 能自动检测和处理趋势变化点 (changepoints)、多种季节性 (年、周、日)、节假日效应。
- 稳健性: 对缺失值和异常值有较好的鲁棒性。
- 可解释性: 可以方便地可视化分解出的趋势、季节性、节假日成分。
Prophet 特别适合具有明显季节性、趋势,并可能受节假日影响的商业预测场景(如销售额预测)。
5.2 Prophet 的核心思想
Prophet 本质上是一个可分解的时间序列模型 (Decomposable Time Series Model),其数学形式可以理解为:
y ( t ) = g ( t ) + s ( t ) + h ( t ) + ϵ t y(t) = g(t) + s(t) + h(t) + \epsilon_t y(t)=g(t)+s(t)+h(t)+ϵt
其中:
- g ( t ) g(t) g(t): 趋势项 (Trend)。Prophet 使用分段线性函数或饱和增长函数来拟合趋势,并能自动检测趋势变化点。
- s ( t ) s(t) s(t): 季节性项 (Seasonality)。使用傅里叶级数来拟合年、周、日等多种周期性模式。
- h ( t ) h(t) h(t): 节假日项 (Holidays)。允许用户指定节假日及影响窗口,模型会估计其效应。
- ϵ t \epsilon_t ϵt: 误差项 (Error Term)。假设为正态分布的噪声。
5.3 实战:使用 Prophet 快速预测销售额
import pandas as pd
from prophet import Prophet # 需要安装: pip install prophet
import matplotlib.pyplot as plt
# 1. 准备数据 (符合 Prophet 格式要求)
# 数据需要包含两列:'ds' (日期时间) 和 'y' (观测值)
# --- 创建示例销售数据 (模拟增长趋势 + 周/年季节性) ---
date_rng = pd.date_range(start='2022-01-01', end='2025-03-31', freq='D')
df = pd.DataFrame(date_rng, columns=['ds'])
# 模拟趋势 (线性增长)
df['trend'] = 100 + 0.5 * (df.index)
# 模拟周季节性 (周末低,工作日高)
df['weekday'] = df['ds'].dt.dayofweek
df['weekly_seasonality'] = np.where(df['weekday'] >= 5, -20, 5 * np.cos(2 * np.pi * df['weekday'] / 7)) # 简化模拟
# 模拟年季节性 (夏季高,冬季低)
df['yearly_seasonality'] = 30 * np.sin(2 * np.pi * (df['ds'].dt.dayofyear - 80) / 365.25)
# 模拟随机噪声
np.random.seed(42)
df['noise'] = np.random.normal(0, 10, size=len(df))
# 合成 'y' 值
df['y'] = df['trend'] + df['weekly_seasonality'] + df['yearly_seasonality'] + df['noise']
# 只保留 'ds' 和 'y' 列
df_prophet = df[['ds', 'y']].copy()
# --- 示例数据创建结束 ---
# 查看数据前几行和格式
print("Sample Data for Prophet:")
print(df_prophet.head())
print("\nData Types:")
print(df_prophet.dtypes) # 'ds' 应该是 datetime 类型
# 2. 初始化并拟合 Prophet 模型
# 可以调整参数,如 growth='logistic' (饱和增长), changepoint_prior_scale (趋势灵活性), seasonality_prior_scale (季节性灵活性)
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False)
# 可以添加自定义节假日:
# holidays = pd.DataFrame({
# 'holiday': 'promo_event',
# 'ds': pd.to_datetime(['2023-11-24', '2024-11-29']), # 黑色星期五示例
# 'lower_window': 0, # 当天
# 'upper_window': 1, # 影响后一天
# })
# model = Prophet(holidays=holidays, yearly_seasonality=True, weekly_seasonality=True)
model.fit(df_prophet)
# 3. 创建未来日期的数据框用于预测
future_periods = 90 # 预测未来 90 天
future = model.make_future_dataframe(periods=future_periods)
print("\nFuture DataFrame Head:")
print(future.head())
# 4. 进行预测
forecast = model.predict(future)
print("\nForecast DataFrame Columns:")
print(forecast.columns) # 查看预测结果包含哪些列
print("\nForecast Sample:")
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()) # yhat 是预测值,yhat_lower/upper 是置信区间
# 5. 可视化预测结果
fig1 = model.plot(forecast)
plt.title("Forecast with Prophet")
plt.xlabel("Date")
plt.ylabel("Sales")
plt.show()
# 6. 可视化时间序列成分
fig2 = model.plot_components(forecast)
plt.show()
Prophet 极大地简化了时间序列预测流程,尤其适合需要快速产出且包含多种周期性模式的场景。
六、深度学习:LSTM 在时间序列预测中的应用简介
近年来,深度学习模型,特别是长短期记忆网络 (LSTM),在时间序列预测领域也展现出强大的能力。
6.1 为何需要 LSTM?
- 捕捉长期依赖: 传统的 ARIMA 等模型在捕捉长期时间依赖关系方面能力有限。
- 处理复杂非线性模式: 现实世界的时间序列往往包含复杂的非线性关系,这是 LSTM 等神经网络的强项。
- 端到端学习: 可以直接从原始序列学习特征和模式,减少了手动特征工程和模型假设的需求(但仍需数据预处理)。
6.2 LSTM 基本原理简述
LSTM 是一种特殊的循环神经网络 (RNN)。标准 RNN 在处理长序列时容易遇到梯度消失/爆炸问题,难以学习长期依赖。LSTM 通过引入门控机制 (Gating Mechanism) 来解决这个问题:
- 遗忘门 (Forget Gate):决定从细胞状态中丢弃哪些信息。
- 输入门 (Input Gate):决定让哪些新信息存储到细胞状态中。
- 输出门 (Output Gate):决定基于细胞状态输出什么值。
这些门结构使得 LSTM 能够有选择地记忆或遗忘信息,从而更好地捕捉时间序列中的长期模式。
6.3 应用场景与挑战
应用场景:
- 需要捕捉复杂、非线性、长期依赖关系的时间序列(如金融市场波动、自然语言处理中的序列数据)。
- 多变量时间序列预测(可以同时输入多个相关的序列)。
挑战:
- 数据需求: 通常需要大量的训练数据。
- 计算成本: 训练深度学习模型通常比传统模型更耗时、计算资源要求更高。
- 模型复杂性与调优: 网络结构设计、超参数调优相对复杂。
- 可解释性: 相对于 ARIMA 或 Prophet,LSTM 的“黑箱”特性更强,解释预测结果更困难。
使用 LSTM 进行时间序列预测通常涉及数据标准化、将序列转换为监督学习格式(用过去的窗口预测未来点)、构建 LSTM 网络(使用 Keras/TensorFlow 或 PyTorch)、训练和评估。这部分内容较为深入,我们在此仅做简介,后续可能会有专题文章详细探讨。
七、总结
本篇文章作为机器学习之旅的第 27 天,带大家探索了时间序列分析与预测的核心概念和常用方法。我们回顾了以下关键知识点:
- 时间序列基础: 认识了时间序列数据的定义、特点(时间依赖性)以及常见的核心成分(趋势、季节性、周期性、随机性)。
- 平稳性: 理解了平稳性的概念、其在时间序列分析中的重要性,并掌握了检验平稳性的方法(可视化、ADF 检验)和处理非平稳序列的技术(差分)。
- 经典模型 ARIMA: 学习了 ARIMA 模型的组成(AR, I, MA)、建模的基本流程(可视化、平稳化、定阶、建模、诊断、预测),并通过
statsmodels
库进行了股票价格预测的概念演示。了解了其局限性,如对线性和平稳性假设的依赖。 - 现代工具 Prophet: 掌握了 Facebook Prophet 库的优势(易用、自动化、稳健)、核心思想(可分解模型),并通过
prophet
库实战演示了如何快速构建销售额预测模型并可视化结果,感受其便捷性。 - 深度学习视角 LSTM: 简要介绍了 LSTM 为何适用于时间序列预测(捕捉长期依赖、非线性),其基本原理(门控机制)以及应用场景与挑战。
时间序列分析是一个既经典又不断发展的领域。从传统的统计模型到现代的机器学习、深度学习方法,选择合适的工具取决于数据的特性、预测的目标以及可用的资源。希望通过今天的学习,您能对时间序列预测建立起清晰的认识,并能动手实践,解决实际问题!