¿Qué es? Una red neuronal es un modelo computacional inspirado en la estructura y el funcionamiento del cerebro humano. Está compuesta por unidades llamadas neuronas artificiales o nodos, que están organizadas en capas interconectadas. Estas capas incluyen una capa de entrada, una o más capas ocultas y una capa de salida. Cada conexión entre nodos tiene un peso asociado que modifica la información que se transmite a través de la red.



La primera capa de la red neuronal (color verde) se conoce como capa de entrada o input layer y recibe los datos en bruto, es decir, el valor de los predictores. La capa intermedia (color azul), conocida como capa oculta o hidden layer, recibe los valores de la capa de entrada, ponderados por los pesos (flechas grises). La última capa, llamada output layer, combina los valores que salen de la capa intermedia para generar la predicción.


El funcionamiento de una red neuronal se basa en el aprendizaje a partir de ejemplos. Durante la fase de entrenamiento, la red ajusta los pesos de las conexiones para minimizar la diferencia entre las salidas predichas y las salidas deseadas. Una vez entrenada, la red puede generalizar y realizar predicciones o clasificaciones para datos no vistos previamente.



La capa de entrada y salida son sencillas de establecer. La capa de entrada tiene tantas neuronas como predictores y la capa de salida tiene una neurona en problemas de regresión y tantas como clases en problemas de clasificación. En la mayoría de implementaciones, estos valores se establecen automáticamente en función del conjunto de entrenamiento. El usuario suele especificar únicamente el número de capas intermedias (ocultas) y el tamaño de las mismas.


Funcionamiento del Perceptrón





Función de activación
La función de activación determina la forma en que la neurona procesa la información y cómo se propaga la información a través de la red .

Las funciones de activación se utilizan para agregar no linealidad a las redes neuronales. Las redes neuronales lineales son incapaces de aprender funciones complejas, pero las funciones de activación no lineales permiten a las redes neuronales aprender funciones más complejas.


Función escalón: La función escalón es una función simple que toma el valor de 1 si la entrada es mayor o igual a un umbral, y 0 si la entrada es menor que el umbral.

Función sigmoide: La función sigmoide es una función en forma de S que toma valores entre 0 y 1.

Función tangente hiperbólica: La función tangente hiperbólica es una función en forma de S que toma valores entre -1 y 1.


Función ReLU: La función ReLU es una función que toma el valor de la entrada si la entrada es positiva, y 0 si la entrada es negativa.



Ventajas de las Redes Neuronales:
- Aprendizaje: Capacidad para aprender a través de una etapa de aprendizaje.
- Autoorganización: Creación propia de representaciones de información.
- Tolerancia a fallos: Almacena información de forma redundante para responder incluso con daños parciales.
- Flexibilidad: Puede manejar cambios no importantes en la información de entrada.
- Tiempo real: Estructura paralela permite respuestas en tiempo real.

Uso y Futuro:
- Ideales como clasificadores y reconocedores de patrones.
- Capacidad para manejar excepciones y datos anormales.
- Potencial para avanzar según progresen en la neurociencia.

Desventajas de las Redes Neuronales:
- Complejidad de aprendizaje: Aumenta para tareas más grandes.
- Tiempo de aprendizaje elevado: Dependiente de la cantidad de patrones y flexibilidad requerida.
- Falta de interpretación automática: La red no interpreta por sí misma la salida.
- Elevada cantidad de datos para entrenamiento: Requiere más información para flexibilidad.
- Falta de reglas definitorias: Problemas en la definición de redes para ciertos problemas.


EJEMPLO

#install.packages("neuralnet")
#install.packages("caTools")
#install.packages("NeuralNetTools")
#install.packages("pROC")

library(neuralnet)
## Warning: package 'neuralnet' was built under R version 4.3.2
library(caTools)
library(NeuralNetTools)
## Warning: package 'NeuralNetTools' was built under R version 4.3.2
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.2
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
dataset <- datasets::mtcars
dataset_sc <- as.data.frame(cbind(dataset$am, scale(dataset[ ,c(1:8,10,11)])))
names(dataset_sc)[1] = "am"

set.seed(6)
sample <- sample.split(dataset_sc$am, SplitRatio = 0.70)
train <- subset(dataset_sc, sample == TRUE)
test <- subset(dataset_sc, sample == FALSE)

model.net = neuralnet(
  formula = am ~ .,
  data = train,
  hidden = c(5,5),
  stepmax = 1e+5,
  linear.output = TRUE,
  act.fct = "logistic",
)

data_pred = compute(model.net, test)$net.result

test_df = as.data.frame(cbind(round(data_pred), test$am))

plotnet(model.net)

#MATRIZ DE CONFUSIÓN

confusion_matrix <- table(test_df$V1, test_df$V2)
   print(confusion_matrix)
##    
##     0 1
##   0 6 0
##   1 0 4
sensibilidad <- confusion_matrix[2, 2] / sum(confusion_matrix[2, ])

especificidad <- confusion_matrix[1, 1] / sum(confusion_matrix[1, ])

print(paste("Sensibilidad = ",sensibilidad*100,"%"))
## [1] "Sensibilidad =  100 %"
print(paste("Especificidad = ", especificidad*100,"%"))
## [1] "Especificidad =  100 %"
curva_roc <- roc(test_df$V2, test_df$V1)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(curva_roc)