La curva ROC (Receiver Operating Characteristic) se utiliza para
evaluar el rendimiento de modelos de clasificación. En este caso,
aplicaremos la curva ROC al modelo k-Nearest Neighbors
(k-NN) utilizando el conjunto de datos iris.
Cargamos las librerías necesarias y el conjunto de datos Iris:
# Librerías necesarias
library(class)
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(caret)
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
# Cargar datos
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
Convertimos las etiquetas de las clases en un formato binario para simplificar el cálculo de la curva ROC (clasificación binaria).
# Convertir la variable Species en un problema binario (Setosa vs. No Setosa)
iris$BinarySpecies <- ifelse(iris$Species == "setosa", 1, 0)
table(iris$BinarySpecies)
##
## 0 1
## 100 50
Dividimos los datos en conjuntos de entrenamiento y prueba:
set.seed(2024)
trainIndex <- createDataPartition(iris$BinarySpecies, p = 0.7, list = FALSE)
trainData <- iris[trainIndex, ]
testData <- iris[-trainIndex, ]
# Características y etiquetas
x_train <- trainData[, 1:4]
y_train <- trainData$BinarySpecies
x_test <- testData[, 1:4]
y_test <- testData$BinarySpecies
Entrenamos un modelo k-NN con k=3:
# Entrenamiento k-NN
knn_model <- knn(train = x_train, test = x_test, cl = y_train, k = 3, prob = TRUE)
Calculamos la curva ROC y el área bajo la curva (AUC):
# Probabilidades para el cálculo de la curva ROC
knn_probs <- attr(knn_model, "prob")
knn_probs <- ifelse(knn_model == 1, knn_probs, 1 - knn_probs)
# Curva ROC
roc_curve <- roc(y_test, knn_probs)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc_value <- auc(roc_curve)
# Mostrar resultados
print(roc_curve)
##
## Call:
## roc.default(response = y_test, predictor = knn_probs)
##
## Data: knn_probs in 30 controls (y_test 0) < 15 cases (y_test 1).
## Area under the curve: 1
print(paste("AUC:", auc_value))
## [1] "AUC: 1"
Generamos la gráfica de la curva ROC:
# Gráfica de la curva ROC
plot(roc_curve, main = "Curva ROC para k-NN (Setosa vs. No Setosa)", col = "blue", lwd = 2)
abline(a = 0, b = 1, col = "red", lty = 2) # Línea aleatoria
text(0.6, 0.4, paste("AUC =", round(auc_value, 2)), col = "black")
La curva ROC y el área bajo la curva (AUC) muestran la capacidad del modelo k-NN para distinguir entre las clases. Un AUC cercano a 1 indica un excelente rendimiento del modelo, mientras que valores cercanos a 0.5 sugieren un rendimiento similar al azar.