WEBKT

别慌,高缺失数据下 Prophet 预测照样稳!

38 0 0 0

1. Prophet 是个啥?先复习一下

2. 数据缺失,Prophet 还能行吗?

3. 评估 Prophet 预测的可靠性:火眼金睛来辨别

3.1 视觉检验:眼见为实

3.2 数值指标:量化评估

3.3 交叉验证:更严谨的评估

3.4 异常值检测:小心“坏”数据

4. 如何改进 Prophet 的预测效果:授人以渔

4.1 数据预处理:打好基础

4.2 调整 Prophet 的参数:精雕细琢

4.3 添加额外的特征:锦上添花

4.4 模型集成:集思广益

5. 案例分析:实战出真知

5.1 数据准备

5.2 模型训练和预测

5.3 结果评估和优化

6. 总结:拥抱挑战

嘿,哥们儿,最近在用 Prophet 预测时间序列数据吗?是不是也遇到了数据缺失的烦恼?别担心,这简直是家常便饭!作为一名在数据预测领域摸爬滚打多年的老司机,我今天就来跟你聊聊,在高缺失值的情况下,如何评估 Prophet 预测的可靠性,以及如何优化它,让你的预测结果更上一层楼。

1. Prophet 是个啥?先复习一下

在开始之前,咱们先快速回顾一下 Prophet。它是由 Facebook 开源的一个时间序列预测工具,特别擅长处理具有季节性、趋势性和节假日效应的数据。简单来说,Prophet 就是把时间序列分解成这几个部分,然后分别建模,最后再加总起来,得到预测结果。这哥们儿最大的优点就是简单易用,不需要太多的参数调整,就能得到一个还不错的预测结果。

2. 数据缺失,Prophet 还能行吗?

当然能!虽然 Prophet 默认情况下会尝试处理缺失值,但如果缺失值比例过高,或者缺失的模式比较复杂,那么预测的准确性就会受到影响。想象一下,如果你的数据缺失了一大块,那 Prophet 就相当于蒙着眼睛走路,预测结果肯定会大打折扣。

所以,在高缺失值的情况下,我们需要格外小心,评估 Prophet 预测的可靠性。

3. 评估 Prophet 预测的可靠性:火眼金睛来辨别

评估预测结果的可靠性,就像医生给病人看病一样,需要多方面诊断。下面是我常用的几个方法:

3.1 视觉检验:眼见为实

首先,也是最简单的方法,就是画图!用 Prophet 预测出的结果,跟实际数据放在一起,观察一下它们之间的拟合程度。具体来说,可以看以下几点:

  • 预测值与真实值的差距:差距越大,说明预测效果越差。如果差距很大,而且差距的模式比较稳定,比如总是高估或者低估,那么就要引起警惕了。
  • 预测值的波动性:预测值的波动性是否与真实值的波动性一致?如果真实值波动很大,而预测值却非常平滑,那么可能说明 Prophet 捕捉不到数据的真实变化。
  • 预测值的趋势:预测值的趋势是否与真实值的趋势一致?如果真实值是上升趋势,而预测值是下降趋势,那么肯定有问题。

你可以用 plot() 函数来可视化预测结果,也可以用 plot_components() 函数来可视化 Prophet 分解后的各个组件(趋势、季节性、节假日效应),这样可以更深入地了解 Prophet 的预测逻辑。

3.2 数值指标:量化评估

光靠眼睛看,难免会主观。我们需要一些数值指标来量化评估预测结果的准确性。常用的指标包括:

  • 均方根误差 (RMSE):衡量预测值与真实值之间的平均差异。RMSE 越小,说明预测效果越好。RMSE 对异常值比较敏感,如果你的数据中有异常值,那么 RMSE 可能会受到很大的影响。
  • 平均绝对误差 (MAE):衡量预测值与真实值之间的平均绝对差异。MAE 比 RMSE 对异常值更鲁棒,更不容易受到异常值的影响。
  • 平均绝对百分比误差 (MAPE):衡量预测值与真实值之间的平均百分比差异。MAPE 可以直观地表示预测误差占真实值的百分比,但需要注意的是,如果真实值接近于 0,那么 MAPE 可能会变得很大,甚至出现无穷大。
  • **R-squared (R²) **:R-squared 反映了模型拟合数据的程度。R-squared 的值介于 0 到 1 之间,越接近 1,说明模型拟合得越好。

