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")
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
Comparamos los modelos, los podemos comparar con diferencias o según post 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