Teoría

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

Instalar paquetes y llamar librerías

#install.packages("ggplot2") #Gráficas con mejor diseño
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
#install.packages("lattice") #Crear gráficos
library(lattice)
## Warning: package 'lattice' was built under R version 4.3.3
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
#install.packages("datasets") #Usar la base de datos "Iris"
library(datasets)
#install.packages("DataExplorer") #Usar la base de datos "Iris"
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.3.3
#install.packages("kernlab") #Paquete con métodos de aprendizaje automático
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
#install.packages("randomForest") #Paquete para este método de clasificación
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

df<-read.csv("C:\\Users\\naila\\OneDrive\\Documentos\\1 TEC\\7MO SEMESTRE\\M2\\heart.csv")

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

1. Modelo con 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 de Entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$target)

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

2. Modelo con 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 de Entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$target)

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

3. Modelo con 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 de Entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$target)

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

4. Modelo con Método rpart

modelo4<- train(target ~ ., data=entrenamiento,
                method = "rpart", #Cambiar
                preProcess=c("scale","center"),
                trControl = trainControl(method="cv", number=10),
                tuneLength = 10 #Cambiar
                )
resultado_entrenamiento4 <- predict(modelo4,entrenamiento)
resultado_prueba4 <- predict(modelo4,prueba)

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

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

5. Modelo con Método nnet

modelo5<- train(target ~ ., data=entrenamiento,
                method = "nnet", #Cambiar
                preProcess=c("scale","center"),
                trControl = trainControl(method="cv", number=10)
                #Cambiar
                )
## # 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)

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

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

6. Modelo con 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 de Entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$target)

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

Resumen de resultados

