Teoría

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

Instalar paquetes y llamar librerías

#install.packages("ggplot2") #Gráficas
library(ggplot2)
#install.packages("lattice") #crear gráficoas
library(lattice)
#install.packages("caret") #Algoritmos de aprendizaje automático
library(caret)
#install.packages("datasets") #Usar bases de datos, en este casi Iris
library(datasets)
#install.packages("DataExplorer") #Análisis exploratorio
library(DataExplorer)

Crear base de datos

df <- data.frame(iris)

IEntender la base de datos

summary(df)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
str(df)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#create_report(df)
plot_missing(df)

plot_histogram(df)

plot_correlation(df)

Nota: La variable que queremos predecir debe tener formato de FACTOR

Partir las bases de datos

#NORMALMENTE 80-20
set.seed(123)
renglones_entrenamiento <- createDataPartition(df$Species, p=0.8, list=FALSE)
entrenamiento <- df[renglones_entrenamiento, ]
prueba <- df[-renglones_entrenamiento, ]

Distintos tipos de 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

Modelo 1. SVM Lineal

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

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

#Matriz de confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultadon del entrenamiento
mcre1 <- confusionMatrix(resultado_entrenamiento1, entrenamiento$Species)
mcre1
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         0
##   virginica       0          1        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9917          
##                  95% CI : (0.9544, 0.9998)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9875          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           1.0000
## Specificity                 1.0000            1.0000           0.9875
## Pos Pred Value              1.0000            1.0000           0.9756
## Neg Pred Value              1.0000            0.9877           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3333
## Detection Prevalence        0.3333            0.3250           0.3417
## Balanced Accuracy           1.0000            0.9875           0.9938
#Matriz de confusión del resultado de la prueba
mcrp1 <- confusionMatrix(resultado_prueba1, prueba$Species)
mcrp1
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         1
##   virginica       0          0         9
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.8278, 0.9992)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 2.963e-13       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.9000
## Specificity                 1.0000            0.9500           1.0000
## Pos Pred Value              1.0000            0.9091           1.0000
## Neg Pred Value              1.0000            1.0000           0.9524
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3000
## Detection Prevalence        0.3333            0.3667           0.3000
## Balanced Accuracy           1.0000            0.9750           0.9500

Modelo 2. SVM Radial

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

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

#Matriz de confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultadon del entrenamiento
mcre2 <- confusionMatrix(resultado_entrenamiento2, entrenamiento$Species)
mcre2
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         0
##   virginica       0          1        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9917          
##                  95% CI : (0.9544, 0.9998)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9875          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           1.0000
## Specificity                 1.0000            1.0000           0.9875
## Pos Pred Value              1.0000            1.0000           0.9756
## Neg Pred Value              1.0000            0.9877           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3333
## Detection Prevalence        0.3333            0.3250           0.3417
## Balanced Accuracy           1.0000            0.9875           0.9938
#Matriz de confusión del resultado de la prueba
mcrp2 <- confusionMatrix(resultado_prueba2, prueba$Species)
mcrp2
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Modelo 3. SVM Polinómico

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

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

#Matriz de confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultadon del entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3, entrenamiento$Species)
mcre3
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         1
##   virginica       0          1        39
## 
## Overall Statistics
##                                          
##                Accuracy : 0.9833         
##                  95% CI : (0.9411, 0.998)
##     No Information Rate : 0.3333         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.975          
##                                          
##  Mcnemar's Test P-Value : NA             
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           0.9750
## Specificity                 1.0000            0.9875           0.9875
## Pos Pred Value              1.0000            0.9750           0.9750
## Neg Pred Value              1.0000            0.9875           0.9875
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3250
## Detection Prevalence        0.3333            0.3333           0.3333
## Balanced Accuracy           1.0000            0.9812           0.9812
#Matriz de confusión del resultado de la prueba
mcrp3 <- confusionMatrix(resultado_prueba3, prueba$Species)
mcrp3
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         1
##   virginica       0          0         9
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.8278, 0.9992)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 2.963e-13       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.9000
## Specificity                 1.0000            0.9500           1.0000
## Pos Pred Value              1.0000            0.9091           1.0000
## Neg Pred Value              1.0000            1.0000           0.9524
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3000
## Detection Prevalence        0.3333            0.3667           0.3000
## Balanced Accuracy           1.0000            0.9750           0.9500

Modelo 4. Árbol de decisión

modelo4 <- train(Species ~ ., data=entrenamiento,
                 method = "rpart", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10),
                 tuneLength =10 #Cambiar hiperparametros, se pueden justar
)

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

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre4 <- confusionMatrix(resultado_entrenamiento4, entrenamiento$Species)
mcre4
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         39         3
##   virginica       0          1        37
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9750           0.9250
## Specificity                 1.0000            0.9625           0.9875
## Pos Pred Value              1.0000            0.9286           0.9737
## Neg Pred Value              1.0000            0.9872           0.9634
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3250           0.3083
## Detection Prevalence        0.3333            0.3500           0.3167
## Balanced Accuracy           1.0000            0.9688           0.9563
mcrp4 <- confusionMatrix(resultado_prueba4, prueba$Species)
mcrp4
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Modelo 5. Redes Neuronales

