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)
## Warning: package 'ggplot2' was built under R version 4.3.3
#install.packages("lattice") #Crear gráficos
library(lattice)
## Warning: package 'lattice' was built under R version 4.3.3
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
#install.packages("datasets") #Usar la base de datos "Iris"
library(datasets)
#install.packages("DataExplorer") #Usar la base de datos "Iris"
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.3.3
#install.packages("kernlab") #Paquete con métodos de aprendizaje automático
library(kernlab)
## Warning: package 'kernlab' was built under R version 4.3.3
## 
## Attaching package: 'kernlab'
## The following object is masked from 'package:ggplot2':
## 
##     alpha
#install.packages("randomForest") #Paquete para este método de clasificación
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin

Crear base de datos

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

Análisis Exploratorio

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

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

Partir los datos 80-20

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

Métodos para Modelar

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

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

1. Modelo con Método svmLinear

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

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

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

2. Modelo con Método svmRadial

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

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

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

3. Modelo con Método svmPoly

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

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

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

4. Modelo con Método rpart

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

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

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

5. Modelo con Método nnet

modelo5<- train(target ~ ., data=entrenamiento,
                method = "nnet", #Cambiar
                preProcess=c("scale","center"),
                trControl = trainControl(method="cv", number=10)
                #Cambiar
                )
## # weights:  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.196345
## iter  80 value 38.711519
## iter  90 value 38.431447
## iter 100 value 37.679924
## final  value 37.679924 
## 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 de Entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$target)

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

6. Modelo con Método rf

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

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

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

Resumen de resultados

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

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

Conclusiones

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

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