在 Python 中,可以使用 sklearn 库来计算这些指标,例如:

from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error, r2_score
import numpy as np
# 假设 y_true 是真实值,y_pred 是预测值
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mae = mean_absolute_error(y_true, y_pred)
mape = mean_absolute_percentage_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f'RMSE: {rmse}')
print(f'MAE: {mae}')
print(f'MAPE: {mape}')
print(f'R-squared: {r2}')

3.3 交叉验证:更严谨的评估

单一的训练集和测试集,难免会有偶然性。为了更严谨地评估 Prophet 的预测效果,我们可以使用交叉验证。交叉验证就是把数据分成多个子集,然后轮流用不同的子集作为训练集和测试集,最终得到多个预测结果,并对这些结果进行平均。这样可以更全面地评估模型的泛化能力。

Prophet 内置了交叉验证的功能,使用 cross_validation() 函数即可。你需要指定预测的 horizon(预测的时间长度)、initial(初始训练集的时间长度)和 period(每次训练集增长的时间长度)。例如:

from prophet import Prophet
from prophet.diagnostics import cross_validation, performance_metrics
# 假设 df 是你的时间序列数据,包含 'ds' (时间) 和 'y' (数值)
model = Prophet()
model.fit(df)
# 交叉验证
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon = '365 days')
# 计算性能指标
df_p = performance_metrics(df_cv)
print(df_p.head())

通过交叉验证,你可以得到不同时间窗口下的预测结果,以及对应的 RMSE、MAE、MAPE 等指标,从而更全面地评估 Prophet 的预测效果。

3.4 异常值检测:小心“坏”数据

数据中的异常值,就像埋在沙滩里的地雷,随时可能引爆你的预测。异常值可能导致模型过度拟合,或者严重影响预测结果的准确性。因此,在评估 Prophet 预测的可靠性时,我们需要特别关注异常值的检测和处理。

  • 可视化检测:通过绘制时间序列图,可以直观地发现异常值。异常值通常表现为远离其他数据点的孤立点。
  • 统计方法:可以使用统计方法来检测异常值,例如:
    • 3σ 原则:如果数据服从正态分布,那么超过 3 倍标准差的数据点可以被认为是异常值。
    • IQR 方法:计算数据的四分位数,然后将超出 IQR (四分位距) 1.5 倍的数据点视为异常值。
    • Z-score:计算每个数据点的 Z-score,Z-score 超过一定阈值的数据点可以被认为是异常值。
  • 机器学习方法:可以使用机器学习方法来检测异常值,例如:
    • 孤立森林:孤立森林是一种无监督的异常检测算法,它通过构建随机森林来孤立异常值。
    • One-Class SVM:One-Class SVM 是一种无监督的异常检测算法,它通过学习正常数据的分布来识别异常值。

在 Python 中,可以使用 scipystatsmodelssklearn 库来实现这些方法。检测到异常值后,你可以选择删除、替换或调整异常值,以减少它们对预测结果的影响。

4. 如何改进 Prophet 的预测效果:授人以渔

如果评估结果显示 Prophet 的预测效果不理想,别慌,咱们还可以通过一些方法来改进它。下面是我的一些经验:

4.1 数据预处理:打好基础

数据预处理就像盖房子前的地基,地基不牢,房子肯定会塌。数据预处理对于 Prophet 的预测效果至关重要。

  • 缺失值处理:对于缺失值,可以采取以下几种方法:
    • 插补:使用插补方法填充缺失值,例如线性插补、均值插补、中位数插补、或者使用更高级的插补方法,例如 K 近邻插补、基于模型的插补等。选择哪种插补方法,需要根据数据的特点来决定。对于时间序列数据,线性插补通常是一个不错的选择。
    • 删除:如果缺失值比例很小,或者缺失值是随机分布的,那么可以考虑删除缺失值。但是,如果缺失值比例很高,或者缺失值不是随机分布的,那么删除缺失值可能会导致数据信息丢失,影响预测结果。
    • 标记:将缺失值标记为一个特定的值,例如 -1,然后将这个标记作为一个特征输入到 Prophet 中。这种方法适用于缺失值的出现是有意义的情况。
  • 异常值处理:前面已经提到过异常值的检测,检测到异常值后,可以采取以下几种方法:
    • 删除:删除异常值。这种方法适用于异常值是由于数据错误造成的。
    • 替换:使用其他值替换异常值,例如使用均值、中位数或相邻值替换异常值。这种方法适用于异常值是由于数据波动造成的。
    • 调整:调整异常值,例如将异常值截断到一定的范围。这种方法适用于异常值是由于数据测量误差造成的。
  • 数据转换:对数据进行转换,例如对数转换、平方根转换等。数据转换可以使数据更符合 Prophet 的假设,从而提高预测效果。
  • 数据缩放:对数据进行缩放,例如标准化、归一化等。数据缩放可以使不同特征的量纲一致,从而提高模型的训练效果。