modelo5 <- train(Species ~ ., data=entrenamiento,
                 method = "nnet", #Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method = "cv", number=10)

)
## # weights:  11
## initial  value 114.109623 
## iter  10 value 45.828563
## iter  20 value 9.079013
## iter  30 value 4.971410
## iter  40 value 3.325076
## iter  50 value 2.324741
## iter  60 value 2.120862
## iter  70 value 1.736362
## iter  80 value 1.707422
## iter  90 value 1.570408
## iter 100 value 1.556071
## final  value 1.556071 
## stopped after 100 iterations
## # weights:  27
## initial  value 139.114470 
## iter  10 value 4.329844
## iter  20 value 0.137561
## iter  30 value 0.000304
## final  value 0.000076 
## converged
## # weights:  43
## initial  value 157.720054 
## iter  10 value 20.358701
## iter  20 value 2.764708
## iter  30 value 0.068068
## iter  40 value 0.003367
## iter  50 value 0.000204
## final  value 0.000076 
## converged
## # weights:  11
## initial  value 124.184254 
## iter  10 value 54.114798
## iter  20 value 43.846499
## final  value 43.846172 
## converged
## # weights:  27
## initial  value 138.358541 
## iter  10 value 30.805831
## iter  20 value 22.240424
## iter  30 value 22.174928
## iter  40 value 21.635498
## iter  50 value 20.423106
## iter  60 value 20.237299
## iter  70 value 20.229187
## final  value 20.229178 
## converged
## # weights:  43
## initial  value 136.335479 
## iter  10 value 24.411557
## iter  20 value 19.593368
## iter  30 value 19.257034
## iter  40 value 19.242614
## iter  50 value 19.241833
## final  value 19.241690 
## converged
## # weights:  11
## initial  value 121.983814 
## iter  10 value 29.764557
## iter  20 value 4.793835
## iter  30 value 4.140823
## iter  40 value 3.941941
## iter  50 value 3.915344
## iter  60 value 3.885919
## iter  70 value 3.864240
## iter  80 value 3.864129
## iter  90 value 3.863498
## iter 100 value 3.863083
## final  value 3.863083 
## stopped after 100 iterations
## # weights:  27
## initial  value 134.704284 
## iter  10 value 10.202539
## iter  20 value 1.378574
## iter  30 value 0.615712
## iter  40 value 0.595992
## iter  50 value 0.541999
## iter  60 value 0.522479
## iter  70 value 0.508242
## iter  80 value 0.494808
## iter  90 value 0.485988
## iter 100 value 0.483150
## final  value 0.483150 
## stopped after 100 iterations
## # weights:  43
## initial  value 134.256561 
## iter  10 value 5.895771
## iter  20 value 0.878393
## iter  30 value 0.414096
## iter  40 value 0.409300
## iter  50 value 0.391384
## iter  60 value 0.372698
## iter  70 value 0.360924
## iter  80 value 0.349824
## iter  90 value 0.337093
## iter 100 value 0.333465
## final  value 0.333465 
## stopped after 100 iterations
## # weights:  11
## initial  value 124.927207 
## iter  10 value 48.680119
## iter  20 value 43.764160
## iter  30 value 9.833138
## iter  40 value 3.861079
## iter  50 value 3.007637
## iter  60 value 2.112234
## iter  70 value 1.015477
## iter  80 value 0.660291
## iter  90 value 0.584209
## iter 100 value 0.557918
## final  value 0.557918 
## stopped after 100 iterations
## # weights:  27
## initial  value 106.009100 
## iter  10 value 3.267265
## iter  20 value 0.011976
## iter  30 value 0.000721
## final  value 0.000079 
## converged
## # weights:  43
## initial  value 132.750055 
## iter  10 value 3.175584
## iter  20 value 0.010245
## final  value 0.000079 
## converged
## # weights:  11
## initial  value 135.102481 
## iter  10 value 48.711066
## iter  20 value 43.644842
## iter  30 value 43.642246
## final  value 43.642244 
## converged
## # weights:  27
## initial  value 133.300307 
## iter  10 value 35.461288
## iter  20 value 22.165793
## iter  30 value 21.425419
## iter  40 value 20.627546
## iter  50 value 20.263763
## iter  60 value 20.262023
## final  value 20.262020 
## converged
## # weights:  43
## initial  value 109.402261 
## iter  10 value 20.902262
## iter  20 value 17.916111
## iter  30 value 17.682265
## iter  40 value 17.481388
## iter  50 value 17.444235
## iter  60 value 17.443763
## final  value 17.443763 
## converged
## # weights:  11
## initial  value 129.154732 
## iter  10 value 49.976791
## iter  20 value 48.672006
## iter  30 value 45.423891
## iter  40 value 44.522174
## iter  50 value 21.617067
## iter  60 value 5.215792
## iter  70 value 3.029068
## iter  80 value 2.694033
## iter  90 value 2.129327
## iter 100 value 2.085723
## final  value 2.085723 
## stopped after 100 iterations
## # weights:  27
## initial  value 128.146901 
## iter  10 value 12.883639
## iter  20 value 0.503141
## iter  30 value 0.440506
## iter  40 value 0.334361
## iter  50 value 0.255176
## iter  60 value 0.231650
## iter  70 value 0.212976
## iter  80 value 0.196930
## iter  90 value 0.160894
## iter 100 value 0.153569
## final  value 0.153569 
## stopped after 100 iterations
## # weights:  43
## initial  value 124.582026 
## iter  10 value 2.754725
## iter  20 value 0.311086
## iter  30 value 0.290474
## iter  40 value 0.256366
## iter  50 value 0.197351
## iter  60 value 0.188947
## iter  70 value 0.175049
## iter  80 value 0.170877
## iter  90 value 0.167614
## iter 100 value 0.163811
## final  value 0.163811 
## stopped after 100 iterations
## # weights:  11
## initial  value 112.574553 
## iter  10 value 16.086369
## iter  20 value 1.127724
## iter  30 value 0.070220
## iter  40 value 0.052693
## iter  50 value 0.027831
## iter  60 value 0.020153
## iter  70 value 0.013655
## iter  80 value 0.013056
## iter  90 value 0.012208
## iter 100 value 0.012127
## final  value 0.012127 
## stopped after 100 iterations
## # weights:  27
## initial  value 123.458121 
## iter  10 value 2.642483
## iter  20 value 0.013165
## final  value 0.000069 
## converged
## # weights:  43
## initial  value 139.091729 
## iter  10 value 2.160891
## iter  20 value 0.003282
## iter  30 value 0.000126
## final  value 0.000080 
## converged
## # weights:  11
## initial  value 130.252323 
## iter  10 value 45.484341
## iter  20 value 42.749013
## final  value 42.748850 
## converged
## # weights:  27
## initial  value 127.386067 
## iter  10 value 25.679985
## iter  20 value 21.366719
## iter  30 value 21.328831
## iter  40 value 21.322845
## iter  50 value 21.151629
## iter  60 value 20.119498
## final  value 20.115812 
## converged
## # weights:  43
## initial  value 150.263239 
## iter  10 value 23.067220
## iter  20 value 17.832665
## iter  30 value 17.464610
## iter  40 value 17.344079
## iter  50 value 17.324985
## iter  60 value 17.322956
## final  value 17.322939 
## converged
## # weights:  11
## initial  value 133.419233 
## iter  10 value 49.541541
## iter  20 value 47.947261
## iter  30 value 47.263169
## iter  40 value 43.915176
## iter  50 value 35.608322
## iter  60 value 9.531218
## iter  70 value 3.590051
## iter  80 value 2.722956
## iter  90 value 1.943896
## iter 100 value 1.935777
## final  value 1.935777 
## stopped after 100 iterations
## # weights:  27
## initial  value 139.743767 
## iter  10 value 12.605931
## iter  20 value 0.365580
## iter  30 value 0.347059
## iter  40 value 0.323069
## iter  50 value 0.274982
## iter  60 value 0.253399
## iter  70 value 0.240675
## iter  80 value 0.213971
## iter  90 value 0.185739
## iter 100 value 0.167358
## final  value 0.167358 
## stopped after 100 iterations
## # weights:  43
## initial  value 116.074870 
## iter  10 value 7.050705
## iter  20 value 0.285352
## iter  30 value 0.257600
## iter  40 value 0.222784
## iter  50 value 0.195658
## iter  60 value 0.168249
## iter  70 value 0.156169
## iter  80 value 0.138017
## iter  90 value 0.135075
## iter 100 value 0.130354
## final  value 0.130354 
## stopped after 100 iterations
## # weights:  11
## initial  value 129.219899 
## iter  10 value 51.373152
## iter  20 value 49.908995
## final  value 49.906753 
## converged
## # weights:  27
## initial  value 120.091089 
## iter  10 value 6.603062
## iter  20 value 0.026764
## final  value 0.000061 
## converged
## # weights:  43
## initial  value 123.728451 
## iter  10 value 4.801734
## iter  20 value 0.039155
## iter  30 value 0.000226
## final  value 0.000070 
## converged
## # weights:  11
## initial  value 118.993896 
## iter  10 value 64.152682
## iter  20 value 55.569463
## iter  30 value 44.068382
## final  value 43.908374 
## converged
## # weights:  27
## initial  value 119.950600 
## iter  10 value 28.428204
## iter  20 value 20.188866
## iter  30 value 19.770305
## iter  40 value 19.726999
## final  value 19.726966 
## converged
## # weights:  43
## initial  value 126.096589 
## iter  10 value 28.247839
## iter  20 value 19.345172
## iter  30 value 18.312394
## iter  40 value 18.163433
## iter  50 value 18.037051
## iter  60 value 17.896710
## iter  70 value 17.855436
## iter  80 value 17.846178
## final  value 17.846136 
## converged
## # weights:  11
## initial  value 119.430385 
## iter  10 value 53.730648
## iter  20 value 47.239603
## iter  30 value 23.897669
## iter  40 value 6.704752
## iter  50 value 4.457121
## iter  60 value 4.153060
## iter  70 value 3.678133
## iter  80 value 3.341161
## iter  90 value 3.278779
## iter 100 value 3.277943
## final  value 3.277943 
## stopped after 100 iterations
## # weights:  27
## initial  value 132.324727 
## iter  10 value 16.886915
## iter  20 value 1.513561
## iter  30 value 0.573764
## iter  40 value 0.516440
## iter  50 value 0.478987
## iter  60 value 0.439664
## iter  70 value 0.406696
## iter  80 value 0.367257
## iter  90 value 0.342586
## iter 100 value 0.336179
## final  value 0.336179 
## stopped after 100 iterations
## # weights:  43
## initial  value 106.618681 
## iter  10 value 6.111470
## iter  20 value 0.743247
## iter  30 value 0.442626
## iter  40 value 0.427963
## iter  50 value 0.409000
## iter  60 value 0.401314
## iter  70 value 0.387625
## iter  80 value 0.355552
## iter  90 value 0.347139
## iter 100 value 0.328937
## final  value 0.328937 
## stopped after 100 iterations
## # weights:  11
## initial  value 118.757399 
## iter  10 value 20.776647
## iter  20 value 4.323354
## iter  30 value 3.179499
## iter  40 value 2.898875
## iter  50 value 2.812313
## iter  60 value 2.724459
## iter  70 value 2.091876
## iter  80 value 2.019732
## iter  90 value 1.924682
## iter 100 value 1.903984
## final  value 1.903984 
## stopped after 100 iterations
## # weights:  27
## initial  value 119.831118 
## iter  10 value 17.037938
## iter  20 value 2.022554
## iter  30 value 0.001992
## final  value 0.000097 
## converged
## # weights:  43
## initial  value 152.666457 
## iter  10 value 4.599487
## iter  20 value 0.288522
## iter  30 value 0.000507
## final  value 0.000095 
## converged
## # weights:  11
## initial  value 139.665328 
## iter  10 value 79.187877
## iter  20 value 55.626312
## iter  30 value 44.041491
## final  value 44.032483 
## converged
## # weights:  27
## initial  value 130.471384 
## iter  10 value 25.286397
## iter  20 value 20.299901
## iter  30 value 20.264751
## final  value 20.264258 
## converged
## # weights:  43
## initial  value 156.762933 
## iter  10 value 22.738500
## iter  20 value 18.942193
## iter  30 value 18.651497
## iter  40 value 18.541216
## iter  50 value 18.492579
## iter  60 value 18.492419
## iter  60 value 18.492419
## iter  60 value 18.492419
## final  value 18.492419 
## converged
## # weights:  11
## initial  value 130.272017 
## iter  10 value 50.765912
## iter  20 value 48.582618
## iter  30 value 45.966204
## iter  40 value 45.903361
## iter  50 value 45.879992
## iter  60 value 45.650444
## iter  70 value 45.165395
## iter  80 value 45.116943
## iter  90 value 45.046789
## iter 100 value 42.562388
## final  value 42.562388 
## stopped after 100 iterations
## # weights:  27
## initial  value 113.815666 
## iter  10 value 5.301574
## iter  20 value 1.571575
## iter  30 value 0.883859
## iter  40 value 0.812207
## iter  50 value 0.731080
## iter  60 value 0.650493
## iter  70 value 0.607689
## iter  80 value 0.557375
## iter  90 value 0.540423
## iter 100 value 0.525700
## final  value 0.525700 
## stopped after 100 iterations
## # weights:  43
## initial  value 182.751934 
## iter  10 value 19.350295
## iter  20 value 1.711168
## iter  30 value 0.511460
## iter  40 value 0.469349
## iter  50 value 0.420543
## iter  60 value 0.398203
## iter  70 value 0.332761
## iter  80 value 0.312241
## iter  90 value 0.294528
## iter 100 value 0.271370
## final  value 0.271370 
## stopped after 100 iterations
## # weights:  11
## initial  value 125.448373 
## iter  10 value 49.926410
## iter  20 value 49.881822
## iter  30 value 49.201823
## iter  40 value 44.247440
## iter  50 value 25.492740
## iter  60 value 5.194775
## iter  70 value 2.583735
## iter  80 value 2.289023
## iter  90 value 1.068084
## iter 100 value 0.835714
## final  value 0.835714 
## stopped after 100 iterations
## # weights:  27
## initial  value 127.664185 
## iter  10 value 13.769859
## iter  20 value 0.492718
## iter  30 value 0.022574
## final  value 0.000068 
## converged
## # weights:  43
## initial  value 110.245332 
## iter  10 value 3.437075
## iter  20 value 0.032918
## iter  30 value 0.002791
## iter  40 value 0.000949
## iter  50 value 0.000777
## final  value 0.000069 
## converged
## # weights:  11
## initial  value 132.440323 
## iter  10 value 72.508591
## iter  20 value 46.007946
## iter  30 value 42.992074
## final  value 42.992070 
## converged
## # weights:  27
## initial  value 117.767278 
## iter  10 value 24.106928
## iter  20 value 18.749636
## iter  30 value 18.652227
## iter  40 value 18.642367
## final  value 18.642365 
## converged
## # weights:  43
## initial  value 128.410770 
## iter  10 value 22.342219
## iter  20 value 17.504842
## iter  30 value 16.915932
## iter  40 value 16.822051
## iter  50 value 16.818771
## final  value 16.818642 
## converged
## # weights:  11
## initial  value 121.106246 
## iter  10 value 49.784217
## iter  20 value 49.066404
## iter  30 value 48.866674
## iter  40 value 48.805726
## iter  50 value 47.050173
## iter  60 value 45.727742
## iter  70 value 42.793682
## iter  80 value 15.061754
## iter  90 value 4.037777
## iter 100 value 3.518024
## final  value 3.518024 
## stopped after 100 iterations
## # weights:  27
## initial  value 145.696392 
## iter  10 value 17.473125
## iter  20 value 0.762785
## iter  30 value 0.212104
## iter  40 value 0.201556
## iter  50 value 0.186255
## iter  60 value 0.178114
## iter  70 value 0.158787
## iter  80 value 0.156356
## iter  90 value 0.153959
## iter 100 value 0.151025
## final  value 0.151025 
## stopped after 100 iterations
## # weights:  43
## initial  value 136.441831 
## iter  10 value 3.296600
## iter  20 value 0.237981
## iter  30 value 0.224021
## iter  40 value 0.200991
## iter  50 value 0.188188
## iter  60 value 0.174578
## iter  70 value 0.168430
## iter  80 value 0.154250
## iter  90 value 0.143591
## iter 100 value 0.139183
## final  value 0.139183 
## stopped after 100 iterations
## # weights:  11
## initial  value 120.488230 
## iter  10 value 47.569324
## iter  20 value 44.401604
## iter  30 value 34.326978
## iter  40 value 7.154579
## iter  50 value 3.957519
## iter  60 value 3.742646
## iter  70 value 1.874932
## iter  80 value 1.071214
## iter  90 value 1.042372
## iter 100 value 0.986469
## final  value 0.986469 
## stopped after 100 iterations
## # weights:  27
## initial  value 135.817698 
## iter  10 value 13.950546
## iter  20 value 1.151586
## iter  30 value 0.031436
## iter  40 value 0.001019
## final  value 0.000068 
## converged
## # weights:  43
## initial  value 140.377939 
## iter  10 value 3.971665
## iter  20 value 1.789822
## iter  30 value 0.009645
## final  value 0.000065 
## converged
## # weights:  11
## initial  value 140.126095 
## iter  10 value 47.333342
## iter  20 value 42.892884
## final  value 42.889689 
## converged
## # weights:  27
## initial  value 121.803026 
## iter  10 value 38.691300
## iter  20 value 19.921144
## iter  30 value 19.433045
## iter  40 value 19.383350
## iter  50 value 19.382633
## final  value 19.382632 
## converged
## # weights:  43
## initial  value 156.386421 
## iter  10 value 23.314550
## iter  20 value 18.748706
## iter  30 value 18.494532
## iter  40 value 18.401643
## iter  50 value 18.383610
## iter  60 value 18.374318
## final  value 18.374255 
## converged
## # weights:  11
## initial  value 138.138161 
## iter  10 value 10.633699
## iter  20 value 3.856084
## iter  30 value 3.802397
## iter  40 value 3.690227
## iter  50 value 3.688922
## iter  60 value 3.687249
## iter  70 value 3.683205
## iter  80 value 3.683144
## iter  90 value 3.683033
## iter 100 value 3.682732
## final  value 3.682732 
## stopped after 100 iterations
## # weights:  27
## initial  value 140.548399 
## iter  10 value 6.301393
## iter  20 value 2.795492
## iter  30 value 1.571451
## iter  40 value 0.907102
## iter  50 value 0.883124
## iter  60 value 0.789401
## iter  70 value 0.729012
## iter  80 value 0.659629
## iter  90 value 0.639191
## iter 100 value 0.617460
## final  value 0.617460 
## stopped after 100 iterations
## # weights:  43
## initial  value 136.614846 
## iter  10 value 4.215242
## iter  20 value 1.283187
## iter  30 value 0.489904
## iter  40 value 0.468648
## iter  50 value 0.449015
## iter  60 value 0.430487
## iter  70 value 0.390820
## iter  80 value 0.382614
## iter  90 value 0.368962
## iter 100 value 0.365353
## final  value 0.365353 
## stopped after 100 iterations
## # weights:  11
## initial  value 128.001875 
## iter  10 value 50.849579
## iter  20 value 49.908965
## final  value 49.906776 
## converged
## # weights:  27
## initial  value 142.435335 
## iter  10 value 21.292905
## iter  20 value 2.931194
## iter  30 value 0.109211
## iter  40 value 0.000269
## final  value 0.000065 
## converged
## # weights:  43
## initial  value 124.336357 
## iter  10 value 6.806115
## iter  20 value 1.066310
## iter  30 value 0.027634
## iter  40 value 0.000120
## iter  40 value 0.000064
## iter  40 value 0.000062
## final  value 0.000062 
## converged
## # weights:  11
## initial  value 127.015963 
## iter  10 value 73.750364
## iter  20 value 44.486713
## iter  30 value 44.115273
## final  value 44.112572 
## converged
## # weights:  27
## initial  value 146.801472 
## iter  10 value 24.261716
## iter  20 value 20.454066
## iter  30 value 19.976360
## iter  40 value 19.900472
## iter  50 value 19.898371
## final  value 19.898368 
## converged
## # weights:  43
## initial  value 140.864658 
## iter  10 value 24.103516
## iter  20 value 19.350754
## iter  30 value 18.914754
## iter  40 value 18.399088
## iter  50 value 18.363716
## iter  60 value 18.360857
## final  value 18.360836 
## converged
## # weights:  11
## initial  value 130.436173 
## iter  10 value 58.545756
## iter  20 value 54.564282
## iter  30 value 54.279512
## iter  40 value 53.998818
## iter  50 value 53.780071
## iter  60 value 51.779803
## iter  70 value 50.473597
## iter  80 value 50.150863
## iter  90 value 32.066399
## iter 100 value 7.064814
## final  value 7.064814 
## stopped after 100 iterations
## # weights:  27
## initial  value 129.312933 
## iter  10 value 4.102054
## iter  20 value 0.721010
## iter  30 value 0.539730
## iter  40 value 0.512533
## iter  50 value 0.452606
## iter  60 value 0.448412
## iter  70 value 0.431627
## iter  80 value 0.410856
## iter  90 value 0.394455
## iter 100 value 0.388833
## final  value 0.388833 
## stopped after 100 iterations
## # weights:  43
## initial  value 148.098515 
## iter  10 value 5.298514
## iter  20 value 0.934008
## iter  30 value 0.522757
## iter  40 value 0.506526
## iter  50 value 0.460051
## iter  60 value 0.424670
## iter  70 value 0.384503
## iter  80 value 0.369647
## iter  90 value 0.362809
## iter 100 value 0.356772
## final  value 0.356772 
## stopped after 100 iterations
## # weights:  11
## initial  value 117.850828 
## iter  10 value 49.456182
## iter  20 value 22.412910
## iter  30 value 6.937668
## iter  40 value 3.905887
## iter  50 value 3.219377
## iter  60 value 3.055029
## iter  70 value 2.579637
## iter  80 value 2.430111
## iter  90 value 2.312313
## iter 100 value 2.298797
## final  value 2.298797 
## stopped after 100 iterations
## # weights:  27
## initial  value 130.602937 
## iter  10 value 5.364860
## iter  20 value 0.018414
## iter  30 value 0.000249
## final  value 0.000061 
## converged
## # weights:  43
## initial  value 146.701299 
## iter  10 value 3.763793
## iter  20 value 0.042843
## final  value 0.000094 
## converged
## # weights:  11
## initial  value 120.628984 
## iter  10 value 68.063025
## iter  20 value 56.521999
## iter  30 value 43.815180
## final  value 43.556889 
## converged
## # weights:  27
## initial  value 124.230739 
## iter  10 value 33.517706
## iter  20 value 22.508053
## iter  30 value 20.889834
## iter  40 value 20.847738
## final  value 20.847700 
## converged
## # weights:  43
## initial  value 133.602839 
## iter  10 value 23.347254
## iter  20 value 18.544964
## iter  30 value 18.040712
## iter  40 value 18.025128
## iter  50 value 18.024592
## iter  60 value 18.024449
## iter  60 value 18.024448
## iter  60 value 18.024448
## final  value 18.024448 
## converged
## # weights:  11
## initial  value 129.177368 
## iter  10 value 52.335766
## iter  20 value 50.198664
## iter  30 value 50.141478
## iter  40 value 50.102850
## iter  50 value 49.957183
## iter  60 value 49.952575
## iter  70 value 49.943436
## iter  80 value 49.894847
## iter  90 value 47.945873
## iter 100 value 30.729753
## final  value 30.729753 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.869884 
## iter  10 value 4.567751
## iter  20 value 0.927957
## iter  30 value 0.897610
## iter  40 value 0.741713
## iter  50 value 0.619617
## iter  60 value 0.608233
## iter  70 value 0.574205
## iter  80 value 0.564730
## iter  90 value 0.505764
## iter 100 value 0.499667
## final  value 0.499667 
## stopped after 100 iterations
## # weights:  43
## initial  value 136.128035 
## iter  10 value 8.773562
## iter  20 value 1.580722
## iter  30 value 0.648186
## iter  40 value 0.598990
## iter  50 value 0.528695
## iter  60 value 0.471326
## iter  70 value 0.428117
## iter  80 value 0.410081
## iter  90 value 0.398805
## iter 100 value 0.383512
## final  value 0.383512 
## stopped after 100 iterations
## # weights:  11
## initial  value 128.896484 
## iter  10 value 50.708111
## iter  20 value 49.907586
## final  value 49.906660 
## converged
## # weights:  27
## initial  value 119.521581 
## iter  10 value 7.183241
## iter  20 value 0.809670
## iter  30 value 0.004390
## iter  40 value 0.000227
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 131.041089 
## iter  10 value 5.393352
## iter  20 value 0.555977
## iter  30 value 0.000400
## final  value 0.000061 
## converged
## # weights:  11
## initial  value 115.254409 
## iter  10 value 46.146438
## iter  20 value 43.980539
## final  value 43.980528 
## converged
## # weights:  27
## initial  value 151.251154 
## iter  10 value 33.640164
## iter  20 value 21.669957
## iter  30 value 21.347848
## iter  40 value 21.321639
## final  value 21.321020 
## converged
## # weights:  43
## initial  value 118.245016 
## iter  10 value 24.475559
## iter  20 value 18.804736
## iter  30 value 18.712983
## iter  40 value 18.677082
## iter  50 value 18.532570
## iter  60 value 18.510662
## iter  70 value 18.509807
## final  value 18.509805 
## converged
## # weights:  11
## initial  value 119.683126 
## iter  10 value 50.076985
## iter  20 value 50.003397
## iter  30 value 49.976779
## iter  40 value 49.971048
## iter  50 value 49.955252
## iter  60 value 49.951357
## iter  70 value 49.942062
## iter  80 value 49.398522
## iter  90 value 46.003338
## iter 100 value 27.767723
## final  value 27.767723 
## stopped after 100 iterations
## # weights:  27
## initial  value 159.588882 
## iter  10 value 20.390703
## iter  20 value 1.967470
## iter  30 value 0.729399
## iter  40 value 0.662707
## iter  50 value 0.596144
## iter  60 value 0.573053
## iter  70 value 0.560158
## iter  80 value 0.521422
## iter  90 value 0.510398
## iter 100 value 0.493555
## final  value 0.493555 
## stopped after 100 iterations
## # weights:  43
## initial  value 150.242971 
## iter  10 value 8.154992
## iter  20 value 2.016351
## iter  30 value 0.620429
## iter  40 value 0.546167
## iter  50 value 0.472008
## iter  60 value 0.453045
## iter  70 value 0.437417
## iter  80 value 0.406533
## iter  90 value 0.393732
## iter 100 value 0.368437
## final  value 0.368437 
## stopped after 100 iterations
## # weights:  11
## initial  value 133.040279 
## iter  10 value 61.370169
## iter  20 value 46.727701
## iter  30 value 46.598174
## final  value 46.598156 
## converged
resultado_entrenamiento5 <- predict(modelo5, entrenamiento)
resultado_prueba5 <- predict(modelo5, prueba)