LS0tDQp0aXRsZTogIkNBUkVUIC0gSGVhcnQiDQphdXRob3I6ICJOYWlsYSBTYWxpbmFzIC0gQTAwODMyNzAyIg0KZGF0ZTogIjIwMjQtMDgtMjEiDQpvdXRwdXQ6IA0KIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXG5haWxhXFxPbmVEcml2ZVxcRG9jdW1lbnRvc1xcMSBURUNcXDdNTyBTRU1FU1RSRVxcTTJcXGNvcmF6b24uZ2lmKQ0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+VGVvcsOtYTwvc3Bhbj4NCkVsIHBhcXVldGUgKmNhcmV0IChDbGFzaWZpY2F0aW9uIGFuZCBSZWdyZXNzaW9uIFRyYWluaW5nKSogZXMgdW4gcGFxdWV0ZSBpbnRlZ3JhbCBjb24gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBhbGdvcml0bW9zIHBhcmEgZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICNHcsOhZmljYXMgY29uIG1lam9yIGRpc2XDsW8NCmxpYnJhcnkoZ2dwbG90MikNCiNpbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikgI0NyZWFyIGdyw6FmaWNvcw0KbGlicmFyeShsYXR0aWNlKQ0KI2luc3RhbGwucGFja2FnZXMoImNhcmV0IikgI0FsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoY2FyZXQpDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjVXNhciBsYSBiYXNlIGRlIGRhdG9zICJJcmlzIg0KbGlicmFyeShkYXRhc2V0cykNCiNpbnN0YWxsLnBhY2thZ2VzKCJEYXRhRXhwbG9yZXIiKSAjVXNhciBsYSBiYXNlIGRlIGRhdG9zICJJcmlzIg0KbGlicmFyeShEYXRhRXhwbG9yZXIpDQojaW5zdGFsbC5wYWNrYWdlcygia2VybmxhYiIpICNQYXF1ZXRlIGNvbiBtw6l0b2RvcyBkZSBhcHJlbmRpemFqZSBhdXRvbcOhdGljbw0KbGlicmFyeShrZXJubGFiKQ0KI2luc3RhbGwucGFja2FnZXMoInJhbmRvbUZvcmVzdCIpICNQYXF1ZXRlIHBhcmEgZXN0ZSBtw6l0b2RvIGRlIGNsYXNpZmljYWNpw7NuDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Q3JlYXIgYmFzZSBkZSBkYXRvczwvc3Bhbj4NCmBgYHtyfQ0KZGY8LXJlYWQuY3N2KCJDOlxcVXNlcnNcXG5haWxhXFxPbmVEcml2ZVxcRG9jdW1lbnRvc1xcMSBURUNcXDdNTyBTRU1FU1RSRVxcTTJcXGhlYXJ0LmNzdiIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkFuw6FsaXNpcyBFeHBsb3JhdG9yaW88L3NwYW4+DQpgYGB7cn0NCnN1bW1hcnkoZGYpDQpzdHIoZGYpDQpkZiR0YXJnZXQgPC0gYXMuZmFjdG9yKGRmJHRhcmdldCkNCmRmJHNleCA8LSBhcy5mYWN0b3IoZGYkc2V4KQ0KZGYkY3AgPC0gYXMuZmFjdG9yKGRmJGNwKQ0KZGYkZmJzIDwtIGFzLmZhY3RvcihkZiRmYnMpDQpkZiRyZXN0ZWNnIDwtIGFzLmZhY3RvcihkZiRyZXN0ZWNnKQ0KZGYkZXhhbmcgPC0gYXMuZmFjdG9yKGRmJGV4YW5nKQ0KZGYkc2xvcGUgPC0gYXMuZmFjdG9yKGRmJHNsb3BlKQ0KZGYkY2EgPC0gYXMuZmFjdG9yKGRmJGNhKQ0KZGYkdGhhbCA8LSBhcy5mYWN0b3IoZGYkdGhhbCkNCnBsb3RfbWlzc2luZyhkZikNCmBgYA0KDQoqKiBOT1RBOiBMYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSB0ZW5lciBmb3JtYXRvIGRlIEZBQ1RPUi4qKg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+UGFydGlyIGxvcyBkYXRvcyA4MC0yMDwvc3Bhbj4NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiR0YXJnZXQsIHA9MC44LCBsaXN0PUZBTFNFKQ0KZW50cmVuYW1pZW50byA8LWRmW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQpwcnVlYmE8LWRmWy1yZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Nw6l0b2RvcyBwYXJhIE1vZGVsYXI8L3NwYW4+DQpMb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHBhcmEgbW9kZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246DQoNCiogKipTVk0qKjogKlN1cHBvcnQgVmVjdG9yIE1hY2hpbmUqIG8gTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZS4gSGF5IHZhcmlvcyBzdWJ0aXBvczogTGluZWFsIChzdm1MaW5lYXIpLCBSYWRpYWwgKHN2bVJhZGlhbCksIFBvbGluw7NtaWNvIChzdm1Qb2x5KSwgZXRjLg0KKiAqKsOBcmJvbCBkZSBEZWNpc2nDs24qKjogcnBhcnQNCiogKipSZWRlcyBOZXVyb25hbGVzKio6IG5uZXQNCiogKipSYW5kb20gRm9yZXN0Kio6IG8gQm9zcXVlcyBBbGVhdG9yaW9zOiByZg0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjEuIE1vZGVsbyBjb24gTcOpdG9kbyBzdm1MaW5lYXI8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzE8LSB0cmFpbih0YXJnZXQgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kID0gInN2bUxpbmVhciIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoQz0xKSAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSxwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBFbnRyZW5hbWllbnRvDQptY3JlMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8xLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIFBydWViYQ0KbWNycDEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmExLCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Mi4gTW9kZWxvIGNvbiBNw6l0b2RvIHN2bVJhZGlhbDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMjwtIHRyYWluKHRhcmdldCB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUmFkaWFsIiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShzaWdtYT0xLEM9MSkgI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzIgPC0gcHJlZGljdChtb2RlbG8yLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMiA8LSBwcmVkaWN0KG1vZGVsbzIscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnAyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMiwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjMuIE1vZGVsbyBjb24gTcOpdG9kbyBzdm1Qb2x5PC9zcGFuPg0KYGBge3J9DQptb2RlbG8zPC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1Qb2x5IiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShkZWdyZWU9MSwgc2NhbGU9MSwgQz0xKSAjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMyxwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBFbnRyZW5hbWllbnRvDQptY3JlMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8zLCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIFBydWViYQ0KbWNycDMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEzLCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+NC4gTW9kZWxvIGNvbiBNw6l0b2RvIHJwYXJ0PC9zcGFuPg0KYGBge3J9DQptb2RlbG80PC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJycGFydCIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0gMTAgI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQgPC0gcHJlZGljdChtb2RlbG80LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNCA8LSBwcmVkaWN0KG1vZGVsbzQscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTQgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNCwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPjUuIE1vZGVsbyBjb24gTcOpdG9kbyBubmV0PC9zcGFuPg0KYGBge3J9DQptb2RlbG81PC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJubmV0IiwgI0NhbWJpYXINCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApDQogICAgICAgICAgICAgICAgI0NhbWJpYXINCiAgICAgICAgICAgICAgICApDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUgPC0gcHJlZGljdChtb2RlbG81LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNSA8LSBwcmVkaWN0KG1vZGVsbzUscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgRW50cmVuYW1pZW50bw0KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSwgZW50cmVuYW1pZW50byR0YXJnZXQpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBQcnVlYmENCm1jcnA1IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNSwgcHJ1ZWJhJHRhcmdldCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjYuIE1vZGVsbyBjb24gTcOpdG9kbyByZjwvc3Bhbj4NCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQptb2RlbG82PC0gdHJhaW4odGFyZ2V0IH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJyZiIsICNDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2Vzcz1jKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnkgPSBjKDIsNCw2KSkjQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNiA8LSBwcmVkaWN0KG1vZGVsbzYsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE2IDwtIHByZWRpY3QobW9kZWxvNixwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBFbnRyZW5hbWllbnRvDQptY3JlNiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG82LCBlbnRyZW5hbWllbnRvJHRhcmdldCkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIFBydWViYQ0KbWNycDYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE2LCBwcnVlYmEkdGFyZ2V0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+UmVzdW1lbiBkZSByZXN1bHRhZG9zPC9zcGFuPg0KYGBge3J9DQpyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoDQogICJzdm1MaW5lYXIiPWMobWNyZTEkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDEkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1MUmFkaWFsIj1jKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic3ZtUG9seSI9YyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJwYXJ0Ij1jKG1jcmU0JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA0JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCI9YyhtY3JlNSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJmIj1jKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQopDQoNCnJvd25hbWVzKHJlc3VsdGFkb3MpIDwtIGMoIlByZWNpc2nDs24gZGUgRW50cmVuYW1pZW50byIsICJQcmVjaXNpw7NuIGRlIFBydWViYSIpDQpyZXN1bHRhZG9zDQpgYGANCg0KIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5Db25jbHVzaW9uZXM8L3NwYW4+DQoNCkVsIG1vZGVsbyBjb24gZWwgbcOpdG9kbyBkZSBib3NxdWVzIGFsZWF0b3Jpb3MgKihyZikqLCBNw6FxdWluYSBkZSBWZWN0b3JlcyBkZSBTb3BvcnRlIFJhZGlhbCAqKHN2bUxSYWRpYWwpKiB5IFJlZGVzIE5ldXJvbmFsZXMgKihubmV0KSogcHJlc2VudGEgc29icmVhanVzdGUsIHlhIHF1ZSB0aWVuZSB1bmEgYWx0YSBwcmVjaXNpw7NuIGVuIGVudHJlbmFtaWVudG8geSBwcnVlYmEuDQoNCkFjb3JkZSBhbCByZXN1bWVuIGRlIHJlc3VsdGFkb3MsIGVsIG1lam9yIG1vZGVsbyBldmFsdWFkbyBlcyBlbCBkZSAqKk3DoXF1aW5hIGRlIFZlY3RvcmVzIGRlIFNvcG9ydGUgTGluZWFsIChzdm1MaW5lYXIqKg0K