Teoría

El paquete caret (Classification and Regression Training) es un paquete integral con una amplia variedad de algoritmos para el aprendizaje automático.

Paso 1. Instalar paquetes y llamar librerías

#install.packages("ggplot2") #Gráficas con mejor diseño
library(ggplot2)
#install.packages("lattice") #Crear gráficos
library(lattice)
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
#install.packages("datasets") #Usar la base de datos "Iris"
library(datasets)
#install.packages("DataExplorer") #Exploración de datos
library(DataExplorer)
#install.packages("kernlab") #Paquete con métodos de aprendizaje automático
library(kernlab)
## 
## Adjuntando el paquete: 'kernlab'
## The following object is masked from 'package:ggplot2':
## 
##     alpha
#install.packages("randomForest") #Paquete para este método de clasificación
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Adjuntando el paquete: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin

Paso 2. Crear base de datos

df <- read.csv("C:/Users/valer/OneDrive/Escritorio/IA con impacto empresarial/Base de datos/heart.csv")

Paso 3. Análisis Exploratorio

summary(df)
##       age             sex               cp            trestbps    
##  Min.   :29.00   Min.   :0.0000   Min.   :0.0000   Min.   : 94.0  
##  1st Qu.:48.00   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:120.0  
##  Median :56.00   Median :1.0000   Median :1.0000   Median :130.0  
##  Mean   :54.43   Mean   :0.6956   Mean   :0.9424   Mean   :131.6  
##  3rd Qu.:61.00   3rd Qu.:1.0000   3rd Qu.:2.0000   3rd Qu.:140.0  
##  Max.   :77.00   Max.   :1.0000   Max.   :3.0000   Max.   :200.0  
##       chol          fbs            restecg          thalach     
##  Min.   :126   Min.   :0.0000   Min.   :0.0000   Min.   : 71.0  
##  1st Qu.:211   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:132.0  
##  Median :240   Median :0.0000   Median :1.0000   Median :152.0  
##  Mean   :246   Mean   :0.1493   Mean   :0.5298   Mean   :149.1  
##  3rd Qu.:275   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:166.0  
##  Max.   :564   Max.   :1.0000   Max.   :2.0000   Max.   :202.0  
##      exang           oldpeak          slope             ca        
##  Min.   :0.0000   Min.   :0.000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.800   Median :1.000   Median :0.0000  
##  Mean   :0.3366   Mean   :1.072   Mean   :1.385   Mean   :0.7541  
##  3rd Qu.:1.0000   3rd Qu.:1.800   3rd Qu.:2.000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :6.200   Max.   :2.000   Max.   :4.0000  
##       thal           target      
##  Min.   :0.000   Min.   :0.0000  
##  1st Qu.:2.000   1st Qu.:0.0000  
##  Median :2.000   Median :1.0000  
##  Mean   :2.324   Mean   :0.5132  
##  3rd Qu.:3.000   3rd Qu.:1.0000  
##  Max.   :3.000   Max.   :1.0000
str(df)
## 'data.frame':    1025 obs. of  14 variables:
##  $ age     : int  52 53 70 61 62 58 58 55 46 54 ...
##  $ sex     : int  1 1 1 1 0 0 1 1 1 1 ...
##  $ cp      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ trestbps: int  125 140 145 148 138 100 114 160 120 122 ...
##  $ chol    : int  212 203 174 203 294 248 318 289 249 286 ...
##  $ fbs     : int  0 1 0 0 1 0 0 0 0 0 ...
##  $ restecg : int  1 0 1 1 1 0 2 0 0 0 ...
##  $ thalach : int  168 155 125 161 106 122 140 145 144 116 ...
##  $ exang   : int  0 1 1 0 0 0 0 1 0 1 ...
##  $ oldpeak : num  1 3.1 2.6 0 1.9 1 4.4 0.8 0.8 3.2 ...
##  $ slope   : int  2 0 0 2 1 1 0 1 2 1 ...
##  $ ca      : int  2 0 0 1 3 0 3 1 0 2 ...
##  $ thal    : int  3 3 3 3 2 2 1 3 3 2 ...
##  $ target  : int  0 0 0 0 0 1 0 0 0 0 ...
plot_missing(df)

df$sex <- as.factor(df$sex)
df$cp <- as.factor(df$cp)
df$fbs <- as.factor(df$fbs)
df$restecg <- as.factor(df$restecg)
df$exang <- as.factor(df$exang)
df$slope <- as.factor(df$slope)
df$ca <- as.factor(df$ca)
df$thal <- as.factor(df$thal)
df$target <- as.factor(df$target)

NOTA: La variable que queremos predecir debe tener formato de FACTOR

Paso 4. Partir los datos 80/20

set.seed(123)
renglones_entrenamiento <- createDataPartition(df$target, p=0.8, list=FALSE)
entrenamiento <- df[renglones_entrenamiento, ]
prueba <- df[-renglones_entrenamiento, ]

Métodos para modelar

Los métodos más utilizadps para modelar aprendizaje automático son:

  • SVM: Support Vector Machine o Máquina de Vectores de Soporte. Hay varios subtipos: Lineal (svmLinear), Radial (svmRadial), Polinómico (svmPoly), etc.
  • Árbol de Decisión: rpart
  • Redes Neuronales: nnet
  • Random Forest o Bosques Aleatorios: rf

1. Modelo con el Método svmLinear

modelo1 <- train(target ~ ., data=entrenamiento,
                 method="svmLinear", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGrid=data.frame(C=1) #Cambiar
                 )

resultado_entrenamiento1 <- predict(modelo1,entrenamiento)
resultado_prueba1 <- predict(modelo1, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$target)

2. Modelo con el Método svmRadial

modelo2 <- train(target ~ ., data=entrenamiento,
                 method="svmRadial", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGrid=data.frame(sigma=1, C=1) #Cambiar
                 )

resultado_entrenamiento2 <- predict(modelo2,entrenamiento)
resultado_prueba2 <- predict(modelo2, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$target)

3. Modelo con el Método svmPoly

modelo3 <- train(target ~ ., data=entrenamiento,
                 method="svmPoly", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGrid=data.frame(degree=1, scale=1, C=1) #Cambiar
                 )

resultado_entrenamiento3 <- predict(modelo3,entrenamiento)
resultado_prueba3 <- predict(modelo3, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$target)

4. Modelo con el Método rpart

modelo4 <- train(target ~ ., data=entrenamiento,
                 method="svmPoly", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tunelenght=10 #Cambiar
                 )

resultado_entrenamiento4 <- predict(modelo4,entrenamiento)
resultado_prueba4 <- predict(modelo4, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$target)

5. Modelo con el Método nnet

