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("caret") # Algoritmos de aprendizaje automático
library(caret)
# install.packages("ggplot2") # Gráficas
library(ggplot2)
# install.packages("lattice") # Crear gráficos
library(lattice)
# install.packages("datasets") # Usar bases de datos precargadas
library(datasets)
# install.packages("DataExplorer") # Análisis Descriptivo
library(DataExplorer)
# install.packages("kernlab")
library(kernlab)
# install.packages("randomForest")
library(randomForest)

Crear la base de datos

df <- data.frame(iris)

Entender 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: En modelos de clasificación, la variable que queremos predecir debe tener formato de FACTOR

Partir la base de datos

# Normalmente 80-20 O 70-30
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"),
                 trControl = 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 Resultado 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"),
                 trControl = 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 del Resultado 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"),
                 trControl = 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 del Resultado del Entrenamiento
mcre3 <- confusionMatrix(resultado_entrenamiento3,entrenamiento$Species)
mcre3
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         40         4
##   virginica       0          0        36
## 
## 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            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
# 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         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 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
                 )

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

# 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
# Matriz de Confusión del Resultado de la Prueba
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. Bosques Aleatorios

modelo5 <- train(Species~., 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_entrenamiento5 <- predict(modelo5,entrenamiento)
resultado_prueba5 <- predict(modelo5,prueba)

# 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         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
mcrp5 <- confusionMatrix(resultado_prueba5, prueba$Species)
mcrp5
## 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 6. Redes Neuronales

modelo6 <- train(Species~., data=entrenamiento,
                 method="nnet", # Cambiar
                 preProcess = c("scale","center"),
                 trControl = trainControl(method="cv", number=10)                            # Cambiar
                 )
## # weights:  11
## initial  value 126.154662 
## iter  10 value 50.048602
## iter  20 value 47.429060
## iter  30 value 45.787177
## iter  40 value 45.434304
## iter  50 value 45.374838
## iter  60 value 45.089135
## iter  70 value 11.196504
## iter  80 value 3.619535
## iter  90 value 2.932576
## iter 100 value 2.714616
## final  value 2.714616 
## stopped after 100 iterations
## # weights:  27
## initial  value 161.788034 
## iter  10 value 14.561975
## iter  20 value 0.605038
## iter  30 value 0.001845
## final  value 0.000074 
## converged
## # weights:  43
## initial  value 140.296214 
## iter  10 value 6.271680
## iter  20 value 0.163333
## iter  30 value 0.000897
## final  value 0.000082 
## converged
## # weights:  11
## initial  value 132.480864 
## iter  10 value 57.583482
## iter  20 value 44.052178
## final  value 44.046903 
## converged
## # weights:  27
## initial  value 139.420119 
## iter  10 value 28.818974
## iter  20 value 19.992893
## iter  30 value 19.711155
## iter  40 value 19.709264
## iter  50 value 19.709184
## iter  50 value 19.709184
## iter  50 value 19.709184
## final  value 19.709184 
## converged
## # weights:  43
## initial  value 154.274936 
## iter  10 value 26.264066
## iter  20 value 20.644698
## iter  30 value 19.420108
## iter  40 value 18.491002
## iter  50 value 18.440854
## iter  60 value 18.436006
## iter  70 value 18.435571
## final  value 18.435529 
## converged
## # weights:  11
## initial  value 129.828524 
## iter  10 value 29.200122
## iter  20 value 5.281451
## iter  30 value 3.610622
## iter  40 value 3.114191
## iter  50 value 3.066582
## iter  60 value 3.021939
## iter  70 value 2.977396
## iter  80 value 2.976503
## iter  90 value 2.974709
## final  value 2.973602 
## converged
## # weights:  27
## initial  value 126.664388 
## iter  10 value 4.712569
## iter  20 value 0.305208
## iter  30 value 0.287394
## iter  40 value 0.267558
## iter  50 value 0.258061
## iter  60 value 0.248416
## iter  70 value 0.244327
## iter  80 value 0.237650
## iter  90 value 0.228249
## iter 100 value 0.218144
## final  value 0.218144 
## stopped after 100 iterations
## # weights:  43
## initial  value 142.225765 
## iter  10 value 4.313550
## iter  20 value 0.371929
## iter  30 value 0.333248
## iter  40 value 0.307199
## iter  50 value 0.290590
## iter  60 value 0.221249
## iter  70 value 0.205156
## iter  80 value 0.198463
## iter  90 value 0.190623
## iter 100 value 0.185782
## final  value 0.185782 
## stopped after 100 iterations
## # weights:  11
## initial  value 123.905912 
## iter  10 value 57.195277
## iter  20 value 49.180745
## iter  30 value 43.003305
## iter  40 value 13.638435
## iter  50 value 4.105965
## iter  60 value 3.536221
## iter  70 value 3.123126
## iter  80 value 2.516877
## iter  90 value 2.086155
## iter 100 value 1.772734
## final  value 1.772734 
## stopped after 100 iterations
## # weights:  27
## initial  value 150.323194 
## iter  10 value 7.271418
## iter  20 value 0.304396
## iter  30 value 0.000945
## final  value 0.000046 
## converged
## # weights:  43
## initial  value 120.108936 
## iter  10 value 5.953416
## iter  20 value 0.226479
## iter  30 value 0.002288
## iter  40 value 0.000387
## final  value 0.000078 
## converged
## # weights:  11
## initial  value 118.275156 
## iter  10 value 44.392549
## iter  20 value 43.154917
## final  value 43.154900 
## converged
## # weights:  27
## initial  value 140.206285 
## iter  10 value 49.467434
## iter  20 value 23.024323
## iter  30 value 21.599403
## iter  40 value 21.543537
## iter  50 value 21.539326
## iter  60 value 21.539031
## iter  70 value 21.535645
## final  value 21.535598 
## converged
## # weights:  43
## initial  value 136.472646 
## iter  10 value 30.034392
## iter  20 value 19.323470
## iter  30 value 17.929789
## iter  40 value 17.843860
## iter  50 value 17.699336
## iter  60 value 17.512057
## iter  70 value 17.511182
## final  value 17.511179 
## converged
## # weights:  11
## initial  value 132.325224 
## iter  10 value 56.136015
## iter  20 value 55.341494
## iter  30 value 55.314962
## iter  40 value 55.303966
## iter  50 value 55.251370
## iter  60 value 50.019435
## iter  70 value 50.011180
## iter  80 value 49.967392
## iter  90 value 49.963287
## iter 100 value 47.062585
## final  value 47.062585 
## stopped after 100 iterations
## # weights:  27
## initial  value 139.094262 
## iter  10 value 3.996656
## iter  20 value 0.648863
## iter  30 value 0.610539
## iter  40 value 0.490452
## iter  50 value 0.459433
## iter  60 value 0.439475
## iter  70 value 0.416765
## iter  80 value 0.387627
## iter  90 value 0.364682
## iter 100 value 0.361405
## final  value 0.361405 
## stopped after 100 iterations
## # weights:  43
## initial  value 145.929717 
## iter  10 value 5.464400
## iter  20 value 1.549774
## iter  30 value 0.421560
## iter  40 value 0.387580
## iter  50 value 0.365186
## iter  60 value 0.344216
## iter  70 value 0.337189
## iter  80 value 0.322317
## iter  90 value 0.310611
## iter 100 value 0.302901
## final  value 0.302901 
## stopped after 100 iterations
## # weights:  11
## initial  value 134.738535 
## iter  10 value 90.034069
## iter  20 value 66.547422
## iter  30 value 66.218383
## iter  40 value 66.148020
## iter  50 value 66.139088
## iter  60 value 66.129895
## iter  70 value 63.538765
## iter  80 value 61.651951
## iter  90 value 60.704177
## iter 100 value 54.278551
## final  value 54.278551 
## stopped after 100 iterations
## # weights:  27
## initial  value 158.948958 
## iter  10 value 4.936680
## iter  20 value 1.643973
## iter  30 value 0.006658
## iter  40 value 0.000426
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 110.987561 
## iter  10 value 4.730618
## iter  20 value 0.162545
## iter  30 value 0.000110
## iter  30 value 0.000054
## iter  30 value 0.000053
## final  value 0.000053 
## converged
## # weights:  11
## initial  value 124.448372 
## iter  10 value 54.166199
## iter  20 value 43.785923
## final  value 43.784882 
## converged
## # weights:  27
## initial  value 139.487724 
## iter  10 value 31.954047
## iter  20 value 22.569116
## iter  30 value 20.821212
## iter  40 value 20.141530
## iter  50 value 19.738076
## iter  60 value 19.729416
## iter  70 value 19.727639
## final  value 19.727639 
## converged
## # weights:  43
## initial  value 123.940776 
## iter  10 value 21.489424
## iter  20 value 18.419176
## iter  30 value 18.196367
## iter  40 value 18.183251
## iter  50 value 18.183122
## final  value 18.183117 
## converged
## # weights:  11
## initial  value 130.121220 
## iter  10 value 49.885634
## iter  20 value 47.914431
## iter  30 value 45.779510
## iter  40 value 44.168796
## iter  50 value 32.081508
## iter  60 value 6.082009
## iter  70 value 4.640165
## iter  80 value 4.500135
## iter  90 value 4.067687
## iter 100 value 3.887572
## final  value 3.887572 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.574097 
## iter  10 value 23.553950
## iter  20 value 2.447080
## iter  30 value 0.781255
## iter  40 value 0.705511
## iter  50 value 0.600211
## iter  60 value 0.555613
## iter  70 value 0.531150
## iter  80 value 0.516206
## iter  90 value 0.497191
## iter 100 value 0.477903
## final  value 0.477903 
## stopped after 100 iterations
## # weights:  43
## initial  value 128.611920 
## iter  10 value 6.194470
## iter  20 value 0.964174
## iter  30 value 0.515971
## iter  40 value 0.441516
## iter  50 value 0.425631
## iter  60 value 0.406008
## iter  70 value 0.382849
## iter  80 value 0.365949
## iter  90 value 0.350943
## iter 100 value 0.303240
## final  value 0.303240 
## stopped after 100 iterations
## # weights:  11
## initial  value 118.941032 
## iter  10 value 44.631372
## iter  20 value 23.886178
## iter  30 value 7.274923
## iter  40 value 4.171524
## iter  50 value 3.897185
## iter  60 value 3.074095
## iter  70 value 2.756239
## iter  80 value 2.609340
## iter  90 value 2.588601
## iter 100 value 2.503120
## final  value 2.503120 
## stopped after 100 iterations
## # weights:  27
## initial  value 113.120286 
## iter  10 value 7.194922
## iter  20 value 1.119093
## iter  30 value 0.000120
## iter  30 value 0.000059
## iter  30 value 0.000059
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 128.292656 
## iter  10 value 8.864264
## iter  20 value 1.986516
## iter  30 value 0.047470
## iter  40 value 0.000933
## final  value 0.000038 
## converged
## # weights:  11
## initial  value 125.434017 
## iter  10 value 64.438822
## iter  20 value 48.090492
## iter  30 value 44.148195
## final  value 44.116522 
## converged
## # weights:  27
## initial  value 127.780501 
## iter  10 value 33.460603
## iter  20 value 20.369424
## iter  30 value 20.258591
## final  value 20.258492 
## converged
## # weights:  43
## initial  value 126.415100 
## iter  10 value 27.025298
## iter  20 value 19.184565
## iter  30 value 18.826007
## iter  40 value 18.757904
## iter  50 value 18.743439
## iter  60 value 18.692529
## iter  70 value 18.454816
## iter  80 value 18.395720
## final  value 18.395647 
## converged
## # weights:  11
## initial  value 118.270173 
## iter  10 value 51.497955
## iter  20 value 49.977897
## iter  30 value 49.968698
## iter  40 value 49.964308
## final  value 49.955625 
## converged
## # weights:  27
## initial  value 130.757272 
## iter  10 value 7.876558
## iter  20 value 1.359423
## iter  30 value 0.654823
## iter  40 value 0.597562
## iter  50 value 0.570525
## iter  60 value 0.549937
## iter  70 value 0.542867
## iter  80 value 0.526913
## iter  90 value 0.498340
## iter 100 value 0.486623
## final  value 0.486623 
## stopped after 100 iterations
## # weights:  43
## initial  value 146.618582 
## iter  10 value 8.655055
## iter  20 value 1.533527
## iter  30 value 0.772295
## iter  40 value 0.727174
## iter  50 value 0.649014
## iter  60 value 0.584837
## iter  70 value 0.513545
## iter  80 value 0.487415
## iter  90 value 0.465265
## iter 100 value 0.384079
## final  value 0.384079 
## stopped after 100 iterations
## # weights:  11
## initial  value 126.000833 
## iter  10 value 50.295427
## iter  20 value 49.472885
## iter  30 value 49.220103
## iter  40 value 49.206497
## final  value 49.206442 
## converged
## # weights:  27
## initial  value 125.697913 
## iter  10 value 6.086448
## iter  20 value 2.421862
## iter  30 value 0.008416
## final  value 0.000090 
## converged
## # weights:  43
## initial  value 126.394561 
## iter  10 value 4.648390
## iter  20 value 0.313838
## iter  30 value 0.003192
## final  value 0.000073 
## converged
## # weights:  11
## initial  value 131.420740 
## iter  10 value 44.129471
## iter  20 value 43.481447
## final  value 43.481307 
## converged
## # weights:  27
## initial  value 126.547169 
## iter  10 value 28.167429
## iter  20 value 20.573538
## iter  30 value 19.435929
## iter  40 value 19.365110
## final  value 19.364846 
## converged
## # weights:  43
## initial  value 137.690931 
## iter  10 value 39.280413
## iter  20 value 21.352841
## iter  30 value 20.310524
## iter  40 value 20.163327
## iter  50 value 20.151201
## iter  60 value 20.150286
## final  value 20.150283 
## converged
## # weights:  11
## initial  value 121.829056 
## iter  10 value 43.368262
## iter  20 value 5.991703
## iter  30 value 4.395965
## iter  40 value 3.935466
## iter  50 value 3.898499
## iter  60 value 3.844202
## iter  70 value 3.750228
## iter  80 value 3.749990
## iter  90 value 3.749470
## iter 100 value 3.748870
## final  value 3.748870 
## stopped after 100 iterations
## # weights:  27
## initial  value 146.631491 
## iter  10 value 8.481129
## iter  20 value 0.922968
## iter  30 value 0.814604
## iter  40 value 0.716122
## iter  50 value 0.600861
## iter  60 value 0.556521
## iter  70 value 0.518042
## iter  80 value 0.500138
## iter  90 value 0.458980
## iter 100 value 0.410634
## final  value 0.410634 
## stopped after 100 iterations
## # weights:  43
## initial  value 117.948329 
## iter  10 value 4.544703
## iter  20 value 0.687427
## iter  30 value 0.525553
## iter  40 value 0.497072
## iter  50 value 0.431370
## iter  60 value 0.405263
## iter  70 value 0.379502
## iter  80 value 0.366528
## iter  90 value 0.351545
## iter 100 value 0.331066
## final  value 0.331066 
## stopped after 100 iterations
## # weights:  11
## initial  value 124.489046 
## iter  10 value 49.953166
## iter  20 value 49.911305
## iter  30 value 49.907488
## iter  40 value 49.907148
## iter  50 value 49.906511
## final  value 49.906501 
## converged
## # weights:  27
## initial  value 136.247850 
## iter  10 value 16.703621
## iter  20 value 2.147246
## iter  30 value 0.442876
## iter  40 value 0.001483
## final  value 0.000071 
## converged
## # weights:  43
## initial  value 162.112090 
## iter  10 value 6.552981
## iter  20 value 1.071715
## iter  30 value 0.001222
## final  value 0.000099 
## converged
## # weights:  11
## initial  value 122.684893 
## iter  10 value 58.768163
## iter  20 value 43.905630
## iter  30 value 43.565087
## final  value 43.565017 
## converged
## # weights:  27
## initial  value 123.931365 
## iter  10 value 29.720682
## iter  20 value 20.148054
## iter  30 value 19.909664
## iter  40 value 19.901063
## final  value 19.901047 
## converged
## # weights:  43
## initial  value 114.322251 
## iter  10 value 32.043615
## iter  20 value 19.081034
## iter  30 value 18.498438
## iter  40 value 18.459951
## iter  50 value 18.458481
## final  value 18.458472 
## converged
## # weights:  11
## initial  value 117.757741 
## iter  10 value 36.176118
## iter  20 value 5.862014
## iter  30 value 4.018818
## iter  40 value 3.863578
## iter  50 value 3.821585
## iter  60 value 3.819143
## iter  70 value 3.815525
## final  value 3.808618 
## converged
## # weights:  27
## initial  value 127.614738 
## iter  10 value 9.383481
## iter  20 value 1.527943
## iter  30 value 0.778231
## iter  40 value 0.614370
## iter  50 value 0.595383
## iter  60 value 0.569180
## iter  70 value 0.541238
## iter  80 value 0.519341
## iter  90 value 0.445589
## iter 100 value 0.433290
## final  value 0.433290 
## stopped after 100 iterations
## # weights:  43
## initial  value 125.083575 
## iter  10 value 5.691190
## iter  20 value 0.675459
## iter  30 value 0.607766
## iter  40 value 0.567793
## iter  50 value 0.507763
## iter  60 value 0.449674
## iter  70 value 0.406804
## iter  80 value 0.389696
## iter  90 value 0.370407
## iter 100 value 0.340462
## final  value 0.340462 
## stopped after 100 iterations
## # weights:  11
## initial  value 121.343721 
## iter  10 value 45.881467
## iter  20 value 31.216217
## iter  30 value 7.459858
## iter  40 value 3.973244
## iter  50 value 3.275873
## iter  60 value 2.367635
## iter  70 value 2.205916
## iter  80 value 2.106360
## iter  90 value 2.060791
## iter 100 value 1.689080
## final  value 1.689080 
## stopped after 100 iterations
## # weights:  27
## initial  value 130.012821 
## iter  10 value 7.638797
## iter  20 value 1.798215
## iter  30 value 0.006314
## final  value 0.000088 
## converged
## # weights:  43
## initial  value 131.979010 
## iter  10 value 3.997876
## iter  20 value 0.235680
## iter  30 value 0.001116
## final  value 0.000089 
## converged
## # weights:  11
## initial  value 135.570262 
## iter  10 value 58.796287
## iter  20 value 53.475266
## iter  30 value 43.899730
## final  value 43.844028 
## converged
## # weights:  27
## initial  value 121.444584 
## iter  10 value 23.149842
## iter  20 value 21.044073
## iter  30 value 20.495497
## iter  40 value 20.493302
## iter  40 value 20.493302
## iter  40 value 20.493302
## final  value 20.493302 
## converged
## # weights:  43
## initial  value 127.515226 
## iter  10 value 30.114591
## iter  20 value 19.227054
## iter  30 value 18.189262
## iter  40 value 18.069084
## iter  50 value 17.725591
## iter  60 value 17.658514
## iter  70 value 17.657227
## final  value 17.657184 
## converged
## # weights:  11
## initial  value 123.121256 
## iter  10 value 41.795248
## iter  20 value 8.644830
## iter  30 value 3.620519
## iter  40 value 3.404036
## iter  50 value 3.285022
## iter  60 value 3.282462
## iter  70 value 3.261091
## iter  80 value 3.231905
## iter  90 value 3.231773
## iter 100 value 3.231580
## final  value 3.231580 
## stopped after 100 iterations
## # weights:  27
## initial  value 134.005596 
## iter  10 value 4.500463
## iter  20 value 1.008713
## iter  30 value 0.523768
## iter  40 value 0.444410
## iter  50 value 0.420125
## iter  60 value 0.393461
## iter  70 value 0.361197
## iter  80 value 0.347167
## iter  90 value 0.334439
## iter 100 value 0.321024
## final  value 0.321024 
## stopped after 100 iterations
## # weights:  43
## initial  value 138.119868 
## iter  10 value 3.156261
## iter  20 value 0.382902
## iter  30 value 0.311994
## iter  40 value 0.296576
## iter  50 value 0.275577
## iter  60 value 0.248813
## iter  70 value 0.240516
## iter  80 value 0.232149
## iter  90 value 0.227705
## iter 100 value 0.225915
## final  value 0.225915 
## stopped after 100 iterations
## # weights:  11
## initial  value 125.752991 
## iter  10 value 44.310729
## iter  20 value 11.907721
## iter  30 value 0.345314
## iter  40 value 0.091998
## iter  50 value 0.030742
## iter  60 value 0.030424
## iter  70 value 0.028660
## iter  80 value 0.024845
## iter  90 value 0.024619
## iter 100 value 0.016268
## final  value 0.016268 
## stopped after 100 iterations
## # weights:  27
## initial  value 140.230219 
## iter  10 value 11.859198
## iter  20 value 0.082063
## iter  30 value 0.000159
## iter  30 value 0.000083
## iter  30 value 0.000082
## final  value 0.000082 
## converged
## # weights:  43
## initial  value 125.374598 
## iter  10 value 1.801863
## iter  20 value 0.018008
## iter  30 value 0.000203
## final  value 0.000051 
## converged
## # weights:  11
## initial  value 144.350959 
## iter  10 value 64.056371
## iter  20 value 49.698824
## iter  30 value 42.353995
## final  value 42.353914 
## converged
## # weights:  27
## initial  value 154.963831 
## iter  10 value 31.847306
## iter  20 value 20.753011
## iter  30 value 18.405187
## iter  40 value 17.873200
## iter  50 value 17.736710
## iter  60 value 17.731316
## iter  70 value 17.730858
## iter  70 value 17.730858
## iter  70 value 17.730858
## final  value 17.730858 
## converged
## # weights:  43
## initial  value 145.093930 
## iter  10 value 22.404663
## iter  20 value 16.592279
## iter  30 value 16.330235
## iter  40 value 16.312788
## iter  50 value 16.312472
## final  value 16.312471 
## converged
## # weights:  11
## initial  value 128.204871 
## iter  10 value 50.018497
## iter  20 value 49.832257
## iter  30 value 45.817220
## iter  40 value 7.517597
## iter  50 value 1.623420
## iter  60 value 1.420743
## iter  70 value 1.258022
## iter  80 value 1.193906
## iter  90 value 1.193714
## iter 100 value 1.193452
## final  value 1.193452 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.393846 
## iter  10 value 3.399522
## iter  20 value 0.129826
## iter  30 value 0.123486
## iter  40 value 0.120116
## iter  50 value 0.117716
## iter  60 value 0.109358
## iter  70 value 0.107153
## iter  80 value 0.105551
## iter  90 value 0.104657
## iter 100 value 0.103381
## final  value 0.103381 
## stopped after 100 iterations
## # weights:  43
## initial  value 154.646725 
## iter  10 value 2.788428
## iter  20 value 0.136867
## iter  30 value 0.124938
## iter  40 value 0.121526
## iter  50 value 0.117165
## iter  60 value 0.112943
## iter  70 value 0.108027
## iter  80 value 0.104600
## iter  90 value 0.102855
## iter 100 value 0.100366
## final  value 0.100366 
## stopped after 100 iterations
## # weights:  11
## initial  value 144.478612 
## iter  10 value 49.121353
## iter  20 value 47.961532
## iter  30 value 13.954535
## iter  40 value 3.590413
## iter  50 value 2.092886
## iter  60 value 2.003780
## iter  70 value 1.923140
## iter  80 value 1.900792
## iter  90 value 1.599149
## iter 100 value 1.520319
## final  value 1.520319 
## stopped after 100 iterations
## # weights:  27
## initial  value 118.590071 
## iter  10 value 21.170965
## iter  20 value 1.540174
## iter  30 value 0.001946
## iter  40 value 0.000957
## iter  50 value 0.000384
## final  value 0.000082 
## converged
## # weights:  43
## initial  value 128.693322 
## iter  10 value 4.909435
## iter  20 value 1.062750
## iter  30 value 0.001171
## final  value 0.000092 
## converged
## # weights:  11
## initial  value 120.648259 
## iter  10 value 58.744694
## iter  20 value 44.395834
## iter  30 value 43.694198
## final  value 43.694197 
## converged
## # weights:  27
## initial  value 124.090568 
## iter  10 value 23.503317
## iter  20 value 20.156638
## iter  30 value 19.923280
## iter  40 value 19.864877
## final  value 19.864570 
## converged
## # weights:  43
## initial  value 133.369986 
## iter  10 value 26.143928
## iter  20 value 18.189114
## iter  30 value 17.977978
## iter  40 value 17.975164
## iter  50 value 17.974889
## final  value 17.974850 
## converged
## # weights:  11
## initial  value 120.568747 
## iter  10 value 94.975303
## iter  20 value 50.123570
## iter  30 value 50.072351
## iter  40 value 50.047579
## iter  50 value 49.977674
## iter  60 value 49.967694
## iter  70 value 48.178648
## iter  80 value 24.632719
## iter  90 value 7.678759
## iter 100 value 4.171563
## final  value 4.171563 
## stopped after 100 iterations
## # weights:  27
## initial  value 122.044199 
## iter  10 value 5.039401
## iter  20 value 0.675026
## iter  30 value 0.612475
## iter  40 value 0.539596
## iter  50 value 0.526191
## iter  60 value 0.516535
## iter  70 value 0.509899
## iter  80 value 0.499538
## iter  90 value 0.490370
## iter 100 value 0.482049
## final  value 0.482049 
## stopped after 100 iterations
## # weights:  43
## initial  value 123.513829 
## iter  10 value 5.248801
## iter  20 value 1.045101
## iter  30 value 0.624127
## iter  40 value 0.588182
## iter  50 value 0.546223
## iter  60 value 0.522713
## iter  70 value 0.492657
## iter  80 value 0.472084
## iter  90 value 0.425942
## iter 100 value 0.393600
## final  value 0.393600 
## stopped after 100 iterations
## # weights:  11
## initial  value 126.418018 
## iter  10 value 47.786232
## iter  20 value 16.691380
## iter  30 value 5.587407
## iter  40 value 2.987755
## iter  50 value 2.777220
## iter  60 value 2.685108
## iter  70 value 2.596780
## iter  80 value 2.439233
## iter  90 value 2.254746
## iter 100 value 2.154518
## final  value 2.154518 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.735484 
## iter  10 value 14.663635
## iter  20 value 1.154829
## iter  30 value 0.000402
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 141.320195 
## iter  10 value 11.553994
## iter  20 value 1.592326
## iter  30 value 0.003382
## final  value 0.000066 
## converged
## # weights:  11
## initial  value 127.334759 
## iter  10 value 72.551607
## iter  20 value 57.860739
## iter  30 value 44.997504
## iter  40 value 44.319715
## final  value 44.319714 
## converged
## # weights:  27
## initial  value 132.730846 
## iter  10 value 26.790558
## iter  20 value 20.644695
## iter  30 value 20.128648
## iter  40 value 20.017325
## final  value 20.009145 
## converged
## # weights:  43
## initial  value 147.495268 
## iter  10 value 21.888582
## iter  20 value 19.659905
## iter  30 value 19.130240
## iter  40 value 19.104657
## iter  50 value 19.104193
## final  value 19.104130 
## converged
## # weights:  11
## initial  value 126.550784 
## iter  10 value 41.558281
## iter  20 value 22.506261
## iter  30 value 7.752436
## iter  40 value 4.641145
## iter  50 value 4.393105
## iter  60 value 4.033007
## iter  70 value 3.930395
## iter  80 value 3.882664
## iter  90 value 3.875265
## iter 100 value 3.862103
## final  value 3.862103 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.483324 
## iter  10 value 7.585980
## iter  20 value 1.517665
## iter  30 value 0.529186
## iter  40 value 0.504747
## iter  50 value 0.448959
## iter  60 value 0.413158
## iter  70 value 0.397922
## iter  80 value 0.381178
## iter  90 value 0.364197
## iter 100 value 0.351680
## final  value 0.351680 
## stopped after 100 iterations
## # weights:  43
## initial  value 108.105913 
## iter  10 value 6.098246
## iter  20 value 0.699769
## iter  30 value 0.570747
## iter  40 value 0.496389
## iter  50 value 0.469627
## iter  60 value 0.455264
## iter  70 value 0.436295
## iter  80 value 0.416914
## iter  90 value 0.410212
## iter 100 value 0.392951
## final  value 0.392951 
## stopped after 100 iterations
## # weights:  27
## initial  value 131.896724 
## iter  10 value 39.307720
## iter  20 value 22.081546
## iter  30 value 21.207147
## iter  40 value 20.975896
## iter  50 value 20.463192
## iter  60 value 20.383415
## iter  70 value 20.366063
## final  value 20.366062 
## converged
resultado_entrenamiento6 <- predict(modelo6,entrenamiento)
resultado_prueba6 <- predict(modelo6,prueba)

# Matriz de Confusión del Resultado del Entrenamiento
mcre6 <- confusionMatrix(resultado_entrenamiento6,entrenamiento$Species)
mcre6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         38         0
##   virginica       0          2        40
## 
## 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.9500           1.0000
## Specificity                 1.0000            1.0000           0.9750
## Pos Pred Value              1.0000            1.0000           0.9524
## Neg Pred Value              1.0000            0.9756           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3167           0.3333
## Detection Prevalence        0.3333            0.3167           0.3500
## Balanced Accuracy           1.0000            0.9750           0.9875
# 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         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

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"]),
  "rf" = c(mcre5$overall["Accuracy"], mcrp5$overall["Accuracy"]),
  "nnet" = c(mcre6$overall["Accuracy"], mcrp6$overall["Accuracy"])
)

