Teoría

El paquete caret (Clasification 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)
#install.packages("lattice") #Crear gráficos
library(lattice)
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
#install.packages("datasets") #Usar la base de datos "Iris"
library(datasets)
#install.packages("DataExplorer") #Exploración de los datos
library(DataExplorer)
#install.packages("kernlab") #Paquete con métodos de aprendizaje automático
library(kernlab)
#install.packages("randomForest") #Paquete para este método de clasificación
library(randomForest)

Crear base de datos

df <- read.csv("C:\\Users\\mari0\\OneDrive\\Documents\\R Studio\\IA con impacto empresarial\\Modulo 2\\BD\\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 ...
plot_missing(df)

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

Partir de los datos 80-20

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$ca <- as.factor(df$ca)
df$thal <- as.factor(df$thal)

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 el Método svmLinear

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

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

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

# Matriz de Confusión del Resultado de la Prueba 1 
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), #validación cruzada de 10
                tuneGrid = data.frame(sigma=1, C=1) #Cambiar
)

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

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

# Matriz de Confusión del Resultado de la Prueba 2
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), #validación cruzada de 10
                tuneGrid = data.frame(degree=1, scale=1, C=1) #Cambiar
)

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

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

# Matriz de Confusión del Resultado de la Prueba 3
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), #validación cruzada de 10
                tuneLength = 10 #Cambiar
)

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

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