resultados <- data.frame(
  "svmLinear"=c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "svmLRadial"=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 svmLRadial   svmPoly     rpart      nnet
## Precisión de Entrenamiento 0.8538368          1 0.8538368 0.9135201 0.9841657
## Precisión de Prueba        0.8627451          1 0.8627451 0.8774510 0.9754902
##                            rf
## Precisión de Entrenamiento  1
## Precisión de Prueba         1

Conclusiones

El modelo con el método de bosques aleatorios (rf), Máquina de Vectores de Soporte Radial (svmLRadial) y Redes Neuronales (nnet) presenta sobreajuste, ya que tiene una alta precisión en entrenamiento y prueba.

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

LS0tDQp0aXRsZTogIkNBUkVUIC0gSGVhcnQiDQphdXRob3I6ICJOYWlsYSBTYWxpbmFzIC0gQTAwODMyNzAyIg0KZGF0ZTogIjIwMjQtMDgtMjEiDQpvdXRwdXQ6IA0KIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXG5haWxhXFxPbmVEcml2ZVxcRG9jdW1lbnRvc1xcMSBURUNcXDdNTyBTRU1FU1RSRVxcTTJcXGNvcmF6b24uZ2lmKQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VGVvcsOtYTwvc3Bhbj4NCkVsIHBhcXVldGUgKmNhcmV0IChDbGFzc2lmaWNhdGlvbiBhbmQgUmVncmVzc2lvbiBUcmFpbmluZykqIGVzIHVuIHBhcXVldGUgaW50ZWdyYWwgY29uIHVuYSBhbXBsaWEgdmFyaWVkYWQgZGUgYWxnb3JpdG1vcyBwYXJhIGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygibGF0dGljZSIpICNDcmVhciBncsOhZmljb3MNCmxpYnJhcnkobGF0dGljZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICNBbGdvcml0bW9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvDQpsaWJyYXJ5KGNhcmV0KQ0KI2luc3RhbGwucGFja2FnZXMoImRhdGFzZXRzIikgI1VzYXIgbGEgYmFzZSBkZSBkYXRvcyAiSXJpcyINCmxpYnJhcnkoZGF0YXNldHMpDQojaW5zdGFsbC5wYWNrYWdlcygiRGF0YUV4cGxvcmVyIikgI1VzYXIgbGEgYmFzZSBkZSBkYXRvcyAiSXJpcyINCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQ0KI2luc3RhbGwucGFja2FnZXMoImtlcm5sYWIiKSAjUGFxdWV0ZSBjb24gbcOpdG9kb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoa2VybmxhYikNCiNpbnN0YWxsLnBhY2thZ2VzKCJyYW5kb21Gb3Jlc3QiKSAjUGFxdWV0ZSBwYXJhIGVzdGUgbcOpdG9kbyBkZSBjbGFzaWZpY2FjacOzbg0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkNyZWFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+DQpgYGB7cn0NCmRmPC1yZWFkLmNzdigiQzpcXFVzZXJzXFxuYWlsYVxcT25lRHJpdmVcXERvY3VtZW50b3NcXDEgVEVDXFw3TU8gU0VNRVNUUkVcXE0yXFxoZWFydC5jc3YiKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BbsOhbGlzaXMgRXhwbG9yYXRvcmlvPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KZGYkdGFyZ2V0IDwtIGFzLmZhY3RvcihkZiR0YXJnZXQpDQpkZiRzZXggPC0gYXMuZmFjdG9yKGRmJHNleCkNCmRmJGNwIDwtIGFzLmZhY3RvcihkZiRjcCkNCmRmJGZicyA8LSBhcy5mYWN0b3IoZGYkZmJzKQ0KZGYkcmVzdGVjZyA8LSBhcy5mYWN0b3IoZGYkcmVzdGVjZykNCmRmJGV4YW5nIDwtIGFzLmZhY3RvcihkZiRleGFuZykNCmRmJHNsb3BlIDwtIGFzLmZhY3RvcihkZiRzbG9wZSkNCmRmJHRoYWwgPC0gYXMuZmFjdG9yKGRmJHRoYWwpDQpwbG90X21pc3NpbmcoZGYpDQpgYGANCg0KKiogTk9UQTogTGEgdmFyaWFibGUgcXVlIHF1ZXJlbW9zIHByZWRlY2lyIGRlYmUgdGVuZXIgZm9ybWF0byBkZSBGQUNUT1IuKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlBhcnRpciBsb3MgZGF0b3MgODAtMjA8L3NwYW4+DQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkdGFyZ2V0LCBwPTAuOCwgbGlzdD1GQUxTRSkNCmVudHJlbmFtaWVudG8gPC1kZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KcHJ1ZWJhPC1kZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+TcOpdG9kb3MgcGFyYSBNb2RlbGFyPC9zcGFuPg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOg0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4NCiogKirDgXJib2wgZGUgRGVjaXNpw7NuKio6IHJwYXJ0DQoqICoqUmVkZXMgTmV1cm9uYWxlcyoqOiBubmV0DQoqICoqUmFuZG9tIEZvcmVzdCoqOiBvIEJvc3F1ZXMgQWxlYXRvcmlvczogcmYNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4xLiBNb2RlbG8gY29uIE3DqXRvZG8gc3ZtTGluZWFyPC9zcGFuPg0KYGBge3J9DQptb2RlbG8xPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEgPC0gcHJlZGljdChtb2RlbG8xLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMSA8LSBwcmVkaWN0KG1vZGVsbzEscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnAxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMSwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjIuIE1vZGVsbyBjb24gTcOpdG9kbyBzdm1SYWRpYWw8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzI8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoc2lnbWE9MSxDPTEpICNDYW1iaWFyDQogICAgICAgICAgICAgICAgKQ0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMixlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTIgPC0gcHJlZGljdChtb2RlbG8yLHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIEVudHJlbmFtaWVudG8NCm1jcmUyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgUHJ1ZWJhDQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4zLiBNb2RlbG8gY29uIE3DqXRvZG8gc3ZtUG9seTwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMzwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUG9seSIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoZGVncmVlPTEsIHNjYWxlPTEsIEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMgPC0gcHJlZGljdChtb2RlbG8zLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMywgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjQuIE1vZGVsbyBjb24gTcOpdG9kbyBycGFydDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNDwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAicnBhcnQiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgdHVuZUxlbmd0aCA9IDEwICNDYW1iaWFyDQogICAgICAgICAgICAgICAgKQ0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG80IDwtIHByZWRpY3QobW9kZWxvNCxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIEVudHJlbmFtaWVudG8NCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgUHJ1ZWJhDQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTQsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij41LiBNb2RlbG8gY29uIE3DqXRvZG8gbm5ldDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNTwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKQ0KICAgICAgICAgICAgICAgICNDYW1iaWFyDQogICAgICAgICAgICAgICAgKQ0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIEVudHJlbmFtaWVudG8NCm1jcmU1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgUHJ1ZWJhDQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij42LiBNb2RlbG8gY29uIE3DqXRvZG8gcmY8L3NwYW4+DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNjwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAicmYiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBleHBhbmQuZ3JpZChtdHJ5ID0gYygyLDQsNikpI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNiA8LSBwcmVkaWN0KG1vZGVsbzYscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlJlc3VtZW4gZGUgcmVzdWx0YWRvczwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKA0KICAic3ZtTGluZWFyIj1jKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtTFJhZGlhbCI9YyhtY3JlMiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMiRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVBvbHkiPWMobWNyZTMkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDMkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJycGFydCI9YyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgIm5uZXQiPWMobWNyZTUkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDUkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJyZiI9YyhtY3JlNiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNiRvdmVyYWxsWyJBY2N1cmFjeSJdKQ0KKQ0KDQpyb3duYW1lcyhyZXN1bHRhZG9zKSA8LSBjKCJQcmVjaXNpw7NuIGRlIEVudHJlbmFtaWVudG8iLCAiUHJlY2lzacOzbiBkZSBQcnVlYmEiKQ0KcmVzdWx0YWRvcw0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Q29uY2x1c2lvbmVzPC9zcGFuPg0KDQpFbCBtb2RlbG8gY29uIGVsIG3DqXRvZG8gZGUgYm9zcXVlcyBhbGVhdG9yaW9zICoocmYpKiwgTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZSBSYWRpYWwgKihzdm1MUmFkaWFsKSogeSBSZWRlcyBOZXVyb25hbGVzICoobm5ldCkqIHByZXNlbnRhIHNvYnJlYWp1c3RlLCB5YSBxdWUgdGllbmUgdW5hIGFsdGEgcHJlY2lzacOzbiBlbiBlbnRyZW5hbWllbnRvIHkgcHJ1ZWJhLg0KDQpBY29yZGUgYWwgcmVzdW1lbiBkZSByZXN1bHRhZG9zLCBlbCBtZWpvciBtb2RlbG8gZXZhbHVhZG8gZXMgZWwgZGUgKipNw6FxdWluYSBkZSBWZWN0b3JlcyBkZSBTb3BvcnRlIExpbmVhbCAoc3ZtTGluZWFyKioNCg==