#Matriz de Confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultado del entrenamiento
mcre5 <- confusionMatrix(resultado_entrenamiento5, entrenamiento$Species)
mcre5
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         36         0
##   virginica       0          4        40
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9000           1.0000
## Specificity                 1.0000            1.0000           0.9500
## Pos Pred Value              1.0000            1.0000           0.9091
## Neg Pred Value              1.0000            0.9524           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3000           0.3333
## Detection Prevalence        0.3333            0.3000           0.3667
## Balanced Accuracy           1.0000            0.9500           0.9750

Modelo 6. Bosques aleatorios

modelo6 <- train(Species ~ ., data = entrenamiento,
                 method = "rf", #Cambiar
                 preProcess = c("scale", "center"),
                 trContol = trainControl(method="cv", number=10),
                 tuneGrid = 
                 #Cambiar
                 )

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

#Matriz de confusión
#Es una tabla de evaluación que desglosa el rendimiento del modelo de clasificación.

#Matriz de confusión del resultadon del entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6, entrenamiento$Species)
mcre6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         40         0
##   virginica       0          0        40
## 
## Overall Statistics
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9697, 1)
##     No Information Rate : 0.3333     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           1.0000
## Specificity                 1.0000            1.0000           1.0000
## Pos Pred Value              1.0000            1.0000           1.0000
## Neg Pred Value              1.0000            1.0000           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3333
## Detection Prevalence        0.3333            0.3333           0.3333
## Balanced Accuracy           1.0000            1.0000           1.0000
#Matriz de confusión del resultado de la prueba
mcrp6 <- confusionMatrix(resultado_prueba6, prueba$Species)
mcrp6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         2
##   virginica       0          0         8
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9333          
##                  95% CI : (0.7793, 0.9918)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : 8.747e-12       
##                                           
##                   Kappa : 0.9             
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           0.8000
## Specificity                 1.0000            0.9000           1.0000
## Pos Pred Value              1.0000            0.8333           1.0000
## Neg Pred Value              1.0000            1.0000           0.9091
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.2667
## Detection Prevalence        0.3333            0.4000           0.2667
## Balanced Accuracy           1.0000            0.9500           0.9000