# Matriz de Confusión del Resultado de la Prueba 4
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) #validación cruzada de 10
                #Cambiar
)
## # weights:  25
## initial  value 534.715512 
## iter  10 value 223.363750
## iter  20 value 209.869954
## iter  30 value 198.570677
## iter  40 value 177.540547
## iter  50 value 177.395285
## final  value 177.395138 
## converged
## # weights:  73
## initial  value 572.745922 
## iter  10 value 194.246195
## iter  20 value 152.191711
## iter  30 value 126.614638
## iter  40 value 92.543694
## iter  50 value 78.746555
## iter  60 value 67.755667
## iter  70 value 66.078737
## iter  80 value 64.921139
## iter  90 value 64.707146
## iter 100 value 64.596336
## final  value 64.596336 
## stopped after 100 iterations
## # weights:  121
## initial  value 552.772751 
## iter  10 value 190.415083
## iter  20 value 118.504550
## iter  30 value 91.508326
## iter  40 value 85.984039
## iter  50 value 82.755252
## iter  60 value 82.213884
## iter  70 value 81.589103
## iter  80 value 81.273209
## iter  90 value 81.108966
## iter 100 value 80.984541
## final  value 80.984541 
## stopped after 100 iterations
## # weights:  25
## initial  value 532.758179 
## iter  10 value 298.830332
## iter  20 value 250.160990
## iter  30 value 222.766098
## iter  40 value 213.792124
## iter  50 value 211.150852
## iter  60 value 210.967881
## iter  70 value 210.947310
## final  value 210.941946 
## converged
## # weights:  73
## initial  value 616.455260 
## iter  10 value 220.367230
## iter  20 value 178.688409
## iter  30 value 161.690178
## iter  40 value 154.018812
## iter  50 value 149.620010
## iter  60 value 147.906537
## iter  70 value 146.746374
## iter  80 value 142.285114
## iter  90 value 140.188410
## iter 100 value 140.023100
## final  value 140.023100 
## stopped after 100 iterations
## # weights:  121
## initial  value 545.022132 
## iter  10 value 211.260881
## iter  20 value 170.581921
## iter  30 value 139.648122
## iter  40 value 117.500230
## iter  50 value 109.681950
## iter  60 value 107.651362
## iter  70 value 102.899352
## iter  80 value 96.582371
## iter  90 value 94.576403
## iter 100 value 92.591197
## final  value 92.591197 
## stopped after 100 iterations
## # weights:  25
## initial  value 537.456314 
## iter  10 value 240.443521
## iter  20 value 222.687610
## iter  30 value 214.577901
## iter  40 value 183.448119
## iter  50 value 175.384834
## iter  60 value 173.731786
## iter  70 value 172.667693
## iter  80 value 172.619775
## iter  90 value 172.461230
## iter 100 value 172.343854
## final  value 172.343854 
## stopped after 100 iterations
## # weights:  73
## initial  value 515.560933 
## iter  10 value 204.949223
## iter  20 value 159.397184
## iter  30 value 147.088050
## iter  40 value 139.616109
## iter  50 value 136.316037
## iter  60 value 130.467866
## iter  70 value 128.043107
## iter  80 value 127.993430
## iter  90 value 127.953418
## iter 100 value 127.560573
## final  value 127.560573 
## stopped after 100 iterations
## # weights:  121
## initial  value 485.119713 
## iter  10 value 176.720126
## iter  20 value 113.262373
## iter  30 value 79.493830
## iter  40 value 63.600350
## iter  50 value 57.875444
## iter  60 value 55.596528
## iter  70 value 55.118518
## iter  80 value 54.482878
## iter  90 value 53.590291
## iter 100 value 52.904660
## final  value 52.904660 
## stopped after 100 iterations
## # weights:  25
## initial  value 524.413808 
## iter  10 value 295.569975
## iter  20 value 217.571715
## iter  30 value 194.948517
## iter  40 value 187.872114
## iter  50 value 181.724110
## iter  60 value 174.102684
## iter  70 value 173.776396
## iter  80 value 171.829884
## iter  90 value 170.111166
## iter 100 value 169.517958
## final  value 169.517958 
## stopped after 100 iterations
## # weights:  73
## initial  value 524.120998 
## iter  10 value 212.471264
## iter  20 value 172.690059
## iter  30 value 140.941742
## iter  40 value 126.279258
## iter  50 value 113.987877
## iter  60 value 110.974564
## iter  70 value 109.794101
## iter  80 value 108.107517
## iter  90 value 107.380018
## iter 100 value 106.518703
## final  value 106.518703 
## stopped after 100 iterations
## # weights:  121
## initial  value 547.059822 
## iter  10 value 221.311315
## iter  20 value 166.044853
## iter  30 value 129.461313
## iter  40 value 114.292234
## iter  50 value 111.550705
## iter  60 value 108.587919
## iter  70 value 107.733316
## iter  80 value 107.558550
## iter  90 value 107.313274
## iter 100 value 107.278863
## final  value 107.278863 
## stopped after 100 iterations
## # weights:  25
## initial  value 540.296279 
## iter  10 value 297.914924
## iter  20 value 236.444748
## iter  30 value 207.296704
## iter  40 value 203.111193
## iter  50 value 203.077087
## final  value 203.076976 
## converged
## # weights:  73
## initial  value 536.723212 
## iter  10 value 206.418161
## iter  20 value 175.663989
## iter  30 value 153.396351
## iter  40 value 146.907331
## iter  50 value 136.384178
## iter  60 value 132.605976
## iter  70 value 131.960333
## iter  80 value 131.874042
## iter  90 value 131.872685
## final  value 131.872539 
## converged
## # weights:  121
## initial  value 551.272696 
## iter  10 value 189.097449
## iter  20 value 147.268490
## iter  30 value 122.671410
## iter  40 value 107.268407
## iter  50 value 100.484561
## iter  60 value 92.649410
## iter  70 value 83.206523
## iter  80 value 76.720238
## iter  90 value 74.042871
## iter 100 value 72.866357
## final  value 72.866357 
## stopped after 100 iterations
## # weights:  25
## initial  value 515.890725 
## iter  10 value 296.723613
## iter  20 value 223.065052
## iter  30 value 215.950306
## iter  40 value 210.458340
## iter  50 value 205.704425
## iter  60 value 194.387688
## iter  70 value 193.372333
## iter  80 value 191.829666
## iter  90 value 190.579366
## iter 100 value 190.568937
## final  value 190.568937 
## stopped after 100 iterations
## # weights:  73
## initial  value 563.534438 
## iter  10 value 246.941180
## iter  20 value 183.618271
## iter  30 value 141.671120
## iter  40 value 120.346910
## iter  50 value 115.625041
## iter  60 value 112.064574
## iter  70 value 107.948783
## iter  80 value 107.686302
## iter  90 value 107.155231
## iter 100 value 106.341384
## final  value 106.341384 
## stopped after 100 iterations
## # weights:  121
## initial  value 513.305500 
## iter  10 value 150.795079
## iter  20 value 88.198039
## iter  30 value 62.370165
## iter  40 value 52.342423
## iter  50 value 49.453440
## iter  60 value 46.372881
## iter  70 value 44.955872
## iter  80 value 42.525007
## iter  90 value 41.403307
## iter 100 value 41.199317
## final  value 41.199317 
## stopped after 100 iterations
## # weights:  25
## initial  value 530.576334 
## iter  10 value 273.812296
## iter  20 value 230.362649
## iter  30 value 213.487875
## iter  40 value 190.047267
## iter  50 value 184.808654
## iter  60 value 184.797714
## final  value 184.797642 
## converged
## # weights:  73
## initial  value 524.549909 
## iter  10 value 224.223441
## iter  20 value 171.688857
## iter  30 value 145.659287
## iter  40 value 133.859118
## iter  50 value 131.235786
## iter  60 value 129.271180
## iter  70 value 128.287737
## iter  80 value 127.968055
## iter  90 value 127.651321
## iter 100 value 127.131750
## final  value 127.131750 
## stopped after 100 iterations
## # weights:  121
## initial  value 561.614928 
## iter  10 value 168.924128
## iter  20 value 121.510553
## iter  30 value 93.639358
## iter  40 value 84.681283
## iter  50 value 78.413660
## iter  60 value 76.552322
## iter  70 value 75.446137
## iter  80 value 75.248354
## iter  90 value 75.063710
## iter 100 value 75.031249
## final  value 75.031249 
## stopped after 100 iterations
## # weights:  25
## initial  value 512.561986 
## iter  10 value 302.881228
## iter  20 value 260.945723
## iter  30 value 216.968473
## iter  40 value 206.127158
## iter  50 value 200.709312
## iter  60 value 200.608473
## iter  70 value 200.544339
## final  value 200.537956 
## converged
## # weights:  73
## initial  value 545.405531 
## iter  10 value 215.790810
## iter  20 value 185.017753
## iter  30 value 158.774358
## iter  40 value 144.323270
## iter  50 value 135.396610
## iter  60 value 132.940858
## iter  70 value 131.698254
## iter  80 value 131.264332
## iter  90 value 131.163203
## iter 100 value 131.084761
## final  value 131.084761 
## stopped after 100 iterations
## # weights:  121
## initial  value 671.606874 
## iter  10 value 182.491812
## iter  20 value 149.613896
## iter  30 value 138.626112
## iter  40 value 125.912307
## iter  50 value 116.779793
## iter  60 value 114.292329
## iter  70 value 99.436411
## iter  80 value 94.826645
## iter  90 value 90.191510
## iter 100 value 88.029433
## final  value 88.029433 
## stopped after 100 iterations
## # weights:  25
## initial  value 528.043339 
## iter  10 value 244.870616
## iter  20 value 201.635439
## iter  30 value 188.794163
## iter  40 value 173.448760
## iter  50 value 172.059521
## iter  60 value 171.916033
## iter  70 value 171.625049
## iter  80 value 171.576975
## iter  90 value 171.545543
## iter 100 value 171.493613
## final  value 171.493613 
## stopped after 100 iterations
## # weights:  73
## initial  value 657.506520 
## iter  10 value 190.289177
## iter  20 value 144.672084
## iter  30 value 129.545717
## iter  40 value 110.468785
## iter  50 value 104.403905
## iter  60 value 102.945795
## iter  70 value 102.473290
## iter  80 value 102.108009
## iter  90 value 101.902328
## iter 100 value 100.896297
## final  value 100.896297 
## stopped after 100 iterations
## # weights:  121
## initial  value 526.225241 
## iter  10 value 208.370011
## iter  20 value 123.114124
## iter  30 value 76.897954
## iter  40 value 58.387977
## iter  50 value 47.700504
## iter  60 value 44.996865
## iter  70 value 44.251733
## iter  80 value 43.823835
## iter  90 value 35.444655
## iter 100 value 31.988866
## final  value 31.988866 
## stopped after 100 iterations
## # weights:  25
## initial  value 496.906661 
## iter  10 value 227.927278
## iter  20 value 204.826169
## iter  30 value 195.942716
## iter  40 value 170.735448
## iter  50 value 159.636670
## iter  60 value 159.571738
## iter  70 value 159.564456
## iter  80 value 159.561491
## iter  90 value 159.561266
## iter 100 value 159.561047
## final  value 159.561047 
## stopped after 100 iterations
## # weights:  73
## initial  value 534.209669 
## iter  10 value 199.713573
## iter  20 value 151.862104
## iter  30 value 130.706034
## iter  40 value 121.202323
## iter  50 value 114.706192
## iter  60 value 111.864043
## iter  70 value 107.815705
## iter  80 value 106.800457
## iter  90 value 106.704295
## final  value 106.703846 
## converged
## # weights:  121
## initial  value 513.609801 
## iter  10 value 127.826039
## iter  20 value 62.397927
## iter  30 value 48.923657
## iter  40 value 44.048908
## iter  50 value 42.678562
## iter  60 value 41.025312
## iter  70 value 39.196341
## iter  80 value 38.718559
## iter  90 value 38.448806
## iter 100 value 37.497415
## final  value 37.497415 
## stopped after 100 iterations
## # weights:  25
## initial  value 518.151021 
## iter  10 value 318.678096
## iter  20 value 241.945332
## iter  30 value 229.638357
## iter  40 value 215.367969
## iter  50 value 206.469115
## iter  60 value 206.251369
## final  value 206.251364 
## converged
## # weights:  73
## initial  value 530.833849 
## iter  10 value 338.128042
## iter  20 value 270.513062
## iter  30 value 221.510693
## iter  40 value 178.916613
## iter  50 value 158.169247
## iter  60 value 154.261671
## iter  70 value 153.263984
## iter  80 value 152.546474
## iter  90 value 151.021312
## iter 100 value 150.566527
## final  value 150.566527 
## stopped after 100 iterations
## # weights:  121
## initial  value 565.658486 
## iter  10 value 280.189051
## iter  20 value 196.660781
## iter  30 value 143.227586
## iter  40 value 117.647916
## iter  50 value 103.919585
## iter  60 value 94.168347
## iter  70 value 86.161121
## iter  80 value 81.207663
## iter  90 value 78.711033
## iter 100 value 77.422134
## final  value 77.422134 
## stopped after 100 iterations
## # weights:  25
## initial  value 558.963055 
## iter  10 value 299.302652
## iter  20 value 227.724495
## iter  30 value 214.949887
## iter  40 value 211.230070
## iter  50 value 211.113771
## iter  60 value 207.671485
## iter  70 value 207.470557
## iter  80 value 207.428745
## iter  90 value 207.424099
## iter 100 value 207.423016
## final  value 207.423016 
## stopped after 100 iterations
## # weights:  73
## initial  value 555.065998 
## iter  10 value 180.867594
## iter  20 value 127.554671
## iter  30 value 97.180965
## iter  40 value 87.305561
## iter  50 value 85.099076
## iter  60 value 84.642955
## iter  70 value 84.184183
## iter  80 value 83.930768
## iter  90 value 83.197667
## iter 100 value 82.844331
## final  value 82.844331 
## stopped after 100 iterations
## # weights:  121
## initial  value 535.930796 
## iter  10 value 172.540069
## iter  20 value 106.929591
## iter  30 value 71.405229
## iter  40 value 53.528710
## iter  50 value 49.097767
## iter  60 value 41.476905
## iter  70 value 39.775296
## iter  80 value 32.149589
## iter  90 value 24.982120
## iter 100 value 23.739887
## final  value 23.739887 
## stopped after 100 iterations
## # weights:  25
## initial  value 514.080659 
## iter  10 value 268.555888
## iter  20 value 227.994652
## iter  30 value 213.904593
## iter  40 value 205.291511
## iter  50 value 196.076685
## iter  60 value 192.252637
## iter  70 value 189.517954
## iter  80 value 185.095985
## iter  90 value 176.724053
## iter 100 value 176.683031
## final  value 176.683031 
## stopped after 100 iterations
## # weights:  73
## initial  value 510.682499 
## iter  10 value 179.887314
## iter  20 value 127.635941
## iter  30 value 106.375525
## iter  40 value 97.626447
## iter  50 value 89.293499
## iter  60 value 87.930155
## iter  70 value 87.918810
## final  value 87.918765 
## converged
## # weights:  121
## initial  value 534.557153 
## iter  10 value 192.055188
## iter  20 value 106.471874
## iter  30 value 68.157389
## iter  40 value 60.303054
## iter  50 value 57.888174
## iter  60 value 56.108330
## iter  70 value 52.631391
## iter  80 value 52.311097
## iter  90 value 51.221122
## iter 100 value 50.179478
## final  value 50.179478 
## stopped after 100 iterations
## # weights:  25
## initial  value 586.762145 
## iter  10 value 279.756970
## iter  20 value 238.839745
## iter  30 value 222.078970
## iter  40 value 219.375113
## iter  50 value 218.660685
## iter  60 value 218.505140
## iter  70 value 213.041871
## iter  80 value 212.591090
## iter  90 value 212.541483
## final  value 212.541418 
## converged
## # weights:  73
## initial  value 537.824697 
## iter  10 value 222.473142
## iter  20 value 195.134011
## iter  30 value 169.929303
## iter  40 value 151.462068
## iter  50 value 143.005184
## iter  60 value 142.089657
## iter  70 value 141.677336
## iter  80 value 141.550118
## iter  90 value 141.535187
## iter 100 value 141.534488
## final  value 141.534488 
## stopped after 100 iterations
## # weights:  121
## initial  value 523.052725 
## iter  10 value 234.813273
## iter  20 value 151.115173
## iter  30 value 116.206558
## iter  40 value 105.017422
## iter  50 value 97.891829
## iter  60 value 93.755609
## iter  70 value 91.023653
## iter  80 value 89.234505
## iter  90 value 88.982824
## iter 100 value 88.826263
## final  value 88.826263 
## stopped after 100 iterations
## # weights:  25
## initial  value 577.005987 
## iter  10 value 243.205547
## iter  20 value 210.027134
## iter  30 value 198.598464
## iter  40 value 176.594694
## iter  50 value 175.697600
## iter  60 value 175.370267
## iter  70 value 175.271829
## iter  80 value 175.258453
## iter  90 value 175.246010
## iter 100 value 175.228476
## final  value 175.228476 
## stopped after 100 iterations
## # weights:  73
## initial  value 567.383546 
## iter  10 value 217.054749
## iter  20 value 163.272972
## iter  30 value 148.189837
## iter  40 value 142.441783
## iter  50 value 140.360317
## iter  60 value 138.386061
## iter  70 value 137.306698
## iter  80 value 137.039418
## iter  90 value 131.652550
## iter 100 value 131.544671
## final  value 131.544671 
## stopped after 100 iterations
## # weights:  121
## initial  value 580.015084 
## iter  10 value 175.219350
## iter  20 value 83.818059
## iter  30 value 51.814087
## iter  40 value 44.824881
## iter  50 value 41.480529
## iter  60 value 40.473464
## iter  70 value 40.042688
## iter  80 value 39.753456
## iter  90 value 39.568942
## iter 100 value 39.255546
## final  value 39.255546 
## stopped after 100 iterations
## # weights:  25
## initial  value 519.997176 
## iter  10 value 337.293526
## iter  20 value 237.014623
## iter  30 value 215.088561
## iter  40 value 212.545772
## iter  50 value 204.735089
## iter  60 value 192.552718
## iter  70 value 175.678167
## iter  80 value 174.270310
## iter  90 value 161.104875
## iter 100 value 159.920089
## final  value 159.920089 
## stopped after 100 iterations
## # weights:  73
## initial  value 532.030675 
## iter  10 value 266.200230
## iter  20 value 179.194837
## iter  30 value 146.521497
## iter  40 value 136.482376
## iter  50 value 131.371840
## iter  60 value 126.793256
## iter  70 value 118.170122
## iter  80 value 116.165280
## iter  90 value 113.316185
## iter 100 value 110.244552
## final  value 110.244552 
## stopped after 100 iterations
## # weights:  121
## initial  value 506.627907 
## iter  10 value 192.330945
## iter  20 value 127.738074
## iter  30 value 86.905957
## iter  40 value 67.978807
## iter  50 value 64.471510
## iter  60 value 62.819121
## iter  70 value 62.368601
## iter  80 value 62.344584
## iter  90 value 62.317026
## iter 100 value 62.005964
## final  value 62.005964 
## stopped after 100 iterations
## # weights:  25
## initial  value 531.998317 
## iter  10 value 316.540442
## iter  20 value 259.026321
## iter  30 value 232.489630
## iter  40 value 209.374541
## iter  50 value 204.875161
## iter  60 value 204.688415
## iter  70 value 204.636980
## final  value 204.634356 
## converged
## # weights:  73
## initial  value 513.857827 
## iter  10 value 260.197927
## iter  20 value 206.205019
## iter  30 value 178.847820
## iter  40 value 156.926288
## iter  50 value 146.791836
## iter  60 value 142.252923
## iter  70 value 139.017873
## iter  80 value 137.699279
## iter  90 value 137.463740
## iter 100 value 137.444569
## final  value 137.444569 
## stopped after 100 iterations
## # weights:  121
## initial  value 531.701345 
## iter  10 value 203.279757
## iter  20 value 132.176512
## iter  30 value 99.361285
## iter  40 value 80.392178
## iter  50 value 73.665138
## iter  60 value 71.350142
## iter  70 value 69.437480
## iter  80 value 68.213945
## iter  90 value 67.502894
## iter 100 value 66.286726
## final  value 66.286726 
## stopped after 100 iterations
## # weights:  25
## initial  value 520.025084 
## iter  10 value 293.197464
## iter  20 value 238.167433
## iter  30 value 216.126975
## iter  40 value 202.923973
## iter  50 value 189.376344
## iter  60 value 188.782848
## iter  70 value 188.586691
## iter  80 value 188.550752
## iter  90 value 188.533234
## iter 100 value 188.511786
## final  value 188.511786 
## stopped after 100 iterations
## # weights:  73
## initial  value 549.276565 
## iter  10 value 202.424577
## iter  20 value 120.498977
## iter  30 value 100.218470
## iter  40 value 85.569796
## iter  50 value 82.218717
## iter  60 value 80.805077
## iter  70 value 76.670669
## iter  80 value 76.100468
## iter  90 value 75.950664
## iter 100 value 75.837156
## final  value 75.837156 
## stopped after 100 iterations
## # weights:  121
## initial  value 486.801109 
## iter  10 value 162.586173
## iter  20 value 92.472285
## iter  30 value 63.280457
## iter  40 value 58.375504
## iter  50 value 56.479074
## iter  60 value 56.166020
## iter  70 value 56.034755
## iter  80 value 49.839032
## iter  90 value 47.800762
## iter 100 value 47.738452
## final  value 47.738452 
## stopped after 100 iterations
## # weights:  25
## initial  value 515.321427 
## iter  10 value 374.746642
## iter  20 value 264.816557
## iter  30 value 217.620535
## iter  40 value 199.793830
## iter  50 value 172.772090
## iter  60 value 168.882395
## iter  70 value 168.783296
## iter  80 value 168.738056
## iter  90 value 168.722188
## iter 100 value 168.714845
## final  value 168.714845 
## stopped after 100 iterations
## # weights:  73
## initial  value 572.217448 
## iter  10 value 254.080902
## iter  20 value 186.652289
## iter  30 value 163.244201
## iter  40 value 141.023448
## iter  50 value 134.881444
## iter  60 value 132.591327
## iter  70 value 125.242198
## iter  80 value 125.082199
## iter  90 value 125.032124
## iter 100 value 125.004077
## final  value 125.004077 
## stopped after 100 iterations
## # weights:  121
## initial  value 526.567787 
## iter  10 value 177.428831
## iter  20 value 109.604681
## iter  30 value 80.034681
## iter  40 value 71.246729
## iter  50 value 67.295835
## iter  60 value 61.091073
## iter  70 value 57.646852
## iter  80 value 56.382133
## iter  90 value 55.321039
## iter 100 value 54.170818
## final  value 54.170818 
## stopped after 100 iterations
## # weights:  25
## initial  value 510.269611 
## iter  10 value 240.884378
## iter  20 value 221.021402
## iter  30 value 213.662528
## iter  40 value 212.891130
## final  value 212.890763 
## converged
## # weights:  73
## initial  value 633.717883 
## iter  10 value 335.115868
## iter  20 value 221.363186
## iter  30 value 186.382241
## iter  40 value 154.570270
## iter  50 value 141.029164
## iter  60 value 133.763365
## iter  70 value 130.569600
## iter  80 value 125.288191
## iter  90 value 124.408629
## iter 100 value 124.269476
## final  value 124.269476 
## stopped after 100 iterations
## # weights:  121
## initial  value 519.420760 
## iter  10 value 202.494150
## iter  20 value 153.513345
## iter  30 value 132.994726
## iter  40 value 125.035358
## iter  50 value 122.480473
## iter  60 value 121.654446
## iter  70 value 121.533779
## iter  80 value 121.415922
## iter  90 value 118.241332
## iter 100 value 108.877918
## final  value 108.877918 
## stopped after 100 iterations
## # weights:  25
## initial  value 534.337762 
## iter  10 value 304.298241
## iter  20 value 269.384794
## iter  30 value 247.819230
## iter  40 value 235.887302
## iter  50 value 223.871379
## iter  60 value 221.359784
## iter  70 value 218.882279
## iter  80 value 218.841898
## iter  90 value 218.835967
## iter 100 value 218.835073
## final  value 218.835073 
## stopped after 100 iterations
## # weights:  73
## initial  value 545.502747 
## iter  10 value 285.531002
## iter  20 value 222.690559
## iter  30 value 178.709869
## iter  40 value 169.416660
## iter  50 value 161.293922
## iter  60 value 154.744867
## iter  70 value 151.961957
## iter  80 value 151.707400
## iter  90 value 151.489054
## iter 100 value 148.683822
## final  value 148.683822 
## stopped after 100 iterations
## # weights:  121
## initial  value 546.052860 
## iter  10 value 208.491524
## iter  20 value 116.493820
## iter  30 value 60.958446
## iter  40 value 45.114528
## iter  50 value 39.890971
## iter  60 value 34.546262
## iter  70 value 31.457760
## iter  80 value 28.161345
## iter  90 value 27.063840
## iter 100 value 26.695138
## final  value 26.695138 
## stopped after 100 iterations
## # weights:  25
## initial  value 514.188818 
## iter  10 value 284.843848
## iter  20 value 241.746632
## iter  30 value 226.575339
## iter  40 value 216.855770
## iter  50 value 213.619677
## iter  60 value 208.142256
## iter  70 value 206.641634
## iter  80 value 200.500824
## iter  90 value 195.762697
## iter 100 value 195.634168
## final  value 195.634168 
## stopped after 100 iterations
## # weights:  73
## initial  value 507.590751 
## iter  10 value 204.139765
## iter  20 value 151.372138
## iter  30 value 128.860421
## iter  40 value 115.145026
## iter  50 value 110.394294
## iter  60 value 108.504177
## iter  70 value 99.298406
## iter  80 value 97.902353
## iter  90 value 97.071562
## iter 100 value 96.782485
## final  value 96.782485 
## stopped after 100 iterations
## # weights:  121
## initial  value 642.257183 
## iter  10 value 177.785884
## iter  20 value 113.151299
## iter  30 value 80.971671
## iter  40 value 72.881241
## iter  50 value 70.038134
## iter  60 value 69.593229
## iter  70 value 69.552396
## iter  80 value 69.550653
## iter  90 value 69.549159
## iter 100 value 69.548639
## final  value 69.548639 
## stopped after 100 iterations
## # weights:  25
## initial  value 493.834895 
## iter  10 value 296.809643
## iter  20 value 232.191490
## iter  30 value 213.748731
## iter  40 value 211.396039
## iter  50 value 211.133742
## iter  60 value 211.132134
## iter  70 value 211.132070
## final  value 211.132045 
## converged
## # weights:  73
## initial  value 499.668010 
## iter  10 value 195.434887
## iter  20 value 177.953076
## iter  30 value 169.915107
## iter  40 value 165.354536
## iter  50 value 163.766019
## iter  60 value 163.196369
## iter  70 value 163.147981
## iter  80 value 163.143525
## final  value 163.143362 
## converged
## # weights:  121
## initial  value 659.457381 
## iter  10 value 221.448783
## iter  20 value 160.962283
## iter  30 value 130.930886
## iter  40 value 110.781236
## iter  50 value 105.351200
## iter  60 value 102.198898
## iter  70 value 99.486816
## iter  80 value 92.378229
## iter  90 value 83.236206
## iter 100 value 81.571272
## final  value 81.571272 
## stopped after 100 iterations
## # weights:  25
## initial  value 541.077503 
## iter  10 value 274.109078
## iter  20 value 241.264534
## iter  30 value 215.108242
## iter  40 value 203.156383
## iter  50 value 183.714258
## iter  60 value 183.349988
## iter  70 value 183.230116
## iter  80 value 183.183624
## iter  90 value 183.143481
## iter 100 value 183.050446
## final  value 183.050446 
## stopped after 100 iterations
## # weights:  73
## initial  value 523.529199 
## iter  10 value 207.785244
## iter  20 value 152.316322
## iter  30 value 127.302669
## iter  40 value 123.506949
## iter  50 value 120.328963
## iter  60 value 112.974902
## iter  70 value 109.949303
## iter  80 value 106.229783
## iter  90 value 104.356212
## iter 100 value 103.827350
## final  value 103.827350 
## stopped after 100 iterations
## # weights:  121
## initial  value 482.884400 
## iter  10 value 174.096457
## iter  20 value 119.073191
## iter  30 value 81.497925
## iter  40 value 76.493081
## iter  50 value 75.006680
## iter  60 value 74.324558
## iter  70 value 72.964427
## iter  80 value 72.187138
## iter  90 value 71.731750
## iter 100 value 71.594790
## final  value 71.594790 
## stopped after 100 iterations
## # weights:  25
## initial  value 536.081896 
## iter  10 value 276.490457
## iter  20 value 203.553763
## iter  30 value 186.245891
## iter  40 value 173.240115
## iter  50 value 168.305256
## iter  60 value 168.268019
## final  value 168.267957 
## converged
## # weights:  73
## initial  value 534.842360 
## iter  10 value 204.487422
## iter  20 value 163.482965
## iter  30 value 142.077628
## iter  40 value 130.803010
## iter  50 value 120.021725
## iter  60 value 111.420325
## iter  70 value 111.207750
## iter  80 value 111.202433
## final  value 111.202337 
## converged
## # weights:  121
## initial  value 542.961146 
## iter  10 value 166.950905
## iter  20 value 91.296277
## iter  30 value 69.961984
## iter  40 value 62.758711
## iter  50 value 59.420609
## iter  60 value 57.038624
## iter  70 value 55.251056
## iter  80 value 54.270606
## iter  90 value 53.959923
## iter 100 value 53.927938
## final  value 53.927938 
## stopped after 100 iterations
## # weights:  25
## initial  value 515.267926 
## iter  10 value 246.345973
## iter  20 value 213.836030
## iter  30 value 208.739181
## iter  40 value 204.212142
## iter  50 value 204.105596
## final  value 204.105120 
## converged
## # weights:  73
## initial  value 625.309381 
## iter  10 value 264.146252
## iter  20 value 217.948834
## iter  30 value 198.883808
## iter  40 value 176.291449
## iter  50 value 166.051322
## iter  60 value 164.630502
## iter  70 value 164.405111
## iter  80 value 163.375309
## iter  90 value 163.154796
## final  value 163.154530 
## converged
## # weights:  121
## initial  value 599.183888 
## iter  10 value 236.624956
## iter  20 value 167.261292
## iter  30 value 128.163768
## iter  40 value 114.274397
## iter  50 value 110.065972
## iter  60 value 97.949946
## iter  70 value 93.781613
## iter  80 value 93.222554
## iter  90 value 93.188822
## iter 100 value 93.185487
## final  value 93.185487 
## stopped after 100 iterations
## # weights:  25
## initial  value 561.034656 
## iter  10 value 258.618270
## iter  20 value 212.124442
## iter  30 value 194.052153
## iter  40 value 177.370931
## iter  50 value 174.933004
## iter  60 value 174.698747
## iter  70 value 174.651941
## iter  80 value 174.644548
## iter  90 value 172.886192
## iter 100 value 172.443430
## final  value 172.443430 
## stopped after 100 iterations
## # weights:  73
## initial  value 552.988008 
## iter  10 value 221.226391
## iter  20 value 177.487820
## iter  30 value 165.108687
## iter  40 value 156.678674
## iter  50 value 134.414061
## iter  60 value 124.006524
## iter  70 value 123.304463
## iter  80 value 123.174838
## iter  90 value 122.351418
## iter 100 value 122.019551
## final  value 122.019551 
## stopped after 100 iterations
## # weights:  121
## initial  value 655.149948 
## iter  10 value 215.334889
## iter  20 value 148.191549
## iter  30 value 100.220154
## iter  40 value 78.203750
## iter  50 value 59.669982
## iter  60 value 53.887870
## iter  70 value 50.365589
## iter  80 value 49.623528
## iter  90 value 49.427863
## iter 100 value 48.981994
## final  value 48.981994 
## stopped after 100 iterations
## # weights:  25
## initial  value 521.395089 
## iter  10 value 298.188677
## iter  20 value 227.343413
## iter  30 value 207.160393
## iter  40 value 193.771924
## iter  50 value 175.744701
## iter  60 value 174.513642
## iter  70 value 174.439729
## iter  80 value 174.417240
## iter  90 value 174.412429
## iter 100 value 174.411093
## final  value 174.411093 
## stopped after 100 iterations
## # weights:  73
## initial  value 542.939486 
## iter  10 value 201.122631
## iter  20 value 152.103509
## iter  30 value 122.539904
## iter  40 value 112.992128
## iter  50 value 111.537628
## iter  60 value 111.425610
## iter  70 value 111.417146
## iter  80 value 111.416119
## iter  90 value 111.415499
## iter 100 value 111.414872
## final  value 111.414872 
## stopped after 100 iterations
## # weights:  121
## initial  value 505.063995 
## iter  10 value 195.179821
## iter  20 value 138.949242
## iter  30 value 105.517771
## iter  40 value 95.531611
## iter  50 value 93.449423
## iter  60 value 91.974573
## iter  70 value 91.567722
## iter  80 value 91.023346
## iter  90 value 90.132920
## iter 100 value 89.713256
## final  value 89.713256 
## stopped after 100 iterations
## # weights:  25
## initial  value 559.491374 
## iter  10 value 236.028240
## iter  20 value 221.230015
## iter  30 value 215.652727
## iter  40 value 210.407669
## iter  50 value 208.772030
## iter  60 value 208.683838
## iter  60 value 208.683837
## iter  60 value 208.683837
## final  value 208.683837 
## converged
## # weights:  73
## initial  value 579.569202 
## iter  10 value 241.235821
## iter  20 value 201.161203
## iter  30 value 160.408181
## iter  40 value 150.538191
## iter  50 value 145.079949
## iter  60 value 143.857389
## iter  70 value 142.063201
## iter  80 value 132.961482
## iter  90 value 127.572778
## iter 100 value 125.252312
## final  value 125.252312 
## stopped after 100 iterations
## # weights:  121
## initial  value 560.419386 
## iter  10 value 183.624095
## iter  20 value 140.774385
## iter  30 value 130.152412
## iter  40 value 122.745435
## iter  50 value 118.598039
## iter  60 value 115.153661
## iter  70 value 109.489112
## iter  80 value 107.441487
## iter  90 value 102.719389
## iter 100 value 91.863748
## final  value 91.863748 
## stopped after 100 iterations
## # weights:  25
## initial  value 488.627550 
## iter  10 value 312.999827
## iter  20 value 272.858216
## iter  30 value 265.197504
## iter  40 value 262.641016
## iter  50 value 259.691543
## iter  60 value 252.911499
## iter  70 value 252.688698
## iter  80 value 252.578613
## iter  90 value 248.992990
## iter 100 value 248.958950
## final  value 248.958950 
## stopped after 100 iterations
## # weights:  73
## initial  value 712.924277 
## iter  10 value 256.041194
## iter  20 value 178.773677
## iter  30 value 136.959333
## iter  40 value 114.991123
## iter  50 value 110.118785
## iter  60 value 103.324028
## iter  70 value 100.700438
## iter  80 value 100.123497
## iter  90 value 98.877298
## iter 100 value 97.810751
## final  value 97.810751 
## stopped after 100 iterations
## # weights:  121
## initial  value 516.686136 
## iter  10 value 195.120076
## iter  20 value 95.899424
## iter  30 value 58.357049
## iter  40 value 42.613375
## iter  50 value 40.748384
## iter  60 value 40.057328
## iter  70 value 39.877527
## iter  80 value 39.658279
## iter  90 value 39.542782
## iter 100 value 39.507586
## final  value 39.507586 
## stopped after 100 iterations
## # weights:  121
## initial  value 594.845601 
## iter  10 value 201.099983
## iter  20 value 145.716833
## iter  30 value 122.488082
## iter  40 value 108.993378
## iter  50 value 100.363507
## iter  60 value 92.713815
## iter  70 value 89.727722
## iter  80 value 88.625205
## iter  90 value 87.353123
## iter 100 value 86.757997
## final  value 86.757997 
## stopped after 100 iterations
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

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

