Redes Neuronales

Una Red Neural Artificial (ANN) modela la relación entre un conjunto de entradas y una salida, resolviendo un problema de aprendizaje.

Un ejemplo de aplicación de Redes Neuronales es 1. La recomendación de contenido de Netflix. 2. El feed de Tiktok, o instagram.

1. Instalar paquetes y llamar librerías

library(neuralnet)

2. Alimentar con ejemplos

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

3. Generar Red Neuronal

red_neuronal <- neuralnet(estatus ~ examen + proyecto, data=df)
plot(red_neuronal, rep = 'best')

4. Predecir con la red neuronal

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

prediccion <- compute(red_neuronal, prueba)
prediccion$net.result 
##           [,1]
## [1,] 0.4000450
## [2,] 0.4000450
## [3,] 0.9937279
probabilidad <- prediccion$net.result
resultado <- ifelse(probabilidad>0.5,1,0)
resultado
##      [,1]
## [1,]    0
## [2,]    0
## [3,]    1

Ejercico Red Neuronal

1. Instalar paquetes y llamar librerías

library(neuralnet)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:neuralnet':
## 
##     compute
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

2. Alimentar con base de datos

data <-  read.csv("C:\\Users\\enriq\\OneDrive\\Documentos\\Datos a Desiciones\\Modulo4\\cancer_de_mama.csv")
data <- na.omit(data)

3. Asignar valores númericos a la variable dependiente

data <- data %>%
  mutate(diagnosis = ifelse(diagnosis == "M", 1, ifelse(diagnosis == "V", 0, diagnosis)))

4. Dividimos los datos en entrenamiento y prueba

inp <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
training_data <- data[inp==1, ]
test_data <- data[inp==2, ]

??neuralnet ## 5. Generar Red Neuronal

set.seed(222)
attach(data)
n <- neuralnet(diagnosis~.,
               data = training_data,
               hidden = 5,
               err.fct = "sse",
               linear.output = FALSE,
               lifesign = 'full',
               rep = 1,
               algorithm = "rprop+",
               stepmax = 500000)
## hidden: 5    thresh: 0.01    rep: 1/1    steps:    1000  min thresh: 0.811175679947158
##                                                    2000  min thresh: 0.811175679947158
##                                                    3000  min thresh: 0.811175679947158
##                                                    4000  min thresh: 0.811175679947158
##                                                    5000  min thresh: 0.811175679947158
##                                                    6000  min thresh: 0.811175679947158
##                                                    7000  min thresh: 0.811175679947158
##                                                    8000  min thresh: 0.507115381444797
##                                                    9000  min thresh: 0.189603224575751
##                                                   10000  min thresh: 0.0424275576286728
##                                                   11000  min thresh: 0.0424275576286728
##                                                   12000  min thresh: 0.0424275576286728
##                                                   13000  min thresh: 0.0424275576286728
##                                                   14000  min thresh: 0.0424275576286728
##                                                   15000  min thresh: 0.0389191946319809
##                                                   16000  min thresh: 0.0389191946319809
##                                                   17000  min thresh: 0.0389191946319809
##                                                   18000  min thresh: 0.0389191946319809
##                                                   19000  min thresh: 0.0172709087879526
##                                                   20000  min thresh: 0.0131333143677779
##                                                   21000  min thresh: 0.0131333143677779
##                                                   22000  min thresh: 0.0131333143677779
##                                                   23000  min thresh: 0.0131333143677779
##                                                   24000  min thresh: 0.0131333143677779
##                                                   25000  min thresh: 0.0131333143677779
##                                                   26000  min thresh: 0.01197042426821
##                                                   27000  min thresh: 0.0101981994588424
##                                                   28000  min thresh: 0.0101981994588424
##                                                   29000  min thresh: 0.0101981994588424
##                                                   30000  min thresh: 0.0101981994588424
##                                                   31000  min thresh: 0.0101981994588424
##                                                   32000  min thresh: 0.0101981994588424
##                                                   32525  error: 0.75057  time: 8.81 secs
plot(n, rep = 'best')

6. Cambiar las predicciones de 0 y 1 a M, V

# Obtener las predicciones como 0 o 1
output <- neuralnet::compute(n, rep = 1, test_data[, -1])
p <- output$net.result
pred <- ifelse(p >= 0.5, "M", "V")

7. Matriz de Confusión

# Asegurarse de que ambos vectores tengan la misma longitud
n <- min(length(pred), length(test_data$diagnosis))
pred <- pred[1:n]
actual <- test_data$diagnosis[1:n]

# Crear la matriz de confusión
tab <- table(pred, actual)
tab
##     actual
## pred   1   B
##    M  51   4
##    V   6 114

