A través de un conjunto de datos (TABLON_ENTRENAMIENTO.csv) se debe entrenar un modelo que realice la predicción de la variable TARGET teniendo en cuenta los inputs dados por las variables (VAR1, VAR2, VAR3, VAR4).
Se debe realizar el test del modelo utilizando los datos del fichero TABLON_VALIDACION.csv. Para ello, elija la métrica que mejor se adapte a la naturaleza de los datos. Pista: la variable TARGET es cuantitativa continua.
Debe indagar sobre diferentes naturalezas de modelos predictivos y mostrar cuál de ellos es el que mejor resultado arroja para el caso bajo estudio tras realizar la comparación entre las métricas obtenidas.
library(ggplot2)
library(dplyr)
library(GGally)
library(rpart)
library(rpart.plot)
library(randomForest)
library(caret)
library(mltools)
library(e1071)
library(rsample)
library(yardstick)
library(Metrics)
library(reshape2)
library(corrplot)
setwd("C:/Users/bianc/OneDrive/Escritorio/Maestria/Modulo 3/Foro")
tablontrain <- read.csv("TABLON_ENTRENAMIENTO.csv", sep=";", header=TRUE, stringsAsFactors = FALSE)
tablontest <- read.csv("TABLON_VALIDACION.csv", sep=";", header=TRUE, stringsAsFactors = FALSE)
Creo un nuevo conjunto datos con ambos sets, o sea, tanto el de Entrenamiento y Validación.
tablon <- bind_rows(tablontrain,tablontest)
str(tablon)
## 'data.frame': 5400 obs. of 5 variables:
## $ TARGET: num 0.128 0.138 0.167 0.277 0.376 ...
## $ VAR1 : int 1 2 3 4 5 6 7 8 9 10 ...
## $ VAR2 : num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
## $ VAR3 : int 1 1 1 1 1 1 1 1 1 1 ...
## $ VAR4 : int 300 300 300 300 300 300 300 300 300 300 ...
head(tablon)
## TARGET VAR1 VAR2 VAR3 VAR4
## 1 0.127681 1 0.5 1 300
## 2 0.137929 2 0.5 1 300
## 3 0.166577 3 0.5 1 300
## 4 0.276655 4 0.5 1 300
## 5 0.375599 5 0.5 1 300
## 6 0.537873 6 0.5 1 300
La base de dato conjunta no tiene valores faltantes.
colSums(is.na(tablon))
## TARGET VAR1 VAR2 VAR3 VAR4
## 0 0 0 0 0
colSums(tablon=="")
## TARGET VAR1 VAR2 VAR3 VAR4
## 0 0 0 0 0
La variable TARGET tiene una distribución asimétrica hacia la izquierda. Mientras que la variable VAR1 muestra una distribución uniforme. No se realizaron histograma de las variables VAR2, VAR3 y VAR4 porque son variables categóricas.
ggplot(tablon, aes(x=TARGET)) +
geom_histogram(aes(y=..density..), colour="black", fill="white")+
geom_density(alpha=.2, fill="#FF6666")
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(tablon, aes(x=VAR1)) +
geom_histogram(aes(y=..density..), colour="black", fill="white")+
geom_density(alpha=.2, fill="#FF6666")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Las variables VAR1 y VAR2 tienen una relación positiva con la variable TARGET, siendo la VAR1 la que muestra una relación más fuerte, aunque ésta aparenta no ser lineal. VAR3 y VAR4 tienen una relación negativa respecto a la variable TARGET y a su vez débil.
ggplot(tablon, aes(as.factor(VAR1), TARGET)) +
geom_boxplot() + xlab("VAR1")
ggplot(tablon, aes(as.factor(VAR2), TARGET)) +
geom_boxplot() + xlab("VAR2")
ggplot(tablon, aes(as.factor(VAR3), TARGET)) +
geom_boxplot() + xlab("VAR3")
ggplot(tablon, aes(as.factor(VAR4), TARGET)) +
geom_boxplot() + xlab("VAR4")
Scatterplot nos confirma que la relación entre la variable TARGET, y VAR1 no es lineal. Esto es importante para tenerlo en consideración para el ajuste en el modelo.
ggplot(tablon,aes(VAR1,TARGET)) +
geom_point()+
geom_smooth()
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
La variable VAR1 es la que tiene mayor correlación con la variable TARGET. Las demás correlaciones son muy débiles.
newtablon <- cor(tablon[ , c('TARGET','VAR1', 'VAR2', 'VAR3', 'VAR4')], use='complete')
corrplot(newtablon, method = "number")
En el modelo todas las variables son significativas. El valor del R-ajustado es de 84.3%, lo que significa que el modelo tiene un buen fit. Sin embargo, viendo las gráficas mostradas anteriormente, debemos explorar diferentes vertientes del modelo (LM) para averiguar cuál es el mejor modelo predictivo. Debemos, considerar que las variables VAR2, VAR3 y VAR4 son categórica, por lo cual, sería bueno especificar esto en el modelo.
set.seed(1234)
model.lm <- lm(TARGET~.,data = tablontrain)
summary(model.lm)
##
## Call:
## lm(formula = TARGET ~ ., data = tablontrain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.31196 -0.49367 0.09087 0.47884 1.00021
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.9167535 0.0552213 16.601 < 2e-16 ***
## VAR1 0.0868552 0.0006762 128.455 < 2e-16 ***
## VAR2 0.0574772 0.0028297 20.312 < 2e-16 ***
## VAR3 -0.0196577 0.0047486 -4.140 3.57e-05 ***
## VAR4 -0.0005762 0.0001195 -4.822 1.49e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5476 on 3145 degrees of freedom
## Multiple R-squared: 0.8435, Adjusted R-squared: 0.8433
## F-statistic: 4238 on 4 and 3145 DF, p-value: < 2.2e-16
Al agregar un componente cuadrático de la variable VAR1, se observar una mejora en el fit del modelo, lo cual, va en línea con lo observado en el análisis descriptivo. El nuevo modelo nos muestra que todas las variables son significativas al 1%, y el R-ajustado es de 97.5%.
set.seed(1234)
tablontrain2 <- tablontrain %>%
mutate(VAR12 = VAR1 * VAR1)
model.lm2 <- lm(TARGET~ VAR1 + VAR12 + VAR2+ as.factor(VAR3) + as.factor(VAR4),data = tablontrain2)
summary(model.lm2)
##
## Call:
## lm(formula = TARGET ~ VAR1 + VAR12 + VAR2 + as.factor(VAR3) +
## as.factor(VAR4), data = tablontrain2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.75959 -0.13641 0.01283 0.15190 0.64115
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.645e-01 1.510e-02 -30.758 < 2e-16 ***
## VAR1 2.243e-01 1.101e-03 203.819 < 2e-16 ***
## VAR12 -2.695e-03 2.092e-05 -128.835 < 2e-16 ***
## VAR2 5.748e-02 1.129e-03 50.891 < 2e-16 ***
## as.factor(VAR3)3 -4.928e-02 9.540e-03 -5.166 2.54e-07 ***
## as.factor(VAR3)6 -9.953e-02 9.540e-03 -10.434 < 2e-16 ***
## as.factor(VAR4)400 -5.435e-02 9.540e-03 -5.697 1.33e-08 ***
## as.factor(VAR4)500 -1.152e-01 9.540e-03 -12.080 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2186 on 3142 degrees of freedom
## Multiple R-squared: 0.9751, Adjusted R-squared: 0.975
## F-statistic: 1.757e+04 on 7 and 3142 DF, p-value: < 2.2e-16
Se estima el modelo (LM) utilizando remuestreo de tipo de validación cruzada. Esto se hizo con el objetivo de facilitar la comparación con los modelos de KKN y SVM.
set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
modelo.lm <- train(TARGET~ VAR1 + VAR12 + VAR2+ as.factor(VAR3) + as.factor(VAR4), data=tablontrain2, method="lm", metric="RMSE", trControl=trainControl)
modelo.lm
## Linear Regression
##
## 3150 samples
## 5 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times)
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 0.2187508 0.9751295 0.173542
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
A continuación, se ejecutan el modelo KNN y SVM para poder comparar con el modelo lineal y poder confirmar si el modelo lineal es el mejor modelo para predecir la variable TARGET.
set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
modelo.knn <- train(TARGET~., data=tablontrain2, method="knn", metric="RMSE", trControl=trainControl)
modelo.knn
## k-Nearest Neighbors
##
## 3150 samples
## 5 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times)
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 5 0.1529770 0.9877749 0.1043376
## 7 0.1768550 0.9836560 0.1242384
## 9 0.1769441 0.9836547 0.1290492
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 5.
set.seed(1234)
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
model.svm <- train(TARGET~., data=tablontrain2, method="svmLinear", metric="RMSE", trControl=trainControl)
model.svm
## Support Vector Machines with Linear Kernel
##
## 3150 samples
## 5 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 3 times)
## Summary of sample sizes: 2835, 2835, 2836, 2836, 2834, 2835, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 0.2188841 0.9751298 0.1730969
##
## Tuning parameter 'C' was held constant at a value of 1
tablontest <- tablontest %>%
mutate(VAR12 = VAR1 * VAR1)
results <- tablontest %>%
mutate(`model_lm` = predict(modelo.lm, tablontest),
`model_knn` = predict(modelo.knn, tablontest),
`model_svm` = predict(model.svm, tablontest))
Luego de evaluar el performance de los tres modelos en el conjunto de datos test podemos concluir que, el mejor modelo para predecir la variable TARGET es el KNN. Si observamos en la tabla más abajo podemos ver que tanto las métricas de RMSE y MAE son las más pequeña, y su RSQ es el más cercano a 1.
lm0 <- metrics(results, truth = TARGET, estimate = `model_lm`)
knn0 <- metrics(results, truth = TARGET, estimate = `model_knn`)
svm0 <- metrics(results, truth = TARGET, estimate = `model_svm`)
lm0 <- lm0 %>%
select(.metric, .estimate) %>%
rename(LM = .estimate)
knn0 <- knn0 %>%
select(.metric, .estimate) %>%
rename(KNN = .estimate)
svm0 <- svm0 %>%
select(.metric, .estimate) %>%
rename(SMV = .estimate)
result <- left_join(lm0,knn0, svm0, by = ".metric")
result2 <- left_join(result, svm0, by = ".metric")
result2
## # A tibble: 3 × 4
## .metric LM KNN SMV
## <chr> <dbl> <dbl> <dbl>
## 1 rmse 0.204 0.107 0.201
## 2 rsq 0.982 0.996 0.983
## 3 mae 0.169 0.0780 0.165