立聪堂德州十三局店 发表于 5 天前

第 5 篇:初试牛刀 - 简单的预测方法

第 5 篇:初试牛刀 - 简单的预测方法

颠末前面四篇的学习,我们已经具备了处置惩罚时间序列数据的基本功:加载、可视化、分解以及处置惩罚平稳性。现在,冲动民气的时刻到来了——我们要开始实验预测 (Forecasting) 将来!
预测是时间序列分析最焦点的应用之一。固然存在很多复杂的预测模型,但万丈高楼平地起,一些看似简单的预测方法不仅轻易理解和实现,有时效果还出奇地好,而且它们是理解更高级模型的重要基础。
本篇,我们将学习几种“入门级”的时间序列预测方法:

[*]预测的基本概念: 区分训练与预测,分别数据集。
[*]朴素预测 (Naive Forecast): 最简单的方法。
[*]简单匀称法 (Simple Average): 用汗青匀称值预测。
[*]移动匀称法 (Moving Average): 用近期汗青匀称值预测。
[*](可选) 季节性朴素预测 (Seasonal Naive Forecast): 考虑季节性的朴素方法。
我们将用 Python 实现这些方法,并看看它们的预测效果怎样。
预测的基本概念

在进行预测之前,我们必要明白两个基本概念:


[*] 拟合 (In-sample Fit) vs. 预测 (Out-of-sample Forecast):

[*]拟合: 使用模型去“解释”或“匹配”我们已经拥有的汗青数据。
[*]预测: 使用模型去推断我们尚未观测到的将来数据点。这才是我们通常意义上的“预测”。

[*] 训练集 (Training Set) vs. 测试集 (Test Set):

[*] 为了评估模型的真实预测能力,我们不能用全部汗青数据来构建模型,然后又用这些数据来评估。这就像考试前知道了全部答案。
[*] 标准的做法是:将汗青数据分别为两部门:

[*]训练集: 用于构建(或“训练”)我们的预测模型。模型只能看到这部门数据。
[*]测试集: 用于评估模型的预测效果。模型在训练阶段看不到这部门数据。我们将模型的预测效果与测试集的真实值进行比较。

[*] 对于时间序列,通常是按时间次序分别,较早的数据作为训练集,较晚的数据作为测试集。比方,用前 80% 的数据训练,后 20% 的数据测试。

最简单的预测模型

现在,让我们来熟悉几位简单但重要的“预测选手”。我们将继承使用之前的月度 CO2 数据(或你可以替换成自己的数据)。
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns

# --- 数据准备 ---
# 1. 加载数据
data = sm.datasets.co2.load_pandas().data
data['co2'].interpolate(inplace=True)
monthly_data = data.resample('M').mean()

# 2. 划分训练集和测试集 (例如,最后 2 年作为测试集)
train_data = monthly_data[:-24] # 除去最后 24 个月
test_data = monthly_data[-24:]# 最后 24 个月

print(f"训练集范围: {train_data.index.min()} to {train_data.index.max()}")
print(f"测试集范围: {test_data.index.min()} to {test_data.index.max()}")

# --- 可视化划分结果 (可选) ---
plt.figure(figsize=(12, 6))
plt.plot(train_data.index, train_data['co2'], label='Train Data')
plt.plot(test_data.index, test_data['co2'], label='Test Data (Actual)')
plt.title('CO2 Data: Train/Test Split')
plt.xlabel('Date')
plt.ylabel('CO2 Concentration')
plt.legend()
plt.show()
https://i-blog.csdnimg.cn/direct/073507885f70484698d15ab59307a2de.png#pic_center
https://i-blog.csdnimg.cn/direct/4fa939fe50274f75b690b46767781db5.png#pic_center
1. 朴素预测 (Naive Forecast)



[*]逻辑: 假设将来跟现在(最近的已知值)一样。预测下一期的值就即是训练会合最后一期的实际值。

[*]Ŷ(t+1) = Y(t_last_train)

[*]长处: 极其简单,无需参数,是一个重要的基准 (Baseline) 模型(任何更复杂的模型都应该比它做得更好才故意义)。
[*]缺点: 无法捕获趋势和季节性,对颠簸敏感。
[*]实现:
# 获取训练集最后一个值
last_train_value = train_data['co2'].iloc[-1]

# 创建测试集长度的预测值,所有值都等于 last_train_value
naive_forecast = pd.Series( * len(test_data), index=test_data.index)

print("\n朴素预测 (Naive Forecast):")
print(naive_forecast.head())
https://i-blog.csdnimg.cn/direct/56e9a0287bd446b1950c8c9b0bd70bc2.png#pic_center
2. 简单匀称法 (Simple Average)



[*]逻辑: 假设将来会和汗青的匀称水平一样。预测将来全部期的值都即是训练会合全部数据的匀称值。

[*]Ŷ(t+k) = mean(Y_train) for all k > 0

[*]长处: 简单,考虑了全部汗青信息。
[*]缺点: 忽略了时间序列的演变(趋势、季节性),对早期数据和近期数据给予同等权重。如果序列有明显趋势,效果通常很差。
[*]实现:
# 计算训练集平均值
train_mean = train_data['co2'].mean()

# 创建测试集长度的预测值,所有值都等于 train_mean
simple_avg_forecast = pd.Series( * len(test_data), index=test_data.index)

print("\n简单平均法预测 (Simple Average Forecast):")
print(simple_avg_forecast.head())
https://i-blog.csdnimg.cn/direct/b19fbc8e5b7f404d85f2c6f55b7f054b.png#pic_center
3. 移动匀称法 (Moving Average)



[*]逻辑: 只考虑最近的一段汗青。预测下一期的值即是训练会合最近 N 个数据点的匀称值。N 是必要我们指定的窗口巨细 (Window Size)。

[*]Ŷ(t+1) = mean(Y(t), Y(t-1), ..., Y(t-N+1))

[*]长处: 比简单匀称法更关注近期变革,能肯定水平平滑短期颠簸。
[*]缺点: 无法很好地处置惩罚趋势和季节性。预测值对窗口巨细 N 很敏感。它本质上是对近期水平的估计,不是趋势预测。严酷来说,移动匀称更多用于平滑数据或作为更复杂模型的组件,直接用于多步预测效果有限(通常只预测一步,或者假设将来多步都即是这个匀称值)。
[*]实现 (预测将来全部期都即是最后窗口的匀称值):
# 设置移动平均窗口大小 (例如,最近 12 个月)
window_size = 12

# 计算训练集最后 N 个点的平均值
moving_avg = train_data['co2'].iloc[-window_size:].mean()

# 创建测试集长度的预测值
moving_avg_forecast = pd.Series( * len(test_data), index=test_data.index)

print(f"\n移动平均法预测 (Moving Average Forecast, N={window_size}):")
print(moving_avg_forecast.head())
https://i-blog.csdnimg.cn/direct/92bc5ff8a3c84311baeaebdf8f1f393c.png#pic_center
4. (可选) 季节性朴素预测 (Seasonal Naive Forecast)



[*]逻辑: 假设下个季节/周期的同一时间点会和上个季节/周期一样。比方,预测来岁 1 月的值即是今年 1 月的值。

[*]Ŷ(t+k) = Y(t+k-s),此中 s 是季节周期长度 (e.g., 12 for monthly data with annual seasonality)。

[*]长处: 考虑了季节性,对于有强季节性模式的数据可能效果不错。也是一个重要的基准。
[*]缺点: 忽略了趋势和其他变革。
[*]实现 (必要访问训练会合更早的数据):
# 季节周期
seasonality = 12

seasonal_naive_forecast_list = []
for i in range(len(test_data)):
    if i >= seasonality:
      # 使用测试集前一个季节周期的预测值
      seasonal_value = test_data['co2'].iloc
    else:
      # 不足一个周期,用训练集最后一个完整周期前的值
      seasonal_value = train_data['co2'].iloc[-seasonality + i]
    seasonal_naive_forecast_list.append(seasonal_value)

seasonal_naive_forecast = pd.Series(seasonal_naive_forecast_list, index=test_data.index)

print("\n季节性朴素预测 (Seasonal Naive Forecast):")
print(seasonal_naive_forecast.head())
https://i-blog.csdnimg.cn/direct/336e23c3b3494fbcb64cc354c06d6d28.png#pic_center
可视化预测效果

光看数字不够直观,让我们把预测效果和测试集的真实值画在一起比较一下。
plt.figure(figsize=(14, 8))

# 绘制训练数据
plt.plot(train_data.index, train_data['co2'], label='Train Data')

# 绘制测试数据 (真实值)
plt.plot(test_data.index, test_data['co2'], label='Test Data (Actual)', color='black', linewidth=2)

# 绘制各种预测结果
plt.plot(test_data.index, naive_forecast, label='Naive Forecast', linestyle='--')
plt.plot(test_data.index, simple_avg_forecast, label='Simple Average Forecast', linestyle='--')
plt.plot(test_data.index, moving_avg_forecast, label=f'Moving Average (N={window_size}) Forecast', linestyle='--')
plt.plot(test_data.index, seasonal_naive_forecast, label='Seasonal Naive Forecast', linestyle='--')

# 添加标题和标签
plt.title('Comparison of Simple Forecast Methods')
plt.xlabel('Date')
plt.ylabel('CO2 Concentration')
plt.legend()
plt.tight_layout()
plt.show()
https://i-blog.csdnimg.cn/direct/39e16590911945cf91479a75e1a341af.png#pic_center
解读图形:


[*]观察每种预测方法(虚线)与测试集真实值(黑色实线)的靠近水平。
[*]对于 CO2 数据(有明显趋势和季节性):

[*]朴素预测 和 简单匀称 显然跟不上趋势,预测线是平的。
[*]移动匀称 (N=12) 也基本是平的,由于它只是最后12个月的匀称,没有预测趋势。
[*]季节性朴素预测 捕获到了季节颠簸,但没有捕获到整体上升的趋势。

[*]这表明,对于具有明显趋势和/或季节性的数据,这些简单方法可能不足以做出正确预测。它们更多是作为后续更复杂模型的比较基准。
小结

今天我们迈出了预测的第一步:


[*]理解了预测的目标是推断将来值,以及训练集/测试集分别的重要性。
[*]学习并实现了四种简单的预测方法:

[*]朴素预测 (Naive): Ŷ(t+1) = Y(t)
[*]简单匀称法 (Simple Average): Ŷ(t+k) = mean(Y_train)
[*]移动匀称法 (Moving Average): Ŷ(t+1) = mean(Y(t), ..., Y(t-N+1))
[*]季节性朴素预测 (Seasonal Naive): Ŷ(t+k) = Y(t+k-s)

[*]通过可视化比较了这些方法在测试集上的表现,并熟悉到它们作为基准模型的价值。
下一篇预告

我们已经做出了几种预测,但是怎么量化地评价哪个预测“更好”呢?光靠看图是不够严谨的。下一篇,我们将学习常用的预测评估指标 (Evaluation Metrics),如 MAE, MSE, RMSE 等,它们将帮助我们用数字来衡量预测的正确性。
准备好给你的预测打分了吗?敬请期待!
(实验用你自己的时间序列数据跑一遍这些简单预测方法,看看哪个效果相对最好?窗口巨细 N 对移动匀称预测影响大吗?欢迎分享!)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 第 5 篇:初试牛刀 - 简单的预测方法