Time series cross-validation using `crossvalidation` (Part 2)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In a previous blog post, 
I presented time series cross-validation with crossvalidation::crossval_ts. The most 
recent version of package crossvalidation, v0.4.1, contains a new function called eval_ts. 
How does crossvalidation::eval_ts work? As described in the graph below:

crossvalidation::crossval_ts and crossvalidation::eval_ts
have the same arguments, except, 
an argument p for crossval_ts and an argument q for eval_ts. p is the percentage of original 
data used for cross-validation and hyperparameter tuning, and q is the percentage of unseen data used 
for model validation. In addition, and most importantly, we must have p + q = 1, to avoid overlapping 
train/test/validation sets.
Here’s a concrete example of use of crossvalidation::eval_ts :
Installing packages
options(repos = c(
      techtonique = 'https://techtonique.r-universe.dev',
      CRAN = 'https://cloud.r-project.org'))
        
install.packages("ahead")
install.packages("crossvalidation")
install.packages("e1071")
Loading packages
library(ahead) # forecasting tool library(crossvalidation) # cross-validation and evaluation library(datasets) # dataset Nile library(e1071) # for svm
Input data
y <- AirPassengers
Forecasting function
fcast_func <- function(y, h = 5, kernel=c("linear", "radial"))
 {
   kernel <- match.arg(kernel)
   ahead::dynrmf(y=y, h=h, level=95,
                 fit_func = e1071::svm,
                 fit_params = list(kernel = kernel),
                 predict_func = predict)
 }
We’ll consider that the hyperparameter is kernel, which is either “linear” or “radial”.
Error metric (Root Mean Squared Error, RMSE)
eval_metric <- function(predicted, observed)
{
   return(sqrt(mean((observed - predicted) ^ 2, na.rm = FALSE)))
}
Cross-validation on 80% of the data
With kernel = "radial"
res_cv_radial <- crossvalidation::crossval_ts(y = y,
                                             fcast_func = fcast_func,
                                             fit_params = list(kernel = "radial"),
                                             initial_window = 20,
                                             horizon = 10, p=0.8,
                                             eval_metric = eval_metric, 
                                             show_progress = FALSE)
print(median(res_cv_radial))
[1] 47.29141
With kernel = "linear"
res_cv_linear <- crossvalidation::crossval_ts(y = y,
                                             fcast_func = fcast_func,
                                             fit_params = list(kernel = "linear"),
                                             initial_window = 20,
                                             horizon = 10, p=0.8,
                                             eval_metric = eval_metric, 
                                             show_progress = FALSE)
print(median(res_cv_linear))
[1] 44.18955
Evaluation with the **best hyperparameter, kernel = "linear", on unseen data (q = 1 - p) **
res_eval_linear <- crossvalidation::eval_ts(y = y,
                                           fcast_func = fcast_func,
                                           fit_params = list(kernel = "linear"),
                                           initial_window = 20,
                                           horizon = 10, q=0.2,
                                           eval_metric = eval_metric, 
                                           show_progress = FALSE)
print(median(res_eval_linear))
[1] 86.47903
		
            
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