4.2 调整 Prophet 的参数:精雕细琢

Prophet 的参数不多,但调整好这些参数,也能显著提高预测效果。

  • growth 参数:指定趋势的类型,可以是 'linear' (线性) 或者 'logistic' (逻辑斯蒂)。如果你的数据呈现线性增长趋势,那么使用 'linear' 即可。如果你的数据呈现饱和增长趋势,那么使用 'logistic'。对于 'logistic' 模式,你需要提供额外的容量参数 cap
  • changepoint_prior_scale 参数:控制趋势变化的灵敏度。这个参数越大,趋势变化的灵敏度越高,模型更容易捕捉到趋势的变化。如果你的数据趋势变化比较剧烈,那么可以适当增大这个参数。如果你的数据趋势比较稳定,那么可以适当减小这个参数。
  • changepoint_range 参数:控制潜在的趋势变化点在时间序列中的位置。这个参数的取值范围是 0 到 1,表示趋势变化点在时间序列中的比例。例如,changepoint_range = 0.8 表示只考虑时间序列前 80% 的数据作为潜在的趋势变化点。
  • seasonality_prior_scale 参数:控制季节性成分的灵敏度。这个参数越大,模型更容易捕捉到季节性成分。如果你的数据季节性比较明显,那么可以适当增大这个参数。如果你的数据季节性不明显,或者你不想考虑季节性,那么可以适当减小这个参数。
  • holidays_prior_scale 参数:控制节假日效应的灵敏度。这个参数越大,模型更容易捕捉到节假日效应。如果你的数据包含节假日效应,那么可以适当增大这个参数。如果你的数据不包含节假日效应,或者你不想考虑节假日效应,那么可以适当减小这个参数。
  • seasonality_mode 参数:指定季节性的建模方式,可以是 'additive' (加性) 或者 'multiplicative' (乘性)。如果季节性变化的大小与时间序列的水平无关,那么使用 'additive'。如果季节性变化的大小与时间序列的水平有关,那么使用 'multiplicative'。
  • n_changepoints 参数:控制趋势变化点的数量。这个参数越大,模型可以捕捉到的趋势变化点越多。但是,过多的趋势变化点可能会导致模型过拟合。

你可以通过交叉验证来调整这些参数,找到最佳的参数组合。

4.3 添加额外的特征:锦上添花

除了时间序列数据本身,你还可以添加额外的特征,来帮助 Prophet 提高预测效果。

  • 外部特征:如果你的时间序列数据受到其他因素的影响,例如天气、促销活动等,那么可以将这些因素作为外部特征添加到 Prophet 中。Prophet 允许你将外部特征作为回归变量,加入到模型中。你需要将外部特征与时间序列数据合并,并确保外部特征与时间序列数据的时间戳对齐。
  • 滞后特征:滞后特征是指将时间序列数据本身作为特征,例如将过去几天的销售额作为特征,来预测今天的销售额。滞后特征可以帮助 Prophet 捕捉到时间序列的自相关性。
  • 节假日:如果你知道节假日对你的时间序列数据有影响,那么可以将节假日信息作为特征添加到 Prophet 中。Prophet 提供了内置的节假日处理功能,你可以通过指定节假日的名称和日期来告诉 Prophet 哪些日期是节假日。

4.4 模型集成:集思广益

