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.
Este reto se debe resolver en RStudio y presentar los resultados a través de un documento (html o pdf) creado con RMarkdown.
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.
Sólo se puntuarán las contribuciones que resuelvan (de forma parcial o total) el caso planteado.
Si sólo se participa en el segundo se podrá optar a una calificación máxima de 8 puntos. Si participan en el primero o en ambos podrán optar a una calificación máxima planteada.
library(ggplot2)
library(corrplot)
library(dplyr)
library(GGally)
library(rpart)
library(rpart.plot)
library(randomForest)
library(caret)
library(mltools)
library(e1071)
library(kernlab)
-Primer visualización de datos -Verificación de valores nulos -Rango de columna “TARGET” para conocer los valores esperados
train <- read.csv("C:/Users/ogl88/OneDrive/Documentos/Master Big Data/3. Técnicas de análisis y exploración de datos/Foro 2/TABLON_ENTRENAMIENTO.csv", header = TRUE, sep = ";")
test <- read.csv("C:/Users/ogl88/OneDrive/Documentos/Master Big Data/3. Técnicas de análisis y exploración de datos/Foro 2/TABLON_VALIDACION.csv", header = TRUE, sep = ";")
full <- rbind(train, test)
str(full)
## '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 ...
colSums(is.na(full))
## TARGET VAR1 VAR2 VAR3 VAR4
## 0 0 0 0 0
range(full$TARGET)
## [1] 0.127681 4.619065
apply(full[2:5],2,function(x) unique(x))
## $VAR1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
##
## $VAR2
## [1] 0.50 0.75 1.00 2.50 5.00 7.50 10.00 0.80 2.00 4.00 6.00 8.00
##
## $VAR3
## [1] 1 3 6
##
## $VAR4
## [1] 300 400 500
No se realiza limpieza de valores nulos al no haberlos
## TARGET VAR1 VAR2 VAR3 VAR4
## TARGET 1.00000000 0.9084015 1.275580e-01 -2.439513e-02 -3.366129e-02
## VAR1 0.90840145 1.0000000 0.000000e+00 0.000000e+00 0.000000e+00
## VAR2 0.12755801 0.0000000 1.000000e+00 -6.848732e-19 -4.376592e-20
## VAR3 -0.02439513 0.0000000 -6.848732e-19 1.000000e+00 -1.960702e-21
## VAR4 -0.03366129 0.0000000 -4.376592e-20 -1.960702e-21 1.000000e+00
-Se considera la variable 1 (VAR1) la mayormente relacionada a la
determinación del valor de TARGET
## Modelo predictivo Se decide explorar correlación entre VAR1 y TARGET
# Regresión lineal Para diseñar un modelo predictivo para la variable
TARGET, al ser una variable continua y numérica se recurre a una
regresion lineal y evaluando las 4 variables numéricas disponibles (VAR1
- VAR4)
set.seed(123)
Rlineal <- lm(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = train)
print(Rlineal)
##
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = train)
##
## Coefficients:
## (Intercept) VAR1 VAR2 VAR3 VAR4
## 0.9167535 0.0868552 0.0574772 -0.0196577 -0.0005762
summary(Rlineal)
##
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = train)
##
## 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
Se encuentra un valor de R^2 de 0.84, denotando una relación fuerte con la linea de regresión
predTARGET <- predict(Rlineal, newdata = test, type = "response")
summary(predTARGET)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.6435 1.9862 3.0757 3.0747 4.1576 5.5268
summary(Rlineal)
##
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = train)
##
## 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
cat("Rango de valores predecidos: ",range(predTARGET),"\n")
## Rango de valores predecidos: 0.6435484 5.526815
cat("Media de valores predecidos: ",mean(predTARGET))
## Media de valores predecidos: 3.074664
#inverso de
regresion2=1 - sum((full$TARGET - predTARGET)^2) / sum((full$TARGET - mean(full$TARGET))^2)
## Warning in full$TARGET - predTARGET: longitud de objeto mayor no es múltiplo de
## la longitud de uno menor
print(regresion2)
## [1] 0.8064779
plot(Rlineal)
#TestRForest <- c(sqrt(mean((RforestTable[,1] - RforestTable[,2])^2)),R2(RforestTable[,1],RforestTable[,2]))
Unicamente se observa una relacion fuerte de TARGET con VAR1, cómo se mostró en el primer análisis
Se procede a evaluar predicción
t1 <- table(full$TARGET)
# Cálculo de precision y recall
precision <- t1[2]/(sum(t1[2]))
recall <- t1[2] / (t1[2] + t1[1])
print("Precisión: ")
## [1] "Precisión: "
precision
## 0.128498
## 1
print("Recall: ")
## [1] "Recall: "
recall
## 0.128498
## 0.5
# F1 score
F1<- 2*precision*recall/(precision+recall)
print("F1: ")
## [1] "F1: "
F1
## 0.128498
## 0.6666667
Recall 12% Denotas una correlacion debil entre variables
Se recurre a una segunda iteración de predicción con el método Random forest para buscar un porcentaje de precisión mayor.
##
## Call:
## randomForest(x = train, y = train$TARGET, importance = TRUE)
## Type of random forest: regression
## Number of trees: 500
## No. of variables tried at each split: 1
##
## Mean of squared residuals: 0.06923433
## % Var explained: 96.38
Se toma como primer iteración 100 árboles para abarcar una buena
eficiencia del modelo
## [1] "Mean of squared errors (MSE): 0.26"
## [1] "R2 score: 0.99"
R^2 de .99% muestra, indica poca probabilidad de overfitting
#Interpretación de métricas
#MSE (Error Cuadrático Medio):
El Error Cuadrático Medio (MSE, por sus siglas en inglés) es una medida de la calidad de un estimador. Representa el promedio de los cuadrados de las diferencias entre los valores predichos y los valores reales. Cuanto menor sea el MSE, mejor será el ajuste del modelo a los datos.
#R^2 (Coeficiente de Determinación):
El Coeficiente de Determinación (R^2) es una medida estadística que representa la proporción de la variabilidad de una variable dependiente que es explicada por un modelo predictivo. R^2 tiene un rango de 0 a 1, donde 0 indica que el modelo no explica la variabilidad y 1 indica una explicación perfecta. Un valor más alto de R^2 sugiere que el modelo se ajusta mejor a los datos.
Comparando ambos modelos podemos observar los isgueintes resultados:
## MSE R2
## regresion2 0.8064779 0.8064779
## TestRForest 0.2574956 0.9890053
Podemos con estos resultados argumentar que el método de Random forest tiene un mejor desempeño que la regresión lineal, por lo que sería el método a recurrir para un mejor resultado