Introducción

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.

Carga de Librerías y Datos

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

Preprocesamiento

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

Entrenamiento del Modelo k-NN

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)

Cálculo de la Curva ROC

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"

Visualización de la Curva ROC

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")

Conclusión

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.