--- title: "Time-Series" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Time-Series} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE,eval = FALSE,echo = T) ``` ## Intro First, we need to install ```timeseries_fastai module``` for [Time-Series](https://github.com/tcapelle/timeseries_fastai) integration. ```{r} reticulate::py_install('git+https://github.com/tcapelle/timeseries_fastai.git', pip = TRUE) ``` ## Grab data Download the data from Facebook Github page (Prophet): ```{r} library(dplyr) library(fastai) df = data.table::fread('https://raw.githubusercontent.com/facebook/prophet/master/examples/example_wp_log_peyton_manning.csv') ``` ``` ds y 1: 2007-12-10 9.590761 2: 2007-12-11 8.519590 3: 2007-12-12 8.183677 4: 2007-12-13 8.072467 5: 2007-12-14 7.893572 6: 2007-12-15 7.783641 ``` ## Preprocess Scale and fill NA's: ```{r} split_idx = which(df$ds=='2016-01-01') # take 1 year for validation y = df$y df = timetk::tk_augment_timeseries_signature(df) %>% mutate_if(is.factor, as.numeric) %>% select(-ds, -hour, -minute, -second, -hour12, -am.pm, -y) %>% scale() %>% data.table::as.data.table() df[is.na(df)]=0 df$y = y ``` ## Split Split data into 2 parts: - train - test ```{r} df_train = df[1:split_idx,] df_test = df[(split_idx+1):nrow(df),] x_cols = setdiff(colnames(df_train),'y') ``` ## Dataloader and Inception model ```{r} dls = TSDataLoaders_from_dfs(df_train, df_test, x_cols = x_cols, label_col = 'y', bs=60, y_block = RegressionBlock()) dls %>% show_batch() inception = create_inception(1, 1) learn = Learner(dls, inception, metrics=list(mae(), rmse())) ``` ``` Sequential( (0): SequentialEx( (layers): ModuleList( (0): InceptionModule( (convs): ModuleList( (0): Conv1d(1, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(1, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(1, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(1, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) ) ) (1): SequentialEx( (layers): ModuleList( (0): InceptionModule( (bottleneck): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) (convs): ModuleList( (0): Conv1d(32, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(32, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(32, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) ) ) (2): SequentialEx( (layers): ModuleList( (0): InceptionModule( (bottleneck): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) (convs): ModuleList( (0): Conv1d(32, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(32, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(32, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) (1): Shortcut( (act_fn): ReLU(inplace=True) (conv): ConvLayer( (0): Conv1d(128, 128, kernel_size=(1,), stride=(1,), bias=False) (1): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() ) (bn): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) ) ) ) (3): SequentialEx( (layers): ModuleList( (0): InceptionModule( (bottleneck): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) (convs): ModuleList( (0): Conv1d(32, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(32, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(32, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) ) ) (4): SequentialEx( (layers): ModuleList( (0): InceptionModule( (bottleneck): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) (convs): ModuleList( (0): Conv1d(32, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(32, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(32, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) ) ) (5): SequentialEx( (layers): ModuleList( (0): InceptionModule( (bottleneck): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) (convs): ModuleList( (0): Conv1d(32, 32, kernel_size=(39,), stride=(1,), padding=(19,), bias=False) (1): Conv1d(32, 32, kernel_size=(19,), stride=(1,), padding=(9,), bias=False) (2): Conv1d(32, 32, kernel_size=(9,), stride=(1,), padding=(4,), bias=False) ) (conv_bottle): Sequential( (0): MaxPool1d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv1d(128, 32, kernel_size=(1,), stride=(1,), bias=False) ) (bn_relu): Sequential( (0): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (1): ReLU() ) ) (1): Shortcut( (act_fn): ReLU(inplace=True) (conv): ConvLayer( (0): Conv1d(128, 128, kernel_size=(1,), stride=(1,), bias=False) (1): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() ) (bn): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) ) ) ) (6): AdaptiveConcatPool1d( (ap): AdaptiveAvgPool1d(output_size=1) (mp): AdaptiveMaxPool1d(output_size=1) ) (7): Flatten(full=False) (8): Linear(in_features=256, out_features=1, bias=True) ) ``` ## Optimal LR Find suitable learning rate and plot: ```{r} lrs = learn %>% lr_find() learn %>% plot_lr_find() ``` ## Conclusion Fit and include early stopping: ```{r} learn %>% fit_one_cycle(30, 1e-5, cbs = EarlyStoppingCallback(patience = 5)) learn %>% predict(df_test) ``` ``` y 1 5.925275 2 5.925579 3 6.060019 4 5.749205 5 5.793755 6 5.974738 7 7.185201 8 6.897375 9 7.095043 10 7.082201 11 6.916879 12 6.802319 13 6.714959 14 6.589868 15 6.436776 16 7.105388 17 7.237350 18 7.133458 19 7.103930 ```