RANDOM FOREST

es un algoritmo de aprendizaje automático utilizado para tareas de clasificación y regresión en el análisis de datos. Consiste en la creación de múltiples árboles de decisión durante el entrenamiento y utiliza el promedio o la votación mayoritaria de sus predicciones para mejorar la precisión y controlar el sobreajuste. Este enfoque de conjunto proporciona robustez y generalización, ya que cada árbol es entrenado con una muestra aleatoria del conjunto de datos y una selección aleatoria de características, lo que reduce la varianza y el sesgo. La importancia de los Random Forests radica en su capacidad para manejar grandes conjuntos de datos y variables, ofrecer interpretaciones claras a través de la evaluación de la importancia de las características y mantener un alto rendimiento incluso con datos faltantes o ruidosos.

PARA LOS DATOS DE ENTRENAMIENTO

# Instalar y cargar las bibliotecas necesarias
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
# Cargar el dataset
library(readxl)
data <- read_excel("C:/Users/Valeria/Downloads/train_1.xlsx")
View(data)

# Seleccionar columnas numéricas relevantes
numeric_data <- data[, c("LotArea", "YearBuilt", "FullBath", "BedroomAbvGr", "GarageCars", "SalePrice")]

# Manejar valores faltantes
numeric_data <- na.omit(numeric_data)

# Establecer una semilla para reproducibilidad
set.seed(123)

# Dividir los datos en 70% entrenamiento y 30% prueba
indice_entrenamiento <- createDataPartition(numeric_data$SalePrice, p = 0.7, list = FALSE)
datos_entrenamiento <- numeric_data[indice_entrenamiento, ]
datos_prueba <- numeric_data[-indice_entrenamiento, ]
# Definir el modelo Random Forest
modelo_rf <- randomForest(SalePrice ~ ., data = datos_entrenamiento, ntree = 100, importance = TRUE)

# Ver resumen del modelo
print(modelo_rf)
## 
## Call:
##  randomForest(formula = SalePrice ~ ., data = datos_entrenamiento,      ntree = 100, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 100
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 2043464056
##                     % Var explained: 68.13
# Predicciones en el conjunto de prueba
predicciones_prueba <- predict(modelo_rf, datos_prueba)
# Calcular métricas de evaluación
mae <- mean(abs(predicciones_prueba - datos_prueba$SalePrice))
mse <- mean((predicciones_prueba - datos_prueba$SalePrice)^2)
rmse <- sqrt(mse)
r2 <- caret::R2(predicciones_prueba, datos_prueba$SalePrice)

cat("MAE: ", mae, "\n")
## MAE:  29553.18
cat("MSE: ", mse, "\n")
## MSE:  2007572124
cat("RMSE: ", rmse, "\n")
## RMSE:  44805.94
cat("R2: ", r2, "\n")
## R2:  0.6830246
# Importancia de las características
importancia <- importance(modelo_rf)
varImpPlot(modelo_rf)

# Crear un data frame con la importancia de las variables
importancia_df <- data.frame(
  Variable = rownames(importancia),
  Importancia = importancia[, "IncNodePurity"]
)
# Graficar la importancia de las variables
ggplot(importancia_df, aes(x = reorder(Variable, Importancia), y = Importancia)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Importancia de las Variables en el Modelo Random Forest",
       x = "Variables",
       y = "Importancia (IncNodePurity)") +
  theme_minimal()

PARA LOS DATOS DE PRUEBA

# Instalar y cargar las bibliotecas necesarias
library(readxl)
library(ggplot2)
library(randomForest)
library(caret)

# Cargar el dataset
library(readxl)
data_2 <- read_excel("test_2.xlsx")
View(data_2)

# Seleccionar columnas numéricas relevantes
numeric_data <- data_2[, c("LotArea", "YearBuilt", "FullBath", "BedroomAbvGr", "GarageCars", "SalePrice")]

# Manejar valores faltantes
numeric_data <- na.omit(numeric_data)

# Establecer una semilla para reproducibilidad
set.seed(123)

# Dividir los datos en 70% entrenamiento y 30% prueba
indice_entrenamiento <- createDataPartition(numeric_data$SalePrice, p = 0.7, list = FALSE)
datos_entrenamiento <- numeric_data[indice_entrenamiento, ]
datos_prueba <- numeric_data[-indice_entrenamiento, ]
# Definir el modelo Random Forest
modelo_rf <- randomForest(SalePrice ~ ., data = datos_entrenamiento, ntree = 100, importance = TRUE)

# Ver resumen del modelo
print(modelo_rf)
## 
## Call:
##  randomForest(formula = SalePrice ~ ., data = datos_entrenamiento,      ntree = 100, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 100
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 63428357
##                     % Var explained: 77.14
# Predicciones en el conjunto de prueba
predicciones_prueba <- predict(modelo_rf, datos_prueba)

# Calcular métricas de evaluación
mae <- mean(abs(predicciones_prueba - datos_prueba$SalePrice))
mse <- mean((predicciones_prueba - datos_prueba$SalePrice)^2)
rmse <- sqrt(mse)
r2 <- caret::R2(predicciones_prueba, datos_prueba$SalePrice)

cat("MAE: ", mae, "\n")
## MAE:  4952.013
cat("MSE: ", mse, "\n")
## MSE:  44842337
cat("RMSE: ", rmse, "\n")
## RMSE:  6696.442
cat("R2: ", r2, "\n")
## R2:  0.8878068
# Importancia de las características
importancia <- importance(modelo_rf)
varImpPlot(modelo_rf)

# Crear un data frame con la importancia de las variables
importancia_df <- data.frame(
  Variable = rownames(importancia),
  Importancia = importancia[, "IncNodePurity"]
)
# Graficar la importancia de las variables
ggplot(importancia_df, aes(x = reorder(Variable, Importancia), y = Importancia)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Importancia de las Variables en el Modelo Random Forest",
       x = "Variables",
       y = "Importancia (IncNodePurity)") +
  theme_minimal()