使用 Facebook Prophet 进行时间序列预测和缺失值填充
在数据分析和机器学习领域,时间序列预测是一个常见的任务。Facebook 开源的 Prophet 是一个专门用于时间序列预测的工具,它简单易用,能够处理复杂的季节性和趋势变化,同时对缺失值和异常值具有一定的鲁棒性。本文将介绍 Prophet 的基本功能,并通过一个代码示例展示如何使用它来填充时间序列中的缺失值。特别地,我们将深入探讨对数变换和逻辑增长模型的设置,这些步骤是根据具体业务需求进行优化的重要环节。
什么是 Facebook Prophet?
Prophet 是 Facebook 开发的一种时间序列预测工具,旨在帮助数据科学家快速生成高质量的预测结果。它基于加性回归模型,能够捕捉时间序列中的趋势、季节性和节假日效应。Prophet 的主要特点包括:
- 易于使用:Prophet 提供了简洁的 API,用户无需复杂的统计知识即可快速上手。
- 强大的季节性建模:Prophet 能够自动检测并建模年、周、日等不同粒度的季节性。
- 灵活的趋势建模:Prophet 使用分段线性或逻辑增长模型来捕捉趋势变化,并允许用户手动指定变化点。
- 鲁棒性:Prophet 对缺失值和异常值具有一定的鲁棒性,能够处理不规则采样的时间序列数据。
Prophet 的基本使用方法
Prophet 的核心思想是将时间序列分解为趋势、季节性和节假日效应。其基本模型可以表示为:

其中:
- g(t) 是趋势项,捕捉时间序列的整体变化趋势。
- s(t) 是季节性项,捕捉周期性变化(如日、周、年)。
- h(t) 是节假日效应项,捕捉特定日期的特殊影响。
- ϵt 是误差项,表示模型无法解释的随机波动。
在实际使用中,Prophet 会自动拟合这些组件,并生成预测结果。
对数变换:减小预测波动性
在时间序列预测中,数据的波动性可能会对模型的性能产生显著影响。为了减小预测的波动性,我们通常会对目标变量进行对数变换。对数变换可以稳定数据的方差,使数据分布更加接近正态分布,从而提高模型的预测精度。
代码示例:对数变换
# 对 y 列进行对数变换
long_df['y'] = np.log(long_df['y'] + 1)
为什么进行对数变换?
- 稳定方差:对数变换可以将乘法关系转化为加法关系,从而稳定数据的方差。
- 减小波动性:对数变换可以压缩数据的范围,减小极端值的影响,使数据更加平滑。
- 提高模型性能:对数变换后的数据更接近正态分布,有助于提高模型的预测性能。
对数变换的效果
假设原始数据 (y) 的分布如下:
y = [1, 2, 3, 10, 100]
经过对数变换后:
log(y + 1) = [0, 0.693, 1.098, 2.302, 4.605]
可以看到,对数变换有效地压缩了数据的范围,减小了极端值的影响。
逻辑增长模型:确保预测值非负
在某些业务场景中,预测值必须是非负的。例如,销售数据、流量数据等都不可能为负值。为了确保预测值非负,我们可以使用逻辑增长模型(Logistic Growth Model)。逻辑增长模型通过设定上限(cap)和下限(floor),限制预测值的范围。
代码示例:逻辑增长模型
model = Prophet(
growth='logistic', # 设置为逻辑增长模型
yearly_seasonality=False,
weekly_seasonality=True,
daily_seasonality=True,
changepoint_prior_scale=changepoint_prior_scale, # 调整这个参数以控制变化点的强度
seasonality_prior_scale=seasonality_prior_scale # 调整这个参数以控制季节性强度
)
为什么使用逻辑增长模型?
- 业务需求:某些业务场景中,预测值必须是非负的。
- 模型约束:逻辑增长模型通过设定上限和下限,确保预测值在合理范围内。
- 提高预测精度:通过限制预测值的范围,可以避免不合理的结果,提高模型的预测精度。
逻辑增长模型的效果
逻辑增长模型通过以下公式确保预测值非负:

其中:
- K 是上限(cap)。
- r是增长率。
- t0 是中点时间。
通过设定合理的上限和下限,可以确保预测值始终在合理范围内。
示例:使用 Prophet 填充缺失值
下面是一个使用 Prophet 填充时间序列中缺失值的完整代码示例。
完整代码示例
import pandas as pd
import numpy as np
from prophet import Prophet
from typing import Optional
from datetime import datetime, time
def fill_missing_data_prophet

最低0.47元/天 解锁文章
1052

被折叠的 条评论
为什么被折叠?



