Teoría

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

Instalar paquetes y librerías

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(lattice)
library(caret)
library(datasets)
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.3.3
library(kernlab)
## Warning: package 'kernlab' was built under R version 4.3.3
## 
## Attaching package: 'kernlab'
## The following object is masked from 'package:ggplot2':
## 
##     alpha
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin

Crear base de datos

#file.choose()
df <- read.csv("C:\\Users\\HP\\OneDrive - FEMSA Comercio\\Escritorio\\Inteligencia de Negocios\\7mo Semestre\\M2\\BDD\\heart.csv")

Analísis 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 ...
df$target <- as.factor(df$target)
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$thal <- as.factor(df$thal)

plot_missing(df)

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

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 utilizados 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: mnet
  • Random Forest o Bosques Aleatorios: rf

1. Modelo con el Método svmLinaer

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

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

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

# Mátriz 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)

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

# Mátriz 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)

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

# Mátriz 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 = "rpart", #Cambiar
                 preProcess=c("scale", "center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneLength =10
                 )

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

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

# Mátriz 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)
                 )
## # weights:  22
## initial  value 515.844459 
## iter  10 value 302.111169
## iter  20 value 265.116114
## iter  30 value 253.479607
## iter  40 value 233.145073
## iter  50 value 231.406597
## iter  60 value 231.398782
## iter  70 value 231.392673
## iter  80 value 231.391488
## iter  90 value 231.390955
## iter 100 value 231.390368
## final  value 231.390368 
## stopped after 100 iterations
## # weights:  64
## initial  value 529.196518 
## iter  10 value 224.297574
## iter  20 value 172.302506
## iter  30 value 154.719275
## iter  40 value 146.113587
## iter  50 value 133.465307
## iter  60 value 130.585239
## iter  70 value 130.575864
## final  value 130.575794 
## converged
## # weights:  106
## initial  value 601.077368 
## iter  10 value 191.721112
## iter  20 value 120.776004
## iter  30 value 75.738423
## iter  40 value 63.909429
## iter  50 value 59.073515
## iter  60 value 57.314828
## iter  70 value 56.047884
## iter  80 value 52.716930
## iter  90 value 51.405029
## iter 100 value 44.403708
## final  value 44.403708 
## stopped after 100 iterations
## # weights:  22
## initial  value 528.923690 
## iter  10 value 259.251699
## iter  20 value 244.376107
## iter  30 value 242.547420
## final  value 242.543374 
## converged
## # weights:  64
## initial  value 653.164510 
## iter  10 value 274.988736
## iter  20 value 226.662429
## iter  30 value 201.183194
## iter  40 value 190.931456
## iter  50 value 182.217745
## iter  60 value 175.863945
## iter  70 value 173.532315
## iter  80 value 173.156400
## iter  90 value 173.042861
## iter 100 value 173.027061
## final  value 173.027061 
## stopped after 100 iterations
## # weights:  106
## initial  value 579.672941 
## iter  10 value 231.077398
## iter  20 value 176.215977
## iter  30 value 156.470953
## iter  40 value 146.283538
## iter  50 value 133.922380
## iter  60 value 126.964332
## iter  70 value 120.125050
## iter  80 value 113.809189
## iter  90 value 108.052228
## iter 100 value 103.928783
## final  value 103.928783 
## stopped after 100 iterations
## # weights:  22
## initial  value 501.677395 
## iter  10 value 268.514253
## iter  20 value 246.456541
## iter  30 value 233.724420
## iter  40 value 219.759592
## iter  50 value 219.189103
## iter  60 value 218.910644
## iter  70 value 218.806281
## iter  80 value 218.796550
## iter  90 value 218.786081
## iter 100 value 218.772413
## final  value 218.772413 
## stopped after 100 iterations
## # weights:  64
## initial  value 507.249900 
## iter  10 value 258.572167
## iter  20 value 219.237535
## iter  30 value 188.384635
## iter  40 value 168.336339
## iter  50 value 155.031400
## iter  60 value 143.520568
## iter  70 value 143.036963
## iter  80 value 142.888637
## iter  90 value 142.654196
## iter 100 value 142.554157
## final  value 142.554157 
## stopped after 100 iterations
## # weights:  106
## initial  value 639.019734 
## iter  10 value 220.903561
## iter  20 value 148.693936
## iter  30 value 101.654917
## iter  40 value 84.770536
## iter  50 value 75.788420
## iter  60 value 71.642363
## iter  70 value 70.181876
## iter  80 value 69.688690
## iter  90 value 69.454109
## iter 100 value 69.240985
## final  value 69.240985 
## stopped after 100 iterations
## # weights:  22
## initial  value 539.324029 
## iter  10 value 319.062443
## iter  20 value 274.242598
## iter  30 value 247.470342
## iter  40 value 230.874355
## iter  50 value 213.348890
## iter  60 value 193.578322
## iter  70 value 193.217466
## final  value 193.216993 
## converged
## # weights:  64
## initial  value 519.552121 
## iter  10 value 245.196694
## iter  20 value 199.705560
## iter  30 value 155.659011
## iter  40 value 139.593293
## iter  50 value 128.200327
## iter  60 value 117.564063
## iter  70 value 116.748782
## iter  80 value 116.650205
## final  value 116.649951 
## converged
## # weights:  106
## initial  value 557.081785 
## iter  10 value 214.305017
## iter  20 value 145.698433
## iter  30 value 94.828559
## iter  40 value 72.813570
## iter  50 value 67.354576
## iter  60 value 65.448760
## iter  70 value 62.323690
## iter  80 value 61.012695
## iter  90 value 60.443020
## iter 100 value 60.263069
## final  value 60.263069 
## stopped after 100 iterations
## # weights:  22
## initial  value 511.176143 
## iter  10 value 265.406934
## iter  20 value 255.495734
## iter  30 value 245.777482
## iter  40 value 245.473683
## iter  50 value 245.472608
## iter  60 value 245.472404
## final  value 245.472357 
## converged
## # weights:  64
## initial  value 555.252848 
## iter  10 value 241.333013
## iter  20 value 213.146487
## iter  30 value 190.739884
## iter  40 value 177.609870
## iter  50 value 170.738716
## iter  60 value 168.562400
## iter  70 value 167.581935
## iter  80 value 167.217255
## iter  90 value 167.204760
## final  value 167.204499 
## converged
## # weights:  106
## initial  value 575.536085 
## iter  10 value 193.274131
## iter  20 value 151.490819
## iter  30 value 138.657885
## iter  40 value 121.462777
## iter  50 value 114.753483
## iter  60 value 112.994854
## iter  70 value 111.726461
## iter  80 value 109.630582
## iter  90 value 109.021674
## iter 100 value 108.955193
## final  value 108.955193 
## stopped after 100 iterations
## # weights:  22
## initial  value 523.585280 
## iter  10 value 314.357497
## iter  20 value 262.120478
## iter  30 value 234.243698
## iter  40 value 221.950420
## iter  50 value 221.838698
## iter  60 value 221.802853
## iter  70 value 221.793131
## iter  80 value 221.758652
## iter  90 value 221.745657
## iter 100 value 221.743484
## final  value 221.743484 
## stopped after 100 iterations
## # weights:  64
## initial  value 530.765631 
## iter  10 value 230.621308
## iter  20 value 189.223801
## iter  30 value 163.072408
## iter  40 value 151.866708
## iter  50 value 148.506827
## iter  60 value 146.847441
## iter  70 value 145.681378
## iter  80 value 145.243797
## iter  90 value 144.872467
## iter 100 value 144.242145
## final  value 144.242145 
## stopped after 100 iterations
## # weights:  106
## initial  value 578.922242 
## iter  10 value 178.117150
## iter  20 value 121.962110
## iter  30 value 92.141482
## iter  40 value 84.182181
## iter  50 value 81.702110
## iter  60 value 76.986193
## iter  70 value 76.047565
## iter  80 value 75.095629
## iter  90 value 74.313551
## iter 100 value 73.983829
## final  value 73.983829 
## stopped after 100 iterations
## # weights:  22
## initial  value 534.620268 
## iter  10 value 345.701389
## iter  20 value 269.877310
## iter  30 value 236.478229
## iter  40 value 224.230180
## iter  50 value 209.741005
## iter  60 value 206.986374
## iter  70 value 206.472052
## iter  80 value 206.222425
## iter  90 value 205.617008
## iter 100 value 205.392930
## final  value 205.392930 
## stopped after 100 iterations
## # weights:  64
## initial  value 607.769165 
## iter  10 value 282.541987
## iter  20 value 203.541908
## iter  30 value 164.929153
## iter  40 value 145.373884
## iter  50 value 131.389861
## iter  60 value 127.669600
## iter  70 value 127.478081
## iter  80 value 127.468831
## iter  90 value 127.467960
## final  value 127.467672 
## converged
## # weights:  106
## initial  value 513.178582 
## iter  10 value 200.680421
## iter  20 value 134.208778
## iter  30 value 97.549885
## iter  40 value 84.075904
## iter  50 value 80.040986
## iter  60 value 79.377507
## iter  70 value 76.033610
## iter  80 value 75.792196
## iter  90 value 75.748028
## iter 100 value 75.708010
## final  value 75.708010 
## stopped after 100 iterations
## # weights:  22
## initial  value 552.698848 
## iter  10 value 301.645071
## iter  20 value 259.346467
## iter  30 value 256.127103
## iter  40 value 255.643227
## final  value 255.641274 
## converged
## # weights:  64
## initial  value 578.929116 
## iter  10 value 269.046296
## iter  20 value 215.452411
## iter  30 value 189.829242
## iter  40 value 175.089253
## iter  50 value 162.537764
## iter  60 value 157.495205
## iter  70 value 154.561113
## iter  80 value 152.872696
## iter  90 value 152.775284
## iter 100 value 152.739845
## final  value 152.739845 
## stopped after 100 iterations
## # weights:  106
## initial  value 487.542866 
## iter  10 value 231.341856
## iter  20 value 192.420177
## iter  30 value 161.417029
## iter  40 value 145.907999
## iter  50 value 132.984432
## iter  60 value 126.820918
## iter  70 value 125.231443
## iter  80 value 122.912281
## iter  90 value 110.945748
## iter 100 value 109.042925
## final  value 109.042925 
## stopped after 100 iterations
## # weights:  22
## initial  value 518.217191 
## iter  10 value 276.073700
## iter  20 value 236.331019
## iter  30 value 228.757411
## iter  40 value 208.565267
## iter  50 value 203.255702
## iter  60 value 202.938765
## iter  70 value 202.848876
## iter  80 value 202.721132
## iter  90 value 202.634214
## iter 100 value 202.609101
## final  value 202.609101 
## stopped after 100 iterations
## # weights:  64
## initial  value 559.602470 
## iter  10 value 231.942027
## iter  20 value 207.504949
## iter  30 value 196.161190
## iter  40 value 182.848239
## iter  50 value 179.159206
## iter  60 value 173.939536
## iter  70 value 165.977813
## iter  80 value 160.921094
## iter  90 value 154.395763
## iter 100 value 149.068321
## final  value 149.068321 
## stopped after 100 iterations
## # weights:  106
## initial  value 526.492447 
## iter  10 value 206.739791
## iter  20 value 143.758428
## iter  30 value 101.400591
## iter  40 value 81.901869
## iter  50 value 75.932326
## iter  60 value 73.200186
## iter  70 value 69.856742
## iter  80 value 67.338610
## iter  90 value 66.391598
## iter 100 value 65.741863
## final  value 65.741863 
## stopped after 100 iterations
## # weights:  22
## initial  value 498.769043 
## iter  10 value 255.203809
## iter  20 value 223.043771
## iter  30 value 199.267799
## iter  40 value 196.404990
## final  value 196.400602 
## converged
## # weights:  64
## initial  value 553.935718 
## iter  10 value 223.794130
## iter  20 value 190.388796
## iter  30 value 164.933894
## iter  40 value 148.420555
## iter  50 value 142.238265
## iter  60 value 132.111454
## iter  70 value 131.449014
## iter  80 value 131.422306
## iter  90 value 131.420232
## iter  90 value 131.420231
## iter  90 value 131.420231
## final  value 131.420231 
## converged
## # weights:  106
## initial  value 611.682816 
## iter  10 value 238.011413
## iter  20 value 186.284618
## iter  30 value 157.856760
## iter  40 value 147.693079
## iter  50 value 137.944414
## iter  60 value 126.797781
## iter  70 value 122.442239
## iter  80 value 120.694464
## iter  90 value 117.357110
## iter 100 value 114.413101
## final  value 114.413101 
## stopped after 100 iterations
## # weights:  22
## initial  value 561.309141 
## iter  10 value 271.287974
## iter  20 value 246.687083
## iter  30 value 240.375318
## iter  40 value 240.318905
## final  value 240.318743 
## converged
## # weights:  64
## initial  value 517.556772 
## iter  10 value 244.259707
## iter  20 value 199.488536
## iter  30 value 186.025355
## iter  40 value 179.796949
## iter  50 value 178.078117
## iter  60 value 177.849317
## iter  70 value 177.373285
## iter  80 value 177.313701
## final  value 177.312270 
## converged
## # weights:  106
## initial  value 551.943597 
## iter  10 value 209.275610
## iter  20 value 153.053696
## iter  30 value 135.924188
## iter  40 value 125.692597
## iter  50 value 115.342703
## iter  60 value 106.629368
## iter  70 value 103.380692
## iter  80 value 101.815311
## iter  90 value 100.332552
## iter 100 value 95.851519
## final  value 95.851519 
## stopped after 100 iterations
## # weights:  22
## initial  value 516.337024 
## iter  10 value 269.801250
## iter  20 value 248.260453
## iter  30 value 244.724666
## iter  40 value 226.618475
## iter  50 value 215.954386
## iter  60 value 214.226364
## iter  70 value 213.581278
## iter  80 value 213.576516
## iter  90 value 213.552323
## iter 100 value 213.548295
## final  value 213.548295 
## stopped after 100 iterations
## # weights:  64
## initial  value 548.932805 
## iter  10 value 212.333904
## iter  20 value 159.737670
## iter  30 value 129.856459
## iter  40 value 121.202342
## iter  50 value 119.086782
## iter  60 value 117.844694
## iter  70 value 117.132611
## iter  80 value 115.413060
## iter  90 value 114.664005
## iter 100 value 114.408706
## final  value 114.408706 
## stopped after 100 iterations
## # weights:  106
## initial  value 554.432201 
## iter  10 value 196.299091
## iter  20 value 128.448849
## iter  30 value 95.671931
## iter  40 value 83.462171
## iter  50 value 81.770973
## iter  60 value 80.607091
## iter  70 value 79.667056
## iter  80 value 79.471048
## iter  90 value 79.149020
## iter 100 value 78.897038
## final  value 78.897038 
## stopped after 100 iterations
## # weights:  22
## initial  value 522.599021 
## iter  10 value 259.339730
## iter  20 value 230.712613
## iter  30 value 215.485960
## iter  40 value 208.331692
## final  value 208.309255 
## converged
## # weights:  64
## initial  value 570.487756 
## iter  10 value 281.470059
## iter  20 value 203.955301
## iter  30 value 186.308846
## iter  40 value 176.846264
## iter  50 value 170.303956
## iter  60 value 168.781527
## iter  70 value 168.581810
## iter  80 value 168.532161
## iter  90 value 168.325491
## iter 100 value 168.193491
## final  value 168.193491 
## stopped after 100 iterations
## # weights:  106
## initial  value 633.603198 
## iter  10 value 218.078104
## iter  20 value 139.925373
## iter  30 value 102.283973
## iter  40 value 94.585450
## iter  50 value 87.969012
## iter  60 value 85.987034
## iter  70 value 85.493734
## iter  80 value 85.062934
## iter  90 value 84.770180
## iter 100 value 84.195521
## final  value 84.195521 
## stopped after 100 iterations
## # weights:  22
## initial  value 518.844651 
## iter  10 value 289.379644
## iter  20 value 257.778460
## iter  30 value 241.130476
## iter  40 value 236.262651
## iter  50 value 236.257108
## final  value 236.257104 
## converged
## # weights:  64
## initial  value 497.318242 
## iter  10 value 273.606828
## iter  20 value 228.997817
## iter  30 value 197.212965
## iter  40 value 189.620822
## iter  50 value 186.934727
## iter  60 value 185.952142
## iter  70 value 183.474669
## iter  80 value 182.692380
## iter  90 value 182.282452
## iter 100 value 182.132790
## final  value 182.132790 
## stopped after 100 iterations
## # weights:  106
## initial  value 565.398483 
## iter  10 value 221.747272
## iter  20 value 188.886163
## iter  30 value 169.378916
## iter  40 value 152.876844
## iter  50 value 129.924047
## iter  60 value 124.962127
## iter  70 value 123.210671
## iter  80 value 122.641303
## iter  90 value 122.211453
## iter 100 value 122.196861
## final  value 122.196861 
## stopped after 100 iterations
## # weights:  22
## initial  value 542.105036 
## iter  10 value 340.922354
## iter  20 value 243.826470
## iter  30 value 231.179209
## iter  40 value 209.294250
## iter  50 value 207.015824
## iter  60 value 203.635352
## iter  70 value 203.331204
## iter  80 value 201.727177
## iter  90 value 201.578394
## iter 100 value 201.577695
## final  value 201.577695 
## stopped after 100 iterations
## # weights:  64
## initial  value 628.429186 
## iter  10 value 231.359870
## iter  20 value 178.009446
## iter  30 value 164.538613
## iter  40 value 159.149637
## iter  50 value 157.909434
## iter  60 value 157.758540
## iter  70 value 157.677505
## iter  80 value 157.623344
## iter  90 value 157.168901
## iter 100 value 157.109221
## final  value 157.109221 
## stopped after 100 iterations
## # weights:  106
## initial  value 554.921573 
## iter  10 value 201.896554
## iter  20 value 116.995383
## iter  30 value 84.680934
## iter  40 value 55.815489
## iter  50 value 46.121752
## iter  60 value 44.155988
## iter  70 value 42.158258
## iter  80 value 41.277048
## iter  90 value 40.431458
## iter 100 value 39.570108
## final  value 39.570108 
## stopped after 100 iterations
## # weights:  22
## initial  value 515.359308 
## iter  10 value 295.818807
## iter  20 value 252.676948
## iter  30 value 246.616008
## iter  40 value 235.347853
## iter  50 value 231.464936
## iter  60 value 231.458618
## final  value 231.458613 
## converged
## # weights:  64
## initial  value 522.527711 
## iter  10 value 211.991127
## iter  20 value 150.334195
## iter  30 value 130.713155
## iter  40 value 118.796198
## iter  50 value 115.629333
## iter  60 value 115.160069
## iter  70 value 115.145414
## iter  80 value 115.144862
## final  value 115.144849 
## converged
## # weights:  106
## initial  value 512.234348 
## iter  10 value 192.112052
## iter  20 value 120.983576
## iter  30 value 90.181602
## iter  40 value 78.006613
## iter  50 value 67.060642
## iter  60 value 64.443052
## iter  70 value 58.113490
## iter  80 value 46.549384
## iter  90 value 43.066590
## iter 100 value 41.027478
## final  value 41.027478 
## stopped after 100 iterations
## # weights:  22
## initial  value 530.110619 
## iter  10 value 331.893043
## iter  20 value 290.981337
## iter  30 value 268.539442
## iter  40 value 255.562685
## iter  50 value 245.659894
## iter  60 value 235.648139
## iter  70 value 235.097279
## iter  80 value 235.096935
## final  value 235.096887 
## converged
## # weights:  64
## initial  value 534.223220 
## iter  10 value 237.058609
## iter  20 value 196.533532
## iter  30 value 177.193049
## iter  40 value 166.661278
## iter  50 value 163.071672
## iter  60 value 162.303618
## iter  70 value 162.146153
## iter  80 value 162.121744
## final  value 162.121535 
## converged
## # weights:  106
## initial  value 492.208621 
## iter  10 value 226.090156
## iter  20 value 179.252119
## iter  30 value 144.996021
## iter  40 value 125.071527
## iter  50 value 114.340099
## iter  60 value 108.456893
## iter  70 value 97.840372
## iter  80 value 92.381262
## iter  90 value 90.017520
## iter 100 value 88.844454
## final  value 88.844454 
## stopped after 100 iterations
## # weights:  22
## initial  value 509.808691 
## iter  10 value 265.360891
## iter  20 value 247.437260
## iter  30 value 229.763488
## iter  40 value 220.593583
## iter  50 value 220.348835
## iter  60 value 220.274710
## iter  70 value 220.235479
## iter  80 value 220.100398
## iter  90 value 220.043412
## iter 100 value 220.040011
## final  value 220.040011 
## stopped after 100 iterations
## # weights:  64
## initial  value 504.969174 
## iter  10 value 287.070043
## iter  20 value 202.601016
## iter  30 value 168.165025
## iter  40 value 148.765236
## iter  50 value 122.679147
## iter  60 value 120.352209
## iter  70 value 119.662439
## iter  80 value 119.432874
## iter  90 value 119.189981
## iter 100 value 118.631081
## final  value 118.631081 
## stopped after 100 iterations
## # weights:  106
## initial  value 505.106880 
## iter  10 value 213.045714
## iter  20 value 133.751288
## iter  30 value 94.782095
## iter  40 value 86.035193
## iter  50 value 82.745186
## iter  60 value 80.943559
## iter  70 value 80.286953
## iter  80 value 79.742497
## iter  90 value 79.654790
## iter 100 value 79.566752
## final  value 79.566752 
## stopped after 100 iterations
## # weights:  22
## initial  value 519.216048 
## iter  10 value 394.489521
## iter  20 value 350.332495
## iter  30 value 345.224942
## iter  40 value 294.314750
## iter  50 value 268.680920
## iter  60 value 260.340892
## iter  70 value 257.841781
## iter  80 value 257.562178
## iter  90 value 257.548791
## iter 100 value 257.542373
## final  value 257.542373 
## stopped after 100 iterations
## # weights:  64
## initial  value 536.743600 
## iter  10 value 262.644919
## iter  20 value 199.641037
## iter  30 value 173.893220
## iter  40 value 148.597231
## iter  50 value 135.322915
## iter  60 value 129.842546
## iter  70 value 128.663432
## iter  80 value 128.188786
## iter  90 value 128.117015
## iter 100 value 128.093850
## final  value 128.093850 
## stopped after 100 iterations
## # weights:  106
## initial  value 603.988810 
## iter  10 value 220.700788
## iter  20 value 135.122339
## iter  30 value 100.862791
## iter  40 value 95.122393
## iter  50 value 89.447057
## iter  60 value 86.236032
## iter  70 value 83.607361
## iter  80 value 82.455234
## iter  90 value 81.624472
## iter 100 value 81.314837
## final  value 81.314837 
## stopped after 100 iterations
## # weights:  22
## initial  value 489.672475 
## iter  10 value 271.166457
## iter  20 value 252.323756
## iter  30 value 246.658037
## final  value 246.613436 
## converged
## # weights:  64
## initial  value 564.345549 
## iter  10 value 280.671776
## iter  20 value 239.265673
## iter  30 value 223.897570
## iter  40 value 212.998518
## iter  50 value 211.945617
## iter  60 value 204.006896
## iter  70 value 185.164141
## iter  80 value 181.805984
## iter  90 value 181.408875
## iter 100 value 181.398982
## final  value 181.398982 
## stopped after 100 iterations
## # weights:  106
## initial  value 581.085700 
## iter  10 value 221.573188
## iter  20 value 168.829198
## iter  30 value 146.230850
## iter  40 value 134.171993
## iter  50 value 130.344058
## iter  60 value 128.677569
## iter  70 value 127.899601
## iter  80 value 126.150610
## iter  90 value 124.214224
## iter 100 value 122.747320
## final  value 122.747320 
## stopped after 100 iterations
## # weights:  22
## initial  value 524.692250 
## iter  10 value 327.228380
## iter  20 value 281.453045
## iter  30 value 252.163769
## iter  40 value 251.599093
## iter  50 value 251.097407
## iter  60 value 247.182308
## iter  70 value 237.226331
## iter  80 value 222.836666
## iter  90 value 218.560137
## iter 100 value 217.633515
## final  value 217.633515 
## stopped after 100 iterations
## # weights:  64
## initial  value 578.463580 
## iter  10 value 219.026209
## iter  20 value 173.424998
## iter  30 value 138.733453
## iter  40 value 131.160806
## iter  50 value 129.319106
## iter  60 value 128.822864
## iter  70 value 128.113367
## iter  80 value 127.073773
## iter  90 value 126.848461
## iter 100 value 126.100559
## final  value 126.100559 
## stopped after 100 iterations
## # weights:  106
## initial  value 662.940610 
## iter  10 value 200.748805
## iter  20 value 124.907054
## iter  30 value 103.489819
## iter  40 value 91.491469
## iter  50 value 85.480019
## iter  60 value 82.654189
## iter  70 value 82.106821
## iter  80 value 81.709610
## iter  90 value 81.374798
## iter 100 value 80.927249
## final  value 80.927249 
## stopped after 100 iterations
## # weights:  22
## initial  value 594.522591 
## iter  10 value 365.232735
## iter  20 value 265.512090
## iter  30 value 242.953851
## iter  40 value 221.755125
## iter  50 value 212.102476
## iter  60 value 211.864063
## iter  70 value 211.826287
## iter  80 value 211.788672
## iter  90 value 211.774508
## iter 100 value 211.774165
## final  value 211.774165 
## stopped after 100 iterations
## # weights:  64
## initial  value 547.458038 
## iter  10 value 228.295846
## iter  20 value 201.142417
## iter  30 value 171.232198
## iter  40 value 148.141663
## iter  50 value 137.396690
## iter  60 value 128.750376
## iter  70 value 128.210969
## iter  80 value 128.203592
## final  value 128.203488 
## converged
## # weights:  106
## initial  value 562.814998 
## iter  10 value 206.339185
## iter  20 value 141.722906
## iter  30 value 88.991849
## iter  40 value 70.962417
## iter  50 value 68.524122
## iter  60 value 67.224300
## iter  70 value 66.276807
## iter  80 value 64.941922
## iter  90 value 64.693052
## iter 100 value 64.271348
## final  value 64.271348 
## stopped after 100 iterations
## # weights:  22
## initial  value 489.674280 
## iter  10 value 271.920290
## iter  20 value 258.919280
## iter  30 value 249.663897
## iter  40 value 247.400529
## iter  50 value 247.256486
## final  value 247.256404 
## converged
## # weights:  64
## initial  value 575.247323 
## iter  10 value 300.231420
## iter  20 value 256.035421
## iter  30 value 221.530131
## iter  40 value 187.633511
## iter  50 value 178.540043
## iter  60 value 174.931704
## iter  70 value 173.997716
## iter  80 value 173.638194
## iter  90 value 173.576773
## iter 100 value 173.559357
## final  value 173.559357 
## stopped after 100 iterations
## # weights:  106
## initial  value 516.035504 
## iter  10 value 238.584698
## iter  20 value 149.542699
## iter  30 value 132.638075
## iter  40 value 124.935499
## iter  50 value 118.581551
## iter  60 value 114.374508
## iter  70 value 111.444485
## iter  80 value 106.876846
## iter  90 value 105.377235
## iter 100 value 104.367643
## final  value 104.367643 
## stopped after 100 iterations
## # weights:  22
## initial  value 526.877157 
## iter  10 value 259.517692
## iter  20 value 238.031570
## iter  30 value 212.341765
## iter  40 value 205.456535
## iter  50 value 205.135332
## iter  60 value 205.072846
## iter  70 value 205.065207
## iter  80 value 205.051767
## iter  90 value 204.999528
## final  value 204.996527 
## converged
## # weights:  64
## initial  value 506.898081 
## iter  10 value 229.873726
## iter  20 value 181.695653
## iter  30 value 161.555902
## iter  40 value 155.874910
## iter  50 value 152.108385
## iter  60 value 150.110405
## iter  70 value 147.842493
## iter  80 value 146.873019
## iter  90 value 146.762452
## iter 100 value 146.576090
## final  value 146.576090 
## stopped after 100 iterations
## # weights:  106
## initial  value 523.582579 
## iter  10 value 205.568328
## iter  20 value 147.203487
## iter  30 value 68.076240
## iter  40 value 54.312307
## iter  50 value 52.721066
## iter  60 value 52.162281
## iter  70 value 52.040922
## iter  80 value 51.957572
## iter  90 value 51.899715
## iter 100 value 51.837616
## final  value 51.837616 
## stopped after 100 iterations
## # weights:  22
## initial  value 547.498992 
## iter  10 value 353.803893
## iter  20 value 267.843201
## iter  30 value 247.241189
## iter  40 value 241.178657
## iter  50 value 233.786268
## iter  60 value 231.203413
## iter  70 value 230.522962
## iter  80 value 228.992383
## iter  90 value 227.831185
## iter 100 value 227.662771
## final  value 227.662771 
## stopped after 100 iterations
## # weights:  64
## initial  value 512.918098 
## iter  10 value 192.693303
## iter  20 value 170.614385
## iter  30 value 162.703376
## iter  40 value 150.518119
## iter  50 value 146.351091
## iter  60 value 146.293033
## iter  70 value 146.176094
## iter  80 value 146.174853
## iter  90 value 146.174308
## final  value 146.174299 
## converged
## # weights:  106
## initial  value 557.746930 
## iter  10 value 199.226101
## iter  20 value 124.065398
## iter  30 value 85.460899
## iter  40 value 70.795335
## iter  50 value 62.957188
## iter  60 value 59.247901
## iter  70 value 57.843987
## iter  80 value 57.309340
## iter  90 value 57.233259
## iter 100 value 57.217785
## final  value 57.217785 
## stopped after 100 iterations
## # weights:  22
## initial  value 624.590640 
## iter  10 value 277.431531
## iter  20 value 252.855821
## iter  30 value 243.495160
## iter  40 value 242.294028
## iter  50 value 242.283620
## iter  60 value 242.281767
## final  value 242.281322 
## converged
## # weights:  64
## initial  value 588.733669 
## iter  10 value 262.374954
## iter  20 value 209.835256
## iter  30 value 194.212511
## iter  40 value 189.421234
## iter  50 value 187.656665
## iter  60 value 183.730133
## iter  70 value 181.347619
## iter  80 value 173.346191
## iter  90 value 169.357876
## iter 100 value 169.215864
## final  value 169.215864 
## stopped after 100 iterations
## # weights:  106
## initial  value 617.451000 
## iter  10 value 224.668376
## iter  20 value 163.672607
## iter  30 value 147.589314
## iter  40 value 134.785222
## iter  50 value 129.693489
## iter  60 value 124.598903
## iter  70 value 121.157884
## iter  80 value 120.950075
## iter  90 value 120.519918
## iter 100 value 107.986957
## final  value 107.986957 
## stopped after 100 iterations
## # weights:  22
## initial  value 515.930004 
## iter  10 value 379.495829
## iter  20 value 272.188287
## iter  30 value 251.218473
## iter  40 value 236.156896
## iter  50 value 235.900838
## iter  60 value 235.812347
## iter  70 value 235.793637
## iter  80 value 235.786364
## iter  90 value 235.785770
## final  value 235.785421 
## converged
## # weights:  64
## initial  value 536.541188 
## iter  10 value 233.541620
## iter  20 value 198.802414
## iter  30 value 182.849319
## iter  40 value 172.207406
## iter  50 value 165.709556
## iter  60 value 159.719239
## iter  70 value 155.772089
## iter  80 value 155.281257
## iter  90 value 154.949526
## iter 100 value 154.479483
## final  value 154.479483 
## stopped after 100 iterations
## # weights:  106
## initial  value 504.747593 
## iter  10 value 215.725342
## iter  20 value 147.545169
## iter  30 value 107.859714
## iter  40 value 96.379082
## iter  50 value 93.121118
## iter  60 value 92.585821
## iter  70 value 92.289465
## iter  80 value 92.072901
## iter  90 value 91.948519
## iter 100 value 91.853376
## final  value 91.853376 
## stopped after 100 iterations
## # weights:  22
## initial  value 560.486985 
## iter  10 value 293.232977
## iter  20 value 260.993979
## iter  30 value 255.968086
## iter  40 value 237.301016
## iter  50 value 230.591627
## iter  60 value 230.577515
## iter  70 value 230.571895
## iter  80 value 230.568956
## iter  90 value 230.567073
## final  value 230.567024 
## converged
## # weights:  64
## initial  value 497.543697 
## iter  10 value 242.902013
## iter  20 value 207.309301
## iter  30 value 199.405214
## iter  40 value 189.545915
## iter  50 value 173.415468
## iter  60 value 168.516345
## iter  70 value 168.256902
## iter  80 value 168.237459
## iter  90 value 168.236217
## final  value 168.235875 
## converged
## # weights:  106
## initial  value 518.259802 
## iter  10 value 198.887575
## iter  20 value 124.162996
## iter  30 value 61.832158
## iter  40 value 48.464218
## iter  50 value 46.900432
## iter  60 value 45.846143
## iter  70 value 44.467486
## iter  80 value 43.746913
## iter  90 value 43.381358
## iter 100 value 42.872127
## final  value 42.872127 
## stopped after 100 iterations
## # weights:  22
## initial  value 534.032760 
## iter  10 value 341.017841
## iter  20 value 283.074367
## iter  30 value 269.720835
## iter  40 value 258.321873
## iter  50 value 247.731753
## iter  60 value 246.014987
## final  value 245.994770 
## converged
## # weights:  64
## initial  value 557.839250 
## iter  10 value 238.105851
## iter  20 value 209.756226
## iter  30 value 195.245867
## iter  40 value 192.232031
## iter  50 value 190.731119
## iter  60 value 189.663875
## iter  70 value 189.542103
## iter  80 value 189.541583
## iter  80 value 189.541582
## iter  80 value 189.541582
## final  value 189.541582 
## converged
## # weights:  106
## initial  value 552.834322 
## iter  10 value 217.984837
## iter  20 value 169.849621
## iter  30 value 146.032051
## iter  40 value 137.425358
## iter  50 value 128.001801
## iter  60 value 125.063649
## iter  70 value 124.659774
## iter  80 value 124.537888
## iter  90 value 124.509762
## iter 100 value 124.502397
## final  value 124.502397 
## stopped after 100 iterations
## # weights:  22
## initial  value 620.984004 
## iter  10 value 324.679168
## iter  20 value 264.492406
## iter  30 value 242.746149
## iter  40 value 230.119216
## iter  50 value 220.601772
## iter  60 value 219.483205
## iter  70 value 219.430794
## iter  80 value 219.399936
## iter  90 value 219.307441
## iter 100 value 219.305550
## final  value 219.305550 
## stopped after 100 iterations
## # weights:  64
## initial  value 538.107202 
## iter  10 value 247.384593
## iter  20 value 188.625761
## iter  30 value 152.728960
## iter  40 value 133.246445
## iter  50 value 126.184785
## iter  60 value 125.468446
## iter  70 value 125.050215
## iter  80 value 124.676002
## iter  90 value 124.494305
## iter 100 value 124.340039
## final  value 124.340039 
## stopped after 100 iterations
## # weights:  106
## initial  value 511.464061 
## iter  10 value 225.376130
## iter  20 value 170.387445
## iter  30 value 112.164997
## iter  40 value 92.101820
## iter  50 value 78.997079
## iter  60 value 75.457307
## iter  70 value 73.305977
## iter  80 value 70.186769
## iter  90 value 69.261781
## iter 100 value 68.926053
## final  value 68.926053 
## stopped after 100 iterations
## # weights:  106
## initial  value 687.667968 
## iter  10 value 237.870070
## iter  20 value 184.361356
## iter  30 value 163.452433
## iter  40 value 153.546431
## iter  50 value 143.714297
## iter  60 value 136.086916
## iter  70 value 127.954535
## iter  80 value 120.463642
## iter  90 value 116.691966
## iter 100 value 111.821936
## final  value 111.821936 
## stopped after 100 iterations
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

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

