Teoría

El paquete caret (Clasification and regression Training) es un pqeute 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") # Algortimos de aprendizaje automático
library(caret)
#install.packages("datasets") # Usar la base de datos "Iris"
library(datasets)
#install.packages("DataExplorer") # Exploración de datos
library(DataExplorer)
#install.packages("kernlab") # Paquete con métodos de aprendizaje automático
library(kernlab)
## 
## 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)
## 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("/Users/yessicaacosta/Downloads/heart.csv")

Análisis exploratorio

# file.choose()
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$exang <- as.factor(df$exang)
df$slope <- as.factor(df$slope)
df$thal <- as.factor(df$thal)
df$restecg <- as.factor(df$restecg)
df$ca <- as.factor(df$ca)

plot_missing(df)

** NOTAL 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 el método svmLinear

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

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

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

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

2. Modelo con el Método svmRadial

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

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

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

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

3. Modelo con el método svmPoly

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

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

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

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

4. Modelo con el método rpart

modelo4 <- train(target ~ ., data = entrenamiento,
                 method = "rpart", # Cambian
                 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 del Entrenamiento 
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$target)

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

5. Modelo con el método nnet

modelo5 <- train(target ~ ., data = entrenamiento,
                 method = "nnet", # Cambian
                 preProcess=c("scale","center"),
                 trControl = trainControl(method = "cv", number = 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.755668
## iter  70 value 66.078737
## iter  80 value 64.921140
## iter  90 value 64.707144
## iter 100 value 64.596332
## final  value 64.596332 
## 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.108968
## 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.118572
## iter  80 value 54.483070
## iter  90 value 53.587280
## iter 100 value 52.605952
## final  value 52.605952 
## 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.111165
## 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.794099
## iter  80 value 108.107514
## iter  90 value 107.142920
## iter 100 value 106.496539
## final  value 106.496539 
## 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.550709
## iter  60 value 108.587919
## iter  70 value 107.733317
## iter  80 value 107.558555
## iter  90 value 107.313288
## iter 100 value 107.278882
## final  value 107.278882 
## 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.155232
## iter 100 value 106.341400
## final  value 106.341400 
## 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.955874
## iter  80 value 42.524964
## iter  90 value 41.319706
## iter 100 value 41.199054
## final  value 41.199054 
## 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.248353
## iter  90 value 75.063709
## 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.191511
## 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.945794
## iter  70 value 102.473290
## iter  80 value 102.108009
## iter  90 value 101.902326
## iter 100 value 100.896278
## final  value 100.896278 
## 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.823836
## iter  90 value 35.444175
## iter 100 value 31.989270
## final  value 31.989270 
## 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.196342
## iter  80 value 38.717320
## iter  90 value 38.489912
## iter 100 value 38.028352
## final  value 38.028352 
## 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.566526
## final  value 150.566526 
## 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.161119
## 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.113770
## iter  60 value 207.671636
## iter  70 value 207.470569
## iter  80 value 207.428718
## iter  90 value 207.424090
## iter 100 value 207.423017
## final  value 207.423017 
## 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.844332
## final  value 82.844332 
## 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.476911
## iter  70 value 39.775294
## iter  80 value 32.149601
## iter  90 value 24.982169
## iter 100 value 24.034241
## final  value 24.034241 
## 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.221134
## iter 100 value 50.179493
## final  value 50.179493 
## 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.039420
## iter  90 value 131.650593
## iter 100 value 131.544227
## final  value 131.544227 
## 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.255638
## final  value 39.255638 
## 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.793254
## iter  70 value 118.170103
## iter  80 value 116.165314
## iter  90 value 113.316294
## iter 100 value 110.244690
## final  value 110.244690 
## 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.819120
## iter  70 value 62.368602
## iter  80 value 62.344585
## iter  90 value 62.317365
## iter 100 value 62.006043
## final  value 62.006043 
## 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.839033
## 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.023444
## iter  50 value 134.881446
## iter  60 value 132.591317
## iter  70 value 125.240607
## iter  80 value 125.084670
## iter  90 value 125.028531
## iter 100 value 124.998703
## final  value 124.998703 
## 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.321054
## iter 100 value 54.170684
## final  value 54.170684 
## 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.683820
## final  value 148.683820 
## 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.457757
## iter  80 value 28.158167
## iter  90 value 27.039745
## iter 100 value 26.711172
## final  value 26.711172 
## 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.641635
## iter  80 value 200.500890
## iter  90 value 195.762752
## 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.298416
## iter  80 value 97.902363
## iter  90 value 97.054749
## iter 100 value 96.740721
## final  value 96.740721 
## 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.378230
## iter  90 value 83.236206
## iter 100 value 81.571273
## final  value 81.571273 
## 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.948800
## iter  80 value 106.229203
## iter  90 value 104.355251
## iter 100 value 103.824797
## final  value 103.824797 
## 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.270605
## 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.351417
## iter 100 value 122.020040
## final  value 122.020040 
## 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.887859
## iter  70 value 50.365585
## iter  80 value 49.623449
## iter  90 value 49.428719
## iter 100 value 48.975412
## final  value 48.975412 
## 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.132921
## 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.542781
## 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 
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$target)

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

5. Modelo con el método rf

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

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

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

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

Resumen de Resultadose rf

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

Resumen de Resultadose rf

El modelo con el método de bosques aleatorios (rf) presenta sobreajuste, ya que tiene una alta precisión en entrenamiento, pero baja en prueba.

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

LS0tCnRpdGxlOiAiQ2FyZXQgLSBlbmZlcm1lZGFkZXMiCmF1dGhvcjogIlllc3NpY2EgQWNvc3RhIgpkYXRlOiAiMjAyNC0wOC0xOSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiBjb3NtbwotLS0KCgohW10oL1VzZXJzL3llc3NpY2FhY29zdGEvRGVza3RvcC9jb3Jhem9uIGVuZmVybW8uZ2lmKQoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmF5OyI+VGVvcsOtYTwvc3Bhbj4gCkVsIHBhcXVldGUgKmNhcmV0IChDbGFzaWZpY2F0aW9uIGFuZCByZWdyZXNzaW9uIFRyYWluaW5nKSogZXMgdW4gcHFldXRlIGludGVncmFsIGNvbiB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4KCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JheTsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXM8L3NwYW4+IApgYGB7ciB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICMgR3LDoWZpY2FzIGNvbiBtZWpvciBkaXNlw7FvCmxpYnJhcnkoZ2dwbG90MikKI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjIENyZWFyIGdyw6FmaWNvcwpsaWJyYXJ5KGxhdHRpY2UpCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICMgQWxnb3J0aW1vcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbwpsaWJyYXJ5KGNhcmV0KQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjIFVzYXIgbGEgYmFzZSBkZSBkYXRvcyAiSXJpcyIKbGlicmFyeShkYXRhc2V0cykKI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpICMgRXhwbG9yYWNpw7NuIGRlIGRhdG9zCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQojaW5zdGFsbC5wYWNrYWdlcygia2VybmxhYiIpICMgUGFxdWV0ZSBjb24gbcOpdG9kb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28KbGlicmFyeShrZXJubGFiKQojaW5zdGFsbC5wYWNrYWdlcygicmFuZG9tRm9yZXN0IikgIyBQYXF1ZXRlIHBhcmEgZXN0ZSBtw6l0b2RvIGRlIGNsYXNpZmljYWNpw7NuCmxpYnJhcnkocmFuZG9tRm9yZXN0KQpgYGAKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JheTsiPkNyZWFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+IAoKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCIvVXNlcnMveWVzc2ljYWFjb3N0YS9Eb3dubG9hZHMvaGVhcnQuY3N2IikKYGBgCgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij5BbsOhbGlzaXMgZXhwbG9yYXRvcmlvPC9zcGFuPiAKCmBgYHtyfQojIGZpbGUuY2hvb3NlKCkKc3VtbWFyeShkZikKc3RyKGRmKQpkZiR0YXJnZXQgPC0gYXMuZmFjdG9yKGRmJHRhcmdldCkKZGYkc2V4IDwtIGFzLmZhY3RvcihkZiRzZXgpCmRmJGNwIDwtIGFzLmZhY3RvcihkZiRjcCkKZGYkZmJzIDwtIGFzLmZhY3RvcihkZiRmYnMpCmRmJGV4YW5nIDwtIGFzLmZhY3RvcihkZiRleGFuZykKZGYkc2xvcGUgPC0gYXMuZmFjdG9yKGRmJHNsb3BlKQpkZiR0aGFsIDwtIGFzLmZhY3RvcihkZiR0aGFsKQpkZiRyZXN0ZWNnIDwtIGFzLmZhY3RvcihkZiRyZXN0ZWNnKQpkZiRjYSA8LSBhcy5mYWN0b3IoZGYkY2EpCgpwbG90X21pc3NpbmcoZGYpCmBgYAoqKiBOT1RBTCBMYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSB0ZW5lciBmb3JtYXRvIGRlIEZBQ1RPUi4qKgoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij5QYXJ0aXIgbG9zIGRhdG9zIDgwLTIwPC9zcGFuPiAKCmBgYHtyfQpzZXQuc2VlZCgxMjMpCnJlbmdsb25lc19lbnRyZW5hbWllbnRvIDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkdGFyZ2V0LCBwPTAuOCwgbGlzdD1GQUxTRSkKZW50cmVuYW1pZW50byA8LSBkZltyZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQpwcnVlYmEgPC0gZGZbLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij5Nw6l0b2RvcyBwYXJhIG1vZGVsYXI8L3NwYW4+IApMb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHBhcmEgbW9kZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246CgoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4KKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKjogcnBhcnQKKiAqKlJlZGVzIG5ldXJvbmFsZXMqKjogbm5ldAoqICoqUmFuZG9tIEZvcmVzdCoqIG8gYm9zcXVlcyBBbGVhdG9yaW9zOiByZgoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmF5OyI+MS4gTW9kZWxvIGNvbiBlbCBtw6l0b2RvIHN2bUxpbmVhcjwvc3Bhbj4KYGBge3J9Cm1vZGVsbzEgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bUxpbmVhciIsICMgQ2FtYmlhbgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShDPTEpICMgQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSxwcnVlYmEpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gCm1jcmUxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEsIHBydWViYSR0YXJnZXQpCgpgYGAKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij4yLiBNb2RlbG8gY29uIGVsIE3DqXRvZG8gc3ZtUmFkaWFsPC9zcGFuPgoKYGBge3J9Cm1vZGVsbzIgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bVJhZGlhbCIsICMgQ2FtYmlhbgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICMgQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiA8LSBwcmVkaWN0KG1vZGVsbzIsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMixwcnVlYmEpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gCm1jcmUyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTIsIHBydWViYSR0YXJnZXQpCgpgYGAKCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij4zLiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gc3ZtUG9seTwvc3Bhbj4KCmBgYHtyfQptb2RlbG8zIDwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1Qb2x5IiwgIyBDYW1iaWFuCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKGRlZ3JlZT0xLCBzY2FsZT0xLCBDPTEpICMgQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMyxwcnVlYmEpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gCm1jcmUzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTMsIHBydWViYSR0YXJnZXQpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmF5OyI+NC4gTW9kZWxvIGNvbiBlbCBtw6l0b2RvIHJwYXJ0PC9zcGFuPgoKYGBge3J9Cm1vZGVsbzQgPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YSA9IGVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJwYXJ0IiwgIyBDYW1iaWFuCiAgICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCksCiAgICAgICAgICAgICAgICAgdHVuZUxlbmd0aCA9IDEwICMgQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCA8LSBwcmVkaWN0KG1vZGVsbzQsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmE0IDwtIHByZWRpY3QobW9kZWxvNCxwcnVlYmEpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8gCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsIGVudHJlbmFtaWVudG8kdGFyZ2V0KQoKIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQptY3JwNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTQsIHBydWViYSR0YXJnZXQpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBncmF5OyI+NS4gTW9kZWxvIGNvbiBlbCBtw6l0b2RvIG5uZXQ8L3NwYW4+CgpgYGB7cn0KbW9kZWxvNSA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAibm5ldCIsICMgQ2FtYmlhbgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3M9Yygic2NhbGUiLCJjZW50ZXIiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyID0gMTApCiAgICAgICAgICAgICAgICAgIyBDYW1iaWFyCiAgICAgICAgICAgICAgICAgKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG81IDwtIHByZWRpY3QobW9kZWxvNSwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTUgPC0gcHJlZGljdChtb2RlbG81LHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50byAKbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSwgZW50cmVuYW1pZW50byR0YXJnZXQpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhCm1jcnA1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNSwgcHJ1ZWJhJHRhcmdldCkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij41LiBNb2RlbG8gY29uIGVsIG3DqXRvZG8gcmY8L3NwYW4+CgpgYGB7cn0KbW9kZWxvNiA8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhID0gZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAicmYiLCAjIENhbWJpYW4KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksCiAgICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBleHBhbmQuZ3JpZChtdHJ5ID0gYygyLDQsNikpIyBDYW1iaWFyCiAgICAgICAgICAgICAgICAgKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG82IDwtIHByZWRpY3QobW9kZWxvNiwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTYgPC0gcHJlZGljdChtb2RlbG81LHBydWViYSkKCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50byAKbWNyZTYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiwgZW50cmVuYW1pZW50byR0YXJnZXQpCgojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJHRhcmdldCkKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JheTsiPlJlc3VtZW4gZGUgUmVzdWx0YWRvc2UgcmY8L3NwYW4+CmBgYHtyfQpyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoCiAgInN2bUxpbmVhciI9YyhtY3JlMSRvdmVyYWxsWyJBY2N1cmFjeSJdLG1jcnAxJG92ZXJhbGxbIkFjY3VyYWN5Il0pLAogICJzdm1SYWRpYWwiPWMobWNyZTIkb3ZlcmFsbFsiQWNjdXJhY3kiXSxtY3JwMiRvdmVyYWxsWyJBY2N1cmFjeSJdKSwKICAic3ZtUG9seSI9YyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLG1jcnAzJG92ZXJhbGxbIkFjY3VyYWN5Il0pLAogICJycGFydCI9YyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLAogICJubmV0Ij1jKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sbWNycDUkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInJmIj1jKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sbWNycDYkb3ZlcmFsbFsiQWNjdXJhY3kiXSkKKQpyb3duYW1lcyhyZXN1bHRhZG9zKSA8LSBjKCJQcmVjaXNpw7NuIGRlIEVudHJlbmFtaWVudG8iLCAiUHJlY2lzacOzbiBkZSBQcnVlYmEiKQpyZXN1bHRhZG9zCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6IGdyYXk7Ij5SZXN1bWVuIGRlIFJlc3VsdGFkb3NlIHJmPC9zcGFuPgpFbCBtb2RlbG8gY29uIGVsIG3DqXRvZG8gZGUgYm9zcXVlcyBhbGVhdG9yaW9zICoocmYpKiBwcmVzZW50YSBzb2JyZWFqdXN0ZSwgeWEgcXVlIHRpZW5lIHVuYSBhbHRhIHByZWNpc2nDs24gZW4gZW50cmVuYW1pZW50bywgcGVybyBiYWphIGVuIHBydWViYS4KCkFjb3JkZSBhbCByZXN1bWVuIGRlIHJlc3VsdGFkb3MsIGVsIG1vZGVsbyBtZWpvciBldmFsdWFkbyBlcyBlbCBkZSAqKk3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUgTGluZWFsKiouCgo=