IT评测·应用市场-qidao123.com技术社区

标题: 第 5 篇:初试牛刀 - 简单的预测方法 [打印本页]

作者: 立聪堂德州十三局店    时间: 2025-4-22 07:05
标题: 第 5 篇:初试牛刀 - 简单的预测方法
第 5 篇:初试牛刀 - 简单的预测方法

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

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

最简单的预测模型

现在,让我们来熟悉几位简单但重要的“预测选手”。我们将继承使用之前的月度 CO2 数据(或你可以替换成自己的数据)。
  1. import pandas as pd
  2. import numpy as np
  3. import statsmodels.api as sm
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. # --- 数据准备 ---
  7. # 1. 加载数据
  8. data = sm.datasets.co2.load_pandas().data
  9. data['co2'].interpolate(inplace=True)
  10. monthly_data = data.resample('M').mean()
  11. # 2. 划分训练集和测试集 (例如,最后 2 年作为测试集)
  12. train_data = monthly_data[:-24] # 除去最后 24 个月
  13. test_data = monthly_data[-24:]  # 最后 24 个月
  14. print(f"训练集范围: {train_data.index.min()} to {train_data.index.max()}")
  15. print(f"测试集范围: {test_data.index.min()} to {test_data.index.max()}")
  16. # --- 可视化划分结果 (可选) ---
  17. plt.figure(figsize=(12, 6))
  18. plt.plot(train_data.index, train_data['co2'], label='Train Data')
  19. plt.plot(test_data.index, test_data['co2'], label='Test Data (Actual)')
  20. plt.title('CO2 Data: Train/Test Split')
  21. plt.xlabel('Date')
  22. plt.ylabel('CO2 Concentration')
  23. plt.legend()
  24. plt.show()
复制代码


1. 朴素预测 (Naive Forecast)


  1. # 获取训练集最后一个值
  2. last_train_value = train_data['co2'].iloc[-1]
  3. # 创建测试集长度的预测值,所有值都等于 last_train_value
  4. naive_forecast = pd.Series([last_train_value] * len(test_data), index=test_data.index)
  5. print("\n朴素预测 (Naive Forecast):")
  6. print(naive_forecast.head())
复制代码

2. 简单匀称法 (Simple Average)


  1. # 计算训练集平均值
  2. train_mean = train_data['co2'].mean()
  3. # 创建测试集长度的预测值,所有值都等于 train_mean
  4. simple_avg_forecast = pd.Series([train_mean] * len(test_data), index=test_data.index)
  5. print("\n简单平均法预测 (Simple Average Forecast):")
  6. print(simple_avg_forecast.head())
复制代码

3. 移动匀称法 (Moving Average)


  1. # 设置移动平均窗口大小 (例如,最近 12 个月)
  2. window_size = 12
  3. # 计算训练集最后 N 个点的平均值
  4. moving_avg = train_data['co2'].iloc[-window_size:].mean()
  5. # 创建测试集长度的预测值
  6. moving_avg_forecast = pd.Series([moving_avg] * len(test_data), index=test_data.index)
  7. print(f"\n移动平均法预测 (Moving Average Forecast, N={window_size}):")
  8. print(moving_avg_forecast.head())
复制代码

4. (可选) 季节性朴素预测 (Seasonal Naive Forecast)


  1. # 季节周期
  2. seasonality = 12
  3. seasonal_naive_forecast_list = []
  4. for i in range(len(test_data)):
  5.     if i >= seasonality:
  6.         # 使用测试集前一个季节周期的预测值
  7.         seasonal_value = test_data['co2'].iloc[i - seasonality]
  8.     else:
  9.         # 不足一个周期,用训练集最后一个完整周期前的值
  10.         seasonal_value = train_data['co2'].iloc[-seasonality + i]
  11.     seasonal_naive_forecast_list.append(seasonal_value)
  12. seasonal_naive_forecast = pd.Series(seasonal_naive_forecast_list, index=test_data.index)
  13. print("\n季节性朴素预测 (Seasonal Naive Forecast):")
  14. print(seasonal_naive_forecast.head())
复制代码

可视化预测效果

光看数字不够直观,让我们把预测效果和测试集的真实值画在一起比较一下。
  1. plt.figure(figsize=(14, 8))
  2. # 绘制训练数据
  3. plt.plot(train_data.index, train_data['co2'], label='Train Data')
  4. # 绘制测试数据 (真实值)
  5. plt.plot(test_data.index, test_data['co2'], label='Test Data (Actual)', color='black', linewidth=2)
  6. # 绘制各种预测结果
  7. plt.plot(test_data.index, naive_forecast, label='Naive Forecast', linestyle='--')
  8. plt.plot(test_data.index, simple_avg_forecast, label='Simple Average Forecast', linestyle='--')
  9. plt.plot(test_data.index, moving_avg_forecast, label=f'Moving Average (N={window_size}) Forecast', linestyle='--')
  10. plt.plot(test_data.index, seasonal_naive_forecast, label='Seasonal Naive Forecast', linestyle='--')
  11. # 添加标题和标签
  12. plt.title('Comparison of Simple Forecast Methods')
  13. plt.xlabel('Date')
  14. plt.ylabel('CO2 Concentration')
  15. plt.legend()
  16. plt.tight_layout()
  17. plt.show()
复制代码

解读图形:

小结

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

下一篇预告

我们已经做出了几种预测,但是怎么量化地评价哪个预测“更好”呢?光靠看图是不够严谨的。下一篇,我们将学习常用的预测评估指标 (Evaluation Metrics),如 MAE, MSE, RMSE 等,它们将帮助我们用数字来衡量预测的正确性。
准备好给你的预测打分了吗?敬请期待!

(实验用你自己的时间序列数据跑一遍这些简单预测方法,看看哪个效果相对最好?窗口巨细 N 对移动匀称预测影响大吗?欢迎分享!)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4