# Matriz de Confusión del Resultado de la Prueba 5
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), #validación cruzada de 10
                tuneGrid = expand.grid(mtry  = c(2,4,6))#Cambiar
)

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

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

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

Resumen de Resultados

resultados <- data.frame(
  "svmLinear" =c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "svmRadial" =c(mcre2$overall["Accuracy"], mcrp2$overall["Accuracy"]),
  "svmPoly" =c(mcre3$overall["Accuracy"], mcrp3$overall["Accuracy"]),
  "rpart" =c(mcre4$overall["Accuracy"], mcrp4$overall["Accuracy"]),
  "nnet" =c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "rf" =c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
  
)

rownames(resultados) <- c("Precisión de Entrenamiento", "Precisión de Prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart      nnet rf
## Precisión de Entrenamiento 0.8952497         1 0.8952497 0.8745432 0.9866017  1
## Precisión de Prueba        0.8921569         1 0.8921569 0.8431373 1.0000000  1

Conclusiones

El modelo con el método de bosques aleatorios (rf) y máquina de vectores de soporte radial svmRadial presentan un sobre ajuste, ya que tienen una alta precisión en entrenamiento y alta en prueba.

Acorde al resumen de resultados, el modelo mejor evaluado es el de svmLinear - máquina de vectores de soporte lineal . Aunque igual el modelo svmPoly - máquina de vectores de soporte polinómico obtuvo los mismos resultados.

LS0tDQp0aXRsZTogIkNhcmV0IC0gRGlhZ27Ds3N0aWNvIGRlIGVuZmVybWVkYWQgY2FyZMOtYWNhIg0KYXV0aG9yOiAiTWFyaWFuYSBSYW3DrXJleiBSYW1vcyAtIEEwMTE3NDE1NSINCmRhdGU6ICIyMDI0LTA4LTIxIg0Kb3V0cHV0OiANCiBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgDQogICAgdGhlbWU6IGpvdXJuYWwNCi0tLQ0KDQohW10oQzpcXFVzZXJzXFxtYXJpMFxcT25lRHJpdmVcXERvY3VtZW50c1xcUiBTdHVkaW9cXElBIGNvbiBpbXBhY3RvIGVtcHJlc2FyaWFsXFxNb2R1bG8gMlxcR2lmc1xcZ2lmX2hlYXJ0LmdpZikNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQUE2MzczOyI+IFRlb3LDrWEgPC9zcGFuPg0KDQpFbCBwYXF1ZXRlICpjYXJldCAoQ2xhc2lmaWNhdGlvbiBhbmQgUmVncmVzc2lvbiBUcmFpbmluZykqIGVzIHVuIHBhcXVldGUgaW50ZWdyYWwgY29uIHVuYSBhbXBsaWEgdmFyaWVkYWQgZGUgYWxnb3JpdG1vcyBwYXJhIGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvLg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6ICNBQTYzNzM7Ij4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgI0dyw6FmaWNhcyBjb24gbWVqb3IgZGlzZcOxbw0KbGlicmFyeShnZ3Bsb3QyKQ0KI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjQ3JlYXIgZ3LDoWZpY29zDQpsaWJyYXJ5KGxhdHRpY2UpDQojaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjQWxnb3JpdG1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShjYXJldCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpICNVc2FyIGxhIGJhc2UgZGUgZGF0b3MgIklyaXMiDQpsaWJyYXJ5KGRhdGFzZXRzKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpICNFeHBsb3JhY2nDs24gZGUgbG9zIGRhdG9zDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJrZXJubGFiIikgI1BhcXVldGUgY29uIG3DqXRvZG9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvDQpsaWJyYXJ5KGtlcm5sYWIpDQojaW5zdGFsbC5wYWNrYWdlcygicmFuZG9tRm9yZXN0IikgI1BhcXVldGUgcGFyYSBlc3RlIG3DqXRvZG8gZGUgY2xhc2lmaWNhY2nDs24NCmxpYnJhcnkocmFuZG9tRm9yZXN0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiBDcmVhciBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZGYgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcbWFyaTBcXE9uZURyaXZlXFxEb2N1bWVudHNcXFIgU3R1ZGlvXFxJQSBjb24gaW1wYWN0byBlbXByZXNhcmlhbFxcTW9kdWxvIDJcXEJEXFxoZWFydC5jc3YiKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIDwvc3Bhbj4NCmBgYHtyfQ0Kc3VtbWFyeShkZikNCnN0cihkZikNCnBsb3RfbWlzc2luZyhkZikNCmBgYA0KDQoqKiBOT1RBOiBMYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSB0ZW5lciBmb3JtYXRvIGRlIEZBQ1RPUi4qKg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6ICNBQTYzNzM7Ij4gUGFydGlyIGRlIGxvcyBkYXRvcyA4MC0yMCA8L3NwYW4+DQpgYGB7cn0NCmRmJHRhcmdldCA8LSBhcy5mYWN0b3IoZGYkdGFyZ2V0KQ0KZGYkc2V4IDwtIGFzLmZhY3RvcihkZiRzZXgpDQpkZiRjcCA8LSBhcy5mYWN0b3IoZGYkY3ApDQpkZiRmYnMgPC0gYXMuZmFjdG9yKGRmJGZicykNCmRmJHJlc3RlY2cgPC0gYXMuZmFjdG9yKGRmJHJlc3RlY2cpDQpkZiRleGFuZyA8LSBhcy5mYWN0b3IoZGYkZXhhbmcpDQpkZiRzbG9wZSA8LSBhcy5mYWN0b3IoZGYkc2xvcGUpDQpkZiRjYSA8LSBhcy5mYWN0b3IoZGYkY2EpDQpkZiR0aGFsIDwtIGFzLmZhY3RvcihkZiR0aGFsKQ0KDQpzZXQuc2VlZCgxMjMpDQpyZW5nbG9uZXNfZW50cmVuYW1pZW50byA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRmJHRhcmdldCwgcD0wLjgsIGxpc3QgPSBGQUxTRSkNCmVudHJlbmFtaWVudG8gPC0gZGZbcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA8LSBkZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6ICNBQTYzNzM7Ij4gTcOpdG9kb3MgcGFyYSBtb2RlbGFyIDwvc3Bhbj4NCg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOg0KDQoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6DQpMaW5lYWwgKHN2bUxpbmVhciksIFJhZGlhbCAoc3ZtUmFkaWFsKSwgUG9saW7Ds21pY28gKHN2bVBvbHkpLCBldGMuIA0KKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKjogcnBhcnQNCiogKipSZWRlcyBOZXVyb25hbGVzKio6IG5uZXQNCiogKipSYW5kb20gRm9yZXN0KiogbyBCb3NxdWVzIEFsZWF0b3Jpb3M6IHJmDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiAxLiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gc3ZtTGluZWFyIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMSA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtTGluZWFyIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksICN2YWxpZGFjacOzbiBjcnV6YWRhIGRlIDEwDQogICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKEM9MSkgI0NhbWJpYXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8xIDwtIHByZWRpY3QobW9kZWxvMSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gMQ0KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmEgMSANCm1jcnAxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMSwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6ICNBQTYzNzM7Ij4gMi4gTW9kZWxvIGNvbiBlbCBNw6l0b2RvIHN2bVJhZGlhbCA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzIgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLCAjdmFsaWRhY2nDs24gY3J1emFkYSBkZSAxMA0KICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICNDYW1iaWFyDQopDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiA8LSBwcmVkaWN0KG1vZGVsbzIsIGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMiA8LSBwcmVkaWN0KG1vZGVsbzIsIHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvIDINCm1jcmUyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhIDINCm1jcnAyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMiwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiAzLiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gc3ZtUG9seSA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzMgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVBvbHkiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKSwgI3ZhbGlkYWNpw7NuIGNydXphZGEgZGUgMTANCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoZGVncmVlPTEsIHNjYWxlPTEsIEM9MSkgI0NhbWJpYXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zIDwtIHByZWRpY3QobW9kZWxvMywgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMywgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gMw0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMywgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmEgMw0KbWNycDMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEzLCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiA0LiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gcnBhcnQgPC9zcGFuPg0KYGBge3J9DQptb2RlbG80IDwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJycGFydCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLCAjdmFsaWRhY2nDs24gY3J1emFkYSBkZSAxMA0KICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAxMCAjQ2FtYmlhcg0KKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQgPC0gcHJlZGljdChtb2RlbG80LCBlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LCBwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50byA0DQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYSA0DQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTQsIHBydWViYSR0YXJnZXQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQUE2MzczOyI+IDUuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyBubmV0IDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNSA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsICJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApICN2YWxpZGFjacOzbiBjcnV6YWRhIGRlIDEwDQogICAgICAgICAgICAgICAgI0NhbWJpYXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gNQ0KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmEgNQ0KbWNycDUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE1LCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQUE2MzczOyI+IDYuIE1vZGVsbyBjb24gZWwgTcOpdG9kbyByZiA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNiA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAicmYiLCAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCAiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKSwgI3ZhbGlkYWNpw7NuIGNydXphZGEgZGUgMTANCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnkgID0gYygyLDQsNikpI0NhbWJpYXINCikNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG82IDwtIHByZWRpY3QobW9kZWxvNiwgZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE2IDwtIHByZWRpY3QobW9kZWxvNiwgcHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gNg0KbWNyZTYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmEgNg0KbWNycDYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE2LCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogI0FBNjM3MzsiPiBSZXN1bWVuIGRlIFJlc3VsdGFkb3MgPC9zcGFuPg0KYGBge3J9DQpyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoDQogICJzdm1MaW5lYXIiID1jKG1jcmUxJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUmFkaWFsIiA9YyhtY3JlMiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMiRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVBvbHkiID1jKG1jcmUzJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAzJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicnBhcnQiID1jKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCIgPWMobWNyZTUkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDUkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJyZiIgPWMobWNyZTYkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDYkb3ZlcmFsbFsiQWNjdXJhY3kiXSkNCiAgDQopDQoNCnJvd25hbWVzKHJlc3VsdGFkb3MpIDwtIGMoIlByZWNpc2nDs24gZGUgRW50cmVuYW1pZW50byIsICJQcmVjaXNpw7NuIGRlIFBydWViYSIpDQpyZXN1bHRhZG9zDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjQUE2MzczOyI+IENvbmNsdXNpb25lcyA8L3NwYW4+DQoNCkVsIG1vZGVsbyBjb24gZWwgbcOpdG9kbyBkZSBib3NxdWVzIGFsZWF0b3Jpb3MgKihyZikqIHkgbcOhcXVpbmEgZGUgdmVjdG9yZXMgZGUgc29wb3J0ZSByYWRpYWwgKnN2bVJhZGlhbCogcHJlc2VudGFuIHVuIHNvYnJlIGFqdXN0ZSwgeWEgcXVlIHRpZW5lbiB1bmEgYWx0YSBwcmVjaXNpw7NuIGVuIGVudHJlbmFtaWVudG8geSBhbHRhIGVuIHBydWViYS4gIA0KDQpBY29yZGUgYWwgcmVzdW1lbiBkZSByZXN1bHRhZG9zLCBlbCBtb2RlbG8gbWVqb3IgZXZhbHVhZG8gZXMgZWwgZGUgKipzdm1MaW5lYXIgLSBtw6FxdWluYSBkZSB2ZWN0b3JlcyBkZSBzb3BvcnRlIGxpbmVhbCAqKi4gQXVucXVlIGlndWFsIGVsIG1vZGVsbyAqKnN2bVBvbHkgLSBtw6FxdWluYSBkZSB2ZWN0b3JlcyBkZSBzb3BvcnRlIHBvbGluw7NtaWNvICoqIG9idHV2byBsb3MgbWlzbW9zIHJlc3VsdGFkb3Mu