# Mátriz 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))
                 )

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

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

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

6. Modelo con el Método rf

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", "Precisión de Prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet rf
## Precisión de Entrenamiento 0.8538368         1 0.8538368 0.9135201 0.9841657  1
## Precisión de Prueba        0.8627451         1 0.8627451 0.8774510 0.9754902  1

Conclusiones

El modelo con el método de (svmRadial), (rf) presenta sobreajuste, ya que tiene una alta precisión.

Acorde al resumen de resultados, el modelo mejor evaluado es el de Máquina de Vectores de Soporte Lineal.

LS0tDQp0aXRsZTogIkNBUkVUIC0gRWplbXBsbzogSGVhcnQgRGlzZWFzZSINCmF1dGhvcjogIlhpbWVuYSBNZWzDqW5kZXoiDQpkYXRlOiAiMjAyNC0wOC0yMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQohW10oQzpcXFVzZXJzXFxIUFxcT25lRHJpdmUgLSBGRU1TQSBDb21lcmNpb1xcRXNjcml0b3Jpb1xcSW50ZWxpZ2VuY2lhIGRlIE5lZ29jaW9zXFw3bW8gU2VtZXN0cmVcXE0yXFxGb3Rvc1xcaGVhcnRkaXNlYXNlZm90by5qcGcpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5UZW9yw61hPC9zcGFuPg0KRWwgcGFxdWV0ZSAqY2FyZXQgKENsYXNpZmlhY3Rpb24gQW5kIFJlZ3Jlc3Npb24gVHJhaW5pbmcpKiBlcyB1biBwYXF1ZXRlIGludGVncmFsIGNvbiB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoZGF0YXNldHMpDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCmxpYnJhcnkoa2VybmxhYikNCmxpYnJhcnkocmFuZG9tRm9yZXN0KQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5DcmVhciBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQojZmlsZS5jaG9vc2UoKQ0KZGYgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcSFBcXE9uZURyaXZlIC0gRkVNU0EgQ29tZXJjaW9cXEVzY3JpdG9yaW9cXEludGVsaWdlbmNpYSBkZSBOZWdvY2lvc1xcN21vIFNlbWVzdHJlXFxNMlxcQkREXFxoZWFydC5jc3YiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5BbmFsw61zaXMgRXhwbG9yYXRvcmlvPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KZGYkdGFyZ2V0IDwtIGFzLmZhY3RvcihkZiR0YXJnZXQpDQpkZiRzZXggPC0gYXMuZmFjdG9yKGRmJHNleCkNCmRmJGNwIDwtIGFzLmZhY3RvcihkZiRjcCkNCmRmJGZicyA8LSBhcy5mYWN0b3IoZGYkZmJzKQ0KZGYkcmVzdGVjZyA8LSBhcy5mYWN0b3IoZGYkcmVzdGVjZykNCmRmJGV4YW5nIDwtIGFzLmZhY3RvcihkZiRleGFuZykNCmRmJHNsb3BlIDwtIGFzLmZhY3RvcihkZiRzbG9wZSkNCmRmJHRoYWwgPC0gYXMuZmFjdG9yKGRmJHRoYWwpDQoNCnBsb3RfbWlzc2luZyhkZikNCmBgYA0KDQoqKiogTk9UQTogTGEgdmFyaWFibGUgcXVlIHF1ZXJlbW9zIHByZWRlY2lyIGRlYmUgdGVuZXIgZm9ybWF0byBkZSBGQUNUT1IuICoqDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5QYXJ0aXIgbG9zIGRhdG9zIDgwLTIwPC9zcGFuPg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpyZW5nbG9uZXNfZW50cmVuYW1pZW50byA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRmJHRhcmdldCwgcD0wLjgsIGxpc3QgPSBGQUxTRSkNCmVudHJlbmFtaWVudG8gPC0gZGZbcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA8LSBkZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+TcOpdG9kb3MgcGFyYSBNb2RlbGFyPC9zcGFuPg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOg0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4NCiogKirDgXJib2wgZGUgRGVjaXNpw7NuKio6IHJwYXJ0DQoqICoqUmVkZXMgTmV1cm9uYWxlcyoqOiBtbmV0DQoqICoqUmFuZG9tIEZvcmVzdCoqIG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPjEuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyBzdm1MaW5hZXI8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzEgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLCANCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlcj0xMCksICNjdiA9IGNyb3NzIHZhbGlkYXRpb24gLy8gc2UgcGFydGUgZW4gMTANCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPWRhdGEuZnJhbWUoQz0xKSANCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEgPC0gcHJlZGljdChtb2RlbG8xLCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTEgPC0gcHJlZGljdChtb2RlbG8xLCBwcnVlYmEpDQoNCiMgTcOhdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gDQptY3JlMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8xLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNw6F0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnAxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMSwgcHJ1ZWJhJHRhcmdldCkNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+Mi4gTW9kZWxvIGNvbiBlbCBNw6l0b2RvIHN2bVJhZGlhbDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMiA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9ZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMiwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMiwgcHJ1ZWJhKQ0KDQojIE3DoXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvIA0KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTcOhdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij4zLiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gc3ZtUG9seTwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMyA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVBvbHkiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPWRhdGEuZnJhbWUoZGVncmVlPTEsc2NhbGU9MSwgQz0xKSAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMsIHBydWViYSkNCg0KIyBNw6F0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50byANCm1jcmUzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojIE3DoXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEzLCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+NC4gTW9kZWxvIGNvbiBlbCBNw6l0b2RvIHJwYXJ0PC9zcGFuPg0KYGBge3J9DQptb2RlbG80IDwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAicnBhcnQiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICAgdHVuZUxlbmd0aCA9MTANCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQgPC0gcHJlZGljdChtb2RlbG80LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LCBwcnVlYmEpDQoNCiMgTcOhdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gDQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNw6F0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPjUuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyBubmV0PC9zcGFuPg0KYGBge3J9DQptb2RlbG81IDwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSwgcHJ1ZWJhKQ0KDQojIE3DoXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvIA0KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTcOhdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij42LiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gcmY8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzYgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJyZiIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnkgPSBjKDIsNCw2KSkNCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG82LCBwcnVlYmEpDQoNCiMgTcOhdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gDQptY3JlNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG82LCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNw6F0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPjYuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyByZjwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKA0KICAic3ZtTGluZWFyIiA9YyhtY3JlMSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVJhZGlhbCIgPWMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDIkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1Qb2x5IiA9YyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJwYXJ0IiA9YyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgIm5uZXQiID1jKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA1JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicmYiID1jKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQogIA0KKQ0KDQpyb3duYW1lcyhyZXN1bHRhZG9zKSA8LSBjKCJQcmVjaXNpw7NuIGRlIEVudHJlbmFtaWVudG8iLCAiUHJlY2lzacOzbiBkZSBQcnVlYmEiKQ0KcmVzdWx0YWRvcw0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5Db25jbHVzaW9uZXM8L3NwYW4+DQpFbCBtb2RlbG8gY29uIGVsIG3DqXRvZG8gZGUgKihzdm1SYWRpYWwpKiwgKihyZikqIHByZXNlbnRhIHNvYnJlYWp1c3RlLCB5YSBxdWUgdGllbmUgdW5hIGFsdGEgcHJlY2lzacOzbi4NCg0KQWNvcmRlIGFsIHJlc3VtZW4gZGUgcmVzdWx0YWRvcywgZWwgbW9kZWxvIG1lam9yIGV2YWx1YWRvIGVzIGVsIGRlICoqTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZSBMaW5lYWwqKi4gDQoNCg==