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
# install.packages("neuralnet")
library(neuralnet)
set.seed(123)
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)
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)
# 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