25
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Prophet で有効な変化点だけを抽出する

Last updated at Posted at 2017-08-02

Prophet は Facebook が作った時系列予測パッケージです。詳しくは次のスライドを参照してください。

このスライドにも書きましたが、Prophet は変化点の自動検出をしてくれます。

p1.png

その方法は、変化点候補を多めに取って、変化量が大きい点を変化点とするものです。
ここで注意が必要なのは、Prophet は変化点として変化点候補をすべて出力するということです。

R
library(prophet)

# データの読み込み
df <- read.csv("https://raw.githubusercontent.com/facebookincubator/prophet/master/examples/example_wp_peyton_manning.csv")
df$y <- log(df$y)

# 変化候補点の数を 25個として学習
m <- prophet(df, n.changepoints = 25)

# 変化点を確認
m$changepoints
結果
 [1] "2008-03-17" "2008-06-20" "2008-10-11" "2009-01-14" "2009-04-17"
 [6] "2009-07-19" "2009-10-26" "2010-01-31" "2010-05-06" "2010-08-14"
[11] "2010-11-15" "2011-02-16" "2011-05-20" "2011-08-21" "2011-11-24"
[16] "2012-02-27" "2012-05-31" "2012-09-01" "2012-12-02" "2013-03-05"
[21] "2013-06-06" "2013-09-08" "2013-12-10" "2014-03-14" "2014-06-15"

変化点候補の数を 25個として学習させると、25個の変化点が出力されます。
しかし、各変化点での変化量を確認すると、非常に小さいものが混ざっています。

R
as.vector(m$params$delta)
結果
 [1] -8.562571e-08 -3.387444e-06  3.542998e-01  4.511354e-01  6.518874e-08
 [6] -1.312443e-02 -2.305192e-01 -2.433559e-01  4.605917e-08 -3.203172e-09
[11] -1.427370e-07  2.930280e-01  1.929682e-01  4.056014e-03  1.666602e-03
[16] -7.897413e-01 -4.422746e-02 -6.516321e-08 -3.571046e-08  4.382417e-01
[21]  2.730189e-02 -2.043925e-07 -3.260183e-01 -1.118381e-09 -5.670137e-08

分かりやすくするために、小数点以下2位で丸めて表示させてみます。

R
round(as.vector(m$params$delta), digits = 2)
結果
 [1]  0.00  0.00  0.35  0.45  0.00
 [6] -0.01 -0.23 -0.24  0.00  0.00
[11]  0.00  0.29  0.19  0.00  0.00
[16] -0.79 -0.04  0.00  0.00  0.44
[21]  0.03  0.00 -0.33  0.00  0.00

このように、丸めると 0 になるような点は変化点として考えたくありません。

有効な変化点の抽出

今、変化点候補の中から変化量が微小なものを除きたいとします。
しかし、Prophet にはそのような機能は備わっていません。

そこで、prophetExt というパッケージを作成し、変化点の中から変化量の大きいものだけを抜き出す関数 prophet_pick_changepoints() を作成しました。

R
library(prophetExt)

cpts <- prophet_pick_changepoints(m)
cpts
結果
   changepoints  growth_rate       delta
1    2007-12-10 -0.350125769  0.00000000
2    2008-10-11  0.004170559  0.35429633
3    2009-01-14  0.455305911  0.45113535
4    2009-07-19  0.442181545 -0.01312437
5    2009-10-26  0.211662361 -0.23051918
6    2010-01-31 -0.031693514 -0.24335588
7    2011-02-16  0.261334295  0.29302781
8    2011-05-20  0.458358498  0.19702420
9    2012-02-27 -0.329716247 -0.78807475
10   2012-05-31 -0.373943805 -0.04422756
11   2013-03-05  0.064297894  0.43824170
12   2013-06-06  0.091599785  0.02730189
13   2013-12-10 -0.234418782 -0.32601857

これにより、変化量が微小なものを除いた、有効な変化点だけを抽出することができます。

さらに、この変化点を簡単に可視化する関数 autolayer() も用意しました。
次のように使うことで Prophet の plot に重ね描きします。

R
future <- make_future_dataframe(m, 1)
fore <- predict(m, future)

plot(m, fore) + autolayer(cpts)

Rplot.png

prophetExt のインストール

prophetExt パッケージは CRAN に上がっておらず、GitHub からインストールする必要があります。
GitHub のパッケージをインストールするには、githubinstall パッケージが便利です。

R
# githubinstall のインストール
install.packages("githubinstall")
R
library(githubinstall)
githubinstall("prophetExt")
Suggestion:
 - hoxo-m/prophetExt  Extension for Facebook Prophet
Do you want to install the package (Y/n)?  

これを実行するとインストール候補が表示されるので、そのままエンターキーを押してください。インストールが始まります。

関連

25
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?