Skip to content

Instantly share code, notes, and snippets.

@cgustav
Last active December 9, 2024 03:14
Show Gist options
  • Save cgustav/bf7aa304e4f5c31ad42237612bac4a3a to your computer and use it in GitHub Desktop.
Save cgustav/bf7aa304e4f5c31ad42237612bac4a3a to your computer and use it in GitHub Desktop.
Script guía para implementar un modelo de Machine Learning mediante un algoritmo de aprendizaje supervisado en R basado en el dataset IRIS
# SOBRE IRIS
# El dataset Iris es un conjunto de datos clásico utilizado
# en aprendizaje automático y estadística. Contiene 150 observaciones
# de tres especies de flores (setosa, versicolor, virginica), con cuatro
# características numéricas: longitud y ancho de sépalo y pétalo.
# Su objetivo es clasificar las flores según su especie. Es balanceado,
# pequeño y fácil de entender, ideal para practicar algoritmos de
# clasificación y visualización de datos.
# Sobre KNN
# K-Nearest Neighbors (KNN) es un algoritmo de aprendizaje supervisado
# utilizado principalmente para problemas de clasificación y regresión.
# Es intuitivo, sencillo y funciona basado en la similitud entre datos.
# ---------------
# Instalación y carga de paquetes necesarios
if (!requireNamespace("caret", quietly = TRUE)) install.packages("caret")
if (!requireNamespace("ISLR", quietly = TRUE)) install.packages("ISLR")
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
library(caret)
library(ISLR)
library(ggplot2)
# 1. Cargar el dataset "IRIS" y preparar los datos
data(iris)
# 2. Dividir el dataset en 50% para entrenamiento y 50% para testing
set.seed(400) # Semilla para reproducibilidad
trainIndex <- createDataPartition(iris$Sepal.Length, p = 0.5, list = FALSE)
trainData <- iris[trainIndex, ]
testData <- iris[-trainIndex, ]
# 3. Preprocesamiento: Escalado y centrado
# Definir la receta de preprocesamiento
preProc <- preProcess(trainData[, -7], method = c("center", "scale"))
trainData[, -7] <- predict(preProc, trainData[, -7])
testData[, -7] <- predict(preProc, testData[, -7])
# 4. Encontrar el valor óptimo de K utilizando validación cruzada
# Validacion cruzada mediante trainControl
set.seed(400) # Semilla para reproducibilidad
# Validación cruzada 7-fold, mediante el metodo cvrepeated,
# con 3 repeticiones.
#
# - Configura cómo se va a dividir el conjunto de entrenamiento
# para validar el modelo durante el proceso de ajuste.
# - repeatedcv inidica que se utilizará un método de validación
# cruzada repetida
# - En la validación cruzada (CV) los datos se dividen en varias
# partes tambien llamadas folds (7). En cada iteración uno de
# esos folds se utiliza para la validación.
# - Este enfoque se repite varias veces (3) para reducir la variabilidad
# causadas pro como se dividen los datos.
# Primera iteracion
# se dividen los datos en 7 folds, se entrena el modelo 7 veces
# utilizando 6 grupos para entrenar y 1 para validar, rotando cada grupo
# Segunda iteración
# Se vuelve a dividir en 7 grupos (aleatorios), repite el proceso anterior
# Tercera iteracion
# Se repite nuevamente con otras divisiones
control <- trainControl(method = "repeatedcv", number = 7, repeats = 3)
# Genera una secuencia de números impares desde 1 hasta 20
# (1, 3, 5, ..., 19). Estos son los valores de k que el
# modelo probará.
knnGrid <- expand.grid(k = seq(1, 20, by = 2)) # Probar K de 1 a 20
# Entrenamos el modelo KNN buscando el mejor K (tuneLength especifica el rango de K)
knnTuning <- train(
Species ~ .,
data = trainData,
method = "knn",
trControl = control,
tuneGrid = knnGrid
)
# Visualizar los resultados del ajuste
print(knnTuning)
# k Accuracy Kappa
# 1 0.9296537 0.8933739
# 3 0.9212843 0.8808017
# 5 0.9300144 0.8939691
# 7 0.9344156 0.9002283
# 9 0.9430736 0.9134956
# 11 0.9466089 0.9191411
# 13 0.9465368 0.9191519
# 15 0.9425685 0.9131995
# 17 0.8865801 0.8289902
# 19 0.8901154 0.8343862
# Graficar los resultados del ajuste
plot(knnTuning)
# Extraer el valor óptimo de K
bestK <- knnTuning$bestTune$k
cat("El valor óptimo de K es:", bestK, "\n")
# K optimo = 11
# 5. Entrenar el modelo final utilizando el valor óptimo de K
finalKnnModel <- train(
Species ~ .,
data = trainData,
method = "knn",
trControl = control,
tuneGrid = data.frame(k = bestK) # Solo entrenar con el mejor K
)
# Resumen del modelo final
print(finalKnnModel)
# Conclusiones de entrenamiento
# -----------------------------
# Precisión (Accuracy): 94.36%
# El modelo clasifica correctamente la mayoría de las muestras,
# mostrando un desempeño excelente.
# Kappa: 0.9152
# Indica un acuerdo casi perfecto entre las predicciones y las
# observaciones reales, ajustado por el azar.
# El modelo KNN con k = 11 tiene un rendimiento sobresaliente,
# capturando patrones significativos en los datos y clasificando
# con alta precisión las tres clases (setosa, versicolor, virginica).
# 6. Predecir las etiquetas en el conjunto de prueba
predictions <- predict(finalKnnModel, newdata = testData)
print(predictions)
# Predictions result:
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [10] setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [19] setosa setosa setosa setosa setosa setosa versicolor versicolor versicolor
# [28] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
# [37] versicolor versicolor versicolor virginica versicolor versicolor versicolor versicolor versicolor
# [46] versicolor versicolor versicolor virginica virginica virginica versicolor virginica virginica
# [55] virginica virginica virginica virginica virginica virginica virginica virginica virginica
# [64] virginica virginica virginica virginica virginica virginica virginica virginica virginica
# [73] virginica
# 7. Crear una matriz de confusión
confMat <- confusionMatrix(predictions, testData$Species)
print(confMat)
# 8. Interpretación de la matriz de confusión
# Confusion Matrix and Statistics (IRIS)
#
# Reference
# Prediction setosa versicolor virginica
# setosa 24 0 0
# versicolor 0 23 1
# virginica 0 1 24
#
# Overall Statistics
#
# Accuracy : 0.9726
# 95% CI : (0.9045, 0.9967)
# No Information Rate : 0.3425
# P-Value [Acc > NIR] : < 2.2e-16
#
# Kappa : 0.9589
#
# Mcnemar's Test P-Value : NA
#
# Statistics by Class:
#
# Class: setosa Class: versicolor Class: virginica
# Sensitivity 1.0000 0.9583 0.9600
# Specificity 1.0000 0.9796 0.9792
# Pos Pred Value 1.0000 0.9583 0.9600
# Neg Pred Value 1.0000 0.9796 0.9792
# Prevalence 0.3288 0.3288 0.3425
# Detection Rate 0.3288 0.3151 0.3288
# Detection Prevalence 0.3288 0.3288 0.3425
# Balanced Accuracy 1.0000 0.9690 0.9696
# El modelo tiene un desempeño sobresaliente, con ligeros errores
# entre versicolor y virginica, pero es altamente confiable para
# clasificar el dataset iris.
# Precisión global (Accuracy): 97.26%
# El modelo clasificó correctamente el 97.26% de las observaciones.
# Kappa: 0.9589
# Excelente acuerdo ajustado por azar, cercano a 1.
# Donde
# 1: Concordancia perfecta entre predicciones y valores reales.
# 0: Concordancia esperada por azar (sin valor predictivo).
# Negativo: Rendimiento peor que el azar.
# Este valor indica que el modelo predice las etiquetas con una
# concordancia muy alta y que casi todos los errores están
# explicados únicamente por variaciones aleatorias,
# no por fallos sistemáticos.
# Comentario adicional:
# El valor de K óptimo se determina como aquel que maximiza la precisión promedio
# durante la validación cruzada. Esto asegura que el modelo sea robusto y generalice bien
# en datos no vistos.
# El nivel de precisión y la correlación en los resultados de predicción
# son optimos para ser utilizados en investigaciones publicaciones
# científicas
# -----------------------
# Extra
# HEATMAP Matriz de confusión
# -----------------------
# Comentario:
# Este gráfico ayuda a identificar visualmente los errores de predicción entre clases,
# destacando con mayor intensidad las predicciones correctas (diagonal).
# Crear un dataframe para graficar la matriz de confusión
confMatrixData <- as.data.frame(as.table(confMat$table))
colnames(confMatrixData) <- c("Prediction", "Reference", "Freq")
# Crear el heatmap de la matriz de confusión
confusionHeatmap <- ggplot(data = confMatrixData, aes(x = Reference, y = Prediction)) +
geom_tile(aes(fill = Freq), color = "white") + # Heatmap con frecuencia
geom_text(aes(label = Freq), vjust = 1.5) + # Añadir etiquetas con valores
scale_fill_gradient(low = "lightblue", high = "blue") + # Escala de color
labs(
title = "Confusion Matrix Heatmap",
x = "Actual Class",
y = "Predicted Class",
fill = "Frequency"
) +
theme_minimal()
# Mostrar el gráfico
print(confusionHeatmap)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment