Last active
December 9, 2024 03:14
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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