帮人做微信是哪个网站,做网站运营工资是不是很低,中国体育新闻热点,企业展示网站 价钱DAY 59 经典时序预测模型3 知识点回顾#xff1a; SARIMA模型的参数和用法#xff1a;SARIMA(p, d, q)(P, D, Q)m模型结果的检验可视化#xff08;昨天说的是摘要表怎么看#xff0c;今天是对这个内容可视化#xff09;多变量数据的理解#xff1a;内生变量和外部变量多变… DAY 59 经典时序预测模型3 知识点回顾 SARIMA模型的参数和用法SARIMA(p, d, q)(P, D, Q)m模型结果的检验可视化昨天说的是摘要表怎么看今天是对这个内容可视化多变量数据的理解内生变量和外部变量多变量模型 统计模型SARIMA单向因果、VAR考虑双向依赖机器学习模型通过滑动窗口实现往往需要借助arima等作为特征提取器来捕捉线性部分趋势、季节性再利用自己的优势捕捉非线性的残差深度学习模型独特的设计天然为时序数据而生 作业由于篇幅问题无法实战SARIMAX了可以自己借助AI尝试尝试相信大家已经有这个能力了。 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
import itertools
warnings.filterwarnings(ignore)
# 显示中文
plt.rcParams[font.sans-serif] [SimHei]
plt.rcParams[axes.unicode_minus] False# 1. 加载数据
url https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv
df pd.read_csv(url, header0, index_col0, parse_datesTrue)
df.columns [Passengers]# 2. 划分训练集和测试集保留最后12个月作为测试
train_data df.iloc[:-12]
test_data df.iloc[-12:]print(--- 训练集 ---)
print(train_data.tail()) # 观察训练集最后5行
print(\n--- 测试集 ---)
print(test_data.head()) # 观察测试集前5行# 3. 可视化原始数据
plt.figure(figsize(12, 6))
plt.plot(train_data[Passengers], label训练集)
plt.plot(test_data[Passengers], label测试集, colororange)
plt.title(国际航空乘客数量 (1949-1960))
plt.xlabel(年份)
plt.ylabel(乘客数量 (千人))
plt.legend()
plt.show()# 进行季节性差分 (D1, m12)
seasonal_diff df[Passengers].diff(12).dropna()
# 再进行普通差分 (d1)
seasonal_and_regular_diff seasonal_diff.diff(1).dropna()# 绘制差分后的数据
plt.figure(figsize(12, 6))
plt.plot(seasonal_and_regular_diff)
plt.title(经过一次季节性差分和一次普通差分后的数据)
plt.show()# ADF检验
result adfuller(seasonal_and_regular_diff)
print(fADF Statistic: {result[0]})
print(fp-value: {result[1]}) # p-value越小越说明数据平稳# 绘制ACF和PACF图
fig, (ax1, ax2) plt.subplots(2, 1, figsize(12, 8))
plot_acf(seasonal_and_regular_diff, lags36, axax1) # 绘制36个时间点
plot_pacf(seasonal_and_regular_diff, lags36, axax2)
plt.show()手动的超参数搜索
# 固定已知参数
d 1 # 非季节性差分阶数
D 1 # 季节性差分阶数
m 12 # 季节性周期月度数据为12# 定义待搜索的参数范围
p q range(0, 3) # 非季节性参数 p和q取0-2
P Q range(0, 2) # 季节性参数 P和Q取0-1# 生成所有可能的参数组合
pdq list(itertools.product(p, [d], q)) # d固定为1
seasonal_pdq [(x[0], D, x[2], m) for x in list(itertools.product(P, [D], Q))] # D固定为1# 修正列名引用假设数据列名为Passengers
train_column Passengers # 请根据实际数据列名调整# 初始化最佳参数和最小AIC
best_aic float(inf)
best_pdq None
best_seasonal_pdq None
best_model Noneprint(开始网格搜索最佳SARIMA参数...)# 网格搜索最佳参数
for param in pdq:for param_seasonal in seasonal_pdq:try:# 拟合SARIMA模型model SARIMAX(train_data[train_column],orderparam,seasonal_orderparam_seasonal,enforce_stationarityFalse, # 放宽平稳性约束enforce_invertibilityFalse, # 放宽可逆性约束dispFalse)# 使用优化的拟合方法results model.fit(methodbfgs, # 使用BFGS优化算法maxiter200, # 增加最大迭代次数dispFalse)# 打印当前参数组合及AICprint(fSARIMA{param}x{param_seasonal} - AIC: {results.aic:.2f})# 更新最佳参数if results.aic best_aic:best_aic results.aicbest_pdq parambest_seasonal_pdq param_seasonalbest_model resultsexcept Exception as e:print(fSARIMA{param}x{param_seasonal} 拟合失败: {str(e)})continue
# 输出最佳模型
if best_pdq:print(f\n最佳模型: SARIMA{best_pdq}x{best_seasonal_pdq} - AIC: {best_aic:.2f})final_model SARIMAX(train_data[train_column],orderbest_pdq,seasonal_orderbest_seasonal_pdq,enforce_stationarityFalse,enforce_invertibilityFalse)final_results final_model.fit(dispFalse)# 检查是否找到有效模型
if best_model is not None:print(f\n最佳模型: SARIMA{best_pdq}x{best_seasonal_pdq} - AIC: {best_aic:.2f})# 打印最佳模型摘要print(best_model.summary())# 绘制模型诊断图best_model.plot_diagnostics(figsize(15, 10))plt.tight_layout()plt.show()else:print(\n未能找到合适的SARIMA模型。请检查)print(1. 数据列名是否正确当前使用, train_column, )print(2. 数据是否包含缺失值或异常值)print(3. 尝试进一步调整参数范围)print(4. 考虑使用其他时间序列模型) # 1. 预测测试集
forecast final_results.get_forecast(stepslen(test_data))
forecast_mean forecast.predicted_mean
forecast_ci forecast.conf_int()# 2. 评估模型
from sklearn.metrics import mean_squared_error
import numpy as npmse mean_squared_error(test_data[train_column], forecast_mean)
rmse np.sqrt(mse)
print(f测试集 MSE: {mse:.2f})
print(f测试集 RMSE: {rmse:.2f})# 3. 绘制预测结果
plt.figure(figsize(12, 6))
plt.plot(train_data.index, train_data[train_column], label训练数据)
plt.plot(test_data.index, test_data[train_column], label真实值, colororange)
plt.plot(test_data.index, forecast_mean, label预测值, colorred)
plt.fill_between(forecast_ci.index,forecast_ci.iloc[:, 0],forecast_ci.iloc[:, 1],colorpink, alpha0.5, label95%置信区间)
plt.title(SARIMA模型预测 vs. 真实值)
plt.xlabel(日期)
plt.ylabel(乘客数量 (千人))
plt.legend()
plt.grid(True, alpha0.3)
plt.show() 浙大疏锦行