Python中的Theta预测法实用指南
Negative Theta 是一种时间序列预测方法,结合了分解、线性外推和集成模型。它特别适用于带有强烈趋势和季节性特征的时间序列。
Theta方法是由Assimakopoulos和Nikolopoulos(2000年)提出的一种预测方法。它基于将时间序列分解成两个或多个部分,然后分别预测各部分并重新组合。核心思想是通过应用一个“theta系数”来调整时间序列的趋势,并利用线性和平滑后的部分进行预测。
Theta方法的关键步骤如下:
- 将时间序列分解成趋势部分和季节性部分。
- 对趋势应用theta变换以调整趋势的曲率。
- 分别预测每个部分。
- 将预测结果结合起来产生最终结果。
我们将用Python里的Theta方法来做这个。为了演示,我们将使用常用的AirPassengers
数据集(记录了从1949年到1960年的每月航空乘客人数)。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
data.rename(columns={'Passengers': 'AirPassengers'}, inplace=True)
# 绘制数据
plt.figure(figsize=(10, 6))
plt.plot(data, label="AirPassengers", color="blue")
plt.title("每月航空乘客")
plt.xlabel("月份")
plt.ylabel("乘客数")
plt.legend()
plt.grid()
plt.savefig("air_passengers_plot.png")
plt.show()
首先,将时间序列拆分为趋势和季节性部分,然后……
从statsmodels.tsa.seasonal导入seasonal_decompose
# 分解时间序列
result = seasonal_decompose(data['AirPassengers'], model='乘法模型')
# 绘制分解图
result.plot()
plt.tight_layout()
plt.savefig("decomposition_plot.png")
plt.show()
我们使用一个theta系数来调整趋势曲线的曲率。通常使用theta = 2
来表示传统的θ方法。
def theta_transform(series, theta=2):
linear_trend = np.poly1d(np.polyfit(range(len(series)), series, 1))(range(len(series)))
theta_series = theta * series - (theta - 1) * linear_trend
return theta_series, linear_trend
# 应用这个变换
theta_series, linear_trend = theta_transform(data['AirPassengers'])
# 绘制变换后的序列
plt.figure(figsize=(10, 6))
plt.plot(data['AirPassengers'], label="原始数据", color="blue")
plt.plot(theta_series, label="θ=2 的Theta序列", color="orange")
plt.plot(linear_trend, label="线性趋势", color="green")
plt.title("Theta变换图")
plt.xlabel("时间轴")
plt.ylabel("乘客数量")
plt.legend()
plt.grid()
plt.savefig("theta_transformation.png")
plt.show()
我们将使用线性趋势法和经过调整的序列做预测,最后整合结果。
from sklearn.linear_model 导入 LinearRegression
def forecast_theta(series, forecast_horizon, theta=2):
# 线性趋势预测
X = np.arange(len(series)).reshape(-1, 1)
model = LinearRegression()
model.fit(X, series)
future_X = np.arange(len(series), len(series) + forecast_horizon).reshape(-1, 1)
trend_forecast = model.predict(future_X)
# 使用简单的朴素方法预测Theta序列
theta_series, _ = theta_transform(series, theta)
naive_forecast = np.mean(theta_series[-12:]) # 过去12个月的平均值
# 结合预测
combined_forecast = (trend_forecast + naive_forecast) / 2
return combined_forecast
# 预测未来12个月
forecast_horizon = 12
forecast_values = forecast_theta(data['AirPassengers'].values, forecast_horizon)
# 生成未来时间点
future_dates = pd.date_range(data.index[-1], periods=forecast_horizon + 1, freq='M')[1:]
# 绘制预测结果
plt.figure(figsize=(10, 6))
plt.plot(data, label="历史数据", color="蓝色")
plt.plot(future_dates, forecast_values, label="Theta预测结果", color="红色", linestyle="--")
plt.title("Theta预测结果")
plt.xlabel("时间")
plt.ylabel("乘客数量")
plt.legend()
plt.grid()
plt.savefig("theta预测.png")
plt.show()
Theta法结合了线性趋势和经过调整的曲率,从而为具有趋势和季节性的时间序列提供了稳健的预测结果。该方法的简单性和高效性使其是许多实际预测任务的优秀选择。
下一步骤:这篇文章将展示如何手动实现Theta方法。但在大多数情况下,人们更倾向于使用Python库如statsmodels
和statsforecast
。这些库可以节省时间,减少错误,并帮助应用更复杂的技术。
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