评估技术在实践中应用。使用 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}")指标解读:MAE: 预测值与实际值之间的平均绝对差值。数值越低越好。对于我们的占位 SARIMA 模型,其 MAE 值更低,这表明其预测结果通常比 ARIMA 预测结果更接近实际值。MSE: 平方差的平均值。它对较大误差的惩罚比 MAE 更重。数值越低越好。RMSE: MSE 的平方根,与原始数据单位相同。数值越低越好。为了易于理解,它通常比 MSE 更受青睐。MAPE: 平均绝对百分比差值。它对比较不同尺度数据集的准确性很有用,但如果实际值接近零,则可能会出现问题。数值越低越好。根据这些指标(使用我们的占位结果),SARIMA 模型在测试集上的表现似乎优于 ARIMA 模型,因为它持续显示较低的误差值。使用信息准则 (AIC/BIC)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 进行交互式可视化的类似比较:{"layout": {"title": "预测比较(交互式)", "xaxis": {"title": "日期"}, "yaxis": {"title": "值"}, "legend": {"title": "序列"}, "hovermode": "x unified", "width": 700, "height": 400}, "data": [{"x": ["2022-03-22", "2022-03-23", "2022-03-24", "2022-03-25", "2022-03-26", "2022-03-27", "2022-03-28", "2022-03-29", "2022-03-30", "2022-03-31", "2022-04-01", "2022-04-02", "2022-04-03", "2022-04-04", "2022-04-05", "2022-04-06", "2022-04-07", "2022-04-08", "2022-04-09", "2022-04-10"], "y": [58.8, 59.1, 58.5, 59.3, 60.1, 59.9, 60.5, 61.2, 60.8, 61.5, 62.0, 61.7, 62.2, 62.8, 63.1, 62.5, 63.0, 63.5, 63.9, 64.2], "mode": "lines", "name": "实际值", "line": {"color": "#1c7ed6", "width": 2}}, {"x": ["2022-03-22", "2022-03-23", "2022-03-24", "2022-03-25", "2022-03-26", "2022-03-27", "2022-03-28", "2022-03-29", "2022-03-30", "2022-03-31", "2022-04-01", "2022-04-02", "2022-04-03", "2022-04-04", "2022-04-05", "2022-04-06", "2022-04-07", "2022-04-08", "2022-04-09", "2022-04-10"], "y": [57.5, 60.2, 57.1, 61.0, 59.5, 61.8, 59.0, 62.5, 60.0, 63.0, 60.5, 63.5, 61.0, 64.5, 61.5, 64.0, 62.0, 65.0, 62.5, 65.5], "mode": "lines", "name": "ARIMA 预测", "line": {"color": "#ff922b", "dash": "dash"}}, {"x": ["2022-03-22", "2022-03-23", "2022-03-24", "2022-03-25", "2022-03-26", "2022-03-27", "2022-03-28", "2022-03-29", "2022-03-30", "2022-03-31", "2022-04-01", "2022-04-02", "2022-04-03", "2022-04-04", "2022-04-05", "2022-04-06", "2022-04-07", "2022-04-08", "2022-04-09", "2022-04-10"], "y": [58.2, 59.5, 58.0, 59.8, 59.7, 60.4, 60.0, 61.5, 60.5, 61.8, 61.5, 62.1, 61.8, 63.0, 62.8, 62.8, 62.5, 63.8, 63.5, 64.5], "mode": "lines", "name": "SARIMA 预测", "line": {"color": "#51cf66", "dash": "dot"}}]}实际测试数据与占位 ARIMA 和 SARIMA 预测的比较。较低的误差通常对应于更紧密追踪实际值的预测。总结在本次实践练习中,我们应用了多种技术来评估时间序列预测。我们计算了常用误差指标(MAE、MSE、RMSE、MAPE),考虑了模型拟合过程中获得的信息准则(AIC、BIC),并通过绘制预测值与实际值的对比图来可视化性能。通过综合这些不同方面的信息,您可以针对您特定的时间序列问题,做出关于哪个模型提供最准确和可靠预测的明智决定。请记住,模型选择通常涉及权衡,并且“最佳”模型取决于您的具体目标和数据的特点。持续评估是时间序列预测工作流程中的一个关键组成部分。