Cargando datos y librerías

Lo primero es cargar las bases de datos y paquetes necesarios para el trabajo

library(tidyverse)
library(caret)
library(knitr)
library(lubridate)
Train <- read_csv("Train.csv")
Test <- read_csv("Test.csv")

Separemos nuestra base de entrenamiento en una Base de entrenamiento y una de prueba para nosotoros

En este caso al ser nuestra base de datos una serie de tiempo, quizás es mas conveniente separar la base de datos en base a el tiempo, podemos hacer un Train1 y un Test1 donde Test1 tenga los datos del 2017 y el Train1 tenga todos los datos anteriores:

Train <- Train %>% mutate(Mes = month(Fecha), Year = year(Fecha))
Test <- Test %>% mutate(Mes = month(Fecha), Year = year(Fecha))


Train1 <- Train  %>% filter(Year < 2017)
Test1 <- Train  %>% filter(Year == 2017)

Luego creamos el modelo controlando con un train control de time series

myTimeControl <- trainControl(method = "timeslice",
                              initialWindow = 1825,
                              horizon = 730,
                              fixedWindow = TRUE)



Models <- c("gbm", "rf", "brnn", "gamboost", "nnet", "avNNet", "glmboost")

set.seed(2018)
Fits <- Models %>% map(~train(MP25 ~., data = Train1, method = .x, trControl = myTimeControl, metric = "Rsquared", maximize= TRUE))



names(Fits) <- Models

Comparación de modelos

Comparamos los modelos, los podemos comparar con diferencias o según post resample

Ordenados por r cuadrado de resample

Tabla <- Fits %>% map2(.y = Models,~data.frame(Model = .y,  Rsq = postResample(pred = predict(.x, Test1), obs = Test1$MP25)[[2]])) %>% reduce(bind_rows) %>% arrange(desc(Rsq))
Model Rsq
gbm 0.4628278
rf 0.4481379
brnn 0.4287662
gamboost 0.3812878
glmboost 0.3284647
avNNet 0.1591265
nnet 0.0029050

debido a esto elijo GBM para trabajar. Antes de esto vere algunos diagnosticos como que pasa con los distintos parametros de entrenamiento:

y ver la importancia de variables:

gbm::relative.influence(Fits$gbm$finalModel)
## n.trees not given. Using 150 trees.
##          Fecha DireccionMedia       MaxVient       MinVient    VientoMedio 
##      495985.22      230546.76      326384.60       20136.48     1055865.30 
##      TempMedia        TempMin        TempMax         MaxHum         MinHum 
##       41184.38       42401.86       66273.92       81632.67       65964.95 
##   HumedadMedia            Mes           Year 
##       69740.42      215995.55           0.00

Todo indica que ademas de la fecha, las variables asociadas con el viento son importante.

Ademas, usando el paquete gbm, podemos ver las respuestas predichas de el MP25 a ciertas variables, por ejemplo:

library(gbm)
plot(Fits$gbm$finalModel, i.var = "MaxVient")

plot(Fits$gbm$finalModel, i.var = "Fecha")

plot(Fits$gbm$finalModel, i.var = "Mes")

Primero trabajaremos con la figura anterior, ahi se observa que el modelo podria mejorar aumentando el numero de iteraciones y la profundidad maxima del arboles:

grid <- expand.grid(interaction.depth = seq(3, 9, by = 2),
                    n.trees = seq(100, 1000, by = 50),
                    shrinkage = c(0.01, 0.1),
                    n.minobsinnode=c(1,5,10))

set.seed(2018)
GBM2 <- train(MP25 ~., data = Train1, method = "gbm", metric = "Rsquared", maximize= TRUE, tuneGrid = grid, trControl = myTimeControl)
plot(GBM2)

gbm::relative.influence(GBM2$finalModel)
## n.trees not given. Using 1000 trees.
##          Fecha DireccionMedia       MaxVient       MinVient    VientoMedio 
##      5432616.5      2013251.2      2154947.5       385533.2     12349820.5 
##      TempMedia        TempMin        TempMax         MaxHum         MinHum 
##       683893.2       845410.9      1118539.4      1332294.7       839542.9 
##   HumedadMedia            Mes           Year 
##       914141.5      1903110.7            0.0