Tabla de resultados

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

rownames(resultados) <- c("Precisión de entrenamiento", "Precisión de prueba")
resultados
##                            svmLinear svmRadial   svmPoly     rpart        rf
## Precisión de entrenamiento 0.9916667 0.9916667 0.9833333 0.9666667 1.0000000
## Precisión de prueba        0.9666667 0.9333333 0.9666667 0.9333333 0.9333333

Conclusiones

Acorde a la tabla de resultados, observamos que ningún método presenta sobreajuste. Podemos seleccionar el de redes neuronales por su desempeño.

LS0tCnRpdGxlOiAiQ0FSRVQiCmF1dGhvcjogIkNhcmxhIExpZXZhbm8iCmRhdGU6ICIyMDI1LTA4LTIyIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogc2ltcGxleAotLS0KCjxjZW50ZXI+CiFbXShodHRwczovL2VuY3J5cHRlZC10Ym4wLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NUdjItVkpDb1J3RW8yajNzTHI0NlROZC1ZNWdkMi1namF4R3cmcykKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IFRlb3LDrWEgPC9zcGFuPgpFbCBwYXF1ZXRlICoqQ0FSRVQgKENsYXNzaWZpY2F0aW9uIEFuZCBSZWdyZXNzaW9uIFRyYWluaW5nKSoqIGVzIHVuIHBhcXVldGUgaW50ZWdyYWwgY29uIHVuYSBhbXBsaWEgdmFyaWVkYWQgZGUgYWxnb3JpdG1vcyBwYXJhIGVsIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjR3LDoWZpY2FzCmxpYnJhcnkoZ2dwbG90MikKI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKSAjY3JlYXIgZ3LDoWZpY29hcwpsaWJyYXJ5KGxhdHRpY2UpCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpICNBbGdvcml0bW9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvCmxpYnJhcnkoY2FyZXQpCiNpbnN0YWxsLnBhY2thZ2VzKCJkYXRhc2V0cyIpICNVc2FyIGJhc2VzIGRlIGRhdG9zLCBlbiBlc3RlIGNhc2kgSXJpcwpsaWJyYXJ5KGRhdGFzZXRzKQojaW5zdGFsbC5wYWNrYWdlcygiRGF0YUV4cGxvcmVyIikgI0Fuw6FsaXNpcyBleHBsb3JhdG9yaW8KbGlicmFyeShEYXRhRXhwbG9yZXIpCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBDcmVhciBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4KYGBge3J9CmRmIDwtIGRhdGEuZnJhbWUoaXJpcykKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IElFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4KYGBge3J9CnN1bW1hcnkoZGYpCnN0cihkZikKI2NyZWF0ZV9yZXBvcnQoZGYpCnBsb3RfbWlzc2luZyhkZikKcGxvdF9oaXN0b2dyYW0oZGYpCnBsb3RfY29ycmVsYXRpb24oZGYpCmBgYAoqKk5vdGE6IExhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gUGFydGlyIGxhcyBiYXNlcyBkZSBkYXRvcyA8L3NwYW4+CmBgYHtyfQojTk9STUFMTUVOVEUgODAtMjAKc2V0LnNlZWQoMTIzKQpyZW5nbG9uZXNfZW50cmVuYW1pZW50byA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRmJFNwZWNpZXMsIHA9MC44LCBsaXN0PUZBTFNFKQplbnRyZW5hbWllbnRvIDwtIGRmW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdCnBydWViYSA8LSBkZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0KYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IERpc3RpbnRvcyB0aXBvcyBkZSBtw6l0b2RvcyBwYXJhIG1vZGVsYXIgPC9zcGFuPgpMb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIHBhcmEgbW9kZWxhciBhcHJlbmRpemFqZSBhdXRvbcOhdGljbyBzb246CgoqICoqU1ZNKio6ICpTdXBwb3J0IFZlY3RvciBNYWNoaW5lKiBvIE3DoXF1aW5hIGRlIHZlY3RvcmVzIGRlIHNvcG9ydGUuIEhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyhzdm1Qb2x5KSwgZXRjLgoqICoqw4FyYm9sIGRlIGRlY2lzacOzbioqOiBycGFydAoqICoqUmVkZXMgbmV1cm9uYWxlcyoqOiBubmV0CiogKipSYW5kb20gRm9yZXN0KiogbyBCb3NxdWVzIEFsZWF0b3Jpb3M6IHJmCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IE1vZGVsbyAxLiBTVk0gTGluZWFsIDwvc3Bhbj4KYGBge3J9Cm1vZGVsbzEgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtTGluZWFyIiwgI0NhbWJpYXIKICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udG9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoQz0xKSAjQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA8LSBwcmVkaWN0KG1vZGVsbzEsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmExIDwtIHByZWRpY3QobW9kZWxvMSwgcHJ1ZWJhKQoKI01hdHJpeiBkZSBjb25mdXNpw7NuCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uCgojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkb24gZGVsIGVudHJlbmFtaWVudG8KbWNyZTEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSwgZW50cmVuYW1pZW50byRTcGVjaWVzKQptY3JlMQojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkbyBkZSBsYSBwcnVlYmEKbWNycDEgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmExLCBwcnVlYmEkU3BlY2llcykKbWNycDEKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IE1vZGVsbyAyLiBTVk0gUmFkaWFsIDwvc3Bhbj4KYGBge3J9Cm1vZGVsbzIgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGE9ZW50cmVuYW1pZW50bywKICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3ZtUmFkaWFsIiwgI0NhbWJpYXIKICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udG9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoc2lnbWE9MSwgQz0xKSAjQ2FtYmlhcgogICAgICAgICAgICAgICAgICkKCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiA8LSBwcmVkaWN0KG1vZGVsbzIsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmEyIDwtIHByZWRpY3QobW9kZWxvMiwgcHJ1ZWJhKQoKI01hdHJpeiBkZSBjb25mdXNpw7NuCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uCgojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkb24gZGVsIGVudHJlbmFtaWVudG8KbWNyZTIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMiwgZW50cmVuYW1pZW50byRTcGVjaWVzKQptY3JlMgojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkbyBkZSBsYSBwcnVlYmEKbWNycDIgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEyLCBwcnVlYmEkU3BlY2llcykKbWNycDIKYGBgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IE1vZGVsbyAzLiBTVk0gUG9saW7Ds21pY28gPC9zcGFuPgpgYGB7cn0KbW9kZWxvMyA8LSB0cmFpbihTcGVjaWVzIH4gLiwgZGF0YT1lbnRyZW5hbWllbnRvLAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzdm1Qb2x5IiwgI0NhbWJpYXIKICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzPWMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udG9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoZGVncmVlPTEsIHNjYWxlPTEsIEM9MSkgI0NhbWJpYXIKICAgICAgICAgICAgICAgICApCgpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMgPC0gcHJlZGljdChtb2RlbG8zLCBlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhMyA8LSBwcmVkaWN0KG1vZGVsbzMsIHBydWViYSkKCiNNYXRyaXogZGUgY29uZnVzacOzbgojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLgoKI01hdHJpeiBkZSBjb25mdXNpw7NuIGRlbCByZXN1bHRhZG9uIGRlbCBlbnRyZW5hbWllbnRvCm1jcmUzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzMsIGVudHJlbmFtaWVudG8kU3BlY2llcykKbWNyZTMKI01hdHJpeiBkZSBjb25mdXNpw7NuIGRlbCByZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhCm1jcnAzIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMywgcHJ1ZWJhJFNwZWNpZXMpCm1jcnAzCmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBNb2RlbG8gNC4gw4FyYm9sIGRlIGRlY2lzacOzbiA8L3NwYW4+CmBgYHtyfQptb2RlbG80IDwtIHRyYWluKFNwZWNpZXMgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gInJwYXJ0IiwgI0NhbWJpYXIKICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwKICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kID0gImN2IiwgbnVtYmVyPTEwKSwKICAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0xMCAjQ2FtYmlhciBoaXBlcnBhcmFtZXRyb3MsIHNlIHB1ZWRlbiBqdXN0YXIKKQoKcmVzdWx0YWRvX2VudHJlbmFtaWVudG80IDwtIHByZWRpY3QobW9kZWxvNCwgZW50cmVuYW1pZW50bykKcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LCBwcnVlYmEpCgojTWF0cml6IGRlIENvbmZ1c2nDs24KI0VzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbi4KCiNNYXRyaXogZGUgY29uZnVzacOzbiBkZWwgcmVzdWx0YWRvIGRlbCBlbnRyZW5hbWllbnRvCm1jcmU0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQsIGVudHJlbmFtaWVudG8kU3BlY2llcykKbWNyZTQKCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJFNwZWNpZXMpCm1jcnA0CmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBNb2RlbG8gNS4gUmVkZXMgTmV1cm9uYWxlcyA8L3NwYW4+CmBgYHtyfQptb2RlbG81IDwtIHRyYWluKFNwZWNpZXMgfiAuLCBkYXRhPWVudHJlbmFtaWVudG8sCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5uZXQiLCAjQ2FtYmlhcgogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXI9MTApCgopCmBgYAoKYGBge3J9CnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSA8LSBwcmVkaWN0KG1vZGVsbzUsIGVudHJlbmFtaWVudG8pCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSwgcHJ1ZWJhKQoKI01hdHJpeiBkZSBDb25mdXNpw7NuCiNFcyB1bmEgdGFibGEgZGUgZXZhbHVhY2nDs24gcXVlIGRlc2dsb3NhIGVsIHJlbmRpbWllbnRvIGRlbCBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24uCgojTWF0cml6IGRlIGNvbmZ1c2nDs24gZGVsIHJlc3VsdGFkbyBkZWwgZW50cmVuYW1pZW50bwptY3JlNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG81LCBlbnRyZW5hbWllbnRvJFNwZWNpZXMpCm1jcmU1CmBgYAoKIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsiPiBNb2RlbG8gNi4gQm9zcXVlcyBhbGVhdG9yaW9zIDwvc3Bhbj4KYGBge3J9Cm1vZGVsbzYgPC0gdHJhaW4oU3BlY2llcyB+IC4sIGRhdGEgPSBlbnRyZW5hbWllbnRvLAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJyZiIsICNDYW1iaWFyCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwgImNlbnRlciIpLAogICAgICAgICAgICAgICAgIHRyQ29udG9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLAogICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gCiAgICAgICAgICAgICAgICAgI0NhbWJpYXIKICAgICAgICAgICAgICAgICApCgpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LCBlbnRyZW5hbWllbnRvKQpyZXN1bHRhZG9fcHJ1ZWJhNiA8LSBwcmVkaWN0KG1vZGVsbzYsIHBydWViYSkKCiNNYXRyaXogZGUgY29uZnVzacOzbgojRXMgdW5hIHRhYmxhIGRlIGV2YWx1YWNpw7NuIHF1ZSBkZXNnbG9zYSBlbCByZW5kaW1pZW50byBkZWwgbW9kZWxvIGRlIGNsYXNpZmljYWNpw7NuLgoKI01hdHJpeiBkZSBjb25mdXNpw7NuIGRlbCByZXN1bHRhZG9uIGRlbCBlbnRyZW5hbWllbnRvCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsIGVudHJlbmFtaWVudG8kU3BlY2llcykKbWNyZTYKI01hdHJpeiBkZSBjb25mdXNpw7NuIGRlbCByZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhCm1jcnA2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNiwgcHJ1ZWJhJFNwZWNpZXMpCm1jcnA2CmBgYAoKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij4gVGFibGEgZGUgcmVzdWx0YWRvcyA8L3NwYW4+CmBgYHtyfQpyZXN1bHRhZG9zIDwtZGF0YS5mcmFtZSgKICAic3ZtTGluZWFyIiA9IGMobWNyZTEkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDEkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInN2bVJhZGlhbCIgPSBjKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLAogICJzdm1Qb2x5IiA9IGMobWNyZTMkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDMkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInJwYXJ0IiA9IGMobWNyZTQkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDQkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgIyJubmV0IiA9IGMobWNyZTUkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDUkb3ZlcmFsbFsiQWNjdXJhY3kiXSksCiAgInJmIiA9IGMobWNyZTYkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDYkb3ZlcmFsbFsiQWNjdXJhY3kiXSkKKQoKcm93bmFtZXMocmVzdWx0YWRvcykgPC0gYygiUHJlY2lzacOzbiBkZSBlbnRyZW5hbWllbnRvIiwgIlByZWNpc2nDs24gZGUgcHJ1ZWJhIikKcmVzdWx0YWRvcwpgYGAKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+IENvbmNsdXNpb25lcyA8L3NwYW4+CkFjb3JkZSBhIGxhIHRhYmxhIGRlIHJlc3VsdGFkb3MsIG9ic2VydmFtb3MgcXVlIG5pbmfDum4gbcOpdG9kbyBwcmVzZW50YSBzb2JyZWFqdXN0ZS4gUG9kZW1vcyBzZWxlY2Npb25hciBlbCBkZSAqKnJlZGVzIG5ldXJvbmFsZXMqKiBwb3Igc3UgZGVzZW1wZcOxby4=