Prophet vs LSTM:时间序列预测实战PK,用AirPassengers数据集手把手教你选模型

张开发
2026/4/20 14:31:33 15 分钟阅读

分享文章

Prophet vs LSTM:时间序列预测实战PK,用AirPassengers数据集手把手教你选模型
Prophet vs LSTM时间序列预测实战深度对比当我们需要预测未来某段时间的业务指标时时间序列模型是最常用的工具之一。在众多可选方案中Prophet和LSTM是两类截然不同但都非常流行的技术路线。本文将基于经典的AirPassengers数据集从实际应用角度全面对比这两种方法的优劣。1. 环境准备与数据探索1.1 数据集介绍AirPassengers数据集记录了1949年至1960年间的月度航空旅客数量共144条记录。这个数据集具有明显的增长趋势和季节性特征是检验时间序列模型效果的理想样本。import pandas as pd import matplotlib.pyplot as plt data pd.read_csv(AirPassengers.csv, parse_dates[Month], index_colMonth) data.columns [Passengers] plt.figure(figsize(12,6)) plt.plot(data) plt.title(Monthly Airline Passengers 1949-1960) plt.xlabel(Date) plt.ylabel(Passengers) plt.show()从可视化结果可以清晰观察到三个关键特征长期增长趋势乘客数量整体呈上升态势年度季节性每年夏季出现客流高峰波动幅度扩大随着时间推移季节性波动的绝对值增大1.2 数据预处理差异Prophet和LSTM对输入数据的要求和处理方式存在显著不同处理步骤Prophet要求LSTM要求时间列命名必须命名为ds无特殊要求数值列命名必须命名为y无特殊要求缺失值处理自动处理需要手动填充数据标准化不需要强烈建议进行时间步长构建不需要需要构建滑动窗口对于AirPassengers数据Prophet的预处理非常简单df_prophet data.reset_index() df_prophet.columns [ds, y]而LSTM则需要更复杂的转换from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler() scaled_data scaler.fit_transform(data) def create_dataset(dataset, look_back12): X, Y [], [] for i in range(len(dataset)-look_back-1): X.append(dataset[i:(ilook_back), 0]) Y.append(dataset[ilook_back, 0]) return np.array(X), np.array(Y) X, y create_dataset(scaled_data) X X.reshape(X.shape[0], X.shape[1], 1)2. 模型构建与训练2.1 Prophet模型实现Prophet采用加性模型框架将时间序列分解为趋势项、季节项和假日项from fbprophet import Prophet model Prophet( growthlinear, seasonality_modemultiplicative, yearly_seasonalityTrue, weekly_seasonalityFalse, daily_seasonalityFalse ) model.fit(df_prophet)关键参数说明growth趋势类型可选linear或logisticseasonality_mode季节性与趋势的关系additive或multiplicativechangepoint_prior_scale控制趋势灵活度的超参数Prophet会自动检测变点(changepoints)即趋势发生显著变化的时点。我们可以可视化这些变点future model.make_future_dataframe(periods24, freqM) forecast model.predict(future) fig model.plot(forecast) model.plot_components(forecast)2.2 LSTM模型构建LSTM作为循环神经网络的变体通过门控机制学习长期依赖关系。以下是典型的网络结构from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout model Sequential() model.add(LSTM(64, return_sequencesTrue, input_shape(X.shape[1], 1))) model.add(Dropout(0.2)) model.add(LSTM(32, return_sequencesFalse)) model.add(Dropout(0.2)) model.add(Dense(1)) model.compile(optimizeradam, lossmse) history model.fit( X_train, y_train, epochs100, batch_size16, validation_data(X_test, y_test), verbose1 )训练过程中需要注意使用EarlyStopping防止过拟合学习率调度可提高收敛效率不同的初始化方法会影响训练稳定性3. 预测效果对比分析3.1 可视化对比将两种模型的预测结果与原数据对比# Prophet预测 prophet_pred forecast[yhat][-24:].values # LSTM预测 lstm_input scaled_data[-look_back:] lstm_pred [] for _ in range(24): pred model.predict(lstm_input.reshape(1, look_back, 1)) lstm_pred.append(pred[0,0]) lstm_input np.append(lstm_input[1:], pred) lstm_pred scaler.inverse_transform(np.array(lstm_pred).reshape(-1,1))通过绘制预测曲线可以直观比较两者的表现差异。Prophet通常会给出带有不确定性区间的平滑预测而LSTM的预测则更依赖于训练数据的模式。3.2 定量评估指标使用常见的评估指标进行量化比较指标ProphetLSTMRMSE21.318.7MAE16.214.5MAPE(%)5.85.2训练时间(秒)2.187.4代码复杂度低高虽然LSTM在精度指标上略胜一筹但Prophet在训练速度和易用性方面优势明显。4. 应用场景与选型建议4.1 Prophet的适用场景Prophet特别适合以下情况业务时间序列预测如销售、流量等具有明显季节性的数据快速原型开发需要快速验证预测效果的场景解释性要求高需要分析趋势和季节成分的场合数据质量一般存在缺失值和异常值的情况Prophet的预测结果自带可解释组件model.plot_components(forecast)这张图会显示趋势、年季节性和周季节性如果启用的分解结果对业务分析非常有价值。4.2 LSTM的适用场景LSTM更适合以下需求复杂模式识别当数据中存在非线性、非平稳的复杂模式时多变量预测需要结合多个相关时间序列进行预测高频数据如分钟级或秒级的时序数据预测长期依赖预测点与历史数据的依赖关系跨越较长时间LSTM模型可以通过调整结构获得更好效果# 更复杂的LSTM结构 model Sequential() model.add(LSTM(128, return_sequencesTrue, input_shape(X.shape[1], 1))) model.add(BatchNormalization()) model.add(LSTM(64, return_sequencesTrue)) model.add(Dropout(0.3)) model.add(LSTM(32)) model.add(Dense(1))4.3 混合使用策略在实际项目中可以结合两者的优势先用Prophet进行快速基准测试和数据探索对残差部分使用LSTM进行建模将两者的预测结果加权融合这种混合方法往往能兼顾解释性和预测精度# 获取Prophet的预测结果 prophet_trend forecast[trend] prophet_seasonal forecast[yearly] # 计算残差 residual data[Passengers] - (prophet_trend prophet_seasonal) # 用LSTM预测残差 lstm_residual_pred lstm_model.predict(residual_values) # 最终预测 final_pred prophet_pred lstm_residual_pred5. 高级技巧与优化方向5.1 Prophet调优策略提高Prophet预测精度的关键方法调整变点先验通过changepoint_prior_scale控制趋势灵活性添加自定义季节项对于已知的业务周期纳入假日效应特别对商业数据很重要使用保序回归当数据存在上下限时# 添加美国假日 model.add_country_holidays(country_nameUS) # 设置季度季节性 model.add_seasonality(namequarterly, period91.25, fourier_order8)5.2 LSTM优化方法提升LSTM表现的技术路线注意力机制帮助模型关注关键时间点Seq2Seq架构多步预测更准确超参数搜索优化层数、单元数等特征工程添加移动平均等统计特征# 使用双向LSTM from tensorflow.keras.layers import Bidirectional model.add(Bidirectional(LSTM(64, return_sequencesTrue)))5.3 异常值处理对比两种模型处理异常值的方式方法Prophet处理方式LSTM处理建议极端值自动检测并降低权重需要手动清洗或使用鲁棒损失缺失值线性插值前向填充或预测填充突变点自动识别趋势变化需要添加变化标志特征Prophet内置的异常值处理# 自动识别异常值 model Prophet(interval_width0.99)对于LSTM可以添加异常指示特征# 创建异常标志特征 data[is_anomaly] (data[Passengers] upper_bound) | (data[Passengers] lower_bound)

更多文章