I. Ejercicio: Aplica el clasificador SVM a la base de datos Propietarios.
# Cargar la base
library("readr")
data <- read_csv("Propietarios.csv")
str(data)
## spc_tbl_ [24 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Hogar : num [1:24] 1 2 3 4 5 6 7 8 9 10 ...
## $ Ingreso: num [1:24] 60 85.5 64.8 61.5 87 ...
## $ Tamaño : num [1:24] 18.4 16.8 21.6 20.8 23.6 19.2 17.6 22.4 20 20.8 ...
## $ Clase : chr [1:24] "Propietario" "Propietario" "Propietario" "Propietario" ...
## - attr(*, "spec")=
## .. cols(
## .. Hogar = col_double(),
## .. Ingreso = col_double(),
## .. Tamaño = col_double(),
## .. Clase = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
Observamos la base de datos y convertimos la variable dependiente (Clase) en factor.
# Transformamos a factor
data$Clase <- as.factor(data$Clase)
Con un muestreo aleatorio, separamos el conjunto de entrenamiento y el de prueba. Elegimos 5 grupos, 4 de entrenamiento y 1 de prueba.
set.seed(2025)
library(caret)
# Crear los folds para validación cruzada
folds <- createFolds(data$Clase, k = 5)
# Dividir en conjunto de entrenamiento y prueba
entrenamiento <- data[-folds[[5]], ]
prueba <- data[folds[[5]], ]
Separamos las etiquetas de nuestro conjunto de entrenamiento y prueba.
entrenamiento_labels <- data$Clase[-folds[[5]]]
prueba_labels <- data$Clase[folds[[5]]]
Para este ejemplo, no es necesario estandarizar los datos, por lo cual aplicamos directamente el método de clasificación SVM con kernel radial. Este tipo de kernel es ideal tanto para datos lineales como no lineales, ya que permite al modelo encontrar límites de decisión más flexibles. Tras ajustar los parámetros, se identificaron las combinaciones de cost y gamma que ofrecen el mejor rendimiento.
library(e1071)
set.seed(1234)
svm_vc <- tune("svm", Clase ~ Ingreso + Tamaño, data = data, kernel = "radial",
ranges = list(cost = c(0.001, 0.01, 0.1, 1, 5, 10, 20),
gamma = c(0.5, 1, 2, 3, 4, 5, 10)))
svm_vc$best.parameters
## cost gamma
## 4 1 0.5
# Guardar los parámetros óptimos
best_cost <- svm_vc$best.parameters$cost
best_gamma <- svm_vc$best.parameters$gamma
Luego de aplicar el método de clasificación SVM con kernel radial, se identificaron como parámetros óptimos un cost de 1 y un gamma de 0.5.
Para evaluar la estabilidad y el desempeño general del modelo, se aplicará una validación cruzada de 5 folds. Además, la exactitud del modelo se calculará para cada fold y se obtendrá un promedio para medir su rendimiento global
# Guardar la exactitud de cada fold
exactitud <- numeric(length = 5)
for(i in 1:5){
# Definir conjuntos entrenamiento y prueba según el fold actual
prueba <- data[folds[[i]],]
entrenamiento <- data[-folds[[i]],]
# Etiquetas
entrenamiento_labels <- data$Clase[-folds[[i]]]
prueba_labels <- data$Clase[folds[[i]]]
# Ajustar el modelo SVM con los parámetros óptimos
svm_model <- svm(Clase ~ Ingreso + Tamaño, data = entrenamiento, kernel = "radial", cost = best_cost, gamma = best_gamma)
# Realizar predicciones en el conjunto de prueba
pred_svm <- predict(svm_model, prueba)
# Evaluar exactitud del modelo en cada fold
cm <- confusionMatrix(pred_svm, prueba_labels)
exactitud[i] <- cm$overall["Accuracy"]
# Mostrar resultado del fold
cat("Fold", i, "- Exactitud:", exactitud[i], "\n")
}
## Fold 1 - Exactitud: 0.75
## Fold 2 - Exactitud: 1
## Fold 3 - Exactitud: 0.8
## Fold 4 - Exactitud: 0.8
## Fold 5 - Exactitud: 0.6666667
# Resultado final: Promedio de la exactitud
cat("Exactitud promedio del modelo:", mean(exactitud), "\n")
## Exactitud promedio del modelo: 0.8033333
Tras aplicar la validación cruzada de 5 folds, el modelo SVM fue evaluado en cinco particiones diferentes de los datos. La exactitud obtenida en cada fold varió entre 0.66 y 1.00.
El promedio de exactitud alcanzado fue de 0.80, lo cual indica que, en general, el clasificador logra predecir correctamente alrededor del 80% de los casos. Este resultado sugiere que el modelo tiene un buen desempeño, aunque también muestra cierta variabilidad dependiendo de la muestra utilizada en cada fold.
# Ajustar el modelo final con los parámetros óptimos
mejor_modelo <- svm(Clase ~ Ingreso + Tamaño, data = data, kernel = "radial", cost = best_cost, gamma = best_gamma)
# Predicciones sobre el conjunto de prueba con el modelo final
pred2 <- predict(object = mejor_modelo, data)
# Matriz de confusión para los datos de prueba
MC2 <- table(pred2, data$Clase)
print(MC2)
##
## pred2 No propietario Propietario
## No propietario 9 1
## Propietario 3 11
El modelo SVM presentó una tasa de aciertos del 83% en el conjunto de prueba, lo que indica que acertó el 83% de las predicciones realizadas. Este resultado es ligeramente superior al promedio de 80% obtenido durante la validación cruzada de 5 folds. La matriz de confusión muestra que el modelo fue bastante preciso en la clasificación, con 9 verdaderos negativos y 11 verdaderos positivos, lo que significa que identificó correctamente tanto a los ‘No propietarios’ como a los ‘Propietarios’ en la mayoría de los casos. Sin embargo, también cometió 3 falsos negativos y 1 falso positivo, lo que sugiere que hubo algunos errores al clasificar a los ‘Propietarios’ como ‘No propietarios’ y viceversa. En general, el desempeño del modelo es bastante bueno y muestra un comportamiento consistente.