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.
library(knitr)
library(dplyr)
library(randomForest)
library(visreg)
#library(scatterplot3d)
Iniciaremos importando los datos de nuestro dataset de entrenamiento (TABLON_ENTRENAMIENTO.csv) y validación (TABLON_VALIDACION.csv). Estos conjuntos de datos contienen las variables predictoras (VAR1, VAR2, VAR3, VAR4) y la variable objetivo que ya sabemos que es cuantitativa continua (TARGET)
training_board <-read.csv('TABLON_ENTRENAMIENTO.csv',sep = ";", header=T, na.strings='')
validation_board <-read.csv('TABLON_VALIDACION.csv',sep = ";", header=T, na.strings='')
Utilizamos la función str() para explorar la estructura de los datos de entrenamiento, de esta manera comprenderemos la naturaleza de las variables y nos aseguramos de que estén en el formato adecuado para el análisis y modelado.
str(training_board)
## 'data.frame': 3150 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 ...
Hacemos una visión rápida de las primeras observaciones con glimpse, y vemos desde otra perspectiva la información sobre las variables y sus tipos de datos
glimpse(training_board)
## Rows: 3,150
## Columns: 5
## $ TARGET <dbl> 0.127681, 0.137929, 0.166577, 0.276655, 0.375599, 0.537873, 0.6…
## $ VAR1 <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, …
## $ VAR2 <dbl> 0.5, 0.5, 0.5, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ VAR4 <int> 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300…
Con Head vemos una muestra inicial de los datos, permitiendonos examinar las observaciones y asegurarnos de que la carga de datos haya sido exitosa
head(training_board)
## 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
Damos un vistazo estadístico del conjunto de datos de entrenamiento, donde podemos apreciar algunas estadísticas descriptivas claves: como la media, mediana, mínimo, máximo y cuartiles, para cada variable.
summary(training_board)
## TARGET VAR1 VAR2 VAR3 VAR4
## Min. :0.1277 Min. : 1.0 Min. : 0.500 Min. :1.000 Min. :300
## 1st Qu.:2.2131 1st Qu.:13.0 1st Qu.: 0.750 1st Qu.:1.000 1st Qu.:300
## Median :3.5503 Median :25.5 Median : 2.500 Median :3.000 Median :400
## Mean :3.0593 Mean :25.5 Mean : 3.893 Mean :3.333 Mean :400
## 3rd Qu.:4.1773 3rd Qu.:38.0 3rd Qu.: 7.500 3rd Qu.:6.000 3rd Qu.:500
## Max. :4.6191 Max. :50.0 Max. :10.000 Max. :6.000 Max. :500
Vemos los valores únicos por cada variable y así entendemos aún más la diversidad de categorías o rangos numéricos en las variables predictoras
print("Unique VAR1")
## [1] "Unique VAR1"
unique(training_board$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
print("Unique VAR2")
## [1] "Unique VAR2"
unique(training_board$VAR2)
## [1] 0.50 0.75 1.00 2.50 5.00 7.50 10.00
print("Unique VAR3")
## [1] "Unique VAR3"
unique(training_board$VAR3)
## [1] 1 3 6
print("Unique VAR4")
## [1] "Unique VAR4"
unique(training_board$VAR4)
## [1] 300 400 500
Contamos missings en números: Verificamos si existen valores nulos en cada columna de los conjuntos de datos
colSums(is.na(training_board))
## TARGET VAR1 VAR2 VAR3 VAR4
## 0 0 0 0 0
colSums(is.na(validation_board))
## TARGET VAR1 VAR2 VAR3 VAR4
## 0 0 0 0 0
Como podemos ver no será necesario hacer un tratamiento de datos faltantes ya que estos no están presentes en nuestros conjuntos de datos
En este apartado, iniciaremos con el entrenado de los modelos para predecir la variable TARGET, según la naturaleza de la variable a predecir seleccionamos dos modelos diferentes de predicción continua: un modelo de Regresión Lineal y un modelo de Bosque Aleatorio.
Utilizamos las variables predictoras VAR1, VAR2, VAR3, y VAR4 para predecir la variable objetivo TARGET en el conjunto de datos de entrenamiento (training_board).
# Entrenar modelo de Regresión Lineal
modelo_reg_lineal <- lm(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)
# Entrenar modelo de Bosque Aleatorio
modelo_bosque <- randomForest(TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)
Hacemos un resumen detallado de los modelos de Regresión Lineal y Bosque Aleatorio que hemos entrenado previamente
summary(modelo_reg_lineal)
##
## Call:
## lm(formula = TARGET ~ VAR1 + VAR2 + VAR3 + VAR4, data = training_board)
##
## 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
summary(modelo_bosque)
## Length Class Mode
## call 3 -none- call
## type 1 -none- character
## predicted 3150 -none- numeric
## mse 500 -none- numeric
## rsq 500 -none- numeric
## oob.times 3150 -none- numeric
## importance 4 -none- numeric
## importanceSD 0 -none- NULL
## localImportance 0 -none- NULL
## proximity 0 -none- NULL
## ntree 1 -none- numeric
## mtry 1 -none- numeric
## forest 11 -none- list
## coefs 0 -none- NULL
## y 3150 -none- numeric
## test 0 -none- NULL
## inbag 0 -none- NULL
## terms 3 terms call
Según lo que nos arroja la función summary(), podemos ver y resaltar lo siguiente:
Según lo especificado anteriormente podemos decir que la distribución de los residuos indica que el modelo tiene un buen ajuste, ya que los residuos no parecen tener patrones sistemáticos
Tambien vemos que el intercepto es significativamente diferente de cero 0.9167535, lo que sugiere que el modelo tiene una constante significativa.
Residual standard error (0.5476): Esto indica un buen ajuste, ya que un valor bajo sugiere que los puntos de datos tienden a estar cercanos a la línea de regresión
Multiple R-squared (0.8435): Aquí podemos ver la proporción de la variabilidad en la variable
TARGET y vemos claramente que el 84% de la variabilidad es explicada por las variables predictoras.
Adjusted R-squared (0.8433): Similar a lo anterior, pero este se ajusta según el número de variables predictoras que tenemos que en este caso son 4, con este 84% podemos decir que las variables predictoras han contribuido positivamente al modelo de regresión lineal entrenado
*F-statistic (4238) y p-value (< 2.2e-16): Esto nos indica que el modelo es altamente significativo, ya que el p-value es esencialmente cero
Dibujamos algunos gráficos relevantes para evaluar el desempeño y la validez de los modelos entrenados
plot(modelo_reg_lineal)
plot(modelo_bosque)
Utilizamos la función visreg() para visualizar las relaciones entre las variables predictoras (VAR1, VAR2, VAR3, VAR4) y la variable objetivo (TARGET) para ambos modelos entrenados: Regresión Lineal y Bosque Aleatorio.
visreg(modelo_reg_lineal)
visreg(modelo_bosque)
Nota: Estos gráficos nos proporcionan una perspectiva más clara de cómo las variables predictoras están relacionadas con la variable objetivo según los modelos entrenados.
# Realizar predicciones en el conjunto de validación
predicciones_bosque <- predict(modelo_bosque, newdata = validation_board)
predicciones_reg_lineal <- predict(modelo_reg_lineal, newdata = validation_board)
Realizamos el test de los modelos entrenados para realizar las predicciones en el conjunto de validación “TABLON_VALIDACION.csv”. Luego, Calculamos el \(R^2\) score y el RMSE para evaluar el rendimiento de los modelos.
Para tener una evaluación más completa y una comprensión más holística de la capacidad predictiva y rendimiento de los modelos entrenados, hacemos uso de distintas métricas según la naturaleza de los datos. Las métricas a utilzar son Mean Squared Error (MSE), Root Mean Squared Error (RMSE) y el \(R^2\) score, estas métricas nos ayudan con la cuantificación de la precisión y la capacidad explicativa de los modelos en relación con los valores reales de la variable objetivo.
El MSE y el RMSE mediran la diferencia entre las predicciones y los valores reales y el \(R^2\) score nos proporcionará una medida de la proporción de la variabilidad explicada por el modelo.
Nota: Al final según los resultados obtenidos seleccionaremos el modelo más efectivo para la predicción de la variable TARGET
# Calcular MSE por separado
mse_reg_lineal <- mean((validation_board$TARGET - predicciones_reg_lineal)^2)
mse_bosque <- mean((validation_board$TARGET - predicciones_bosque)^2)
# Calcular RMSE en el conjunto de validación
rmse_reg_lineal <- sqrt(mean((validation_board$TARGET - predicciones_reg_lineal)^2))
rmse_bosque <- sqrt(mean((validation_board$TARGET - predicciones_bosque)^2))
# Calcular R^2 en el conjunto de validación
r2_reg_lineal <- summary(modelo_reg_lineal)$r.squared
r2_bosque <- 1 - (sum((validation_board$TARGET - predicciones_bosque)^2) / sum((validation_board$TARGET - mean(validation_board$TARGET))^2))
A continuación proporcionamos una visión resumida y comparativa de los resultados obtenidos por cada modelo en el conjunto de validación
# Crear un dataframe con los resultados
resultados_df <- data.frame(
Modelo = c("Bosque Aleatorio", "Regresión Lineal"),
RMSE = c(rmse_bosque, rmse_reg_lineal),
MSE = c(mse_bosque, mse_reg_lineal),
R2 = c(r2_bosque, r2_reg_lineal)
)
# Mostrar el dataframe de resultados
print(resultados_df)
## Modelo RMSE MSE R2
## 1 Bosque Aleatorio 0.4802986 0.2306867 0.8829898
## 2 Regresión Lineal 0.5601824 0.3138043 0.8435213
Nota: Estas métricas proporcionarán una evaluación cuantitativa de la capacidad predictiva del modelo en el conjunto de validación “TABLON_VALIDACION.csv”.
Basándonos en los resultados obtenidos en la tabla anterior, podemos hacer las siguientes comparaciones:
## Modelo RMSE
## 1 Bosque Aleatorio 0.4802986
## 2 Regresión Lineal 0.5601824
Un valor de RMSE más bajo indica un mejor rendimiento. En este caso, el Bosque Aleatorio tiene un RMSE más bajo, lo cual sugiere que tiene una mejor capacidad para hacer predicciones precisas en el conjunto de validación.
## Modelo MSE
## 1 Bosque Aleatorio 0.2306867
## 2 Regresión Lineal 0.3138043
Similar al RMSE, un MSE más bajo indica un mejor rendimiento. El Bosque Aleatorio tiene un MSE inferior, lo que respalda su mejor rendimiento en términos de precisión.
## Modelo R2
## 1 Bosque Aleatorio 0.8829898
## 2 Regresión Lineal 0.8435213
Un \(R^2\) más cercano a 1 indica un mejor ajuste del modelo a los datos. En este caso, el Bosque Aleatorio tiene un \(R^2\) más alto, lo que sugiere una mejor capacidad para explicar la variabilidad en la variable objetivo.
Tras realizar la comparación entre las métricas obtenidas, el Bosque Aleatorio se desempeña mejor en la tarea de predicción de la variable objetivo (TARGET) en comparación con la Regresión Lineal en el conjunto de validación.
En este análisis hemos comparado el rendimiento entre los modelos predictivos: Bosque Aleatorio y Regresión Lineal utilizando un conjunto de datos de entrenamiento y validación. Los resultados revelan claramente la superioridad del Bosque Aleatorio, evidenciada por métricas como RMSE, MSE y \(R^2\) mostrando una capacidad predictiva más robusta, con un menor error cuadrático medio, una raíz cuadrada del error cuadrático medio más baja y una mayor capacidad para explicar la variabilidad en la variable objetivo. Estos hallazgos nos indican que emplear el Bosque Aleatorio como el modelo preferido para este caso de estudio es la mejor opción.