rownames(resultados) <- c("Exactitud del Entrenamiento", "Exactitud de la Prueba")
resultados
##                             svmLinear svmRadial   svmPoly     rpart        rf
## Exactitud del Entrenamiento 0.9916667 0.9916667 0.9666667 0.9666667 1.0000000
## Exactitud de la Prueba      0.9666667 0.9333333 0.9333333 0.9333333 0.9333333
##                                  nnet
## Exactitud del Entrenamiento 0.9833333
## Exactitud de la Prueba      0.9666667

Conclusión

En conclusión, el modelo de Redes Neuronales es el recomendado para la clasificación de los lirios.

LS0tDQp0aXRsZTogIkNBUkVUIC0gSXJpcyINCmF1dGhvcjogIlJhdWwgQ2FudHUgQTAxMDg3NjgzIg0KZGF0ZTogIjIwMjYtMDgtMjYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogc2FuZHN0b25lDQotLS0NCg0KPGNlbnRlcj4NCiFbXShodHRwczovL2VuY3J5cHRlZC10Ym4wLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NUaFkxYTB1Tm9ESmo4TzJ0bHMwY21LSV81UGR2OHRnTlFfQ0pKVVBGdUh2VmZpSTF1a1gybXVpcE0mcz0xMCkNCjwvY2VudGVyPg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IFRlb3LDrWEgPC9zcGFuPg0KRWwgcGFxdWV0ZSAqKkNBUkVUIChDbGFzc2lmaWNhdGlvbiBBbmQgUkVncmVzc2lvbiBUcmFpbmluZykqKiBlcyB1biBwYXF1ZXRlIGludGVncmFsIGNvbiB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4gIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAjIEFsZ29yaXRtb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28NCmxpYnJhcnkoY2FyZXQpDQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAjIEdyw6FmaWNhcw0KbGlicmFyeShnZ3Bsb3QyKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikgIyBDcmVhciBncsOhZmljb3MNCmxpYnJhcnkobGF0dGljZSkNCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKSAjIFVzYXIgYmFzZXMgZGUgZGF0b3MgcHJlY2FyZ2FkYXMNCmxpYnJhcnkoZGF0YXNldHMpDQojIGluc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpICMgQW7DoWxpc2lzIERlc2NyaXB0aXZvDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiMgaW5zdGFsbC5wYWNrYWdlcygia2VybmxhYiIpDQpsaWJyYXJ5KGtlcm5sYWIpDQojIGluc3RhbGwucGFja2FnZXMoInJhbmRvbUZvcmVzdCIpDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IENyZWFyIGxhIGJhc2UgZGUgZGF0b3MgPC9zcGFuPg0KYGBge3J9DQpkZiA8LSBkYXRhLmZyYW1lKGlyaXMpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBFbnRlbmRlciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0Kc3VtbWFyeShkZikNCnN0cihkZikNCiMgY3JlYXRlX3JlcG9ydChkZikNCnBsb3RfbWlzc2luZyhkZikNCnBsb3RfaGlzdG9ncmFtKGRmKQ0KcGxvdF9jb3JyZWxhdGlvbihkZikNCmBgYA0KDQoqKk5PVEE6IEVuIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24sIGxhIHZhcmlhYmxlIHF1ZSBxdWVyZW1vcyBwcmVkZWNpciBkZWJlIHRlbmVyIGZvcm1hdG8gZGUgRkFDVE9SKioNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBQYXJ0aXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCiMgTm9ybWFsbWVudGUgODAtMjAgTyA3MC0zMA0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZiRTcGVjaWVzLCBwPTAuOCwgbGlzdD1GQUxTRSkNCmVudHJlbmFtaWVudG8gPC0gZGZbcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA8LSBkZlstcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IERpc3RpbnRvcyB0aXBvcyBkZSBNw6l0b2RvcyBwYXJhIE1vZGVsYXIgPC9zcGFuPg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOiAgDQoNCiogKipTVk0qKjogKlN1cHBvcnQgVmVjdG9yIE1hY2hpbmUqIG8gTcOhcXVpbmEgZGUgVmVjdG9yZXMgZGUgU29wb3J0ZS4gSGF5IHZhcmlvcyBzdWJ0aXBvczogTGluZWFsIChzdm1MaW5lYXIpLCBSYWRpYWwgKHN2bVJhZGlhbCksIFBvbGluw7NtaWNvIChzdm1Qb2x5KSwgZXRjLiAgDQoqICoqw4FyYm9sIGRlIERlY2lzacOzbioqOiBycGFydCAgDQoqICoqUmVkZXMgTmV1cm9uYWxlcyoqOiBubmV0ICANCiogKipSYW5kb20gRm9yZXN0KiogbyBCb3NxdWVzIEFsZWF0b3Jpb3M6IHJmICANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBNb2RlbG8gMS4gU1ZNIExpbmVhbCA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzEgPC0gdHJhaW4oU3BlY2llc34uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtTGluZWFyIiwgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgIHR1bmVHcmlkZSA9IGRhdGEuZnJhbWUoQz0xKSAjIENhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEgPC0gcHJlZGljdChtb2RlbG8xLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMSA8LSBwcmVkaWN0KG1vZGVsbzEscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuDQojIEVzIHVuYSB0YWJsYSBkZSBldmFsdWFjacOzbiBxdWUgZGVzZ2xvc2EgZWwgcmVuZGltaWVudG8gZGVsIG1vZGVsbyBkZSBjbGFzaWZpY2FjacOzbiANCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlMSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8xLGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmUxDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnAxIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMSwgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwMQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gTW9kZWxvIDIuIFNWTSBSYWRpYWwgPC9zcGFuPg0KYGBge3J9DQptb2RlbG8yIDwtIHRyYWluKFNwZWNpZXN+LiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9InN2bVJhZGlhbCIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZGUgPSBkYXRhLmZyYW1lKHNpZ21hPTEsIEM9MSkgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yIDwtIHByZWRpY3QobW9kZWxvMixlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTIgPC0gcHJlZGljdChtb2RlbG8yLHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlMiA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG8yLGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmUyDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnAyIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMiwgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwMg0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gTW9kZWxvIDMuIFNWTSBQb2xpbsOzbWljbyA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzMgPC0gdHJhaW4oU3BlY2llc34uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUG9seSIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZGUgPSBkYXRhLmZyYW1lKGRlZ3JlZT0xLCBzY2FsZT0xLCBDPTEpICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyA8LSBwcmVkaWN0KG1vZGVsbzMsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEzIDwtIHByZWRpY3QobW9kZWxvMyxwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTMgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyxlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlMw0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwMyA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTMsIHBydWViYSRTcGVjaWVzKQ0KbWNycDMNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IE1vZGVsbyA0LiDDgXJib2wgZGUgRGVjaXNpw7NuIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvNCA8LSB0cmFpbihTcGVjaWVzfi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJycGFydCIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0gMTAgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG80IDwtIHByZWRpY3QobW9kZWxvNCxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTQgPC0gcHJlZGljdChtb2RlbG80LHBydWViYSkNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlNCA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmU0DQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZSBsYSBQcnVlYmENCm1jcnA0IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhNCwgcHJ1ZWJhJFNwZWNpZXMpDQptY3JwNA0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlIj4gTW9kZWxvIDUuIEJvc3F1ZXMgQWxlYXRvcmlvcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvNSA8LSB0cmFpbihTcGVjaWVzfi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICAgbWV0aG9kPSJyZiIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGV4cGFuZC5ncmlkKG10cnk9YygyLDQsNikpICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSA8LSBwcmVkaWN0KG1vZGVsbzUsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE1IDwtIHByZWRpY3QobW9kZWxvNSxwcnVlYmEpDQoNCiMgTWF0cml6IGRlIENvbmZ1c2nDs24gZGVsIFJlc3VsdGFkbyBkZWwgRW50cmVuYW1pZW50bw0KbWNyZTUgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSxlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlNQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGUgbGEgUHJ1ZWJhDQptY3JwNSA8LSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUsIHBydWViYSRTcGVjaWVzKQ0KbWNycDUNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IE1vZGVsbyA2LiBSZWRlcyBOZXVyb25hbGVzIDwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptb2RlbG82IDwtIHRyYWluKFNwZWNpZXN+LiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICBtZXRob2Q9Im5uZXQiLCAjIENhbWJpYXINCiAgICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbWJpYXINCiAgICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPC0gcHJlZGljdChtb2RlbG82LGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhNiA8LSBwcmVkaWN0KG1vZGVsbzYscHJ1ZWJhKQ0KDQojIE1hdHJpeiBkZSBDb25mdXNpw7NuIGRlbCBSZXN1bHRhZG8gZGVsIEVudHJlbmFtaWVudG8NCm1jcmU2IDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYsZW50cmVuYW1pZW50byRTcGVjaWVzKQ0KbWNyZTYNCg0KIyBNYXRyaXogZGUgQ29uZnVzacOzbiBkZWwgUmVzdWx0YWRvIGRlIGxhIFBydWViYQ0KbWNycDYgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE2LCBwcnVlYmEkU3BlY2llcykNCm1jcnA2DQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWUiPiBUYWJsYSBkZSBSZXN1bHRhZG9zIDwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA8LSBkYXRhLmZyYW1lKA0KICAic3ZtTGluZWFyIiA9IGMobWNyZTEkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDEkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJzdm1SYWRpYWwiID0gYyhtY3JlMiRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMiRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInN2bVBvbHkiID0gYyhtY3JlMyRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMyRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJwYXJ0IiA9IGMobWNyZTQkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDQkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJyZiIgPSBjKG1jcmU1JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA1JG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAibm5ldCIgPSBjKG1jcmU2JG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnA2JG92ZXJhbGxbIkFjY3VyYWN5Il0pDQopDQoNCnJvd25hbWVzKHJlc3VsdGFkb3MpIDwtIGMoIkV4YWN0aXR1ZCBkZWwgRW50cmVuYW1pZW50byIsICJFeGFjdGl0dWQgZGUgbGEgUHJ1ZWJhIikNCnJlc3VsdGFkb3MNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZSI+IENvbmNsdXNpw7NuIDwvc3Bhbj4NCkVuIGNvbmNsdXNpw7NuLCBlbCBtb2RlbG8gZGUgKipSZWRlcyBOZXVyb25hbGVzKiogZXMgZWwgcmVjb21lbmRhZG8gcGFyYSBsYSBjbGFzaWZpY2FjacOzbiBkZSBsb3MgbGlyaW9zLiANCg==