用Python实现时间序列模型实战——Day 16: 时间序列预测方法

一、学习内容
1. 一步预测与多步预测的区别与方法
  • 一步预测: 一步预测指的是仅预测下一个时间步的值。模型只预测未来一个时间点,然后终止。这种预测方法通常用于短期预测,且误差较小。

  • 多步预测: 多步预测指的是预测多个未来时间点。多步预测可以分为两种方法:

    • 直接多步预测:同时预测多个未来时间点的值。
    • 递归多步预测:先进行一步预测,然后将预测值用于下一步的输入,继续预测后续的多个时间点。
2. 时间序列的滚动预测与滑动窗口方法
  • 滚动预测: 滚动预测是一种递归多步预测方法,在每一步预测后,将预测值作为下一个时间步的输入,并滚动窗口前进。这种方法适合于连续预测,但误差可能随着预测步长增加而累积。

  • 滑动窗口: 滑动窗口方法是将一定数量的过去观测值作为窗口输入,预测下一个时间点的值。随着时间步进,窗口不断前移,用新的观测值替换旧的观测值。

3. 预测区间的计算

预测区间(或置信区间)表示模型预测值的不确定性范围。通常我们使用模型的残差来计算预测区间,它是对未来某个时间点值的估计范围,通常包含 95% 或 99% 的可能性。

预测区间的计算公式为:

\text{Forecast Interval} = \hat{y}_t \pm z \times \sigma

其中 \hat{y}_t 是预测值,z 是正态分布下的临界值(例如对于 95% 置信区间,z \approx 1.96),\sigma是预测的标准误差。

二、实战案例

我们将使用 statsmodels 对时间序列数据进行一步预测和多步预测,并计算预测区间。

1. 数据生成

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# 生成模拟的时间序列数据
np.random.seed(42)
n_obs = 150
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
data = 0.5 * np.arange(n_obs) + np.random.normal(0, 1, n_obs)

# 创建数据框
ts_data = pd.DataFrame({'Date': time, 'Value': data})
ts_data.set_index('Date', inplace=True)

# 绘制时间序列
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.title('Simulated Time Series Data')
plt.legend()
plt.show()

代码解释:

  • 我们生成了一个模拟时间序列,包含趋势和噪声,用于模型训练和预测。

结果输出:

2. 一步预测
# 构建 ARIMA 模型 (p=1, d=1, q=1)
arima_model = ARIMA(ts_data['Value'], order=(1, 1, 1)).fit()

# 一步预测 (One-step forecast)
one_step_forecast = arima_model.forecast(steps=1)
one_step_conf_int = arima_model.get_forecast(steps=1).conf_int()

print(f"One-step forecast: {one_step_forecast}")
print(f"One-step forecast confidence interval: \n{one_step_conf_int}")

代码解释:

  • 使用 ARIMA 模型进行一步预测,并输出预测值和置信区间。预测区间表示模型预测值的不确定性范围。

结果输出:

One-step forecast: 2012-07-31    74.700013
Freq: M, dtype: float64
One-step forecast confidence interval: 
            lower Value  upper Value
2012-07-31    71.990793    77.409233
3. 多步预测
# 多步预测 (Multi-step forecast)
multi_step_forecast = arima_model.forecast(steps=12)
multi_step_conf_int = arima_model.get_forecast(steps=12).conf_int()

# 绘制多步预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(pd.date_range(start=ts_data.index[-1], periods=12, freq='M'), multi_step_forecast, label='Multi-step Forecast')
plt.fill_between(pd.date_range(start=ts_data.index[-1], periods=12, freq='M'),
                 multi_step_conf_int.iloc[:, 0],
                 multi_step_conf_int.iloc[:, 1], color='gray', alpha=0.3, label='Confidence Interval')
plt.title('Multi-step Forecast with Confidence Intervals')
plt.legend()
plt.show()

代码解释:

  • 使用 ARIMA 模型进行未来 12 个月的多步预测,并绘制预测结果及其置信区间。置信区间反映了预测的不确定性。

结果输出:

4. 滚动预测
# 滚动预测 (Rolling forecast)
history = [x for x in ts_data['Value'][:120]]
rolling_predictions = list()
for t in range(30):
    model = ARIMA(history, order=(1, 1, 1))
    model_fit = model.fit()
    yhat = model_fit.forecast()[0]
    rolling_predictions.append(yhat)
    history.append(ts_data['Value'][120 + t])

# 绘制滚动预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(ts_data.index[120:150], rolling_predictions, label='Rolling Forecast', linestyle='--')
plt.title('Rolling Forecast')
plt.legend()
plt.show()

代码解释:

  • 滚动预测是一种逐步更新预测的方法。我们使用历史数据进行预测,然后将新预测值加入历史数据中,重复此过程以进行多步预测。

结果输出:

三、结果分析

1. 一步预测结果
  • 输出了下一步的预测值和置信区间。置信区间通常围绕预测值展开,显示了预测值的可能范围。
2. 多步预测结果
  • 多步预测显示了未来 12 个月的预测值及其置信区间。由于多步预测是递归进行的,预测误差可能会随着时间的推移而增加。
3. 滚动预测结果
  • 滚动预测结果展示了 30 个时间步的逐步预测。滚动预测适合于需要连续更新预测值的场景。

四、总结

通过使用一步预测、多步预测和滚动预测方法,我们可以为不同场景下的时间序列数据生成合理的预测结果。结合置信区间,我们可以评估预测值的准确性和不确定性。

滑动窗口算法是一种在序列数据分析中常用的技术,它可以用于查找序列中满足某些条件的连续元素子集。在生物信息学中,尤其是在蛋白质序列分析时,滑动窗口算法可以用于检测序列中可能存在的功能区域、保守区域或结构特征。 在Python实现氨基酸序列的滑动窗口分析通常涉及以下步骤: 1. 初始化一个窗口大小,这个大小可以根据分析的目的来设定。 2. 从序列的起始位置开始,逐步移动窗口,每次移动一个元素。 3. 在每次移动后,检查窗口内的氨基酸序列是否满足分析条件(比如是否包含特定的氨基酸模式、是否具有某种生物学特性等)。 4. 记录满足条件的窗口位置和相关的属性信息。 下面是一个简单的Python示例,演示如何使用滑动窗口技术来分析蛋白质序列: ```python def sliding_window_peptide(seq, window_size): """ 对蛋白质序列使用滑动窗口分析。 :param seq: 蛋白质序列(字符串) :param window_size: 窗口大小 :return: 窗口内的氨基酸子序列列表 """ window_sequences = [] length = len(seq) for start in range(length - window_size + 1): end = start + window_size window_seq = seq[start:end] window_sequences.append(window_seq) return window_sequences # 示例使用 protein_sequence = "AGCTAGCTAGCTA" window_size = 5 windowed_sequences = sliding_window_peptide(protein_sequence, window_size) # 输出窗口内的氨基酸子序列 for i, window_seq in enumerate(windowed_sequences): print(f"窗口 #{i+1}: {window_seq}") ``` 在这个例子中,我们定义了一个函数`sliding_window_peptide`,它接受一个蛋白质序列和窗口大小作为参数,并返回一个包含所有窗口内氨基酸序列的列表。然后我们用一个具体的蛋白质序列和窗口大小来调用这个函数,并打印出每个窗口的氨基酸子序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值