> 概述:作为经统专业看到预测的packages很眼馋。除了之前的forecast包,此刻这个prophet成果也很强大。并且! 适合家产界+贸易场景的应用。并不喜欢理论阐明,能直接上案例的,一般不码字,力争简朴粗暴!!
同时,本篇内容会同步更新于小我私家BLOG:http://blog.csdn.net/sinat_26917383/article/details/57419862
官网网址:https://facebookincubator.github.io/prophet/
github网址:https://github.com/facebookincubator/prophet
论文:《Forecasting at Scale // Sean J.Taylor and Benjamin Letham》
案例数据下载:http://download.csdn.net/detail/sinat_26917383/9764537
———-
**那么试玩下来以为较量赞的成果点:**
– 1、**大局限、细粒度数据。**其实并不是大量数据,而是时间粒度可以很小,在学校玩的计量大多都是“年/月”粒度,而这个包可以适应“日/时”级此外,详细的见后头的案例就知道了。不外,预测速度嘛~
可以界说为:较慢!!!
– 2、**趋势预测+趋势解析**,最亮眼模块哟~~
拟合的有两种趋势:线性趋势、logistic趋势;趋势解析有许多种:Trend趋势、礼拜、年度、季候、节沐日,同时也可以看到节中、节后效应。
– 3、**突变点识别+调解**。多种反抗突变步伐以及调理方法。
– 4、**异常值/离群值检测。**时间维度的异常值检测。突变点和异常点既相似、又差异。
– 5、**处理惩罚缺失值数据。**这里指的是你大概有一些时间片断数据的缺失,之前的做法是先插值,然后举办预测(一些模子不答允断点),这里可以分身缺失值,同时也到达预测的目标。可以处理惩罚缺失值数据,这点很棒。
> prophet应该就是我一直在找的,今朝看到最好的营销勾当阐明的预测东西,是网站阐明、告白勾当阐明的福音,假如您看到本篇文章内的要领,您在利用中发明什么心得,还请您只管分享出来~
“`
# install.packages(‘prophet’)
library(prophet)
library(dplyr)
“`
### 一、趋势预测+趋势解析
#### 1、案例一:线性趋势+趋势解析
– 数据生成+建模阶段
“`
history <- data.frame(ds = seq(as.Date(‘2015-01-01’), as.Date(‘2016-01-01’), by = ‘d’),
y = sin(1:366/200) + rnorm(366)/10)
m <- prophet(history,growth = "linear")
“`
个中,生成数据的时候留意,最好用ds(时间项)、y(必然要numeric)这两个定名你的变量,本案例是单序列+时间项。数据长这样:
![这里写图片描写](http://img.blog.csdn.net/20170226172926989?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
prophet是生成模子阶段,m中有许多参数,有待厥后人逐步研究。
– 预测阶段
“`
#时间函数
future <- make_future_dataframe(m, periods = 365)
tail(future)
#预测
forecast <- predict(m, future)
tail(forecast[c(‘ds’, ‘yhat’, ‘yhat_lower’, ‘yhat_upper’)])
#直线预测
plot(m, forecast)
#趋势解析
prophet_plot_components(m, forecast)
“`
make_future_dataframe:有趣的时间生成函数,之前的ds数据是2015-1-1到2016-1-1,此刻生成了一个2015-1-1到2016-12-30序列,多增加了一年,以备预测。并且可以机动的调控是预测天,照旧周,freq参数。
predict,预测那么ds是时间,yhat是预测值,lower和upper是置信区间。
感觉一下plot:
![这里写图片描写](http://img.blog.csdn.net/20170226173508606?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
prophet_plot_components函数是趋势解析函数,将趋势分成了趋势项、礼拜、年份,这是默认设置。
![这里写图片描写](http://img.blog.csdn.net/20170226173542148?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#### 2、案例二:logitics趋势+趋势解析
logitics是啥? 不懂烦请百度。
“`
#数据生成阶段
history <- data.frame(ds = seq(as.Date(‘2015-01-01’), as.Date(‘2016-01-01’), by = ‘d’),
y = sin(1:366/200) + rnorm(366)/10,
cap=sin(1:366/200) + rnorm(366)/10+rep(0.3,366))
#最大增长趋势,cap配置cap,就是这个局限的极点,y其时极点
#模子生成
m <- prophet(history,growth = "logistic")
future <- make_future_dataframe(m, periods = 1826)
future$cap <- sin(1:2191/200) + rnorm(2191)/10+rep(0.3,2191)
#预测阶段
fcst <- predict(m, future)
plot(m, fcst)
“`
prophet这里假如是要拟合logitics趋势,**就需要一个cap变量,这个变量是y变量的上限(譬如最大市场局限),因为y假如听从logitics趋势不给范畴的话,很容易一下预测就到极点了,所以cap来让预测变得不那么“懦弱”…**
下面来看一个失败拟合logitics案例:
![这里写图片描写](http://img.blog.csdn.net/20170226174713121?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
### 二、节沐日效应
可以考查节中、节后效应。
#### 1、节中效应
“`
#数据生成:通例数据
history <- data.frame(ds = seq(as.Date(‘2015-01-01’), as.Date(‘2016-01-01’), by = ‘d’),
y = sin(1:366/200) + rnorm(366)/10,
cap=sin(1:366/200) + rnorm(366)/10+rep(0.3,366))
#数据生成:节沐日数据
library(dplyr)
playoffs <- data_frame(
holiday = ‘playoff’,
ds = as.Date(c(‘2008-01-13’, ‘2009-01-03’, ‘2010-01-16’,
‘2010-01-24’, ‘2010-02-07’, ‘2011-01-08’,
‘2013-01-12’, ‘2014-01-12’, ‘2014-01-19’,
‘2014-02-02’, ‘2015-01-11’, ‘2016-01-17’,
‘2016-01-24’, ‘2016-02-07’)),
lower_window = 0,
upper_window = 1
)
superbowls <- data_frame(
holiday = ‘superbowl’,
ds = as.Date(c(‘2010-02-07’, ‘2014-02-02’, ‘2016-02-07’)),
lower_window = 0,
upper_window = 1
)
holidays <- bind_rows(playoffs, superbowls)
#预测
m <- prophet(history, holidays = holidays)
forecast <- predict(m, future)
#影响效应
forecast %>%
select(ds, playoff, superbowl) %>%
filter(abs(playoff + superbowl) > 0) %>%
tail(10)
#趋势组件
prophet_plot_components(m, forecast);
“`
**数据生成环节有两个数据集要生成,一批数据是通例的数据(譬如流量),尚有一个是节沐日的时间数据**
个中lower_window,upper_window 可以领略为沐日耽误时限,国庆和元旦必定休息时间纷歧致,配置地很人性化,譬如**圣诞节的平安夜+圣诞节两天,那么就要配置(lower_window = -1, upper_window = 1)**。数据长这样:
“`
holiday ds lower_window upper_window
<chr> <date> <dbl> <dbl>
1 playoff 2008-01-13 0 1
2 playoff 2009-01-03 0 1
3 playoff 2010-01-16 0 1
4 playoff 2010-01-24 0 1
5 playoff 2010-02-07 0 1
“`
预测阶段,记得要开启prophet(history, holidays = holidays)中的holidays。此刻可以来看看节沐日效应:
“`
ds playoff superbowl
1 2015-01-11 0.012300004 0
2 2015-01-12 -0.008805914 0
3 2016-01-17 0.012300004 0
4 2016-01-18 -0.008805914 0
5 2016-01-24 0.012300004 0
6 2016-01-25 -0.008805914 0
7 2016-02-07 0.012300004 0
8 2016-02-08 -0.008805914 0
“`
从数据来看,可以看到有一个日期是重叠的,超等碗+季后赛在同一天,那么这样就会呈现**节日效应累加的环境。**
可以看到季后赛当日的影响较量明明,超等碗当日根基没啥影响,虽然了,这些数据都是我瞎编的,要是有效应就见xxx。
趋势解析这里,除了趋势项、礼拜、年份,多了一个节沐日影响,看到了吗?
![这里写图片描写](http://img.blog.csdn.net/20170226175541682?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
.
#### 2、和谐节前效应(Prior scale for holidays and seasonality)
一些环境下节沐日会产生过拟合,那么可以利用holidays.prior.scale参数来举办调理,使其滑腻过渡。(不知道翻译地对差池,原来刚开始觉得是节后效应…)
“`
#节后效应 holidays.prior.scale
m <- prophet(history, holidays = holidays, holidays.prior.scale = 1)
forecast <- predict(m, future)
forecast %>%
select(ds, playoff, superbowl) %>%
filter(abs(playoff + superbowl) > 0) %>%
tail(10)
“`
主要通过holidays.prior.scale来实现,默认是10。由于笔者乱整数据,这里显示出效应,所以粘贴官网数据。官网的案例内里,通过调理,使恰当晚超等碗的效应削弱,分身了节前的环境对当日的影响。
同时除了节前,尚有季候前的效应,通过参数seasonality_prior_scale 调解
“`
DS PLAYOFF SUPERBOWL
2190 2014-02-02 1.362312 0.693425
2191 2014-02-03 2.033471 0.542254
2532 2015-01-11 1.362312 0.000000
2533 2015-01-12 2.033471 0.000000
2901 2016-01-17 1.362312 0.000000
2902 2016-01-18 2.033471 0.000000
2908 2016-01-24 1.362312 0.000000
“`
### 三、突变点调理、中断点、异常点
> 本节之后主要就是玩案例内里的数据,案例数据假如R包中没有,可以从[这里下载](http://download.csdn.net/detail/sinat_26917383/9764537)。
#### 1、Prophet——自动突变点识别
时间序列内里的很大概存在突变点,譬如一些节沐日的攻击。Prophet会自动检测这些突变点,并举办适当的调解,可是呆板判定会呈现:没有对突变点举办调解、突变点太过调解两种环境,假如然的突变点呈现,也可以通过函数中的参数举办调理。
**Prophet本身会检测一些突变点**,以下的图就是Prophet本身检测出来的,虚纵向代表突变点。检测到了25个,那么Prophet的做法跟L1正则一样,“冒充”/删掉看不见这些突变。
![这里写图片描写](http://img.blog.csdn.net/20170226181835776?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其本身检讨突变点的方法,雷同调查ARIMA的自相关/偏相干系数截尾、拖尾:
![这里写图片描写](http://img.blog.csdn.net/20170226182228610?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
.
#### 2、工钱过问突变点——弹性范畴
通过changepoint_prior_scale举办工钱过问。
“`
df = pd.read_csv(‘../examples/example_wp_peyton_manning.csv’)
m <- prophet(df, changepoint.prior.scale = 0.5)
forecast <- predict(m, future)
plot(m, forecast)
“`
来感觉一下changepoint.prior.scale=0.05和0.5的区别:
![这里写图片描写](http://img.blog.csdn.net/20170226183055017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描写](http://img.blog.csdn.net/20170226183102090?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以把changepoint.prior.scale当作一个弹性标准,值越大,受异常值影响越大,那么颠簸越大,如0.5这样的。
#### 3、工钱过问突变点——某突变点
当你知道数据中,存在某一个确定的突变点,且知道时间。可以用changepoints 函数。不po图了。
“`
df = pd.read_csv(‘../examples/example_wp_peyton_manning.csv’)
m <- prophet(df, changepoints = c(as.Date(‘2014-01-01’)))
forecast <- predict(m, future)
plot(m, forecast)
“`
#### 4、突变预测
标题取了这么一个名字,也是够吓人的,哈哈~ 第三节的前3点都是如何消除突变点并举办预测。
可是! 现实是,突变点是真实存在,且有些是有意义的,譬如双11、双12这样的节日。不能去掉这些突变点,可是不去掉又会影响真实预测,这时候Prophet新奇的来了一招:序列生成模子中,几多受异常值些影响(雷同前面的changepoint_prior_scale,可是这里是从生成模子阶段就给一个弹性值)。
这里从生成模子中可以举办三个角度的调理:
(1)调理趋势;
(2)季候性调理
– **(1)趋势突变适应**
“`
df = pd.read_csv(‘../examples/example_wp_peyton_manning.csv’)
m <- prophet(df, interval.width = 0.95)
forecast <- predict(m, future)
“`
在prophet生成模子阶段,插手interval.width,就是代表生成模子时,整个序列趋势,尚有5%受异常值影响。
– **(2)季候性突变适应**
对支付产厂家来说,季候性颠簸是必定有的,那么又想保存季候性突变环境,又要预测。并且季候性适应又是一个较量贫苦的工作,prophet内里需要先举办全贝叶斯抽样,mcmc.samples参数,默认为0.
“`
m <- prophet(df, mcmc.samples = 500)
forecast <- predict(m, future)
prophet_plot_components(m, forecast);
“`
打开mcmc.samples按钮,会把MAP预计改变为MCMC采样,**练习时间很长,大概是之前的10倍**。最终功效,官网DAO图:
![这里写图片描写](http://img.blog.csdn.net/20170226191113412?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#### 5、异常值/离群值
异常值与突变点是有区此外,离群值对预测影响尤其大。
“`
df <- read.csv(‘../examples/example_wp_R_outliers1.csv’)
df$y <- log(df$y)
m <- prophet(df)
future <- make_future_dataframe(m, periods = 1096)
forecast <- predict(m, future)
plot(m, forecast);
“`
![这里写图片描写](http://img.blog.csdn.net/20170226192615558?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对功效的影响很大,并且导致预测置信区间扩大多倍不止。prophet的优势浮现出来了,**prophet是可以接管空白值NA的**,所以这些异常点删掉可能NA掉,都是可以的。
“`
#异常点变为NA+举办预测
outliers <- (as.Date(df$ds) > as.Date(‘2010-01-01’)
& as.Date(df$ds) < as.Date(‘2011-01-01’))
df$y[outliers] = NA
m <- prophet(df)
forecast <- predict(m, future)
plot(m, forecast);
“`
虽然啦,你也可以删掉整一段影响数据,出格是天灾人祸的影响是永久存在的,那么可以删掉这一整段。下图就是这样的环境,2015年6月份阁下的一批数据,都是离群值。
![这里写图片描写](http://img.blog.csdn.net/20170226193402327?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
### 四、缺失值、空白时间的处理惩罚+预测
前面第三章后头就提过,**prophet是可以处理惩罚缺失值**。那么这里就可以实现这么一个操纵,假如你的数据不完整,且是中断的,譬如你有一个月20天的数据,那么你也可以按照prophet预测,同时给以你天天的数据功效。实现了以下的成果:
“`
prophet=缺失值预测+插值
“`
“`
df <- read.csv(‘../examples/example_retail_sales.csv’)
m <- prophet(df)
future <- make_future_dataframe(m, periods = 3652)
fcst <- predict(m, future)
plot(m, fcst);
“`
![这里写图片描写](http://img.blog.csdn.net/20170226193952799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
源数据长这样:
“`
ds y
1 1992-01-01 146376
2 1992-02-01 147079
3 1992-03-01 159336
4 1992-04-01 163669
5 1992-05-01 170068
“`
也就是你只有一年的每个月的数据,上面是预测接下来每一天的数据,也能预测,可是后头天天预测的误差有点大。所以你可以配置make_future_dataframe中的freq,后头预测的是每个月的:
“`
future <- make_future_dataframe(m, periods = 120, freq = ‘m’)
fcst <- predict(m, future)
plot(m, fcst)
“`
![这里写图片描写](http://img.blog.csdn.net/20170226194322254?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjY5MTczODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)