UPDATE: 2022-12-24 17:18:26
tidymodels
パッケージの使い方をいくつかのノートに分けてまとめている。tidymodels
パッケージは、統計モデルや機械学習モデルを構築するために必要なパッケージをコレクションしているパッケージで、非常に色んなパッケージがある。ここでは、今回はmodeltime
パッケージ
+ cross-validation
+
hyperparameter-tuning
についてまとめていく。モデルの数理的な側面や機械学習の用語などは、このノートでは扱わない。
下記の公式ドキュメントやtidymodels
パッケージに関する書籍を参考にしている。
modeltime
パッケージの目的modeltime
パッケージは、時系列モデルの構築を効率よく行うためのパッケージで、tidymodels
パッケージと組み合わせて時系列モデルを作成する際に使用される。時系列予測のための体系的なワークフローを提供し、時系列ブーストモデルなど新しいアルゴリズムもカバーしている点が特徴的。
前回は基本的な使い方をまとめており、時系列モデルのハイパーパラメータチューニングを扱う。
上記のサイトをなぞりながら、不明点を追記しながらまとめていく。
まずは必要なパッケージを読み込んでおく。
library(tidymodels)
library(tidyverse)
library(modeltime)
library(timetk)
library(DT)
前回同様、ここでもtimetk
パッケージ内のm4_monthly
データセットのid
がM750
の部分を使用する。
%>%
m4_monthly filter(id == "M750") %>%
tk_summary_diagnostics(date)
## # A tibble: 1 × 12
## n.obs start end units scale tzone diff.m…¹ diff.q1 diff.…² diff.…³
## <int> <date> <date> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 306 1990-01-01 2015-06-01 days month UTC 2419200 2592000 2678400 2.63e6
## # … with 2 more variables: diff.q3 <dbl>, diff.maximum <dbl>, and abbreviated
## # variable names ¹diff.minimum, ²diff.median, ³diff.mean
データは、1990-01-01から始まり、2015-06-01まである。レコード数は306レコードで、間隔は月単位のデータになっている。
<- m4_monthly %>% filter(id == "M750") %>% select(-id)
m750 %>% datatable() m750
グラフ化しておく。
%>%
m750 plot_time_series(.data = ., .date_var = date, .value = value, .interactive = FALSE) +
scale_x_date(limits = c(as.Date("1990-01-01"), as.Date("2015-06-01")),
labels = date_format("%Y/%m"),
breaks = date_breaks("1 year")) +
theme(axis.text.x = element_text(angle = 45, vjust = 0.2, hjust=0.2))
ここでは最終的に12ヶ月の予測を試みる。まずは、予測する分だけデータフレームを拡張する。これはfuture_frame
関数で実行でき、2015-07-01から2016-06-01まで、データフレームが拡張されていることがわかる。
<- m750 %>%
m750_extend future_frame(
.length_out = 12,
.bind_data = TRUE
)%>% datatable() m750_extend
拡張したデータを学習データ、テストデータ、予測用データに再分割する。
# 2015-07-01から2016-06-01(n=12)
<- m750_extend %>% filter(is.na(value))
df_future # 1990-01-01から2015-06-01(n=306)
<- m750_extend %>% filter(!is.na(value))
df
# <Training/Testing/Total>
# <275/31/306>
<- initial_time_split(df, 0.9)
df_init <- df_init %>% training()
df_train <- df_init %>% testing()
df_test
bind_rows(
%>% summarise(n.obs = n(), start = min(date), end = max(date)) %>% mutate(tag = "train"),
df_train %>% summarise(n.obs = n(), start = min(date), end = max(date)) %>% mutate(tag = "test"),
df_test %>% summarise(n.obs = n(), start = min(date), end = max(date)) %>% mutate(tag = "forecast")
df_future )
## # A tibble: 3 × 4
## n.obs start end tag
## <int> <date> <date> <chr>
## 1 275 1990-01-01 2012-11-01 train
## 2 31 2012-12-01 2015-06-01 test
## 3 12 2015-07-01 2016-06-01 forecast
学習データをクロスバリデーション用に分割する。学習データに5年、評価データに2年、フォールド間のスキップは1年で、分割数は5とする。
<- df_train %>%
m750_resamples time_series_cv(
date_var = date,
initial = "5 years",
assess = "2 years",
skip = "1 years",
cumulative = TRUE,
slice_limit = 5
)
%>%
m750_resamples tk_time_series_cv_plan() %>%
group_by(.id) %>%
summarise(min = min(date), max = max(date))
## # A tibble: 5 × 3
## .id min max
## <chr> <date> <date>
## 1 Slice1 1990-01-01 2012-11-01
## 2 Slice2 1990-01-01 2011-11-01
## 3 Slice3 1990-01-01 2010-11-01
## 4 Slice4 1990-01-01 2009-11-01
## 5 Slice5 1990-01-01 2008-11-01
クロスバリデーションの様子をplot_time_series_cv_plan
関数で可視化しておく。
%>%
m750_resamples tk_time_series_cv_plan() %>%
plot_time_series_cv_plan(.date_var = date, .value = value, .interactive = FALSE, .facet_ncol = 1) +
scale_x_date(limits = c(as.Date("1990-01-01"), as.Date("2015-06-01")),
labels = date_format("%Y/%m"),
breaks = date_breaks("1 year")) +
theme(axis.text.x = element_text(angle = 45, vjust = 0.2, hjust=0.2))
データの分割が終わったので、レシピの設定を行なう。step_times_series_signature
関数を使用して、日付から多数の特徴量を生成する。
<- recipe(value ~ ., training(m750_resamples$splits[[1]])) %>%
recipe step_timeseries_signature(date) %>%
step_rm(matches("(.iso$)|(.xts$)|(day)|(hour)|(minute)|(second)|(am.pm)")) %>%
step_rm("date_index.num") %>%
step_mutate(date_month = factor(date_month, ordered = TRUE)) %>%
step_dummy(all_nominal(), one_hot = TRUE)
%>% prep() %>% bake(df_test) %>% datatable() recipe
データの分割が終わったので、パラメタのチューニングを行なうためのモデルの設定を行なう。今回はProphetBoostモデルを利用する。Prophet Boostモデルは、Prophet と XGBoost を組み合わせたアルゴリズムで、ワークフローを使用してモデルを設定できる。細かい数理的な部分は追えてないのでわからないが、おそらくこういうことだと思われる。
Prophetは時系列データを様々な要素分解(成長関数、周期性、祝日効果など)して、変化点を検出しながら、モデルを組み立てることができ、時系列データに特化したPropehetでまず予測値を得る。そこから残差を観測値として、XGBoostモデルが学習を繰り返すことで予測モデルが学習していく。
<-
prophet_boost ::prophet_boost(
modeltime# prophet
growth = "linear",
changepoint_num = tune(),
changepoint_range = tune(),
seasonality_yearly = TRUE,
seasonality_weekly = FALSE, # Monthlyデータなので機能しない
seasonality_daily = FALSE, # Monthlyデータなので機能しない
season = "multiplicative",
prior_scale_changepoints = tune(),
prior_scale_seasonality = tune(),
# prior_scale_holidays = NULL,
# xgboost
trees = 1000,
sample_size = c(0.1, 1),
# mtryを設定すると場合によってはエラーになる。原因不明。
mtry = tune(),
tree_depth = tune(),
learn_rate = tune(),
stop_iter = tune(),
min_n = tune(),
# loss_reduction = tune(),
%>%
) set_engine('prophet_xgboost')
prophet_boost
## PROPHET Regression Model Specification (regression)
##
## Main Arguments:
## growth = linear
## changepoint_num = tune()
## changepoint_range = tune()
## seasonality_yearly = TRUE
## seasonality_weekly = FALSE
## seasonality_daily = FALSE
## season = multiplicative
## prior_scale_changepoints = tune()
## prior_scale_seasonality = tune()
## mtry = tune()
## trees = 1000
## min_n = tune()
## tree_depth = tune()
## learn_rate = tune()
## sample_size = c(0.1, 1)
## stop_iter = tune()
##
## Computational engine: prophet_xgboost
モデルのハイパーパラメーターの調整はtidymodels
のモデリングフレームワークに従い、workflows
パッケージの関数でワークフローを作成して行なう。
<- workflow() %>%
workflow add_model(prophet_boost) %>%
add_recipe(recipe)
workflow
## ══ Workflow ════════════════════════════════════════════════════════════════════
## Preprocessor: Recipe
## Model: prophet_boost()
##
## ── Preprocessor ────────────────────────────────────────────────────────────────
## 5 Recipe Steps
##
## • step_timeseries_signature()
## • step_rm()
## • step_rm()
## • step_mutate()
## • step_dummy()
##
## ── Model ───────────────────────────────────────────────────────────────────────
## PROPHET Regression Model Specification (regression)
##
## Main Arguments:
## growth = linear
## changepoint_num = tune()
## changepoint_range = tune()
## seasonality_yearly = TRUE
## seasonality_weekly = FALSE
## seasonality_daily = FALSE
## season = multiplicative
## prior_scale_changepoints = tune()
## prior_scale_seasonality = tune()
## mtry = tune()
## trees = 1000
## min_n = tune()
## tree_depth = tune()
## learn_rate = tune()
## sample_size = c(0.1, 1)
## stop_iter = tune()
##
## Computational engine: prophet_xgboost
そして、tune_grid
関数を使用して、クロスバリデーションでパラメタの最適値を探索する。ただ、私がmodeltimes
パッケージやProphetBoostモデルを理解してないためか、多数のエラー、ワーニングが出る…。
set.seed(1989)
<- tune_grid(
tune_results object = workflow,
resamples = m750_resamples,
param_info = parameters(workflow),
grid = 30,
metrics = metric_set(rmse, mae, mape)
)
パラメタの組み合わせを見るときは、show_best
関数で取り出す。ここではmape
基準でクロスバリデーションの結果を確認する。
%>%
tune_results show_best(n = 10, metric = "mape") %>%
datatable()
あとは、ベストなバラメタをselect_best
関数で取り出して、ワークフローのパラメタをfinalize_workflow
関数で更新する。そして、取りあえずデータは何でも良いので、形式的にフィッティングしておく。
<- tune_results %>%
tuned_best_params select_best("mape")
<- workflow %>%
best_workflow finalize_workflow(parameters = tuned_best_params)
# ここのデータはなんでもよい
<- best_workflow %>%
model_predicted_best_workflow fit(training(m750_resamples$splits[[1]]))
model_predicted_best_workflow
## ══ Workflow [trained] ══════════════════════════════════════════════════════════
## Preprocessor: Recipe
## Model: prophet_boost()
##
## ── Preprocessor ────────────────────────────────────────────────────────────────
## 5 Recipe Steps
##
## • step_timeseries_signature()
## • step_rm()
## • step_rm()
## • step_mutate()
## • step_dummy()
##
## ── Model ───────────────────────────────────────────────────────────────────────
## PROPHET w/ XGBoost Errors
## ---
## Model 1: PROPHET
## - growth: 'linear'
## - n.changepoints: 20
## - changepoint.range: 0.629681361559778
## - yearly.seasonality: 'TRUE'
## - weekly.seasonality: 'FALSE'
## - daily.seasonality: 'FALSE'
## - seasonality.mode: 'multiplicative'
## - changepoint.prior.scale: 0.00800693435048087
## - seasonality.prior.scale: 11.8613867207823
## - holidays.prior.scale: 10
## - logistic_cap: NULL
## - logistic_floor: NULL
##
## ---
## Model 2: XGBoost Errors
##
## xgboost::xgb.train(params = list(eta = 5.05798197161862e-05,
## max_depth = 14L, gamma = 0, colsample_bytree = 1, colsample_bynode = 0.806451612903226,
## min_child_weight = 31L, subsample = c(0.1, 1)), data = x$data,
## nrounds = 1000, watchlist = x$watchlist, verbose = 0, early_stopping_rounds = 17L,
## objective = "reg:squarederror", nthread = 1)
ここまでくれば、modeltime
のワークフローに戻って作業ができる。ということで、これまで通りmodeltime
のワークフローに従って、モデルテーブルに登録する。
<- modeltime_table(
models_tbl
model_predicted_best_workflow
) models_tbl
## # Modeltime Table
## # A tibble: 1 × 3
## .model_id .model .model_desc
## <int> <list> <chr>
## 1 1 <workflow> PROPHET W/ XGBOOST ERRORS
その後はmodeltime_calibrate
関数でテストデータに対するキャリブレーションを行なう。
<- models_tbl %>%
calibration_tbl modeltime_calibrate(df_test)
%>%
calibration_tbl pluck(".calibration_data", 1) %>%
datatable()
テストデータと観測値をグラフで確認する。
%>%
calibration_tbl modeltime_forecast(
new_data = df_test,
actual_data = m750,
keep_data = TRUE
%>%
) plot_modeltime_forecast(.interactive = TRUE, .legend_show = FALSE)
評価指標を確認するためにはtable_modeltime_accuracy
関数を利用する。
%>%
calibration_tbl modeltime_accuracy(new_data = df_test) %>%
table_modeltime_accuracy(.interactive = FALSE)
Accuracy Table | ||||||||
.model_id | .model_desc | .type | mae | mape | mase | smape | rmse | rsq |
---|---|---|---|---|---|---|---|---|
1 | PROPHET W/ XGBOOST ERRORS | Test | 173.25 | 1.69 | 0.59 | 1.67 | 224.3 | 0.85 |
テストデータでの検証も終わったら、あとはフルデータでモデルの再学習を行なう。
<- calibration_tbl %>%
refit_tbl modeltime_refit(data = m750)
refit_tbl
## # Modeltime Table
## # A tibble: 1 × 5
## .model_id .model .model_desc .type .calibration_data
## <int> <list> <chr> <chr> <list>
## 1 1 <workflow> PROPHET W/ XGBOOST ERRORS Test <tibble [31 × 4]>
その後は、当初の目的であった、2015-07-01から2016-06-01の間の予測を行なう。
%>%
refit_tbl modeltime_forecast(actual_data = m750, new_data = df_future) %>%
plot_modeltime_forecast(.interactive = TRUE, .legend_show = FALSE)
下記は観測値と予測値を統合したデータで、おまけとして出力する。そのまま出力しておく。
%>%
refit_tbl modeltime_forecast(actual_data = m750, new_data = df_future) %>%
print(n = 500)
## # A tibble: 318 × 7
## .model_id .model_desc .key .index .value .conf…¹ .conf…²
## <int> <chr> <fct> <date> <dbl> <dbl> <dbl>
## 1 NA ACTUAL actual 1990-01-01 6370 NA NA
## 2 NA ACTUAL actual 1990-02-01 6430 NA NA
## 3 NA ACTUAL actual 1990-03-01 6520 NA NA
## 4 NA ACTUAL actual 1990-04-01 6580 NA NA
## 5 NA ACTUAL actual 1990-05-01 6620 NA NA
## 6 NA ACTUAL actual 1990-06-01 6690 NA NA
## 7 NA ACTUAL actual 1990-07-01 6000 NA NA
## 8 NA ACTUAL actual 1990-08-01 5450 NA NA
## 9 NA ACTUAL actual 1990-09-01 6480 NA NA
## 10 NA ACTUAL actual 1990-10-01 6820 NA NA
## 11 NA ACTUAL actual 1990-11-01 6860 NA NA
## 12 NA ACTUAL actual 1990-12-01 6950 NA NA
## 13 NA ACTUAL actual 1991-01-01 6920 NA NA
## 14 NA ACTUAL actual 1991-02-01 6910 NA NA
## 15 NA ACTUAL actual 1991-03-01 6960 NA NA
## 16 NA ACTUAL actual 1991-04-01 6990 NA NA
## 17 NA ACTUAL actual 1991-05-01 7010 NA NA
## 18 NA ACTUAL actual 1991-06-01 6890 NA NA
## 19 NA ACTUAL actual 1991-07-01 6200 NA NA
## 20 NA ACTUAL actual 1991-08-01 5780 NA NA
## 21 NA ACTUAL actual 1991-09-01 6550 NA NA
## 22 NA ACTUAL actual 1991-10-01 6980 NA NA
## 23 NA ACTUAL actual 1991-11-01 7000 NA NA
## 24 NA ACTUAL actual 1991-12-01 7040 NA NA
## 25 NA ACTUAL actual 1992-01-01 7030 NA NA
## 26 NA ACTUAL actual 1992-02-01 7170 NA NA
## 27 NA ACTUAL actual 1992-03-01 7150 NA NA
## 28 NA ACTUAL actual 1992-04-01 7180 NA NA
## 29 NA ACTUAL actual 1992-05-01 7140 NA NA
## 30 NA ACTUAL actual 1992-06-01 7100 NA NA
## 31 NA ACTUAL actual 1992-07-01 6490 NA NA
## 32 NA ACTUAL actual 1992-08-01 6060 NA NA
## 33 NA ACTUAL actual 1992-09-01 6870 NA NA
## 34 NA ACTUAL actual 1992-10-01 6880 NA NA
## 35 NA ACTUAL actual 1992-11-01 6950 NA NA
## 36 NA ACTUAL actual 1992-12-01 7030 NA NA
## 37 NA ACTUAL actual 1993-01-01 6940 NA NA
## 38 NA ACTUAL actual 1993-02-01 6970 NA NA
## 39 NA ACTUAL actual 1993-03-01 6990 NA NA
## 40 NA ACTUAL actual 1993-04-01 7010 NA NA
## 41 NA ACTUAL actual 1993-05-01 7020 NA NA
## 42 NA ACTUAL actual 1993-06-01 6890 NA NA
## 43 NA ACTUAL actual 1993-07-01 6300 NA NA
## 44 NA ACTUAL actual 1993-08-01 6040 NA NA
## 45 NA ACTUAL actual 1993-09-01 6730 NA NA
## 46 NA ACTUAL actual 1993-10-01 6910 NA NA
## 47 NA ACTUAL actual 1993-11-01 7090 NA NA
## 48 NA ACTUAL actual 1993-12-01 7120 NA NA
## 49 NA ACTUAL actual 1994-01-01 7070 NA NA
## 50 NA ACTUAL actual 1994-02-01 7240 NA NA
## 51 NA ACTUAL actual 1994-03-01 7180 NA NA
## 52 NA ACTUAL actual 1994-04-01 7180 NA NA
## 53 NA ACTUAL actual 1994-05-01 7300 NA NA
## 54 NA ACTUAL actual 1994-06-01 6900 NA NA
## 55 NA ACTUAL actual 1994-07-01 6400 NA NA
## 56 NA ACTUAL actual 1994-08-01 6220 NA NA
## 57 NA ACTUAL actual 1994-09-01 6960 NA NA
## 58 NA ACTUAL actual 1994-10-01 7130 NA NA
## 59 NA ACTUAL actual 1994-11-01 7310 NA NA
## 60 NA ACTUAL actual 1994-12-01 7300 NA NA
## 61 NA ACTUAL actual 1995-01-01 7310 NA NA
## 62 NA ACTUAL actual 1995-02-01 7310 NA NA
## 63 NA ACTUAL actual 1995-03-01 7510 NA NA
## 64 NA ACTUAL actual 1995-04-01 7440 NA NA
## 65 NA ACTUAL actual 1995-05-01 7430 NA NA
## 66 NA ACTUAL actual 1995-06-01 7030 NA NA
## 67 NA ACTUAL actual 1995-07-01 6440 NA NA
## 68 NA ACTUAL actual 1995-08-01 6070 NA NA
## 69 NA ACTUAL actual 1995-09-01 7200 NA NA
## 70 NA ACTUAL actual 1995-10-01 7390 NA NA
## 71 NA ACTUAL actual 1995-11-01 7630 NA NA
## 72 NA ACTUAL actual 1995-12-01 7630 NA NA
## 73 NA ACTUAL actual 1996-01-01 7610 NA NA
## 74 NA ACTUAL actual 1996-02-01 7570 NA NA
## 75 NA ACTUAL actual 1996-03-01 7690 NA NA
## 76 NA ACTUAL actual 1996-04-01 7740 NA NA
## 77 NA ACTUAL actual 1996-05-01 7730 NA NA
## 78 NA ACTUAL actual 1996-06-01 7340 NA NA
## 79 NA ACTUAL actual 1996-07-01 6700 NA NA
## 80 NA ACTUAL actual 1996-08-01 6740 NA NA
## 81 NA ACTUAL actual 1996-09-01 7500 NA NA
## 82 NA ACTUAL actual 1996-10-01 7930 NA NA
## 83 NA ACTUAL actual 1996-11-01 7940 NA NA
## 84 NA ACTUAL actual 1996-12-01 7960 NA NA
## 85 NA ACTUAL actual 1997-01-01 7900 NA NA
## 86 NA ACTUAL actual 1997-02-01 8010 NA NA
## 87 NA ACTUAL actual 1997-03-01 8170 NA NA
## 88 NA ACTUAL actual 1997-04-01 8140 NA NA
## 89 NA ACTUAL actual 1997-05-01 8210 NA NA
## 90 NA ACTUAL actual 1997-06-01 8180 NA NA
## 91 NA ACTUAL actual 1997-07-01 7330 NA NA
## 92 NA ACTUAL actual 1997-08-01 7110 NA NA
## 93 NA ACTUAL actual 1997-09-01 8020 NA NA
## 94 NA ACTUAL actual 1997-10-01 8150 NA NA
## 95 NA ACTUAL actual 1997-11-01 8200 NA NA
## 96 NA ACTUAL actual 1997-12-01 8040 NA NA
## 97 NA ACTUAL actual 1998-01-01 8210 NA NA
## 98 NA ACTUAL actual 1998-02-01 8240 NA NA
## 99 NA ACTUAL actual 1998-03-01 8350 NA NA
## 100 NA ACTUAL actual 1998-04-01 8390 NA NA
## 101 NA ACTUAL actual 1998-05-01 8420 NA NA
## 102 NA ACTUAL actual 1998-06-01 8280 NA NA
## 103 NA ACTUAL actual 1998-07-01 7710 NA NA
## 104 NA ACTUAL actual 1998-08-01 7410 NA NA
## 105 NA ACTUAL actual 1998-09-01 8180 NA NA
## 106 NA ACTUAL actual 1998-10-01 8430 NA NA
## 107 NA ACTUAL actual 1998-11-01 8610 NA NA
## 108 NA ACTUAL actual 1998-12-01 8570 NA NA
## 109 NA ACTUAL actual 1999-01-01 8610 NA NA
## 110 NA ACTUAL actual 1999-02-01 8730 NA NA
## 111 NA ACTUAL actual 1999-03-01 8910 NA NA
## 112 NA ACTUAL actual 1999-04-01 8840 NA NA
## 113 NA ACTUAL actual 1999-05-01 8860 NA NA
## 114 NA ACTUAL actual 1999-06-01 8930 NA NA
## 115 NA ACTUAL actual 1999-07-01 8760 NA NA
## 116 NA ACTUAL actual 1999-08-01 8280 NA NA
## 117 NA ACTUAL actual 1999-09-01 8650 NA NA
## 118 NA ACTUAL actual 1999-10-01 8800 NA NA
## 119 NA ACTUAL actual 1999-11-01 9130 NA NA
## 120 NA ACTUAL actual 1999-12-01 9130 NA NA
## 121 NA ACTUAL actual 2000-01-01 9140 NA NA
## 122 NA ACTUAL actual 2000-02-01 9160 NA NA
## 123 NA ACTUAL actual 2000-03-01 9290 NA NA
## 124 NA ACTUAL actual 2000-04-01 9240 NA NA
## 125 NA ACTUAL actual 2000-05-01 9300 NA NA
## 126 NA ACTUAL actual 2000-06-01 9280 NA NA
## 127 NA ACTUAL actual 2000-07-01 8520 NA NA
## 128 NA ACTUAL actual 2000-08-01 8100 NA NA
## 129 NA ACTUAL actual 2000-09-01 8970 NA NA
## 130 NA ACTUAL actual 2000-10-01 9190 NA NA
## 131 NA ACTUAL actual 2000-11-01 9340 NA NA
## 132 NA ACTUAL actual 2000-12-01 9340 NA NA
## 133 NA ACTUAL actual 2001-01-01 9350 NA NA
## 134 NA ACTUAL actual 2001-02-01 9190 NA NA
## 135 NA ACTUAL actual 2001-03-01 9490 NA NA
## 136 NA ACTUAL actual 2001-04-01 9360 NA NA
## 137 NA ACTUAL actual 2001-05-01 9500 NA NA
## 138 NA ACTUAL actual 2001-06-01 9520 NA NA
## 139 NA ACTUAL actual 2001-07-01 8890 NA NA
## 140 NA ACTUAL actual 2001-08-01 8320 NA NA
## 141 NA ACTUAL actual 2001-09-01 9370 NA NA
## 142 NA ACTUAL actual 2001-10-01 9660 NA NA
## 143 NA ACTUAL actual 2001-11-01 10060 NA NA
## 144 NA ACTUAL actual 2001-12-01 10040 NA NA
## 145 NA ACTUAL actual 2002-01-01 9900 NA NA
## 146 NA ACTUAL actual 2002-02-01 10120 NA NA
## 147 NA ACTUAL actual 2002-03-01 10060 NA NA
## 148 NA ACTUAL actual 2002-04-01 10820 NA NA
## 149 NA ACTUAL actual 2002-05-01 10650 NA NA
## 150 NA ACTUAL actual 2002-06-01 10650 NA NA
## 151 NA ACTUAL actual 2002-07-01 9560 NA NA
## 152 NA ACTUAL actual 2002-08-01 9130 NA NA
## 153 NA ACTUAL actual 2002-09-01 9810 NA NA
## 154 NA ACTUAL actual 2002-10-01 10060 NA NA
## 155 NA ACTUAL actual 2002-11-01 10250 NA NA
## 156 NA ACTUAL actual 2002-12-01 10230 NA NA
## 157 NA ACTUAL actual 2003-01-01 10190 NA NA
## 158 NA ACTUAL actual 2003-02-01 10140 NA NA
## 159 NA ACTUAL actual 2003-03-01 10350 NA NA
## 160 NA ACTUAL actual 2003-04-01 10310 NA NA
## 161 NA ACTUAL actual 2003-05-01 10140 NA NA
## 162 NA ACTUAL actual 2003-06-01 10040 NA NA
## 163 NA ACTUAL actual 2003-07-01 9310 NA NA
## 164 NA ACTUAL actual 2003-08-01 8780 NA NA
## 165 NA ACTUAL actual 2003-09-01 9530 NA NA
## 166 NA ACTUAL actual 2003-10-01 9790 NA NA
## 167 NA ACTUAL actual 2003-11-01 9950 NA NA
## 168 NA ACTUAL actual 2003-12-01 9900 NA NA
## 169 NA ACTUAL actual 2004-01-01 9970 NA NA
## 170 NA ACTUAL actual 2004-02-01 9980 NA NA
## 171 NA ACTUAL actual 2004-03-01 10160 NA NA
## 172 NA ACTUAL actual 2004-04-01 10220 NA NA
## 173 NA ACTUAL actual 2004-05-01 10190 NA NA
## 174 NA ACTUAL actual 2004-06-01 10020 NA NA
## 175 NA ACTUAL actual 2004-07-01 9310 NA NA
## 176 NA ACTUAL actual 2004-08-01 8970 NA NA
## 177 NA ACTUAL actual 2004-09-01 9700 NA NA
## 178 NA ACTUAL actual 2004-10-01 9910 NA NA
## 179 NA ACTUAL actual 2004-11-01 10120 NA NA
## 180 NA ACTUAL actual 2004-12-01 10220 NA NA
## 181 NA ACTUAL actual 2005-01-01 10130 NA NA
## 182 NA ACTUAL actual 2005-02-01 10200 NA NA
## 183 NA ACTUAL actual 2005-03-01 10330 NA NA
## 184 NA ACTUAL actual 2005-04-01 10340 NA NA
## 185 NA ACTUAL actual 2005-05-01 10330 NA NA
## 186 NA ACTUAL actual 2005-06-01 9850 NA NA
## 187 NA ACTUAL actual 2005-07-01 8860 NA NA
## 188 NA ACTUAL actual 2005-08-01 8890 NA NA
## 189 NA ACTUAL actual 2005-09-01 9640 NA NA
## 190 NA ACTUAL actual 2005-10-01 10060 NA NA
## 191 NA ACTUAL actual 2005-11-01 10210 NA NA
## 192 NA ACTUAL actual 2005-12-01 10330 NA NA
## 193 NA ACTUAL actual 2006-01-01 9900 NA NA
## 194 NA ACTUAL actual 2006-02-01 9880 NA NA
## 195 NA ACTUAL actual 2006-03-01 10050 NA NA
## 196 NA ACTUAL actual 2006-04-01 10060 NA NA
## 197 NA ACTUAL actual 2006-05-01 10050 NA NA
## 198 NA ACTUAL actual 2006-06-01 9990 NA NA
## 199 NA ACTUAL actual 2006-07-01 8930 NA NA
## 200 NA ACTUAL actual 2006-08-01 8580 NA NA
## 201 NA ACTUAL actual 2006-09-01 9140 NA NA
## 202 NA ACTUAL actual 2006-10-01 9590 NA NA
## 203 NA ACTUAL actual 2006-11-01 9690 NA NA
## 204 NA ACTUAL actual 2006-12-01 9700 NA NA
## 205 NA ACTUAL actual 2007-01-01 9610 NA NA
## 206 NA ACTUAL actual 2007-02-01 9570 NA NA
## 207 NA ACTUAL actual 2007-03-01 9770 NA NA
## 208 NA ACTUAL actual 2007-04-01 9830 NA NA
## 209 NA ACTUAL actual 2007-05-01 9840 NA NA
## 210 NA ACTUAL actual 2007-06-01 9710 NA NA
## 211 NA ACTUAL actual 2007-07-01 8710 NA NA
## 212 NA ACTUAL actual 2007-08-01 8300 NA NA
## 213 NA ACTUAL actual 2007-09-01 8910 NA NA
## 214 NA ACTUAL actual 2007-10-01 9710 NA NA
## 215 NA ACTUAL actual 2007-11-01 9870 NA NA
## 216 NA ACTUAL actual 2007-12-01 9980 NA NA
## 217 NA ACTUAL actual 2008-01-01 9970 NA NA
## 218 NA ACTUAL actual 2008-02-01 9970 NA NA
## 219 NA ACTUAL actual 2008-03-01 10120 NA NA
## 220 NA ACTUAL actual 2008-04-01 10150 NA NA
## 221 NA ACTUAL actual 2008-05-01 10110 NA NA
## 222 NA ACTUAL actual 2008-06-01 9970 NA NA
## 223 NA ACTUAL actual 2008-07-01 8930 NA NA
## 224 NA ACTUAL actual 2008-08-01 9020 NA NA
## 225 NA ACTUAL actual 2008-09-01 9200 NA NA
## 226 NA ACTUAL actual 2008-10-01 10090 NA NA
## 227 NA ACTUAL actual 2008-11-01 10260 NA NA
## 228 NA ACTUAL actual 2008-12-01 10330 NA NA
## 229 NA ACTUAL actual 2009-01-01 10360 NA NA
## 230 NA ACTUAL actual 2009-02-01 10350 NA NA
## 231 NA ACTUAL actual 2009-03-01 10560 NA NA
## 232 NA ACTUAL actual 2009-04-01 10600 NA NA
## 233 NA ACTUAL actual 2009-05-01 10660 NA NA
## 234 NA ACTUAL actual 2009-06-01 10580 NA NA
## 235 NA ACTUAL actual 2009-07-01 9420 NA NA
## 236 NA ACTUAL actual 2009-08-01 9770 NA NA
## 237 NA ACTUAL actual 2009-09-01 9680 NA NA
## 238 NA ACTUAL actual 2009-10-01 10400 NA NA
## 239 NA ACTUAL actual 2009-11-01 10560 NA NA
## 240 NA ACTUAL actual 2009-12-01 10600 NA NA
## 241 NA ACTUAL actual 2010-01-01 10560 NA NA
## 242 NA ACTUAL actual 2010-02-01 10550 NA NA
## 243 NA ACTUAL actual 2010-03-01 10790 NA NA
## 244 NA ACTUAL actual 2010-04-01 10810 NA NA
## 245 NA ACTUAL actual 2010-05-01 10780 NA NA
## 246 NA ACTUAL actual 2010-06-01 10710 NA NA
## 247 NA ACTUAL actual 2010-07-01 9060 NA NA
## 248 NA ACTUAL actual 2010-08-01 9610 NA NA
## 249 NA ACTUAL actual 2010-09-01 9770 NA NA
## 250 NA ACTUAL actual 2010-10-01 10340 NA NA
## 251 NA ACTUAL actual 2010-11-01 10480 NA NA
## 252 NA ACTUAL actual 2010-12-01 10180 NA NA
## 253 NA ACTUAL actual 2011-01-01 10390 NA NA
## 254 NA ACTUAL actual 2011-02-01 10400 NA NA
## 255 NA ACTUAL actual 2011-03-01 10590 NA NA
## 256 NA ACTUAL actual 2011-04-01 10600 NA NA
## 257 NA ACTUAL actual 2011-05-01 10580 NA NA
## 258 NA ACTUAL actual 2011-06-01 10300 NA NA
## 259 NA ACTUAL actual 2011-07-01 8800 NA NA
## 260 NA ACTUAL actual 2011-08-01 9360 NA NA
## 261 NA ACTUAL actual 2011-09-01 9650 NA NA
## 262 NA ACTUAL actual 2011-10-01 10280 NA NA
## 263 NA ACTUAL actual 2011-11-01 10410 NA NA
## 264 NA ACTUAL actual 2011-12-01 10240 NA NA
## 265 NA ACTUAL actual 2012-01-01 10380 NA NA
## 266 NA ACTUAL actual 2012-02-01 10390 NA NA
## 267 NA ACTUAL actual 2012-03-01 10580 NA NA
## 268 NA ACTUAL actual 2012-04-01 10560 NA NA
## 269 NA ACTUAL actual 2012-05-01 10570 NA NA
## 270 NA ACTUAL actual 2012-06-01 10240 NA NA
## 271 NA ACTUAL actual 2012-07-01 8720 NA NA
## 272 NA ACTUAL actual 2012-08-01 9340 NA NA
## 273 NA ACTUAL actual 2012-09-01 9650 NA NA
## 274 NA ACTUAL actual 2012-10-01 10480 NA NA
## 275 NA ACTUAL actual 2012-11-01 10630 NA NA
## 276 NA ACTUAL actual 2012-12-01 10490 NA NA
## 277 NA ACTUAL actual 2013-01-01 10550 NA NA
## 278 NA ACTUAL actual 2013-02-01 10540 NA NA
## 279 NA ACTUAL actual 2013-03-01 10720 NA NA
## 280 NA ACTUAL actual 2013-04-01 10700 NA NA
## 281 NA ACTUAL actual 2013-05-01 10750 NA NA
## 282 NA ACTUAL actual 2013-06-01 10540 NA NA
## 283 NA ACTUAL actual 2013-07-01 9030 NA NA
## 284 NA ACTUAL actual 2013-08-01 9620 NA NA
## 285 NA ACTUAL actual 2013-09-01 10050 NA NA
## 286 NA ACTUAL actual 2013-10-01 10610 NA NA
## 287 NA ACTUAL actual 2013-11-01 10760 NA NA
## 288 NA ACTUAL actual 2013-12-01 10570 NA NA
## 289 NA ACTUAL actual 2014-01-01 10730 NA NA
## 290 NA ACTUAL actual 2014-02-01 10660 NA NA
## 291 NA ACTUAL actual 2014-03-01 10900 NA NA
## 292 NA ACTUAL actual 2014-04-01 11020 NA NA
## 293 NA ACTUAL actual 2014-05-01 10940 NA NA
## 294 NA ACTUAL actual 2014-06-01 10770 NA NA
## 295 NA ACTUAL actual 2014-07-01 9340 NA NA
## 296 NA ACTUAL actual 2014-08-01 9900 NA NA
## 297 NA ACTUAL actual 2014-09-01 10360 NA NA
## 298 NA ACTUAL actual 2014-10-01 10950 NA NA
## 299 NA ACTUAL actual 2014-11-01 11120 NA NA
## 300 NA ACTUAL actual 2014-12-01 10990 NA NA
## 301 NA ACTUAL actual 2015-01-01 10980 NA NA
## 302 NA ACTUAL actual 2015-02-01 11010 NA NA
## 303 NA ACTUAL actual 2015-03-01 11250 NA NA
## 304 NA ACTUAL actual 2015-04-01 11290 NA NA
## 305 NA ACTUAL actual 2015-05-01 11310 NA NA
## 306 NA ACTUAL actual 2015-06-01 11000 NA NA
## 307 1 PROPHET W/ XGBOOST ERRORS predi… 2015-07-01 9673. 9230. 10116.
## 308 1 PROPHET W/ XGBOOST ERRORS predi… 2015-08-01 9554. 9111. 9997.
## 309 1 PROPHET W/ XGBOOST ERRORS predi… 2015-09-01 10263. 9820. 10706.
## 310 1 PROPHET W/ XGBOOST ERRORS predi… 2015-10-01 10741. 10298. 11184.
## 311 1 PROPHET W/ XGBOOST ERRORS predi… 2015-11-01 10915. 10471. 11358.
## 312 1 PROPHET W/ XGBOOST ERRORS predi… 2015-12-01 10862. 10419. 11306.
## 313 1 PROPHET W/ XGBOOST ERRORS predi… 2016-01-01 10853. 10410. 11296.
## 314 1 PROPHET W/ XGBOOST ERRORS predi… 2016-02-01 10854. 10411. 11298.
## 315 1 PROPHET W/ XGBOOST ERRORS predi… 2016-03-01 11023. 10580. 11466.
## 316 1 PROPHET W/ XGBOOST ERRORS predi… 2016-04-01 11065. 10622. 11509.
## 317 1 PROPHET W/ XGBOOST ERRORS predi… 2016-05-01 11067. 10624. 11510.
## 318 1 PROPHET W/ XGBOOST ERRORS predi… 2016-06-01 10880. 10436. 11323.
## # … with abbreviated variable names ¹.conf_lo, ².conf_hi