7天微课程day4——时间序列预测的baseline

本文介绍了时间序列预测中基线模型的重要性和实现方法。通过使用简单而快速的persistence模型,文章展示了如何将其应用于实际数据集上,包括数据预处理、模型训练、预测及结果评估等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:

  1. 本文是系列课程的第4课
  2. 本文是对机器学习网站课程的翻译
  3. 尊重原作者,尊重知识分享

时间序列预测的baseline

创建一个baseline总是时间序列预测的关键一步。一个baseline可以帮助我们了解模型的好坏。本文将会创建一个基本的时间序列预测模型——persistence模型,该模型的预测可以作为一个baseline。

通过本文,你将学到:

  • baseline的重要性。
  • 如何从零开始创建一个简单的python时间序列预测模型。
  • 如何评估预测结果,如何使用baseline。

Baseline

baseline的作用在于比较,我们通常将预测结果好于baseline的模型保留并舍弃结果差的。一个合理的baseline应该来自一个简单模型,并且不会过多的考虑数据细节方面的特征。

首先,确定数据集、如何划分训练集和测试集、模型评估方法(如MSE)。然后,尽可能选择一个简单的模型快速计算baseline。这个简单的模型应满足一下基本要素:

  • 简单,不需要太智能
  • 快速,计算速度快
  • 可重复,没有太多的trick(所想即所得)

下面介绍最常用的建立baseline的模型——persistence模型。

Persistence Algorithm(又称“naive”预测)

监督学习中最常用的获得baseline的方法是Zero Rule。该方法在分类问题中,总是输出出现次数最多的类;在回归问题中,总是输出平均值。

对于时间序列预测,应该考虑序列中的自相关性,找到更好的计算baseline的方法。

persistence方法用t-1时刻的数据预测t时刻的数据。下面,我们来实现该方法。这里用到的数据集是Shampoo Sales Dataset.

Shampoo Sales Dataset

该数据集是3年里洗发水的月销量,有36个观测值,具体如下:

"Month","Sales"
"1-01",266.0
"1-02",145.9
"1-03",183.1
"1-04",119.3
"1-05",180.3

通过洗发水的销量图发现,销量上涨的趋势明显,且有季节性波动。

Persistence Algorithm

我们将分一下几步实现Persistence预测:

  1. 先将单变量时间序列转化成监督学习问题。
  2. 建立训练集和测试集
  3. 定义Persistence模型。
  4. 预测并建立baseline
  5. 可视化输出
1. 定义监督学习问题
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot

def parser(x):
    return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)

# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift[1], values], axis=1)
dataframe.columns = ['t-1', 't']
print(dataframe.head())
'''输出
     t-1    t+1
0    NaN  266.0
1  266.0  145.9
2  145.9  183.1
3  183.1  119.3
4  119.3  180.3
'''
2. 训练集和测试集
X = dataframe.values
train_size = int(len(X) * 0.66)
train, test = X[1:train_size], X[train_size:]
train_X, train_y = train[:, 0], train[:, 1]
test_X, test_y = test[:, 0], test[:, 1]
3. Persistence算法
# persistence model
def model_persestence(x):
    return x
4. 预测、评估

预测方法为walk-forward。直接预测是将预测值作为下一步预测的输入;walk-forward用测试集中的真实值作为下一步预测的输入。

# 用真实的t-1时刻的值预测t时刻的值
predictions = list()
for x in test_X:
    yhat = model_persistence(x)
    predictions.append(yhat)
test_score = mean_squared_error(test_y, predictions)
print('Test MSE: %.3f' % test_score)
'''输出
Test MSE: 17730.518
'''
5. 可视化
# plot predictions and expected results
pyplot.plot(train_y)
pyplot.plot([None for i in train_y] + [x for x in test_y])
pyplot.plot([None for i in train_y] + [x for x in predictions])
pyplot.show()

### 时间序列预测的基准方法 对于时间序列预测,构建一个合理的基线模型是非常重要的。这不仅有助于理解数据本身的特点,也为后续更复杂模型的效果提供了对比标准。 #### 平均法 最简单的基线模型之一是平均法,该方法假设未来值等于历史观测值的算术平均数。这种方法虽然简单,但在某些情况下能够提供较为稳定的预测结果[^1]。 ```python def mean_forecast(data, forecast_length): """ 使用过去的数据计算均值作为未来的预测值 参数: data (list): 历史时间序列数据列表 forecast_length (int): 需要预测的时间步长数量 返回: list: 包含预测值的结果列表 """ avg_value = sum(data) / len(data) return [avg_value] * forecast_length ``` #### 移动平均法 移动平均法则考虑了一定窗口期内的历史数值来估计下一个时刻的值。相比全局平均而言,这种方式更能捕捉到近期趋势变化的影响。 ```python import numpy as np def moving_average_forecast(series, window_size=5): """基于给定大小滑窗内的均值来进行一步向前预测""" forecasts = [] for i in range(len(series)-window_size+1): window_mean = np.mean(series[i:i+window_size]) forecasts.append(window_mean) # 补充最后几个无法形成完整窗口的位置 last_window_avg = np.mean(series[-window_size:]) remaining_predictions = [last_window_avg]*(len(series)+forecast_steps-len(forecasts)) return forecasts + remaining_predictions[:forecast_steps] ``` #### 自回归积分滑动平均(ARIMA)模型 当面对具有明显季节性和长期趋势特征的时间序列时,ARIMA是一个常用的统计学建模工具。通过差分化处理使原序列为平稳过程之后再应用自回归项和/或移动平均成分进行拟合。 ```python from statsmodels.tsa.arima.model import ARIMA model = ARIMA(endog=data, order=(p,d,q)) # p: AR阶数; d: 差分次数; q: MA阶数 fitted_model = model.fit() predictions = fitted_model.forecast(steps=forecast_horizon) ``` 上述三种方式构成了不同类型的时间序列分析基础框架,在实际应用场景中可以根据具体需求选择合适的方法并加以改进优化[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值