Teoría

Una Red Neuronal Artificial (ANN) modela una realcion entre un conjunto de entradas y salidas, resolviendo un rpblema de aprendizje.

Ejemplos practicos de la aplicación de Redes Neuronales son

Instalación de paquetes y llamar librerías

# install.packages("neuralnet")
library(neuralnet)
set.seed(123)

Alimentar con ejemploss

examen <- c(20,10,30,20,80,30)
proyecto <- c(90,20,40,50,50,80)
estatus <- c(1,0,0,0,0,1)
df <- data.frame(examen,proyecto,estatus)

Generar Red Neuronal

red_neuronal <- neuralnet(estatus~., data=df)
plot(red_neuronal, rep="best")

# Crear datos de prueba
prueba_examen <- c(30,40,85)
prueba_proyecto <- c(85,50,40)
prueba <- data.frame(prueba_examen, prueba_proyecto)

modelo <- neuralnet(estatus ~ examen + proyecto,
                    data = df,
                    hidden = 2,          # 2 neuronas ocultas
                    linear.output = FALSE)

plot(modelo, rep="best")

# Ahora sí, usar tus datos de prueba
prueba_examen <- c(30,40,85)
prueba_proyecto <- c(85,50,40)
prueba <- data.frame(examen = prueba_examen, proyecto = prueba_proyecto)

# Hacer predicciones
prediccion <- compute(modelo, prueba)

# Revisar resultados en probabilidad
prediccion$net.result
##           [,1]
## [1,] 0.3341435
## [2,] 0.3341435
## [3,] 0.3341434
# Convertir con umbral 0.5
probabilidad <- prediccion$net.result
resultado <- ifelse(probabilidad > 0.5, 1, 0)
resultado
##      [,1]
## [1,]    0
## [2,]    0
## [3,]    0
df <- read.csv("/Users/mariajoseflores/Downloads/cancer_de_mama.csv", stringsAsFactors = FALSE)

# Convertir diagnosis a 0/1 → M=1, B=0
df$diagnosis <- ifelse(df$diagnosis == "M", 1, 0)

Generar Red Neuronal

# install.packages("neuralnet")
library(neuralnet)

set.seed(123)

# --- 1) Selección de columnas y limpieza ---
cols <- c("diagnosis","radius_mean","texture_mean","perimeter_mean","area_mean","smoothness_mean")
df_nn <- na.omit(df[ , cols])

# Asegurar que la variable objetivo sea 0/1 numérica
# Edita los niveles según tu dataset ("M"/"B", "Malignant"/"Benign", etc.)
if (is.character(df_nn$diagnosis) || is.factor(df_nn$diagnosis)) {
  df_nn$diagnosis <- ifelse(df_nn$diagnosis %in% c("M","Malignant","1"), 1, 0)
}
df_nn$diagnosis <- as.numeric(df_nn$diagnosis)

# --- 2) Escalado de predictores (0-1) para estabilidad del entrenamiento ---
rng01 <- function(x) (x - min(x)) / (max(x) - min(x))
Xcols <- setdiff(cols, "diagnosis")
df_nn[ , Xcols] <- lapply(df_nn[ , Xcols], rng01)

# (Opcional) Partición train/test
n <- nrow(df_nn)
idx <- sample(seq_len(n), size = floor(0.8*n))
train <- df_nn[idx, ]
test  <- df_nn[-idx, ]

# --- 3) Entrenamiento con hiperparámetros más tolerantes ---
# Tips para evitar "did not converge":
# - reducir tamaño de la red (p.ej. hidden = c(4) o c(5,3) si ya escala)
# - aumentar stepmax
# - usar algorithm = "rprop+" (resilient backprop)
# - subir threshold (criterio de parada) ligeramente
formula_nn <- diagnosis ~ radius_mean + texture_mean + perimeter_mean + area_mean + smoothness_mean

red_neuronal <- neuralnet(
  formula = formula_nn,
  data = train,
  hidden = c(4),              # empieza simple; luego puedes probar c(5,3)
  act.fct = "logistic",
  linear.output = FALSE,
  algorithm = "rprop+",
  stepmax = 5e6,
  threshold = 0.05,
  lifesign = "minimal",
  rep = 3
)
## hidden: 4    thresh: 0.05    rep: 1/3    steps:     277  error: 10.13928 time: 0.02 secs
## hidden: 4    thresh: 0.05    rep: 2/3    steps:     230  error: 10.31412 time: 0.02 secs
## hidden: 4    thresh: 0.05    rep: 3/3    steps:     323  error: 10.20643 time: 0.02 secs
# --- 4) Graficar solo si hay pesos (convergió al menos una réplica) ---
convergio <- length(red_neuronal$weights) > 0 &&
             length(red_neuronal$weights[[1]]) > 0 &&
             all(!sapply(red_neuronal$weights[[1]], is.null))

if (convergio) {
  plot(red_neuronal, rep = which.min(red_neuronal$result.matrix["error", ]))
} else {
  message("La red no convergió. Ajusta hidden/stepmax/threshold o verifica datos.")
}

# --- 5) Predicción y umbral ---
if (convergio) {
  pred_prob <- compute(red_neuronal, test[ , Xcols])$net.result
  pred_clas <- ifelse(pred_prob > 0.5, 1, 0)

  # Métrica rápida (si tienes test$diagnosis)
  if (nrow(test) > 0) {
    acc <- mean(pred_clas == test$diagnosis)
    cat(sprintf("\nAccuracy test: %.3f\n", acc))
  }

  # Ver predicciones de ejemplo
  head(data.frame(prob = pred_prob, pred = pred_clas))
}
## 
## Accuracy test: 0.930
##         prob pred
## 1  0.9683749    1
## 9  0.9697277    1
## 15 0.9374889    1
## 17 0.6831005    1
## 18 0.9956391    1
## 28 0.9959247    1
# Crear datos de prueba (ejemplo con 3 pacientes)
prueba <- data.frame(
  radius_mean      = c(14.5, 20.1, 10.3),
  texture_mean     = c(20.2, 12.5, 18.4),
  perimeter_mean   = c(88.5, 130.1, 70.4),
  area_mean        = c(520, 1250, 320),
  smoothness_mean  = c(0.10, 0.09, 0.12)
)

# Predicciones
prediccion <- compute(red_neuronal, prueba)
probabilidad <- as.vector(prediccion$net.result)
resultado <- ifelse(probabilidad > 0.5, 1, 0)

# Mostrar resultados
data.frame(prueba, probabilidad, resultado)
##   radius_mean texture_mean perimeter_mean area_mean smoothness_mean
## 1        14.5         20.2           88.5       520            0.10
## 2        20.1         12.5          130.1      1250            0.09
## 3        10.3         18.4           70.4       320            0.12
##   probabilidad resultado
## 1    0.9999962         1
## 2    0.9999962         1
## 3    0.9999962         1