手把手教会你简单易学的Prophet时间序列模型
收录于话题
大家好,小果再次与大家相聚啦!今天,我要和大家一起探讨一项非常有趣的主题,那就是由Facebook开发的Prophet模型以及ProphetR包。
Prophet模型是一个强大的时间序列数据预测工具,它采用了一种非常智能的方法。它可以帮助我们分析时间序列数据中的非线性趋势,并与每年、每周以及每日的季节性变化以及假期的影响相匹配。这种模型特别适用于那些具有强烈季节性影响的时间序列数据,以及那些包含多个季节性因素的历史数据。Prophet模型还非常强大,能够处理数据缺失和趋势变化,并且通常能够很好地应对异常值。
现在,让我们来看看Prophet模型在生物信息学中的一些潜在应用。它可以用于分析基因表达数据,帮助我们预测基因表达随时间的变化趋势和周期性,并且能够帮助我们识别与生物过程、细胞周期或治疗干预相关的季节性模式。此外,Prophet模型还可以用于分析生物实验数据,包括酶活性、代谢产物浓度以及细胞生长曲线等,从而更好地理解这些生物过程的动态变化,并为实验计划和优化提供支持。Prophet的强大季节性建模和灵活的节假日效应支持使其成为处理生物信息学时间序列数据的绝佳工具。
Prophet模型的工作原理非常有趣。它采用了一种分解时间序列的方法,将其分解为三个主要组成部分:趋势、季节性和节假日效应。这种分解方法可以更好地捕捉时间序列中的复杂模式。首先,Prophet模型对趋势进行建模,它假设趋势可以由非线性增长函数表示,并使用分段线性函数来捕捉长期趋势的非线性变化。短期波动则通过窗口平滑技术来平滑趋势。其次,Prophet模型可以自动检测和建模数据中的季节性。它能够处理多种类型的季节性模式,包括每日、每周和每年的季节性。为了近似这些季节性模式,Prophet模型采用傅里叶级数进行建模。此外,Prophet模型还考虑了节假日效应对时间序列的影响。用户可以指定重要的节假日,并根据历史数据中的节假日模式自动建模这些效应。这使得模型能够更好地预测在特定节假日期间可能发生的变化。Prophet的公式如下:
其中,g(t)表示增长函数,用来表示线性或非线性的增长趋势;s(t)表示周期性变化,变化的周期可以是年、季度、月、每天等;h(t)表示时间序列中那些潜在的具有非固定周期的节假日对预测值造成的影响;为噪声项,表示随机的无法预测的波动.
具体地,g(t)包含饱和增长模型和分段线性模型两种参数模型:
(4-2)
(4-3)
周期模型s(t)依据傅里叶级数建立:
节假日模型:
Prophet R 包是用于时间序列分析和预测的开源工具,由 Facebook 开发和维护。它旨在为用户提供一个简单且强大的工具,用于处理具有季节性、节假日效应和趋势的时间序列数据。下面小果将通过一个简单的示例带大家学习Prophet模型的建模。
首先,载入R包并读取数据、创建结果变量。这是一个包含ds和y列的数据框,其中ds列包含日期,y列包含数值。ds列是YYYY-MM-DD格式的日期。我们使用了关于Peyton Manning维基百科页面的浏览量的对数数据。
公众号后台回复“111″,领取代码,代码编号:231017
Prophet模型建模
library(prophet)
df <- read.csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv')
我们可以调用该prophet函数来拟合模型并进行预测。第一个参数是历史数据框。其他参数控制 Prophet 如何拟合数据,可以使用help(prophet)进行进一步研究。
预测可以在数据帧上进行,其中有一列ds包含要进行预测的日期。该make_future_dataframe函数采用模型对象和多个周期进行预测并生成合适的数据帧。默认情况下,它还将包括历史日期,以便我们可以评估样本内的拟合度。
#创建Prophet模型
m <- prophet(df)
m
#预测
future <- make_future_dataframe(m, periods = 365)
tail(future)
forecast <- predict(m, future)
tail(forecast[c('ds', 'yhat', 'yhat_lower', 'yhat_upper')])
prophet模型的预测很简单。与 R 中的大多数建模过程一样,可以通过使用通用predict函数来获得预测。该forecast对象是一个数据框,其中有一列yhat包含预测。它还有用于不确定性区间和季节性成分的附加列。
Prophet模型结果分析与可视化
Facebook对Prophet模型的可视化进行了既容易又美观的开发。可以使用通用plot函数通过传入模型和预测数据框来绘制预测,该函数会为我们绘制一个时间序列图,包括真实值和拟合值,并绘制上预测区间。
#可视化
plot(m, forecast)
prophet_plot_components(m, forecast)
从上图中,可以看出Prophet模型很好地拟合了整个时间序列,基本捕获了整个序列的规律,并做出了一定地预测,为了更进一步研究该时间序列的规律,可以使用该prophet_plot_components函数查看细分为趋势、每周季节性和每年季节性的预测。
Prophet模型参数调整
有多种可供Prophet模型调整的参数,Prophet模型的主要参数有:
-
growth(趋势的形式):
-
可选值:”linear” 或 “sigmoid”。
-
作用:用于指定趋势的形式。”linear” 表示线性趋势,”sigmoid” 表示S形趋势。
-
changepoint_num(趋势变化点的数量):
-
作用:指定趋势模型中允许的最大趋势变化点数量。增加此值可以使模型更灵活,但也可能导致过拟合。
-
changepoint_range(变化点距离时间序列末尾的距离):
-
作用:指定变化点距离时间序列末尾的距离。值越大,趋势越灵活,更容易适应数据的变化。
-
季节性参数:
-
每年季节性:seasonality_yearly
-
每周季节性:seasonality_weekly
-
每日季节性:seasonality_daily
-
作用:用于指定不同季节性模式的存在。根据数据的特性选择是否启用这些季节性模式。
-
season(季节术语的形式):
-
可选值:”additive” 或 “multiplicative”。
-
作用:用于指定季节性模式的形式。”additive” 表示加法季节性,”multiplicative” 表示乘法季节性。
-
优先规模参数(prior_scale):
-
prior_scale_changepoints:控制趋势变化点的灵活性。
-
prior_scale_seasonality:控制季节性模式的灵活性。
-
prior_scale_holidays:控制假期效应的灵活性。
-
作用:通过调整这些参数,可以控制模型对于趋势、季节性和假期的拟合程度。较大的值表示更灵活的拟合。
在下面的代码中,给出了Prophet模型可供调整的参数设置:
growth(values = c("linear", "logistic"))
changepoint_num(range = c(0L, 50L), trans = NULL)
changepoint_range(range = c(0.6, 0.9), trans = NULL)
seasonality_yearly(values = c(TRUE, FALSE))
seasonality_weekly(values = c(TRUE, FALSE))
seasonality_daily(values = c(TRUE, FALSE))
prior_scale_changepoints(range = c(-3, 2), trans = log10_trans())
prior_scale_seasonality(range = c(-3, 2), trans = log10_trans())
prior_scale_holidays(range = c(-3, 2), trans = log10_trans())
也可以通过输入对应的参数调整函数来想看可供调整的参数选项:
在进行参数调整时,可以使用交叉验证或网格搜索等技巧来确定最佳参数组合。首先,选择一组初始参数值,然后使用历史数据拟合模型,并使用验证集来评估模型性能。根据验证集的性能,逐步调整参数值,直到找到最佳的参数组合,以获得最佳的预测性能。
Prophet模型的搭建到这里就结束啦,是不是非常简单呢,其实Prophet时间序列模型不仅仅可以应用在与时间有关的问题上,只要是含有一定趋势的问题,例如温度、基因序列等,都可以通过Prophet模型进行建模,小伙伴们可以多多尝试,Facebook开发的Prophet模型,既简单又高效,在很多任务的学习上,初学者甚至可以得到比不断调整后的传统时间序列模型更为优秀的模型,非常适合生信小白进行学习。
相信大家经过今天的学习,一定可以在今后的研究生活中有所收益!那么小果要跟大家说再见了,或者也可以关注我们的官网也会持续更新的哦~
往期推荐