8. Porcentaje de error total

#Con esta operación obtenemos el porcentaje de error total (usando datos de la matrix de confusión)
1 - sum(diag(tab)) / sum(tab)
## [1] 0.05714286
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCA0LjciDQphdXRob3I6ICJFbnJpcXVlIE1vbnNpdmFpcyINCmRhdGU6ICIyMDIzLTA5LTI4Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogInplbmJ1cm4iDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KLS0tDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+IFJlZGVzIE5ldXJvbmFsZXM8L3NwYW4+DQohW10oQzpcXFVzZXJzXFxlbnJpcVxcT25lRHJpdmVcXERvY3VtZW50b3NcXERhdG9zIGEgRGVzaWNpb25lc1xcTW9kdWxvNFxccm4uZ2lmKQ0KDQpVbmEgUmVkIE5ldXJhbCBBcnRpZmljaWFsIChBTk4pIG1vZGVsYSBsYSByZWxhY2nDs24gZW50cmUgdW4gY29uanVudG8gZGUgZW50cmFkYXMgeSB1bmEgc2FsaWRhLCByZXNvbHZpZW5kbyB1biBwcm9ibGVtYSBkZSBhcHJlbmRpemFqZS4gDQoNClVuIGVqZW1wbG8gZGUgYXBsaWNhY2nDs24gZGUgUmVkZXMgTmV1cm9uYWxlcyBlcyANCjEuIExhIHJlY29tZW5kYWNpw7NuIGRlIGNvbnRlbmlkbyBkZSBOZXRmbGl4Lg0KMi4gRWwgZmVlZCBkZSBUaWt0b2ssIG8gaW5zdGFncmFtLg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij4xLiBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3J9DQpsaWJyYXJ5KG5ldXJhbG5ldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij4yLiBBbGltZW50YXIgY29uIGVqZW1wbG9zPC9zcGFuPg0KYGBge3J9DQpleGFtZW4gPC0gYygyMCwxMCwzMCwyMCw4MCwzMCkNCnByb3llY3RvIDwtIGMoOTAsMjAsNDAsNTAsNTAsODApDQplc3RhdHVzIDwtIGMoMSwwLDAsMCwxLDEpDQpkZiA8LSBkYXRhLmZyYW1lKGV4YW1lbiwgcHJveWVjdG8sIGVzdGF0dXMpDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij4zLiBHZW5lcmFyIFJlZCBOZXVyb25hbDwvc3Bhbj4NCmBgYHtyfQ0KcmVkX25ldXJvbmFsIDwtIG5ldXJhbG5ldChlc3RhdHVzIH4gZXhhbWVuICsgcHJveWVjdG8sIGRhdGE9ZGYpDQpwbG90KHJlZF9uZXVyb25hbCwgcmVwID0gJ2Jlc3QnKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogY2lhbjsiPjQuIFByZWRlY2lyIGNvbiBsYSByZWQgbmV1cm9uYWw8L3NwYW4+DQpgYGB7cn0NCnBydWViYV9leGFtZW4gPC0gYygzMCw0MCw4NSkNCnBydWViYV9wcm95ZWN0byA8LSBjKDg1LDUwLDQwKQ0KcHJ1ZWJhIDwtIGRhdGEuZnJhbWUocHJ1ZWJhX2V4YW1lbiwgcHJ1ZWJhX3Byb3llY3RvKQ0KDQpwcmVkaWNjaW9uIDwtIGNvbXB1dGUocmVkX25ldXJvbmFsLCBwcnVlYmEpDQpwcmVkaWNjaW9uJG5ldC5yZXN1bHQgDQpwcm9iYWJpbGlkYWQgPC0gcHJlZGljY2lvbiRuZXQucmVzdWx0DQpyZXN1bHRhZG8gPC0gaWZlbHNlKHByb2JhYmlsaWRhZD4wLjUsMSwwKQ0KcmVzdWx0YWRvDQpgYGANCg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkVqZXJjaWNvIFJlZCBOZXVyb25hbDwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBjaWFuOyI+MS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KbGlicmFyeShuZXVyYWxuZXQpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogY2lhbjsiPjIuIEFsaW1lbnRhciBjb24gYmFzZSBkZSBkYXRvczwvc3Bhbj4NCmBgYHtyfQ0KZGF0YSA8LSAgcmVhZC5jc3YoIkM6XFxVc2Vyc1xcZW5yaXFcXE9uZURyaXZlXFxEb2N1bWVudG9zXFxEYXRvcyBhIERlc2ljaW9uZXNcXE1vZHVsbzRcXGNhbmNlcl9kZV9tYW1hLmNzdiIpDQpkYXRhIDwtIG5hLm9taXQoZGF0YSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij4zLiBBc2lnbmFyIHZhbG9yZXMgbsO6bWVyaWNvcyBhIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlPC9zcGFuPg0KYGBge3J9DQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShkaWFnbm9zaXMgPSBpZmVsc2UoZGlhZ25vc2lzID09ICJNIiwgMSwgaWZlbHNlKGRpYWdub3NpcyA9PSAiViIsIDAsIGRpYWdub3NpcykpKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogY2lhbjsiPjQuIERpdmlkaW1vcyBsb3MgZGF0b3MgZW4gZW50cmVuYW1pZW50byB5IHBydWViYTwvc3Bhbj4NCmBgYHtyfQ0KaW5wIDwtIHNhbXBsZSgyLCBucm93KGRhdGEpLCByZXBsYWNlID0gVFJVRSwgcHJvYiA9IGMoMC43LCAwLjMpKQ0KdHJhaW5pbmdfZGF0YSA8LSBkYXRhW2lucD09MSwgXQ0KdGVzdF9kYXRhIDwtIGRhdGFbaW5wPT0yLCBdDQpgYGANCj8/bmV1cmFsbmV0DQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij41LiBHZW5lcmFyIFJlZCBOZXVyb25hbDwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMjIyKQ0KYXR0YWNoKGRhdGEpDQpuIDwtIG5ldXJhbG5ldChkaWFnbm9zaXN+LiwNCiAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbmluZ19kYXRhLA0KICAgICAgICAgICAgICAgaGlkZGVuID0gNSwNCiAgICAgICAgICAgICAgIGVyci5mY3QgPSAic3NlIiwNCiAgICAgICAgICAgICAgIGxpbmVhci5vdXRwdXQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgIGxpZmVzaWduID0gJ2Z1bGwnLA0KICAgICAgICAgICAgICAgcmVwID0gMSwNCiAgICAgICAgICAgICAgIGFsZ29yaXRobSA9ICJycHJvcCsiLA0KICAgICAgICAgICAgICAgc3RlcG1heCA9IDUwMDAwMCkNCnBsb3QobiwgcmVwID0gJ2Jlc3QnKQ0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBjaWFuOyI+Ni4gQ2FtYmlhciBsYXMgcHJlZGljY2lvbmVzIGRlIDAgeSAxIGEgTSwgVjwvc3Bhbj4NCmBgYHtyfQ0KIyBPYnRlbmVyIGxhcyBwcmVkaWNjaW9uZXMgY29tbyAwIG8gMQ0Kb3V0cHV0IDwtIG5ldXJhbG5ldDo6Y29tcHV0ZShuLCByZXAgPSAxLCB0ZXN0X2RhdGFbLCAtMV0pDQpwIDwtIG91dHB1dCRuZXQucmVzdWx0DQpwcmVkIDwtIGlmZWxzZShwID49IDAuNSwgIk0iLCAiViIpDQpgYGANCg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGNpYW47Ij43LiBNYXRyaXogZGUgQ29uZnVzacOzbjwvc3Bhbj4NCmBgYHtyfQ0KIyBBc2VndXJhcnNlIGRlIHF1ZSBhbWJvcyB2ZWN0b3JlcyB0ZW5nYW4gbGEgbWlzbWEgbG9uZ2l0dWQNCm4gPC0gbWluKGxlbmd0aChwcmVkKSwgbGVuZ3RoKHRlc3RfZGF0YSRkaWFnbm9zaXMpKQ0KcHJlZCA8LSBwcmVkWzE6bl0NCmFjdHVhbCA8LSB0ZXN0X2RhdGEkZGlhZ25vc2lzWzE6bl0NCg0KIyBDcmVhciBsYSBtYXRyaXogZGUgY29uZnVzacOzbg0KdGFiIDwtIHRhYmxlKHByZWQsIGFjdHVhbCkNCnRhYg0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBjaWFuOyI+OC4gUG9yY2VudGFqZSBkZSBlcnJvciB0b3RhbDwvc3Bhbj4NCmBgYHtyfQ0KI0NvbiBlc3RhIG9wZXJhY2nDs24gb2J0ZW5lbW9zIGVsIHBvcmNlbnRhamUgZGUgZXJyb3IgdG90YWwgKHVzYW5kbyBkYXRvcyBkZSBsYSBtYXRyaXggZGUgY29uZnVzacOzbikNCjEgLSBzdW0oZGlhZyh0YWIpKSAvIHN1bSh0YWIpDQpgYGANCg0K