modelo5 <- train(target ~ ., data=entrenamiento,
                 method="nnet", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10)
                 #Cambiar
                 )
## # weights:  25
## initial  value 514.623784 
## iter  10 value 249.922431
## iter  20 value 202.957720
## iter  30 value 196.715786
## iter  40 value 187.039763
## iter  50 value 186.931635
## final  value 186.931517 
## converged
## # weights:  73
## initial  value 652.451307 
## iter  10 value 216.447979
## iter  20 value 146.128194
## iter  30 value 99.662478
## iter  40 value 89.447307
## iter  50 value 85.552826
## iter  60 value 84.877100
## iter  70 value 75.748165
## iter  80 value 75.585270
## iter  90 value 75.526503
## iter 100 value 75.472828
## final  value 75.472828 
## stopped after 100 iterations
## # weights:  121
## initial  value 637.746891 
## iter  10 value 208.826472
## iter  20 value 157.395953
## iter  30 value 130.579245
## iter  40 value 109.710489
## iter  50 value 97.831184
## iter  60 value 92.248877
## iter  70 value 90.699136
## iter  80 value 90.326979
## iter  90 value 90.305756
## iter 100 value 90.301388
## final  value 90.301388 
## stopped after 100 iterations
## # weights:  25
## initial  value 526.007968 
## iter  10 value 317.068928
## iter  20 value 256.908724
## iter  30 value 234.617192
## iter  40 value 222.406927
## iter  50 value 214.489493
## iter  60 value 214.004588
## iter  70 value 213.710779
## iter  80 value 213.692488
## final  value 213.692480 
## converged
## # weights:  73
## initial  value 552.927177 
## iter  10 value 284.424982
## iter  20 value 229.276627
## iter  30 value 189.724879
## iter  40 value 174.934529
## iter  50 value 171.136308
## iter  60 value 165.475209
## iter  70 value 131.098011
## iter  80 value 114.355019
## iter  90 value 110.849755
## iter 100 value 110.128395
## final  value 110.128395 
## stopped after 100 iterations
## # weights:  121
## initial  value 515.721232 
## iter  10 value 206.190312
## iter  20 value 165.062512
## iter  30 value 145.371461
## iter  40 value 120.292772
## iter  50 value 110.488603
## iter  60 value 104.313443
## iter  70 value 102.669980
## iter  80 value 102.177760
## iter  90 value 101.458465
## iter 100 value 99.913416
## final  value 99.913416 
## stopped after 100 iterations
## # weights:  25
## initial  value 519.265578 
## iter  10 value 301.227207
## iter  20 value 240.257630
## iter  30 value 214.701037
## iter  40 value 200.063044
## iter  50 value 183.394154
## iter  60 value 182.916102
## iter  70 value 182.834726
## iter  80 value 182.773144
## iter  90 value 180.566591
## iter 100 value 180.219045
## final  value 180.219045 
## stopped after 100 iterations
## # weights:  73
## initial  value 505.791715 
## iter  10 value 190.831443
## iter  20 value 149.245846
## iter  30 value 127.828414
## iter  40 value 110.292310
## iter  50 value 102.604341
## iter  60 value 101.887015
## iter  70 value 101.393739
## iter  80 value 100.961877
## iter  90 value 100.428694
## iter 100 value 100.238080
## final  value 100.238080 
## stopped after 100 iterations
## # weights:  121
## initial  value 488.997167 
## iter  10 value 199.630578
## iter  20 value 140.106226
## iter  30 value 101.111539
## iter  40 value 84.716205
## iter  50 value 63.856324
## iter  60 value 57.624720
## iter  70 value 55.036612
## iter  80 value 53.885364
## iter  90 value 53.720483
## iter 100 value 53.310407
## final  value 53.310407 
## stopped after 100 iterations
## # weights:  25
## initial  value 502.569688 
## iter  10 value 266.297672
## iter  20 value 226.841239
## iter  30 value 209.102925
## iter  40 value 197.394404
## iter  50 value 181.462630
## iter  60 value 180.671000
## iter  70 value 180.604087
## iter  80 value 178.306059
## iter  90 value 178.196664
## iter 100 value 178.189783
## final  value 178.189783 
## stopped after 100 iterations
## # weights:  73
## initial  value 522.091512 
## iter  10 value 201.108415
## iter  20 value 139.897998
## iter  30 value 127.810258
## iter  40 value 121.579430
## iter  50 value 118.655342
## iter  60 value 118.374303
## iter  70 value 118.369884
## final  value 118.369869 
## converged
## # weights:  121
## initial  value 578.784238 
## iter  10 value 192.175150
## iter  20 value 126.673295
## iter  30 value 105.934936
## iter  40 value 100.848513
## iter  50 value 97.232315
## iter  60 value 93.798640
## iter  70 value 92.203712
## iter  80 value 88.848168
## iter  90 value 86.243909
## iter 100 value 85.153889
## final  value 85.153889 
## stopped after 100 iterations
## # weights:  25
## initial  value 540.149835 
## iter  10 value 304.635477
## iter  20 value 239.803375
## iter  30 value 211.423132
## iter  40 value 204.761470
## iter  50 value 203.555868
## iter  60 value 203.502104
## iter  70 value 203.495121
## final  value 203.493765 
## converged
## # weights:  73
## initial  value 536.865750 
## iter  10 value 185.724140
## iter  20 value 162.823763
## iter  30 value 159.751982
## iter  40 value 159.271979
## iter  50 value 159.211731
## iter  60 value 159.209396
## iter  70 value 153.884934
## iter  80 value 149.488919
## iter  90 value 146.958064
## iter 100 value 145.026702
## final  value 145.026702 
## stopped after 100 iterations
## # weights:  121
## initial  value 585.434227 
## iter  10 value 176.167293
## iter  20 value 142.515591
## iter  30 value 127.105444
## iter  40 value 119.735158
## iter  50 value 110.877621
## iter  60 value 98.280412
## iter  70 value 87.052559
## iter  80 value 84.107732
## iter  90 value 83.340583
## iter 100 value 83.154504
## final  value 83.154504 
## stopped after 100 iterations
## # weights:  25
## initial  value 505.766862 
## iter  10 value 288.176528
## iter  20 value 249.552951
## iter  30 value 218.859731
## iter  40 value 190.530350
## iter  50 value 180.724881
## iter  60 value 175.770431
## iter  70 value 175.230900
## iter  80 value 174.336223
## iter  90 value 173.995022
## iter 100 value 173.985447
## final  value 173.985447 
## stopped after 100 iterations
## # weights:  73
## initial  value 508.648684 
## iter  10 value 214.028173
## iter  20 value 186.410957
## iter  30 value 149.869734
## iter  40 value 130.203505
## iter  50 value 114.199178
## iter  60 value 108.923969
## iter  70 value 108.215259
## iter  80 value 107.888957
## iter  90 value 106.205450
## iter 100 value 106.072227
## final  value 106.072227 
## stopped after 100 iterations
## # weights:  121
## initial  value 510.813898 
## iter  10 value 183.381176
## iter  20 value 109.602595
## iter  30 value 75.084498
## iter  40 value 65.534607
## iter  50 value 62.505633
## iter  60 value 59.337509
## iter  70 value 58.050627
## iter  80 value 56.766040
## iter  90 value 55.660513
## iter 100 value 55.415447
## final  value 55.415447 
## stopped after 100 iterations
## # weights:  25
## initial  value 529.156251 
## iter  10 value 288.689367
## iter  20 value 232.982215
## iter  30 value 224.501906
## iter  40 value 215.488351
## iter  50 value 206.410975
## iter  60 value 203.866746
## iter  70 value 203.677731
## iter  80 value 203.606338
## iter  90 value 203.488651
## iter 100 value 203.215770
## final  value 203.215770 
## stopped after 100 iterations
## # weights:  73
## initial  value 537.904492 
## iter  10 value 197.456481
## iter  20 value 147.656403
## iter  30 value 114.377754
## iter  40 value 103.350492
## iter  50 value 97.093519
## iter  60 value 95.979237
## iter  70 value 95.039540
## iter  80 value 94.997389
## iter  90 value 94.988627
## iter 100 value 94.941354
## final  value 94.941354 
## stopped after 100 iterations
## # weights:  121
## initial  value 595.449532 
## iter  10 value 158.841229
## iter  20 value 98.013134
## iter  30 value 74.445470
## iter  40 value 69.146165
## iter  50 value 61.963345
## iter  60 value 60.265222
## iter  70 value 57.165239
## iter  80 value 55.117046
## iter  90 value 55.042179
## iter 100 value 54.984360
## final  value 54.984360 
## stopped after 100 iterations
## # weights:  25
## initial  value 597.467778 
## iter  10 value 268.112849
## iter  20 value 233.623953
## iter  30 value 202.847097
## iter  40 value 200.505182
## iter  50 value 200.325497
## final  value 200.325368 
## converged
## # weights:  73
## initial  value 506.350109 
## iter  10 value 243.304178
## iter  20 value 188.818392
## iter  30 value 159.094638
## iter  40 value 144.807643
## iter  50 value 141.405729
## iter  60 value 140.570124
## iter  70 value 139.621904
## iter  80 value 138.914011
## iter  90 value 135.629039
## iter 100 value 132.944320
## final  value 132.944320 
## stopped after 100 iterations
## # weights:  121
## initial  value 604.127383 
## iter  10 value 199.226295
## iter  20 value 147.427701
## iter  30 value 128.035968
## iter  40 value 117.780720
## iter  50 value 109.622099
## iter  60 value 107.465432
## iter  70 value 102.937372
## iter  80 value 101.204314
## iter  90 value 100.591872
## iter 100 value 100.403690
## final  value 100.403690 
## stopped after 100 iterations
## # weights:  25
## initial  value 513.088088 
## iter  10 value 275.387859
## iter  20 value 224.035401
## iter  30 value 219.907092
## iter  40 value 215.016841
## iter  50 value 213.774182
## iter  60 value 212.858473
## iter  70 value 212.815329
## iter  80 value 212.800096
## iter  90 value 212.796233
## iter 100 value 212.794542
## final  value 212.794542 
## stopped after 100 iterations
## # weights:  73
## initial  value 501.218969 
## iter  10 value 240.156536
## iter  20 value 146.551325
## iter  30 value 123.490896
## iter  40 value 119.433029
## iter  50 value 114.671971
## iter  60 value 112.435040
## iter  70 value 112.189484
## iter  80 value 112.019710
## iter  90 value 111.846846
## iter 100 value 111.547702
## final  value 111.547702 
## stopped after 100 iterations
## # weights:  121
## initial  value 524.296493 
## iter  10 value 161.900518
## iter  20 value 114.420893
## iter  30 value 98.431850
## iter  40 value 93.368165
## iter  50 value 92.784815
## iter  60 value 92.204148
## iter  70 value 91.908930
## iter  80 value 91.516451
## iter  90 value 91.412766
## iter 100 value 91.346212
## final  value 91.346212 
## stopped after 100 iterations
## # weights:  25
## initial  value 512.813761 
## iter  10 value 203.372144
## iter  20 value 194.197165
## iter  30 value 183.049289
## iter  40 value 165.345030
## iter  50 value 164.967091
## final  value 164.965647 
## converged
## # weights:  73
## initial  value 556.994601 
## iter  10 value 264.325963
## iter  20 value 158.763323
## iter  30 value 112.683204
## iter  40 value 107.526538
## iter  50 value 103.740605
## iter  60 value 98.577768
## iter  70 value 96.340947
## iter  80 value 95.688620
## iter  90 value 95.452343
## iter 100 value 95.265091
## final  value 95.265091 
## stopped after 100 iterations
## # weights:  121
## initial  value 475.604339 
## iter  10 value 182.204502
## iter  20 value 109.958587
## iter  30 value 68.389963
## iter  40 value 55.099828
## iter  50 value 51.821355
## iter  60 value 51.470661
## iter  70 value 51.410206
## iter  80 value 51.391004
## iter  90 value 51.384530
## iter 100 value 51.363932
## final  value 51.363932 
## stopped after 100 iterations
## # weights:  25
## initial  value 522.972186 
## iter  10 value 234.778720
## iter  20 value 208.881188
## iter  30 value 202.677043
## iter  40 value 201.012318
## iter  50 value 200.967325
## final  value 200.967254 
## converged
## # weights:  73
## initial  value 538.614402 
## iter  10 value 288.794354
## iter  20 value 224.458721
## iter  30 value 189.802681
## iter  40 value 159.625601
## iter  50 value 151.810854
## iter  60 value 150.246676
## iter  70 value 148.275865
## iter  80 value 141.932754
## iter  90 value 137.440475
## iter 100 value 136.524613
## final  value 136.524613 
## stopped after 100 iterations
## # weights:  121
## initial  value 517.107337 
## iter  10 value 179.856722
## iter  20 value 145.578827
## iter  30 value 122.256856
## iter  40 value 109.823117
## iter  50 value 99.229678
## iter  60 value 92.180306
## iter  70 value 88.659106
## iter  80 value 86.888681
## iter  90 value 86.048812
## iter 100 value 85.211020
## final  value 85.211020 
## stopped after 100 iterations
## # weights:  25
## initial  value 518.889795 
## iter  10 value 317.799383
## iter  20 value 240.875464
## iter  30 value 206.652874
## iter  40 value 189.888355
## iter  50 value 174.415678
## iter  60 value 170.994515
## iter  70 value 170.683521
## iter  80 value 170.489943
## iter  90 value 170.350316
## iter 100 value 170.316318
## final  value 170.316318 
## stopped after 100 iterations
## # weights:  73
## initial  value 534.198537 
## iter  10 value 237.964373
## iter  20 value 141.377957
## iter  30 value 111.678656
## iter  40 value 87.243383
## iter  50 value 75.404170
## iter  60 value 71.945209
## iter  70 value 69.823651
## iter  80 value 69.363242
## iter  90 value 69.088197
## iter 100 value 68.703620
## final  value 68.703620 
## stopped after 100 iterations
## # weights:  121
## initial  value 482.867675 
## iter  10 value 180.440243
## iter  20 value 124.470445
## iter  30 value 88.850095
## iter  40 value 74.543926
## iter  50 value 66.701889
## iter  60 value 64.643456
## iter  70 value 58.320274
## iter  80 value 57.393218
## iter  90 value 56.666247
## iter 100 value 56.262641
## final  value 56.262641 
## stopped after 100 iterations
## # weights:  25
## initial  value 530.560629 
## iter  10 value 319.595039
## iter  20 value 243.798747
## iter  30 value 221.274816
## iter  40 value 210.921959
## iter  50 value 190.790522
## iter  60 value 188.881635
## iter  70 value 188.691775
## iter  80 value 188.682816
## iter  90 value 188.678587
## iter 100 value 188.677121
## final  value 188.677121 
## stopped after 100 iterations
## # weights:  73
## initial  value 511.044597 
## iter  10 value 221.298095
## iter  20 value 181.339567
## iter  30 value 162.935436
## iter  40 value 153.442392
## iter  50 value 147.881565
## iter  60 value 143.386412
## iter  70 value 142.472866
## iter  80 value 141.995010
## iter  90 value 141.949739
## iter 100 value 141.943361
## final  value 141.943361 
## stopped after 100 iterations
## # weights:  121
## initial  value 534.245625 
## iter  10 value 209.979011
## iter  20 value 113.919418
## iter  30 value 53.290986
## iter  40 value 42.088866
## iter  50 value 39.396535
## iter  60 value 38.898303
## iter  70 value 38.858030
## iter  80 value 38.852997
## iter  90 value 38.851878
## iter 100 value 38.851460
## final  value 38.851460 
## stopped after 100 iterations
## # weights:  25
## initial  value 514.712235 
## iter  10 value 238.073675
## iter  20 value 218.236547
## iter  30 value 213.544584
## iter  40 value 212.183157
## iter  50 value 212.167990
## iter  60 value 212.157719
## final  value 212.157564 
## converged
## # weights:  73
## initial  value 506.262598 
## iter  10 value 234.705988
## iter  20 value 198.241018
## iter  30 value 174.597467
## iter  40 value 166.925849
## iter  50 value 162.455849
## iter  60 value 160.243221
## iter  70 value 159.910827
## iter  80 value 159.881086
## final  value 159.880690 
## converged
## # weights:  121
## initial  value 496.333459 
## iter  10 value 191.905246
## iter  20 value 155.588146
## iter  30 value 136.553799
## iter  40 value 120.687995
## iter  50 value 113.269091
## iter  60 value 110.554705
## iter  70 value 109.107502
## iter  80 value 105.860653
## iter  90 value 99.425122
## iter 100 value 96.839862
## final  value 96.839862 
## stopped after 100 iterations
## # weights:  25
## initial  value 547.337950 
## iter  10 value 364.755091
## iter  20 value 261.573848
## iter  30 value 230.133010
## iter  40 value 210.890743
## iter  50 value 195.584170
## iter  60 value 187.857530
## iter  70 value 186.115571
## iter  80 value 182.866343
## iter  90 value 179.187976
## iter 100 value 179.096281
## final  value 179.096281 
## stopped after 100 iterations
## # weights:  73
## initial  value 611.102823 
## iter  10 value 210.506245
## iter  20 value 161.031287
## iter  30 value 121.505225
## iter  40 value 90.149900
## iter  50 value 72.246238
## iter  60 value 62.596604
## iter  70 value 55.667851
## iter  80 value 54.822975
## iter  90 value 54.298989
## iter 100 value 54.090394
## final  value 54.090394 
## stopped after 100 iterations
## # weights:  121
## initial  value 484.327113 
## iter  10 value 172.312315
## iter  20 value 91.112026
## iter  30 value 61.115826
## iter  40 value 50.703622
## iter  50 value 49.403140
## iter  60 value 42.152363
## iter  70 value 37.579844
## iter  80 value 34.989743
## iter  90 value 34.615333
## iter 100 value 34.466802
## final  value 34.466802 
## stopped after 100 iterations
## # weights:  25
## initial  value 601.056711 
## iter  10 value 320.531868
## iter  20 value 246.306034
## iter  30 value 224.371689
## iter  40 value 208.025758
## iter  50 value 202.443465
## iter  60 value 195.748313
## iter  70 value 189.919807
## iter  80 value 189.885206
## final  value 189.885157 
## converged
## # weights:  73
## initial  value 638.026012 
## iter  10 value 218.637883
## iter  20 value 190.477657
## iter  30 value 172.956916
## iter  40 value 145.729312
## iter  50 value 131.511157
## iter  60 value 108.634033
## iter  70 value 106.797242
## iter  80 value 104.947219
## iter  90 value 103.299188
## iter 100 value 102.853678
## final  value 102.853678 
## stopped after 100 iterations
## # weights:  121
## initial  value 625.045986 
## iter  10 value 178.828386
## iter  20 value 125.053991
## iter  30 value 76.654480
## iter  40 value 68.178693
## iter  50 value 65.479098
## iter  60 value 61.758998
## iter  70 value 60.337753
## iter  80 value 57.958290
## iter  90 value 57.241329
## iter 100 value 57.091708
## final  value 57.091708 
## stopped after 100 iterations
## # weights:  25
## initial  value 561.885283 
## iter  10 value 405.378582
## iter  20 value 330.178754
## iter  30 value 279.666185
## iter  40 value 252.907940
## iter  50 value 218.864792
## iter  60 value 207.551366
## iter  70 value 203.947798
## iter  80 value 203.653903
## final  value 203.653671 
## converged
## # weights:  73
## initial  value 614.512290 
## iter  10 value 244.906959
## iter  20 value 187.981919
## iter  30 value 158.132837
## iter  40 value 144.014199
## iter  50 value 140.090031
## iter  60 value 139.264500
## iter  70 value 136.686887
## iter  80 value 135.523983
## iter  90 value 135.366661
## iter 100 value 135.349483
## final  value 135.349483 
## stopped after 100 iterations
## # weights:  121
## initial  value 608.130764 
## iter  10 value 261.182079
## iter  20 value 217.705954
## iter  30 value 171.481010
## iter  40 value 147.044624
## iter  50 value 125.207907
## iter  60 value 116.640450
## iter  70 value 113.442052
## iter  80 value 110.034835
## iter  90 value 103.915790
## iter 100 value 98.331739
## final  value 98.331739 
## stopped after 100 iterations
## # weights:  25
## initial  value 547.498498 
## iter  10 value 281.108965
## iter  20 value 252.778185
## iter  30 value 247.003800
## iter  40 value 243.363945
## iter  50 value 231.680446
## iter  60 value 224.941780
## iter  70 value 215.348154
## iter  80 value 215.012871
## iter  90 value 214.942602
## iter 100 value 214.898164
## final  value 214.898164 
## stopped after 100 iterations
## # weights:  73
## initial  value 590.344703 
## iter  10 value 237.957569
## iter  20 value 183.360996
## iter  30 value 138.516776
## iter  40 value 121.846070
## iter  50 value 107.047688
## iter  60 value 94.124056
## iter  70 value 90.494948
## iter  80 value 86.277492
## iter  90 value 81.475074
## iter 100 value 78.617267
## final  value 78.617267 
## stopped after 100 iterations
## # weights:  121
## initial  value 667.316663 
## iter  10 value 220.091561
## iter  20 value 122.102556
## iter  30 value 75.780583
## iter  40 value 57.155515
## iter  50 value 46.950246
## iter  60 value 45.572132
## iter  70 value 44.940230
## iter  80 value 44.330806
## iter  90 value 43.844553
## iter 100 value 43.001923
## final  value 43.001923 
## stopped after 100 iterations
## # weights:  25
## initial  value 538.399450 
## iter  10 value 246.711430
## iter  20 value 207.511442
## iter  30 value 190.320755
## iter  40 value 184.513286
## iter  50 value 184.496574
## final  value 184.496549 
## converged
## # weights:  73
## initial  value 519.178000 
## iter  10 value 206.121340
## iter  20 value 134.192041
## iter  30 value 82.385157
## iter  40 value 65.502214
## iter  50 value 59.926329
## iter  60 value 59.059175
## iter  70 value 59.025410
## iter  80 value 59.023426
## iter  90 value 59.023231
## iter 100 value 59.023150
## final  value 59.023150 
## stopped after 100 iterations
## # weights:  121
## initial  value 544.898046 
## iter  10 value 170.522992
## iter  20 value 118.513967
## iter  30 value 73.015626
## iter  40 value 63.387012
## iter  50 value 61.796967
## iter  60 value 57.197147
## iter  70 value 56.241179
## iter  80 value 55.544645
## iter  90 value 55.126651
## iter 100 value 54.642853
## final  value 54.642853 
## stopped after 100 iterations
## # weights:  25
## initial  value 512.406281 
## iter  10 value 342.189551
## iter  20 value 297.782126
## iter  30 value 260.115515
## iter  40 value 220.441060
## iter  50 value 212.286509
## iter  60 value 211.964411
## iter  70 value 211.924750
## final  value 211.924236 
## converged
## # weights:  73
## initial  value 558.642461 
## iter  10 value 248.233739
## iter  20 value 183.728211
## iter  30 value 152.665060
## iter  40 value 144.088705
## iter  50 value 141.728405
## iter  60 value 140.994018
## iter  70 value 140.603180
## iter  80 value 140.551975
## final  value 140.551724 
## converged
## # weights:  121
## initial  value 630.144334 
## iter  10 value 202.109999
## iter  20 value 142.936101
## iter  30 value 121.933555
## iter  40 value 107.944590
## iter  50 value 98.369628
## iter  60 value 90.267232
## iter  70 value 88.834323
## iter  80 value 88.258365
## iter  90 value 87.659656
## iter 100 value 87.365074
## final  value 87.365074 
## stopped after 100 iterations
## # weights:  25
## initial  value 557.391886 
## iter  10 value 226.066959
## iter  20 value 218.696182
## iter  30 value 216.239936
## iter  40 value 212.804968
## iter  50 value 204.972677
## iter  60 value 196.312066
## iter  70 value 185.351179
## iter  80 value 184.864998
## iter  90 value 184.627065
## iter 100 value 184.504686
## final  value 184.504686 
## stopped after 100 iterations
## # weights:  73
## initial  value 547.493090 
## iter  10 value 218.852755
## iter  20 value 177.129529
## iter  30 value 145.179292
## iter  40 value 133.660525
## iter  50 value 127.460613
## iter  60 value 125.435347
## iter  70 value 123.504066
## iter  80 value 123.400636
## iter  90 value 123.353248
## iter 100 value 123.330890
## final  value 123.330890 
## stopped after 100 iterations
## # weights:  121
## initial  value 589.124745 
## iter  10 value 205.300836
## iter  20 value 139.470696
## iter  30 value 98.492279
## iter  40 value 81.767155
## iter  50 value 77.121554
## iter  60 value 73.877682
## iter  70 value 71.969591
## iter  80 value 71.240782
## iter  90 value 70.502423
## iter 100 value 69.795511
## final  value 69.795511 
## stopped after 100 iterations
## # weights:  25
## initial  value 537.917727 
## iter  10 value 257.858730
## iter  20 value 208.966537
## iter  30 value 192.252973
## iter  40 value 188.697584
## iter  50 value 185.953596
## iter  60 value 173.906195
## iter  70 value 173.774180
## final  value 173.774012 
## converged
## # weights:  73
## initial  value 574.334029 
## iter  10 value 207.873681
## iter  20 value 174.063403
## iter  30 value 156.503840
## iter  40 value 142.293564
## iter  50 value 141.683210
## final  value 141.640524 
## converged
## # weights:  121
## initial  value 538.319531 
## iter  10 value 214.389675
## iter  20 value 132.196993
## iter  30 value 103.274993
## iter  40 value 80.276895
## iter  50 value 70.362435
## iter  60 value 59.626688
## iter  70 value 50.925671
## iter  80 value 46.451578
## iter  90 value 43.254152
## iter 100 value 41.824196
## final  value 41.824196 
## stopped after 100 iterations
## # weights:  25
## initial  value 645.079190 
## iter  10 value 438.338503
## iter  20 value 377.496468
## iter  30 value 283.070071
## iter  40 value 250.467581
## iter  50 value 236.907870
## iter  60 value 232.489030
## iter  70 value 231.884616
## iter  80 value 231.847154
## final  value 231.847133 
## converged
## # weights:  73
## initial  value 506.955794 
## iter  10 value 243.452514
## iter  20 value 208.620003
## iter  30 value 197.998893
## iter  40 value 193.976867
## iter  50 value 190.956553
## iter  60 value 190.536166
## iter  70 value 183.361681
## iter  80 value 178.681943
## iter  90 value 175.696322
## iter 100 value 175.362226
## final  value 175.362226 
## stopped after 100 iterations
## # weights:  121
## initial  value 538.629387 
## iter  10 value 195.096347
## iter  20 value 147.952301
## iter  30 value 134.027910
## iter  40 value 119.028493
## iter  50 value 112.922169
## iter  60 value 111.037193
## iter  70 value 109.924675
## iter  80 value 108.799097
## iter  90 value 108.315697
## iter 100 value 108.002878
## final  value 108.002878 
## stopped after 100 iterations
## # weights:  25
## initial  value 535.217099 
## iter  10 value 379.051447
## iter  20 value 259.101991
## iter  30 value 232.907141
## iter  40 value 201.086945
## iter  50 value 196.554364
## iter  60 value 195.338735
## iter  70 value 184.974343
## iter  80 value 183.752700
## iter  90 value 179.178756
## iter 100 value 179.006432
## final  value 179.006432 
## stopped after 100 iterations
## # weights:  73
## initial  value 567.690316 
## iter  10 value 243.112711
## iter  20 value 187.173575
## iter  30 value 166.169246
## iter  40 value 153.369911
## iter  50 value 142.641072
## iter  60 value 136.659901
## iter  70 value 135.259100
## iter  80 value 133.954253
## iter  90 value 133.168187
## iter 100 value 132.067705
## final  value 132.067705 
## stopped after 100 iterations
## # weights:  121
## initial  value 621.852655 
## iter  10 value 216.079837
## iter  20 value 117.605461
## iter  30 value 72.717599
## iter  40 value 57.169689
## iter  50 value 53.720956
## iter  60 value 50.161053
## iter  70 value 48.478933
## iter  80 value 47.999628
## iter  90 value 47.747083
## iter 100 value 47.316341
## final  value 47.316341 
## stopped after 100 iterations
## # weights:  25
## initial  value 545.685689 
## iter  10 value 252.017398
## iter  20 value 219.300527
## iter  30 value 209.765121
## iter  40 value 191.709270
## iter  50 value 181.185455
## iter  60 value 176.421696
## iter  70 value 175.173572
## iter  80 value 172.547516
## iter  90 value 163.731733
## iter 100 value 163.643664
## final  value 163.643664 
## stopped after 100 iterations
## # weights:  73
## initial  value 566.922805 
## iter  10 value 223.217563
## iter  20 value 181.277561
## iter  30 value 165.206760
## iter  40 value 157.744917
## iter  50 value 153.994647
## iter  60 value 151.276928
## iter  70 value 147.505630
## iter  80 value 145.595686
## iter  90 value 144.161071
## iter 100 value 143.669255
## final  value 143.669255 
## stopped after 100 iterations
## # weights:  121
## initial  value 596.153965 
## iter  10 value 175.115368
## iter  20 value 89.510088
## iter  30 value 52.775753
## iter  40 value 33.068688
## iter  50 value 28.381397
## iter  60 value 27.290450
## iter  70 value 25.302867
## iter  80 value 24.981365
## iter  90 value 24.824371
## iter 100 value 24.667802
## final  value 24.667802 
## stopped after 100 iterations
## # weights:  25
## initial  value 565.615526 
## iter  10 value 289.126112
## iter  20 value 236.698860
## iter  30 value 227.869226
## iter  40 value 210.955212
## iter  50 value 203.653990
## iter  60 value 202.724738
## iter  70 value 202.676582
## iter  80 value 202.459539
## iter  90 value 202.410583
## final  value 202.409858 
## converged
## # weights:  73
## initial  value 541.178106 
## iter  10 value 234.604129
## iter  20 value 182.236461
## iter  30 value 165.975483
## iter  40 value 154.537403
## iter  50 value 148.174910
## iter  60 value 146.431697
## iter  70 value 146.008486
## iter  80 value 145.384600
## iter  90 value 144.990762
## iter 100 value 144.954549
## final  value 144.954549 
## stopped after 100 iterations
## # weights:  121
## initial  value 505.386647 
## iter  10 value 204.794374
## iter  20 value 150.214843
## iter  30 value 121.908112
## iter  40 value 112.241307
## iter  50 value 99.439549
## iter  60 value 91.370458
## iter  70 value 86.928981
## iter  80 value 85.901929
## iter  90 value 85.258647
## iter 100 value 84.893413
## final  value 84.893413 
## stopped after 100 iterations
## # weights:  25
## initial  value 577.734866 
## iter  10 value 344.475604
## iter  20 value 286.874667
## iter  30 value 248.937476
## iter  40 value 239.174166
## iter  50 value 228.803876
## iter  60 value 227.685050
## iter  70 value 227.566651
## iter  80 value 227.438805
## iter  90 value 227.432369
## iter 100 value 227.430006
## final  value 227.430006 
## stopped after 100 iterations
## # weights:  73
## initial  value 539.893029 
## iter  10 value 232.998519
## iter  20 value 156.494090
## iter  30 value 113.642499
## iter  40 value 94.340188
## iter  50 value 87.260310
## iter  60 value 83.748000
## iter  70 value 82.987386
## iter  80 value 82.531854
## iter  90 value 82.386144
## iter 100 value 82.164667
## final  value 82.164667 
## stopped after 100 iterations
## # weights:  121
## initial  value 503.935457 
## iter  10 value 190.921333
## iter  20 value 118.643486
## iter  30 value 76.914000
## iter  40 value 64.959299
## iter  50 value 56.154105
## iter  60 value 54.046976
## iter  70 value 51.144990
## iter  80 value 48.113060
## iter  90 value 47.447985
## iter 100 value 47.079349
## final  value 47.079349 
## stopped after 100 iterations
## # weights:  25
## initial  value 522.019686 
## iter  10 value 313.687213
## iter  20 value 215.283278
## iter  30 value 193.580432
## iter  40 value 181.356602
## iter  50 value 172.304206
## iter  60 value 171.954453
## iter  70 value 171.619909
## iter  80 value 170.893309
## iter  90 value 170.817536
## iter 100 value 170.813665
## final  value 170.813665 
## stopped after 100 iterations
## # weights:  73
## initial  value 571.129957 
## iter  10 value 221.787072
## iter  20 value 178.463846
## iter  30 value 154.937611
## iter  40 value 135.966040
## iter  50 value 130.184065
## iter  60 value 125.282668
## iter  70 value 123.752372
## iter  80 value 123.446939
## iter  90 value 122.983363
## iter 100 value 122.902694
## final  value 122.902694 
## stopped after 100 iterations
## # weights:  121
## initial  value 531.385187 
## iter  10 value 240.408935
## iter  20 value 135.308467
## iter  30 value 93.704713
## iter  40 value 87.703925
## iter  50 value 76.893006
## iter  60 value 73.080257
## iter  70 value 65.290520
## iter  80 value 64.042686
## iter  90 value 63.330230
## iter 100 value 62.968353
## final  value 62.968353 
## stopped after 100 iterations
## # weights:  25
## initial  value 582.804791 
## iter  10 value 334.209489
## iter  20 value 251.469132
## iter  30 value 210.928864
## iter  40 value 203.293991
## iter  50 value 202.558072
## iter  60 value 202.555588
## final  value 202.555419 
## converged
## # weights:  73
## initial  value 532.183569 
## iter  10 value 243.055135
## iter  20 value 196.868187
## iter  30 value 173.046279
## iter  40 value 162.174232
## iter  50 value 158.883336
## iter  60 value 156.645833
## iter  70 value 152.415808
## iter  80 value 147.255132
## iter  90 value 140.098426
## iter 100 value 138.119879
## final  value 138.119879 
## stopped after 100 iterations
## # weights:  121
## initial  value 530.557380 
## iter  10 value 184.946587
## iter  20 value 142.069431
## iter  30 value 116.880036
## iter  40 value 104.597354
## iter  50 value 99.655751
## iter  60 value 98.033591
## iter  70 value 96.663103
## iter  80 value 95.240546
## iter  90 value 92.455378
## iter 100 value 91.349834
## final  value 91.349834 
## stopped after 100 iterations
## # weights:  25
## initial  value 508.293583 
## iter  10 value 290.220697
## iter  20 value 214.335933
## iter  30 value 194.944385
## iter  40 value 168.652826
## iter  50 value 162.234133
## iter  60 value 161.341553
## iter  70 value 161.314672
## iter  80 value 161.253524
## iter  90 value 161.200850
## iter 100 value 161.175873
## final  value 161.175873 
## stopped after 100 iterations
## # weights:  73
## initial  value 491.044162 
## iter  10 value 177.684441
## iter  20 value 126.020642
## iter  30 value 99.610840
## iter  40 value 89.355666
## iter  50 value 87.295315
## iter  60 value 87.167133
## iter  70 value 87.013727
## iter  80 value 86.905814
## iter  90 value 86.528664
## iter 100 value 86.381528
## final  value 86.381528 
## stopped after 100 iterations
## # weights:  121
## initial  value 484.743905 
## iter  10 value 154.433135
## iter  20 value 111.226376
## iter  30 value 89.856943
## iter  40 value 82.143694
## iter  50 value 76.987200
## iter  60 value 71.984295
## iter  70 value 71.418439
## iter  80 value 70.708451
## iter  90 value 70.444773
## iter 100 value 70.290804
## final  value 70.290804 
## stopped after 100 iterations
## # weights:  121
## initial  value 624.539719 
## iter  10 value 250.559560
## iter  20 value 185.674225
## iter  30 value 148.040611
## iter  40 value 121.136616
## iter  50 value 109.304502
## iter  60 value 103.801674
## iter  70 value 98.574179
## iter  80 value 97.185464
## iter  90 value 96.322070
## iter 100 value 95.863974
## final  value 95.863974 
## stopped after 100 iterations
resultado_entrenamiento5 <- predict(modelo5,entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$target)

