趋近智
评估技术在实践中应用。使用 Python 计算性能指标,并比较应用于时间序列数据集的不同预测模型。此实践练习专注于评估时间序列数据和模型,包括 ARIMA 和 SARIMA,以评估它们的预测性能。
首先,请确保已导入所需的库。我们需要 pandas 用于数据处理,statsmodels 用于可能的模型拟合(尽管本次练习假定模型已拟合),sklearn.metrics 用于计算误差指标,以及 matplotlib 或 plotly 用于可视化。
import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error
import matplotlib.pyplot as plt
# 假设 statsmodels 用于模型拟合和预测:
# from statsmodels.tsa.arima.model import ARIMA
# from statsmodels.tsa.statespace.sarimax import SARIMAX
# 加载您的时间序列数据(请替换为实际的数据加载代码)
# 示例: data = pd.read_csv('your_time_series.csv', index_col='Date', parse_dates=True)
# 为了演示,我们创建一些占位数据和预测
dates = pd.date_range(start='2022-01-01', periods=100, freq='D')
data = pd.Series(np.random.randn(100).cumsum() + 50, index=dates)
# 假设您已经拟合了前几步的模型,例如:
# arima_fit = ARIMA(train_data, order=(p, d, q)).fit()
# sarima_fit = SARIMAX(train_data, order=(p, d, q), seasonal_order=(P, D, Q, m)).fit()
# 演示用的占位模型拟合与预测
# 在实际情况中,这些将来自您的模型拟合过程
train_size = 80
train_data = data[:train_size]
test_data = data[train_size:]
# 占位预测 — 替换为您的实际模型预测
arima_forecast = test_data + np.random.randn(len(test_data)) * 2 # 噪声预测 1
sarima_forecast = test_data + np.random.randn(len(test_data)) * 1 # 噪声预测 2 (较好)
# 确保预测结果是 pandas Series,且与 test_data 具有相同的索引
arima_forecast.index = test_data.index
sarima_forecast.index = test_data.index
# 占位 AIC/BIC 值(请替换为模型总结中的实际值)
arima_aic = 310.5
arima_bic = 320.1
sarima_aic = 305.2
sarima_bic = 318.8
print("设置完成。测试数据和占位预测已就绪。")
print(f"测试数据长度: {len(test_data)}")
如前所述,时间序列数据分割需要小心处理以保持时间顺序。我们通常选择一个时间点,将此时间点 之前 的所有数据用于训练,之后 的所有数据用于测试。我们上面的占位代码通过定义 train_data 和 test_data 来模拟此过程。
# 数据分割的代码已在设置部分显示
print("原始数据:")
print(data.head())
print("\n训练数据头部:")
print(train_data.head())
print("\n测试数据头部:")
print(test_data.head())
print(f"\n训练集大小: {len(train_data)}, 测试集大小: {len(test_data)}")
在 train_data 上拟合模型后,下一步是为 test_data 涵盖的时间段生成预测。statsmodels 库为此提供了诸如 .predict() 或 .forecast() 的方法。预测的起始和结束点应与您的 test_data 索引对齐。
# 占位预测已在设置部分生成。
# 在实际情况中,您会使用已拟合的模型:
# arima_forecast = arima_fit.predict(start=test_data.index[0], end=test_data.index[-1])
# sarima_forecast = sarima_fit.predict(start=test_data.index[0], end=test_data.index[-1])
print("ARIMA 预测(占位):")
print(arima_forecast.head())
print("\nSARIMA 预测(占位):")
print(sarima_forecast.head())
现在我们应用之前讨论的指标(MAE、MSE、RMSE、MAPE),将预测结果与 test_data 中的实际值进行比较。
# 确保实际值和预测值对齐
actual_values = test_data
# 为 ARIMA 模型计算指标
arima_mae = mean_absolute_error(actual_values, arima_forecast)
arima_mse = mean_squared_error(actual_values, arima_forecast)
arima_rmse = np.sqrt(arima_mse) # 从 MSE 计算 RMSE
arima_mape = mean_absolute_percentage_error(actual_values, arima_forecast)
print("--- ARIMA 模型评估 ---")
print(f"MAE: {arima_mae:.4f}")
print(f"MSE: {arima_mse:.4f}")
print(f"RMSE: {arima_rmse:.4f}")
print(f"MAPE: {arima_mape:.4f}")
# 为 SARIMA 模型计算指标
sarima_mae = mean_absolute_error(actual_values, sarima_forecast)
sarima_mse = mean_squared_error(actual_values, sarima_forecast)
sarima_rmse = np.sqrt(sarima_mse) # 从 MSE 计算 RMSE
sarima_mape = mean_absolute_percentage_error(actual_values, sarima_forecast)
print("\n--- SARIMA 模型评估 ---")
print(f"MAE: {sarima_mae:.4f}")
print(f"MSE: {sarima_mse:.4f}")
print(f"RMSE: {sarima_rmse:.4f}")
print(f"MAPE: {sarima_mape:.4f}")
指标解读:
根据这些指标(使用我们的占位结果),SARIMA 模型在测试集上的表现似乎优于 ARIMA 模型,因为它持续显示较低的误差值。
AIC 和 BIC 在模型拟合过程中,基于训练数据计算。它们通过平衡拟合优度和模型复杂度来帮助比较模型。AIC 和 BIC 值越低通常越受青睐。
# 获取 AIC/BIC(使用设置中的占位值)
# 实际中,您可以从模型拟合的总结中获取这些值:
# arima_aic = arima_fit.aic
# arima_bic = arima_fit.bic
# sarima_aic = sarima_fit.aic
# sarima_bic = sarima_fit.bic
print("--- 信息准则(来自训练拟合)---")
print(f"ARIMA - AIC: {arima_aic:.2f}, BIC: {arima_bic:.2f}")
print(f"SARIMA - AIC: {sarima_aic:.2f}, BIC: {sarima_bic:.2f}")
# 解释
if sarima_aic < arima_aic:
print("\nSARIMA 的 AIC 更低,表明其在拟合度和复杂度之间有更好的平衡。")
else:
print("\nARIMA 的 AIC 更低,表明其在拟合度和复杂度之间有更好的平衡。")
if sarima_bic < arima_bic:
print("SARIMA 的 BIC 更低,表明其在拟合度和复杂度之间有更好的平衡(对参数的惩罚更强)。")
else:
print("ARIMA 的 BIC 更低,表明其在拟合度和复杂度之间有更好的平衡(对参数的惩罚更强)。")
在我们的占位示例中,SARIMA 模型也显示出更低的 AIC 和 BIC 值,这与误差指标的结果相符。
一张比较测试集中的实际值与不同模型的预测结果的图表,提供了一种直观的评估性能的方法。
plt.figure(figsize=(12, 6))
plt.plot(train_data.index, train_data, label='训练数据', color='#adb5bd')
plt.plot(test_data.index, actual_values, label='实际值(测试)', color='#1c7ed6', linewidth=2)
plt.plot(arima_forecast.index, arima_forecast, label=f'ARIMA 预测 (RMSE: {arima_rmse:.2f})', color='#ff922b', linestyle='--')
plt.plot(sarima_forecast.index, sarima_forecast, label=f'SARIMA 预测 (RMSE: {sarima_rmse:.2f})', color='#51cf66', linestyle=':')
plt.title('实际值 vs. 预测值')
plt.xlabel('日期')
plt.ylabel('值')
plt.legend()
plt.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()
该图表直观地确认了每个模型的预测在测试期内追踪实际数据点的程度。您可以看到哪种预测(ARIMA 或 SARIMA)通常更接近实际的蓝色线条。
这里是使用 Plotly 进行交互式可视化的类似比较:
实际测试数据与占位 ARIMA 和 SARIMA 预测的比较。较低的误差通常对应于更紧密追踪实际值的预测。
在本次实践练习中,我们应用了多种技术来评估时间序列预测。我们计算了常用误差指标(MAE、MSE、RMSE、MAPE),考虑了模型拟合过程中获得的信息准则(AIC、BIC),并通过绘制预测值与实际值的对比图来可视化性能。通过综合这些不同方面的信息,您可以针对您特定的时间序列问题,做出关于哪个模型提供最准确和可靠预测的明智决定。请记住,模型选择通常涉及权衡,并且“最佳”模型取决于您的具体目标和数据的特点。持续评估是时间序列预测工作流程中的一个关键组成部分。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造