Crear un proyecto completo de redes neuronales para la clasificación de imágenes radiográficas de pacientes con tuberculosis en diferentes estadios implica varios pasos, desde la carga y procesamiento de datos hasta la construcción y evaluación del modelo. Aquí se proporciona una guía general sobre cómo podría estructurar este proyecto en R.

Paso 1: Instalar y Cargar Paquetes Necesarios

Aquí instalas y cargas el paquete neuralnet, que se utilizará para crear y entrenar la red neuronal.

knitr::opts_chunk$set(echo = TRUE)
#install.packages("neuralnet")
library(neuralnet)
## Warning: package 'neuralnet' was built under R version 4.3.2

Paso 2: Preparar Datos Simulados

En lugar de trabajar con imágenes reales, utilizaremos un conjunto de datos simulado. Este conjunto de datos representará características numéricas extraídas de las imágenes, que podrían ser, por ejemplo, medidas estadísticas de las imágenes.

# Crear un conjunto de datos simulado
set.seed(123)
n <- 100  # Número de observaciones
p <- 10   # Número de características
X <- matrix(rnorm(n * p), nrow = n, ncol = p)
y <- ifelse(rowSums(X) + rnorm(n) > 0, 1, 0)  # Variable de respuesta binaria

# Dividir en conjunto de entrenamiento y prueba
train_index <- sample(1:n, size = 0.8 * n)
X_train <- X[train_index, ]
y_train <- y[train_index]
X_test <- X[-train_index, ]
y_test <- y[-train_index]

Paso 3: Construir el Modelo de Red Neuronal

Construye una red neuronal básica utilizando neuralnet:

# Entrenar el modelo
nn_model <- neuralnet(y_train ~ ., data = data.frame(y_train, X_train), hidden = c(5), linear.output = FALSE)

Paso 4: Evaluar el Modelo Evaluar el modelo en el conjunto de prueba

# Predecir en el conjunto de prueba
nn_predictions <- compute(nn_model, X_test)$net.result
nn_predictions <- ifelse(nn_predictions > 0.5, 1, 0)

# Matriz de Confusión:  Muestra el número de predicciones correctas e incorrectas.
caret::confusionMatrix(factor(nn_predictions), factor(y_test))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction 0 1
##          0 7 0
##          1 4 9
##                                           
##                Accuracy : 0.8             
##                  95% CI : (0.5634, 0.9427)
##     No Information Rate : 0.55            
##     P-Value [Acc > NIR] : 0.01886         
##                                           
##                   Kappa : 0.6117          
##                                           
##  Mcnemar's Test P-Value : 0.13361         
##                                           
##             Sensitivity : 0.6364          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.6923          
##              Prevalence : 0.5500          
##          Detection Rate : 0.3500          
##    Detection Prevalence : 0.3500          
##       Balanced Accuracy : 0.8182          
##                                           
##        'Positive' Class : 0               
## 
# Curva ROC: Representa la capacidad del modelo para distinguir entre clases
pred_prob <- compute(nn_model, X_test)$net.result
pROC::roc(y_test, pred_prob)
## Setting levels: control = 0, case = 1
## Warning in roc.default(y_test, pred_prob): Deprecated use a matrix as
## predictor. Unexpected results may be produced, please pass a numeric vector.
## Setting direction: controls < cases
## 
## Call:
## roc.default(response = y_test, predictor = pred_prob)
## 
## Data: pred_prob in 11 controls (y_test 0) < 9 cases (y_test 1).
## Area under the curve: 0.9091

Interpretemos los resultados de la evaluacion del modelo:

  1. Matriz de Confusión:
    • Verdaderos Positivos (TP): 9
    • Verdaderos Negativos (TN): 7
    • Falsos Positivos (FP): 0
    • Falsos Negativos (FN): 4
  2. Precisión (Accuracy): La precisión del modelo es del 80%, lo que significa que el 80% de las predicciones son correctas.
  3. Intervalo de Confianza del 95% (95% CI): El intervalo de confianza del 95% para la precisión se encuentra entre 0.5634 y 0.9427.
  4. Tasa de Verdaderos Positivos (Sensibilidad): La sensibilidad del modelo es del 63.64%, lo que indica la capacidad del modelo para identificar correctamente los casos positivos.
  5. Tasa de Verdaderos Negativos (Especificidad): La especificidad del modelo es del 100%, lo que indica que el modelo identifica correctamente todos los casos negativos.
  6. Valor Predictivo Positivo (Pos Pred Value): El valor predictivo positivo es del 100%, lo que significa que todas las predicciones positivas son correctas.
  7. Valor Predictivo Negativo (Neg Pred Value): El valor predictivo negativo es del 69.23%, lo que indica la proporción de predicciones negativas correctas.
  8. Tasa de Prevalencia (Prevalence): La tasa de prevalencia en el conjunto de datos es del 55%, lo que representa la proporción de casos positivos en el conjunto de datos.
  9. Tasa de Detección (Detection Rate): La tasa de detección es del 35%, lo que representa la proporción de casos positivos detectados por el modelo.
  10. Tasa de Detección de Prevalencia (Detection Prevalence): La tasa de detección de prevalencia es del 35%, lo que representa la proporción de casos positivos detectados en relación con la tasa de prevalencia.
  11. Coeficiente Kappa (Kappa): El coeficiente Kappa mide la concordancia entre las predicciones del modelo y los resultados reales. En este caso, es de 0.6117, lo que sugiere una concordancia moderada.
  12. Área bajo la Curva ROC (AUC-ROC): El AUC-ROC es 0.9091, lo que indica una buena capacidad del modelo para distinguir entre las dos clases. Cuanto más cercano esté el valor a 1, mejor será el rendimiento del modelo.

Paso 5: Graficar el modelo

plot(nn_model)

Consideraciones Adicionales

Limitaciones para Imágenes: neuralnet no es adecuado para el procesamiento de imágenes de alta dimensión, y este ejemplo es altamente simplificado.

Preprocesamiento de Imágenes: En un escenario real, se requeriría un paso de preprocesamiento para extraer características relevantes de las imágenes de RX antes de usar neuralnet.

Exploración de Alternativas: Para un análisis de imágenes médicas, se recomendaría explorar herramientas en Python o utilizar servicios especializados en aprendizaje profundo.