6. Modelo con el Método rf

modelo6 <- train(target ~ ., data=entrenamiento,
                 method="rf", # Cambiar 
                 preProcess=c("scale","center"),
                 trControl = trainControl(method="cv", number=10),
                 tuneGrid=expand.grid(mtry=c(2,4,6)) #Cambiar
                 )

resultado_entrenamiento6 <- predict(modelo6,entrenamiento)
resultado_prueba6 <- predict(modelo6, prueba)

#Matriz de Confusión del Resultado del Entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$target)

#Matriz de Confusión del Resultado de la Prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$target)

Resumen de resultados

resultados <- data.frame(
  "svmLinear"=c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "svmRadial"=c(mcre2$overall["Accuracy"], mcrp2$overall["Accuracy"]),
  "svmPoly"=c(mcre3$overall["Accuracy"], mcrp3$overall["Accuracy"]),
  "rpart"=c(mcre4$overall["Accuracy"], mcrp4$overall["Accuracy"]),
  "nnet"=c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "rf"=c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)
rownames(resultados) <- c("Precisión de Entrenamiento", "Prescisión de Prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet rf
## Precisión de Entrenamiento 0.8952497         1 0.8952497 1.0000000 0.9914738  1
## Prescisión de Prueba       0.8921569         1 0.8921569 0.9852941 0.9901961  1

Conclusiones

El modelo con el método de Máquina de Vectores de Soporte de subtipo Radial (svmRadial) presenta sobreajuste, ya que tiene una alta precisión en entrenamiento y alta en la prueba, mientras que la base de datos contiene errores.

Acorde al resumen de resultados, el modelo mejor evaluado es el de Máquina de Vectores de Soporte de subtipo Lineal, pues es más sencillo.

LS0tDQp0aXRsZTogJzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Q2FyZXQgLSBFbmZlcm1lZGFkIGNhcmRpYWNhPC9zcGFuPicNCmF1dGhvcjogIlZhbGVyaWEgTmFuZ28gLSBBMDExNzQxMDYiDQpkYXRlOiAiMjAyNC0wOC0yMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSANCiAgICB0aGVtZTogZGFyayANCi0tLQ0KDQohW10oQzpcXFVzZXJzXFx2YWxlclxcT25lRHJpdmVcXEVzY3JpdG9yaW9cXElBIGNvbiBpbXBhY3RvIGVtcHJlc2FyaWFsXFxSU3R1ZGlvXFxJbcOhZ2VuZXNcXGhlYXJ0LmdpZikgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5UZW9yw61hIDwvc3Bhbj4NCkVsIHBhcXVldGUgKmNhcmV0IChDbGFzc2lmaWNhdGlvbiBhbmQgUmVncmVzc2lvbiBUcmFpbmluZykqIGVzIHVuIHBhcXVldGUgaW50ZWdyYWwgY29uIHVuYSBhbXBsaWEgdmFyaWVkYWQgZGUgYWxnb3JpdG1vcyBwYXJhIGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+IFBhc28gMS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgI0dyw6FmaWNhcyBjb24gbWVqb3IgZGlzZcOxbw0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjQ3JlYXIgZ3LDoWZpY29zDQpsaWJyYXJ5KGxhdHRpY2UpDQojaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShjYXJldCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpICNVc2FyIGxhIGJhc2UgZGUgZGF0b3MgIklyaXMiDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpICNFeHBsb3JhY2nDs24gZGUgZGF0b3MNCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KI2luc3RhbGwucGFja2FnZXMoImtlcm5sYWIiKSAjUGFxdWV0ZSBjb24gbcOpdG9kb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoa2VybmxhYikNCiNpbnN0YWxsLnBhY2thZ2VzKCJyYW5kb21Gb3Jlc3QiKSAjUGFxdWV0ZSBwYXJhIGVzdGUgbcOpdG9kbyBkZSBjbGFzaWZpY2FjacOzbg0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPiBQYXNvIDIuIENyZWFyIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkZiA8LSByZWFkLmNzdigiQzovVXNlcnMvdmFsZXIvT25lRHJpdmUvRXNjcml0b3Jpby9JQSBjb24gaW1wYWN0byBlbXByZXNhcmlhbC9CYXNlIGRlIGRhdG9zL2hlYXJ0LmNzdiIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPiBQYXNvIDMuIEFuw6FsaXNpcyBFeHBsb3JhdG9yaW8gPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KcGxvdF9taXNzaW5nKGRmKQ0KDQpkZiRzZXggPC0gYXMuZmFjdG9yKGRmJHNleCkNCmRmJGNwIDwtIGFzLmZhY3RvcihkZiRjcCkNCmRmJGZicyA8LSBhcy5mYWN0b3IoZGYkZmJzKQ0KZGYkcmVzdGVjZyA8LSBhcy5mYWN0b3IoZGYkcmVzdGVjZykNCmRmJGV4YW5nIDwtIGFzLmZhY3RvcihkZiRleGFuZykNCmRmJHNsb3BlIDwtIGFzLmZhY3RvcihkZiRzbG9wZSkNCmRmJGNhIDwtIGFzLmZhY3RvcihkZiRjYSkNCmRmJHRoYWwgPC0gYXMuZmFjdG9yKGRmJHRoYWwpDQpkZiR0YXJnZXQgPC0gYXMuZmFjdG9yKGRmJHRhcmdldCkNCmBgYA0KKipOT1RBOiBMYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSB0ZW5lciBmb3JtYXRvIGRlIEZBQ1RPUioqDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4gUGFzbyA0LiBQYXJ0aXIgbG9zIGRhdG9zIDgwLzIwIDwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiR0YXJnZXQsIHA9MC44LCBsaXN0PUZBTFNFKQ0KZW50cmVuYW1pZW50byA8LSBkZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KcHJ1ZWJhIDwtIGRmWy1yZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Nw6l0b2RvcyBwYXJhIG1vZGVsYXIgPC9zcGFuPg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRwcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOg0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4NCiogKirDgXJib2wgZGUgRGVjaXNpw7NuKio6IHJwYXJ0DQoqICoqUmVkZXMgTmV1cm9uYWxlcyoqOiBubmV0DQoqICoqUmFuZG9tIEZvcmVzdCoqIG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjEuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyBzdm1MaW5lYXI8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzEgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InN2bUxpbmVhciIsICMgQ2FtYmlhciANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkPWRhdGEuZnJhbWUoQz0xKSAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSwgcHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmExLCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Mi4gTW9kZWxvIGNvbiBlbCBNw6l0b2RvIHN2bVJhZGlhbDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMiA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUmFkaWFsIiwgIyBDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQ9ZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMixlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTIgPC0gcHJlZGljdChtb2RlbG8yLCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8yLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4zLiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gc3ZtUG9seTwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMyA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUG9seSIsICMgQ2FtYmlhciANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkPWRhdGEuZnJhbWUoZGVncmVlPTEsIHNjYWxlPTEsIEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMgPC0gcHJlZGljdChtb2RlbG8zLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmUzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjQuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyBycGFydDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNCA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUG9seSIsICMgQ2FtYmlhciANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVsZW5naHQ9MTAgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQgPC0gcHJlZGljdChtb2RlbG80LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNCA8LSBwcmVkaWN0KG1vZGVsbzQsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJHRhcmdldCkNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+NS4gTW9kZWxvIGNvbiBlbCBNw6l0b2RvIG5uZXQ8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzUgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9Im5uZXQiLCAjIENhbWJpYXIgDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApDQogICAgICAgICAgICAgICAgICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LCBwcnVlYmEpDQoNCiNNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG81LCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij42LiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gcmY8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzYgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InJmIiwgIyBDYW1iaWFyIA0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQ9ZXhwYW5kLmdyaWQobXRyeT1jKDIsNCw2KSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNiA8LSBwcmVkaWN0KG1vZGVsbzYsIHBydWViYSkNCg0KI01hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+IFJlc3VtZW4gZGUgcmVzdWx0YWRvczwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKA0KICAic3ZtTGluZWFyIj1jKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUmFkaWFsIj1jKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUG9seSI9YyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJwYXJ0Ij1jKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCI9YyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJmIj1jKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQopDQpyb3duYW1lcyhyZXN1bHRhZG9zKSA8LSBjKCJQcmVjaXNpw7NuIGRlIEVudHJlbmFtaWVudG8iLCAiUHJlc2Npc2nDs24gZGUgUHJ1ZWJhIikNCnJlc3VsdGFkb3MNCmBgYA0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPiBDb25jbHVzaW9uZXM8L3NwYW4+DQpFbCBtb2RlbG8gY29uIGVsIG3DqXRvZG8gZGUgTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZSBkZSBzdWJ0aXBvIFJhZGlhbCAqKHN2bVJhZGlhbCkqIHByZXNlbnRhIHNvYnJlYWp1c3RlLCB5YSBxdWUgdGllbmUgdW5hIGFsdGEgcHJlY2lzacOzbiBlbiBlbnRyZW5hbWllbnRvIHkgYWx0YSBlbiBsYSBwcnVlYmEsIG1pZW50cmFzIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIGNvbnRpZW5lIGVycm9yZXMuDQoNCkFjb3JkZSBhbCByZXN1bWVuIGRlIHJlc3VsdGFkb3MsIGVsIG1vZGVsbyBtZWpvciBldmFsdWFkbyBlcyBlbCBkZSAqKk3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUgZGUgc3VidGlwbyBMaW5lYWwqKiwgcHVlcyBlcyBtw6FzIHNlbmNpbGxvLg0KDQo=