如果单个模型的效果不理想,你可以尝试使用模型集成的方法,将多个模型的预测结果进行组合。模型集成可以提高预测的稳定性和准确性。

  • 加权平均:将多个模型的预测结果进行加权平均。你可以根据每个模型的预测效果,为每个模型分配不同的权重。预测效果好的模型,可以分配更高的权重。
  • 堆叠 (Stacking):将多个模型的预测结果作为新的特征,然后使用一个新的模型来预测最终的结果。堆叠可以利用不同模型的互补性,提高预测效果。

5. 案例分析:实战出真知

为了让你更直观地理解,我来分享一个实际的案例。假设我们要预测某个电商网站的每日访问量,数据中存在大量的缺失值。

5.1 数据准备

首先,我们需要准备数据。数据包括日期 ('ds') 和每日访问量 ('y')。由于数据中存在缺失值,我们需要先对缺失值进行处理。这里我们使用线性插补来填充缺失值。

import pandas as pd
from prophet import Prophet
from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error, r2_score
import numpy as np
# 假设 df 是你的时间序列数据,包含 'ds' (时间) 和 'y' (数值)
# 模拟数据,包含缺失值
df = pd.DataFrame({'ds': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-04', '2023-01-05', '2023-01-07', '2023-01-08']), 'y': [100, 110, 130, 140, 160, 170]})
# 线性插补填充缺失值
df = df.set_index('ds').resample('D').asfreq()
df['y'] = df['y'].interpolate(method='linear')
df = df.reset_index()

5.2 模型训练和预测

接下来,我们使用 Prophet 来训练模型,并进行预测。

# 模型训练
model = Prophet()
model.fit(df)
# 预测未来 30 天
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
# 可视化预测结果
fig1 = model.plot(forecast)
fig2 = model.plot_components(forecast)
# 计算预测误差
# 为了计算预测误差,我们需要一个真实的测试集
# 这里我们假设 df_test 是一个包含真实值的 DataFrame
# 但是,在实际应用中,我们需要在时间序列的末尾留出一部分数据作为测试集
# 例如,我们可以在训练模型时,使用前 80% 的数据,然后使用后 20% 的数据作为测试集
# 假设 df_test 是一个包含真实值的 DataFrame,时间范围与 forecast 重叠
# 模拟数据
end_date = forecast['ds'].max()
start_date = end_date - pd.Timedelta(days=29)
df_test = pd.DataFrame({'ds': pd.to_datetime([start_date + pd.Timedelta(days=i) for i in range(30)]), 'y': [180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470]}) # 模拟测试数据
# 合并预测结果和真实值
forecast_with_true = pd.merge(forecast, df_test, on='ds', how='inner', suffixes=('_pred', '_true'))
# 计算 RMSE, MAE, MAPE, R2
rmse = np.sqrt(mean_squared_error(forecast_with_true['y_true'], forecast_with_true['yhat']))
mae = mean_absolute_error(forecast_with_true['y_true'], forecast_with_true['yhat'])
mape = mean_absolute_percentage_error(forecast_with_true['y_true'], forecast_with_true['yhat'])
r2 = r2_score(forecast_with_true['y_true'], forecast_with_true['yhat'])
print(f'RMSE: {rmse}')
print(f'MAE: {mae}')
print(f'MAPE: {mape}')
print(f'R-squared: {r2}')

5.3 结果评估和优化

通过可视化结果和计算预测误差,我们可以评估 Prophet 的预测效果。如果预测效果不理想,我们可以尝试调整参数、添加外部特征等方法来优化模型。

例如,我们可以尝试调整 changepoint_prior_scale 参数,来控制趋势变化的灵敏度。或者,我们可以添加天气数据作为外部特征,来提高预测的准确性。

6. 总结:拥抱挑战

在高缺失值的情况下,使用 Prophet 进行时间序列预测,确实是一个挑战。但是,只要我们掌握了正确的评估方法和优化技巧,就能让 Prophet 预测结果更加可靠。记住以下几点:

  • 重视数据预处理:缺失值、异常值的处理是关键。
  • 多角度评估:视觉检验、数值指标、交叉验证,一个都不能少。
  • 善用参数调整:根据数据特点,调整 Prophet 的参数。
  • 灵活运用技巧:添加外部特征、模型集成,提高预测效果。

希望这些经验能帮助你更好地使用 Prophet,解决时间序列预测中的难题!加油,哥们儿!

老码农 Prophet时间序列预测数据缺失机器学习预测模型

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8806