En el siguiente artículo se darán a conocer los pasos para poder crear una red neuronal y un modelo de Árbol en rStudio. Se utilizaran diferentes librerías para que el contenido pueda ser ilustrativo y entendible. De esta manera, se podrá generar estos procesos de una forma más sencilla y óptima.
A continuación se darán definiciones de lo que son Redes Neuronales y Modelo de Árbol.
#MODELO DE ARBOL
El árbol de decisión o de clasificación es una representación visual de la manera en que se estructuran las decisiones que dan lugar a la clasificación. El árbol de clasificación lo componen una serie de nodos internos y externos así como arcos que unen los nodos. Los nodos externos se les conocen como hojas del árbol y se marcan con una clase o una distribución de probabilidad sobre las clases. Los árboles de decisión son un método usado en distintas disciplinas como modelo de predicción. Estos son similares a diagramas de flujo, en los que llegamos a puntos en los que se toman decisiones de acuerdo a una regla.
#REDES NEURONALES
Las redes neuronales son un paradigma de aprendizaje y procesamiento automático basado en el funcionamiento de nuestro sistema nervioso, este sistema este compuesto por una serie de neuronas y conexiones entre ellas que colaboran entre sí para producir una salida.
#cARGAMOS LA DATA
Se importa la data asignada de GitHub.
DiabetesAguilar=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/diabetes_m.csv", sep = ";")
#COMPRENSION DE LA DATA
Se necesita comprender los datos de dicha data para poder continuar con el siguiente paso. Aquí se mostrarán el número de variables que existen y los datos.
names(DiabetesAguilar)
## [1] "n"
## [2] "NumeroEmbarazos"
## [3] "Concentrac.blucosa.plama"
## [4] "Presión.arterial.diastólica"
## [5] "Tríceps.espesor.del.pliegue.cutáneo"
## [6] "X2.horas.suero.insulina"
## [7] "Índice.de.masa.corporal"
## [8] "Función.pedigrí.de.la.diabetes"
## [9] "edad"
## [10] "resultado"
head(DiabetesAguilar)
## n NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1 1 6 148 72
## 2 2 1 85 66
## 3 3 8 183 64
## 4 4 1 89 NA
## 5 5 0 137 40
## 6 6 5 116 74
## Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1 35 0
## 2 29 0
## 3 0 0
## 4 23 94
## 5 NA 168
## 6 0 0
## Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad resultado
## 1 33.6 0.627 50 Positivo
## 2 26.6 0.351 31 Negativo
## 3 23.3 0.672 32 Positivo
## 4 28.1 0.167 21 Negativo
## 5 43.1 2.288 33 Positivo
## 6 25.6 0.201 30 Negativo
str(DiabetesAguilar)
## 'data.frame': 768 obs. of 10 variables:
## $ n : int 1 2 3 4 5 6 7 8 9 10 ...
## $ NumeroEmbarazos : int 6 1 8 1 0 5 3 10 2 8 ...
## $ Concentrac.blucosa.plama : int 148 85 183 89 137 116 78 115 197 125 ...
## $ Presión.arterial.diastólica : int 72 66 64 NA 40 74 NA 0 70 96 ...
## $ Tríceps.espesor.del.pliegue.cutáneo: int 35 29 0 23 NA 0 32 0 45 0 ...
## $ X2.horas.suero.insulina : int 0 0 0 94 168 0 88 0 543 0 ...
## $ Índice.de.masa.corporal : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
## $ Función.pedigrí.de.la.diabetes : num 0.627 0.351 0.672 0.167 2.288 ...
## $ edad : int 50 31 32 21 33 30 26 29 53 54 ...
## $ resultado : Factor w/ 2 levels "Negativo","Positivo": 2 1 2 1 2 1 2 1 2 2 ...
#ELIMINANDO VARIABLE
Al momento de ejecutar los comandos anteriores se puede visualizar que hay una variable innecesaria la cual se procederá a eliminar.
DiabetesAguilar01<-DiabetesAguilar[,2:10]
head(DiabetesAguilar01)
## NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1 6 148 72
## 2 1 85 66
## 3 8 183 64
## 4 1 89 NA
## 5 0 137 40
## 6 5 116 74
## Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1 35 0
## 2 29 0
## 3 0 0
## 4 23 94
## 5 NA 168
## 6 0 0
## Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad resultado
## 1 33.6 0.627 50 Positivo
## 2 26.6 0.351 31 Negativo
## 3 23.3 0.672 32 Positivo
## 4 28.1 0.167 21 Negativo
## 5 43.1 2.288 33 Positivo
## 6 25.6 0.201 30 Negativo
#VALORES NA’s Al analizar la data se detecto que existen valores NA’s en las variables:Presion arterial diastolica,Tríceps espesor del pliegue cutáneo y X2 horas suero insulina.
Existe en dichas variables un valor de 3% en datos NA’s.
library(Amelia)
missmap(DiabetesAguilar01)
En el siguiente gráfico se puede observar los valores perdidos (NA’s)
library(VIM)
missing=aggr(DiabetesAguilar01)
summary(missing)
##
## Missings per variable:
## Variable Count
## NumeroEmbarazos 0
## Concentrac.blucosa.plama 0
## Presión.arterial.diastólica 84
## Tríceps.espesor.del.pliegue.cutáneo 66
## X2.horas.suero.insulina 70
## Índice.de.masa.corporal 0
## Función.pedigrí.de.la.diabetes 0
## edad 0
## resultado 0
##
## Missings in combinations of variables:
## Combinations Count Percent
## 0:0:0:0:0:0:0:0:0 569 74.0885417
## 0:0:0:0:1:0:0:0:0 55 7.1614583
## 0:0:0:1:0:0:0:0:0 52 6.7708333
## 0:0:0:1:1:0:0:0:0 8 1.0416667
## 0:0:1:0:0:0:0:0:0 71 9.2447917
## 0:0:1:0:1:0:0:0:0 7 0.9114583
## 0:0:1:1:0:0:0:0:0 6 0.7812500
#REEMPLAZANDO LOS NA’S
Ya se logró apreciar que existen filas que no se encuentrar con la data correspondiente(VACIOS). Por lo que se procederá a rellenarlos con el promedio ponderado de los datos mas cercanos.
library(DMwR)
Diabetes_Im_Fa=knnImputation(DiabetesAguilar01)
summary(Diabetes_Im_Fa)
## NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## Min. : 0.000 Min. : 0.0 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 63.02
## Median : 3.000 Median :117.0 Median : 71.21
## Mean : 3.845 Mean :120.9 Mean : 68.94
## 3rd Qu.: 6.000 3rd Qu.:140.2 3rd Qu.: 79.06
## Max. :17.000 Max. :199.0 Max. :122.00
## Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## Min. : 0.0 Min. : 0.00
## 1st Qu.: 0.0 1st Qu.: 0.00
## Median :23.0 Median : 42.39
## Mean :20.5 Mean : 78.57
## 3rd Qu.:32.0 3rd Qu.:126.55
## Max. :99.0 Max. :680.00
## Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad
## Min. : 0.00 Min. :0.0780 Min. :21.00
## 1st Qu.:27.30 1st Qu.:0.2437 1st Qu.:24.00
## Median :32.00 Median :0.3725 Median :29.00
## Mean :31.99 Mean :0.4719 Mean :33.24
## 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :67.10 Max. :2.4200 Max. :81.00
## resultado
## Negativo:500
## Positivo:268
##
##
##
##
#REDES NEURONALES
Una vez analizada la data se procederá a hacer lo que son redes neuronales. El primer paso partir la data y por ende usamos el siguiente comando
dim(Diabetes_Im_Fa)
## [1] 768 9
set.seed(111)
muestra=sample(480,288)
Una ves partida la data se crean la data TRAIN y la data TEST lo cual nos ayudará con nuestro modelo predictivo.
#DATA TRAIN
train_01=Diabetes_Im_Fa[-muestra,]
head(train_01)
## NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica
## 1 6 148 72.00000
## 2 1 85 66.00000
## 4 1 89 65.93520
## 7 3 78 67.42610
## 11 4 110 92.00000
## 15 5 166 72.71296
## Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina
## 1 35 0
## 2 29 0
## 4 23 94
## 7 32 88
## 11 0 0
## 15 19 175
## Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad resultado
## 1 33.6 0.627 50 Positivo
## 2 26.6 0.351 31 Negativo
## 4 28.1 0.167 21 Negativo
## 7 31.0 0.248 26 Positivo
## 11 37.6 0.191 30 Negativo
## 15 25.8 0.587 51 Positivo
#DATA TEST
test_01=Diabetes_Im_Fa[muestra,]
dim(train_01)
## [1] 480 9
dim(test_01)
## [1] 288 9
fix(train_01)
#ENTRENAMOS LO QUE VENDRÍAN A SER LOS VALORES ANN
Para este caso se decidio trabajar con 50 neuronas
library(nnet)
names(train_01)
## [1] "NumeroEmbarazos"
## [2] "Concentrac.blucosa.plama"
## [3] "Presión.arterial.diastólica"
## [4] "Tríceps.espesor.del.pliegue.cutáneo"
## [5] "X2.horas.suero.insulina"
## [6] "Índice.de.masa.corporal"
## [7] "Función.pedigrí.de.la.diabetes"
## [8] "edad"
## [9] "resultado"
set.seed(222)
modelo_diab=nnet(resultado~.,data=train_01, size=50)
## # weights: 501
## initial value 346.427604
## iter 10 value 275.195483
## iter 20 value 267.030124
## iter 30 value 255.971540
## iter 40 value 244.149738
## iter 50 value 228.023063
## iter 60 value 213.644460
## iter 70 value 197.555366
## iter 80 value 188.317310
## iter 90 value 180.004177
## iter 100 value 177.654852
## final value 177.654852
## stopped after 100 iterations
#PRODECIMIENTO DE PREDICCIÓN
Aquí se muestra las predicciones que se realizaron, pero se puede mejorar.
predichos_diab=predict(modelo_diab, test_01, type = "class")
predichos_diab
## [1] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [7] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [13] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [19] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [25] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [31] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [37] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [43] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [49] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [55] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [61] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [67] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
## [73] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
## [79] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [85] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [91] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [97] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [103] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [109] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [115] "Positivo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [121] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Positivo"
## [127] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [133] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [139] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [145] "Positivo" "Negativo" "Positivo" "Negativo" "Negativo" "Negativo"
## [151] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [157] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [163] "Negativo" "Positivo" "Negativo" "Positivo" "Positivo" "Negativo"
## [169] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [175] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [181] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [187] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [193] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [199] "Negativo" "Negativo" "Negativo" "Negativo" "Positivo" "Negativo"
## [205] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [211] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [217] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [223] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [229] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Positivo"
## [235] "Negativo" "Negativo" "Positivo" "Positivo" "Positivo" "Negativo"
## [241] "Negativo" "Positivo" "Negativo" "Positivo" "Positivo" "Positivo"
## [247] "Positivo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [253] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [259] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Positivo"
## [265] "Negativo" "Negativo" "Positivo" "Negativo" "Negativo" "Positivo"
## [271] "Negativo" "Negativo" "Negativo" "Positivo" "Negativo" "Positivo"
## [277] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [283] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
comparando=as.data.frame(cbind(test_01$resultado, predichos_diab))
fix(comparando)
Se realizó un conteo de las predicciones hechas.
table(test_01$resultado, predichos_diab)
## predichos_diab
## Negativo Positivo
## Negativo 141 42
## Positivo 66 39
#INDICADORES
Se necesito cambiar el valor de la variale a “factor” para poder continuar con el siguiente paso. Podemos ver que contamos con: Accuracy: 0.6354 (muy bajo) Sensibilidad: 0.7705 (muy bajo) Especificidad: 0.3714 (demasiado bajo)
library(caret)
str(predichos_diab)
## chr [1:288] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" ...
predichos_diab=as.factor(predichos_diab)
str(test_01$resultado)
## Factor w/ 2 levels "Negativo","Positivo": 1 1 1 1 2 2 1 1 1 1 ...
indicadores_diab=confusionMatrix(predichos_diab, test_01$resultado)
indicadores_diab
## Confusion Matrix and Statistics
##
## Reference
## Prediction Negativo Positivo
## Negativo 141 66
## Positivo 42 39
##
## Accuracy : 0.625
## 95% CI : (0.5663, 0.6811)
## No Information Rate : 0.6354
## P-Value [Acc > NIR] : 0.66746
##
## Kappa : 0.1492
##
## Mcnemar's Test P-Value : 0.02689
##
## Sensitivity : 0.7705
## Specificity : 0.3714
## Pos Pred Value : 0.6812
## Neg Pred Value : 0.4815
## Prevalence : 0.6354
## Detection Rate : 0.4896
## Detection Prevalence : 0.7188
## Balanced Accuracy : 0.5710
##
## 'Positive' Class : Negativo
##
#CURVA ROC
La curva roc visualizada no es buena.
library(ROCR)
predichos_prob=predict(modelo_diab, test_01, type = "raw")
pred1=prediction(predichos_prob, test_01$resultado)
pred2=performance(pred1, "tpr", "fpr")
plot(pred2, colorize=T)
lines(x=c(0,1), y=c(0,1))
#MODELO DE ÁRBOL
Partimos la data Diabetes_Im_Fa en 2 partes con un 70% para el TRAIN y el 30% para TEST.
library(caret)
set.seed(111)
particion=createDataPartition(y = Diabetes_Im_Fa$resultado, p=0.7, list = F, times = 1)
train_02=Diabetes_Im_Fa[particion,]
test_02=Diabetes_Im_Fa[-particion,]
dim(Diabetes_Im_Fa)
## [1] 768 9
dim(train_02)
## [1] 538 9
dim(test_02)
## [1] 230 9
Se nos muestra un esquema del árbol que acabamos de crear, primero se encuentra por el nodo lo cual es la variable después de eso vienen lo que son las hojas del árbol lo cual corresponde a los datos.
library(rpart)
set.seed(111)
modelo_02=rpart(resultado~.,data=train_02, method = "class")
modelo_02
## n= 538
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 538 188 Negativo (0.65055762 0.34944238)
## 2) Concentrac.blucosa.plama< 123.5 332 63 Negativo (0.81024096 0.18975904)
## 4) edad< 28.5 183 13 Negativo (0.92896175 0.07103825) *
## 5) edad>=28.5 149 50 Negativo (0.66442953 0.33557047)
## 10) Índice.de.masa.corporal< 26.35 30 0 Negativo (1.00000000 0.00000000) *
## 11) Índice.de.masa.corporal>=26.35 119 50 Negativo (0.57983193 0.42016807)
## 22) Concentrac.blucosa.plama< 103.5 59 15 Negativo (0.74576271 0.25423729)
## 44) Función.pedigrí.de.la.diabetes< 0.6355 48 8 Negativo (0.83333333 0.16666667) *
## 45) Función.pedigrí.de.la.diabetes>=0.6355 11 4 Positivo (0.36363636 0.63636364) *
## 23) Concentrac.blucosa.plama>=103.5 60 25 Positivo (0.41666667 0.58333333)
## 46) NumeroEmbarazos< 6.5 42 20 Negativo (0.52380952 0.47619048)
## 92) X2.horas.suero.insulina< 140 30 11 Negativo (0.63333333 0.36666667)
## 184) Índice.de.masa.corporal>=33.75 16 3 Negativo (0.81250000 0.18750000) *
## 185) Índice.de.masa.corporal< 33.75 14 6 Positivo (0.42857143 0.57142857) *
## 93) X2.horas.suero.insulina>=140 12 3 Positivo (0.25000000 0.75000000) *
## 47) NumeroEmbarazos>=6.5 18 3 Positivo (0.16666667 0.83333333) *
## 3) Concentrac.blucosa.plama>=123.5 206 81 Positivo (0.39320388 0.60679612)
## 6) Índice.de.masa.corporal< 29.95 62 22 Negativo (0.64516129 0.35483871)
## 12) edad< 26.5 17 1 Negativo (0.94117647 0.05882353) *
## 13) edad>=26.5 45 21 Negativo (0.53333333 0.46666667)
## 26) edad>=56 9 0 Negativo (1.00000000 0.00000000) *
## 27) edad< 56 36 15 Positivo (0.41666667 0.58333333)
## 54) Índice.de.masa.corporal>=28.8 10 2 Negativo (0.80000000 0.20000000) *
## 55) Índice.de.masa.corporal< 28.8 26 7 Positivo (0.26923077 0.73076923) *
## 7) Índice.de.masa.corporal>=29.95 144 41 Positivo (0.28472222 0.71527778)
## 14) edad< 28.5 51 24 Positivo (0.47058824 0.52941176)
## 28) Concentrac.blucosa.plama< 165.5 38 15 Negativo (0.60526316 0.39473684)
## 56) Presión.arterial.diastólica>=72.3342 16 2 Negativo (0.87500000 0.12500000) *
## 57) Presión.arterial.diastólica< 72.3342 22 9 Positivo (0.40909091 0.59090909)
## 114) NumeroEmbarazos>=0.5 13 5 Negativo (0.61538462 0.38461538) *
## 115) NumeroEmbarazos< 0.5 9 1 Positivo (0.11111111 0.88888889) *
## 29) Concentrac.blucosa.plama>=165.5 13 1 Positivo (0.07692308 0.92307692) *
## 15) edad>=28.5 93 17 Positivo (0.18279570 0.81720430) *
Queriendo tener un gráfico más claro de poder observar usamos los comandos siguientes.
library(partykit)
plot(as.party(modelo_02))
#Predecimos
Usamos la función precict() para poder ser mas sistemáticos.
predichos=predict(modelo_02,test_02,type="class")
predichos
## 2 8 12 14 29 34 36 39
## Negativo Positivo Positivo Positivo Negativo Negativo Negativo Negativo
## 42 44 46 48 49 58 60 62
## Positivo Positivo Positivo Negativo Negativo Positivo Negativo Positivo
## 63 64 65 66 71 75 78 82
## Negativo Negativo Positivo Negativo Negativo Negativo Negativo Negativo
## 87 89 94 96 98 101 102 106
## Positivo Positivo Negativo Positivo Negativo Positivo Negativo Negativo
## 110 111 114 116 117 121 122 124
## Negativo Positivo Negativo Positivo Positivo Negativo Negativo Negativo
## 125 126 131 134 135 136 140 149
## Negativo Negativo Negativo Negativo Negativo Positivo Negativo Positivo
## 150 151 152 155 158 164 165 167
## Negativo Negativo Negativo Positivo Negativo Negativo Positivo Negativo
## 168 169 170 175 176 182 185 188
## Positivo Positivo Positivo Negativo Positivo Negativo Positivo Positivo
## 190 192 195 206 208 210 216 218
## Negativo Positivo Negativo Negativo Positivo Positivo Positivo Positivo
## 224 225 228 232 234 241 244 245
## Negativo Negativo Negativo Positivo Negativo Negativo Positivo Positivo
## 247 249 250 252 253 257 262 264
## Positivo Positivo Negativo Positivo Negativo Positivo Negativo Positivo
## 266 268 278 279 282 283 284 286
## Positivo Negativo Negativo Negativo Positivo Positivo Positivo Positivo
## 287 290 291 292 294 297 299 301
## Positivo Negativo Negativo Negativo Negativo Positivo Negativo Positivo
## 305 312 319 320 329 332 335 338
## Positivo Negativo Negativo Negativo Negativo Negativo Negativo Positivo
## 339 340 346 347 355 356 357 359
## Positivo Positivo Positivo Negativo Negativo Positivo Negativo Negativo
## 364 369 376 377 379 380 383 384
## Positivo Negativo Positivo Negativo Positivo Positivo Negativo Negativo
## 386 390 399 402 420 427 433 439
## Negativo Negativo Negativo Positivo Positivo Negativo Negativo Negativo
## 443 446 450 451 452 453 456 458
## Negativo Positivo Negativo Negativo Negativo Negativo Positivo Negativo
## 466 470 471 478 480 492 494 506
## Negativo Negativo Negativo Negativo Negativo Negativo Negativo Negativo
## 509 517 518 528 529 536 539 555
## Negativo Positivo Positivo Negativo Negativo Negativo Negativo Negativo
## 556 558 562 572 575 576 577 579
## Positivo Positivo Positivo Negativo Negativo Negativo Negativo Positivo
## 580 581 583 586 587 590 596 603
## Positivo Negativo Positivo Negativo Positivo Negativo Positivo Positivo
## 607 610 613 615 619 622 623 627
## Positivo Negativo Positivo Positivo Positivo Negativo Positivo Negativo
## 628 629 631 633 634 637 638 639
## Negativo Positivo Positivo Negativo Negativo Positivo Negativo Positivo
## 646 657 659 667 671 675 676 678
## Positivo Negativo Positivo Positivo Positivo Negativo Positivo Negativo
## 682 684 685 687 688 689 695 696
## Negativo Negativo Negativo Negativo Positivo Negativo Negativo Positivo
## 697 699 700 704 707 708 710 713
## Negativo Negativo Negativo Positivo Negativo Negativo Negativo Positivo
## 716 717 719 722 725 736 743 745
## Positivo Positivo Negativo Negativo Positivo Negativo Negativo Positivo
## 747 748 751 752 759 762
## Negativo Positivo Negativo Negativo Negativo Positivo
## Levels: Negativo Positivo
#Matriz de confusion e indicadores
table(predichos, test_02$resultado)
##
## predichos Negativo Positivo
## Negativo 105 29
## Positivo 45 51
Tenemos una precisión (accuracy), Kappa y otros estadísticos con valores aceptables. Podemos ver que contamos con: Accuracy: 0.6783 (muy bajo) Sensibilidad: 0.7000 (muy bajo) Especificidad: 0.6375 (muy bajo)
library(caret)
str(test_02$resultado)
## Factor w/ 2 levels "Negativo","Positivo": 1 1 2 2 1 1 1 2 1 2 ...
test_02$resultado=as.factor(test_02$resultado)
indicadores=confusionMatrix(predichos,test_02$resultado)
indicadores
## Confusion Matrix and Statistics
##
## Reference
## Prediction Negativo Positivo
## Negativo 105 29
## Positivo 45 51
##
## Accuracy : 0.6783
## 95% CI : (0.6137, 0.7382)
## No Information Rate : 0.6522
## P-Value [Acc > NIR] : 0.22411
##
## Kappa : 0.3225
##
## Mcnemar's Test P-Value : 0.08121
##
## Sensitivity : 0.7000
## Specificity : 0.6375
## Pos Pred Value : 0.7836
## Neg Pred Value : 0.5312
## Prevalence : 0.6522
## Detection Rate : 0.4565
## Detection Prevalence : 0.5826
## Balanced Accuracy : 0.6687
##
## 'Positive' Class : Negativo
##
library(nnet)
modelo_red=nnet(resultado~.,data=train_02, size=90)
## # weights: 901
## initial value 405.951380
## iter 10 value 310.786582
## iter 20 value 299.372146
## iter 30 value 285.281337
## iter 40 value 273.175793
## iter 50 value 250.602247
## iter 60 value 234.626144
## iter 70 value 220.543645
## iter 80 value 203.623130
## iter 90 value 188.851592
## iter 100 value 173.187614
## final value 173.187614
## stopped after 100 iterations
modelo_red
## a 8-90-1 network with 901 weights
## inputs: NumeroEmbarazos Concentrac.blucosa.plama Presión.arterial.diastólica Tríceps.espesor.del.pliegue.cutáneo X2.horas.suero.insulina Índice.de.masa.corporal Función.pedigrí.de.la.diabetes edad
## output(s): resultado
## options were - entropy fitting
predichos_red=predict(modelo_red, test_02, type = "class")
predichos_red
## [1] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [7] "Positivo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [13] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Positivo"
## [19] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [25] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [31] "Positivo" "Positivo" "Negativo" "Negativo" "Negativo" "Positivo"
## [37] "Negativo" "Positivo" "Positivo" "Negativo" "Negativo" "Negativo"
## [43] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [49] "Negativo" "Positivo" "Negativo" "Positivo" "Negativo" "Negativo"
## [55] "Negativo" "Positivo" "Negativo" "Negativo" "Negativo" "Negativo"
## [61] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [67] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [73] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
## [79] "Positivo" "Positivo" "Positivo" "Positivo" "Negativo" "Negativo"
## [85] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Negativo"
## [91] "Negativo" "Negativo" "Positivo" "Positivo" "Negativo" "Positivo"
## [97] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Positivo"
## [103] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [109] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Positivo"
## [115] "Negativo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [121] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [127] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [133] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [139] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Negativo"
## [145] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [151] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [157] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [163] "Positivo" "Negativo" "Negativo" "Negativo" "Positivo" "Positivo"
## [169] "Positivo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [175] "Positivo" "Positivo" "Negativo" "Positivo" "Positivo" "Positivo"
## [181] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [187] "Positivo" "Negativo" "Negativo" "Positivo" "Negativo" "Negativo"
## [193] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [199] "Negativo" "Negativo" "Positivo" "Negativo" "Positivo" "Negativo"
## [205] "Positivo" "Positivo" "Negativo" "Negativo" "Positivo" "Negativo"
## [211] "Negativo" "Negativo" "Negativo" "Positivo" "Positivo" "Positivo"
## [217] "Positivo" "Negativo" "Positivo" "Positivo" "Negativo" "Positivo"
## [223] "Negativo" "Negativo" "Negativo" "Negativo" "Negativo" "Negativo"
## [229] "Positivo" "Positivo"
#CURVA ROC
predichos_prob_02=predict(modelo_diab, test_02, type = "raw")
library(ROCR)
pred1=prediction(predichos_prob_02, test_02$resultado)
pred2=performance(pred1, "tpr", "fpr")
plot(pred2, colorize=T)
lines(x=c(0,1), y=c(0,1))