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")
library("caret")
#install.packages("ggplot2")
library("ggplot2")
#install.packages("lattice")
library("lattice")
#install.packages("datasets")
library("datasets")
#install.packages("DataExplorer")
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 Fator

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 hay varios subtipos: Lineal (svmLinear), Radial (svmRadial), Polinómico (svmPoly), etc. * Árbol de Decisión: rpart * Redes Neuronales: nnet * Random Forest: rf

Modelo 1. SVM Lineal

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

resultado_entrenamiento1 = predict(modelo1,entrenamiento)
resultado_prueba1 = predict(modelo1,prueba)

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
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),
                tuneGrid = data.frame(sigma=1, C=1) # Cambiar
                )

resultado_entrenamiento2 = predict(modelo2,entrenamiento)
resultado_prueba2 = predict(modelo2,prueba)

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
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 Polinomico

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

resultado_entrenamiento3 = predict(modelo3,entrenamiento)
resultado_prueba3 = predict(modelo3,prueba)

mcre3 = confusionMatrix(resultado_entrenamiento3,entrenamiento$Species)
mcre3
## 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
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
                )

resultado_entrenamiento4 = predict(modelo4,entrenamiento)
resultado_prueba4 = predict(modelo4,prueba)

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. Random Forest

modelo5 = train(Species~., data=entrenamiento,
                method="rf", # Cambiar
                preProcess = c("scale","center"),
                trControl = trainControl(method="cv", number=10),
                tuneLength = 10 # Cambiar
                )
## note: only 3 unique complexity parameters in default grid. Truncating the grid to 3 .
resultado_entrenamiento5 = predict(modelo5,entrenamiento)
resultado_prueba5 = predict(modelo5,prueba)

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
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))
## # weights:  11
## initial  value 122.429801 
## iter  10 value 54.793931
## iter  20 value 49.046671
## iter  30 value 48.210677
## iter  40 value 48.056402
## iter  50 value 47.875245
## iter  60 value 47.855889
## iter  70 value 47.743693
## iter  80 value 47.735609
## iter  90 value 47.726467
## iter 100 value 47.708274
## final  value 47.708274 
## stopped after 100 iterations
## # weights:  27
## initial  value 128.983894 
## iter  10 value 6.487216
## iter  20 value 2.235177
## iter  30 value 0.123823
## iter  40 value 0.000438
## final  value 0.000055 
## converged
## # weights:  43
## initial  value 136.685625 
## iter  10 value 3.856226
## iter  20 value 0.095012
## iter  30 value 0.004023
## iter  40 value 0.000694
## final  value 0.000079 
## converged
## # weights:  11
## initial  value 126.116754 
## iter  10 value 51.920751
## iter  20 value 43.216031
## final  value 43.206920 
## converged
## # weights:  27
## initial  value 124.298194 
## iter  10 value 27.011887
## iter  20 value 20.019592
## iter  30 value 19.284700
## iter  40 value 19.234447
## iter  50 value 19.231106
## final  value 19.231021 
## converged
## # weights:  43
## initial  value 137.243626 
## iter  10 value 25.040391
## iter  20 value 18.027998
## iter  30 value 17.680846
## iter  40 value 17.675231
## iter  50 value 17.674853
## final  value 17.674851 
## converged
## # weights:  11
## initial  value 122.226997 
## iter  10 value 71.231930
## iter  20 value 50.045592
## iter  30 value 50.009466
## iter  40 value 49.992771
## iter  50 value 49.981310
## iter  60 value 49.943788
## iter  70 value 49.420977
## iter  80 value 32.510923
## iter  90 value 6.619154
## iter 100 value 4.407515
## final  value 4.407515 
## stopped after 100 iterations
## # weights:  27
## initial  value 126.412149 
## iter  10 value 12.478255
## iter  20 value 1.805300
## iter  30 value 0.814140
## iter  40 value 0.745912
## iter  50 value 0.676174
## iter  60 value 0.606975
## iter  70 value 0.567406
## iter  80 value 0.548426
## iter  90 value 0.509524
## iter 100 value 0.437578
## final  value 0.437578 
## stopped after 100 iterations
## # weights:  43
## initial  value 139.483927 
## iter  10 value 7.426145
## iter  20 value 2.155378
## iter  30 value 0.631020
## iter  40 value 0.541066
## iter  50 value 0.419010
## iter  60 value 0.361144
## iter  70 value 0.343220
## iter  80 value 0.321160
## iter  90 value 0.309599
## iter 100 value 0.299500
## final  value 0.299500 
## stopped after 100 iterations
## # weights:  11
## initial  value 124.891783 
## iter  10 value 32.768602
## iter  20 value 3.767712
## iter  30 value 1.243864
## iter  40 value 1.135034
## iter  50 value 1.012080
## iter  60 value 1.005066
## iter  70 value 0.811933
## iter  80 value 0.794063
## iter  90 value 0.670837
## iter 100 value 0.638178
## final  value 0.638178 
## stopped after 100 iterations
## # weights:  27
## initial  value 132.350110 
## iter  10 value 4.682428
## iter  20 value 0.034381
## final  value 0.000064 
## converged
## # weights:  43
## initial  value 111.760806 
## iter  10 value 3.560108
## iter  20 value 0.291236
## iter  30 value 0.000501
## final  value 0.000088 
## converged
## # weights:  11
## initial  value 123.302392 
## iter  10 value 54.673160
## iter  20 value 43.154301
## final  value 43.141197 
## converged
## # weights:  27
## initial  value 139.828249 
## iter  10 value 27.852410
## iter  20 value 19.901485
## iter  30 value 19.100799
## iter  40 value 18.666603
## iter  50 value 18.643962
## final  value 18.643820 
## converged
## # weights:  43
## initial  value 129.044183 
## iter  10 value 23.044889
## iter  20 value 17.458651
## iter  30 value 17.195744
## iter  40 value 17.178774
## iter  50 value 17.178501
## final  value 17.178465 
## converged
## # weights:  11
## initial  value 136.546638 
## iter  10 value 49.848696
## iter  20 value 48.016291
## iter  30 value 47.974292
## iter  40 value 47.356084
## iter  50 value 46.338811
## iter  60 value 34.417885
## iter  70 value 7.297199
## iter  80 value 4.301609
## iter  90 value 3.264096
## iter 100 value 3.063626
## final  value 3.063626 
## stopped after 100 iterations
## # weights:  27
## initial  value 123.522987 
## iter  10 value 2.635527
## iter  20 value 0.393197
## iter  30 value 0.334876
## iter  40 value 0.316525
## iter  50 value 0.308852
## iter  60 value 0.281123
## iter  70 value 0.270503
## iter  80 value 0.261902
## iter  90 value 0.259339
## iter 100 value 0.251660
## final  value 0.251660 
## stopped after 100 iterations
## # weights:  43
## initial  value 119.000995 
## iter  10 value 8.287549
## iter  20 value 0.832784
## iter  30 value 0.506206
## iter  40 value 0.431916
## iter  50 value 0.414091
## iter  60 value 0.378776
## iter  70 value 0.339372
## iter  80 value 0.298762
## iter  90 value 0.254963
## iter 100 value 0.244663
## final  value 0.244663 
## stopped after 100 iterations
## # weights:  11
## initial  value 127.410090 
## iter  10 value 40.593083
## iter  20 value 10.695478
## iter  30 value 3.078855
## iter  40 value 2.464762
## iter  50 value 2.321976
## iter  60 value 2.234156
## iter  70 value 2.172824
## iter  80 value 1.601610
## iter  90 value 1.566129
## iter 100 value 1.418037
## final  value 1.418037 
## stopped after 100 iterations
## # weights:  27
## initial  value 132.965117 
## iter  10 value 10.971315
## iter  20 value 0.248451
## iter  30 value 0.012941
## iter  40 value 0.000844
## iter  50 value 0.000202
## final  value 0.000068 
## converged
## # weights:  43
## initial  value 141.617184 
## iter  10 value 6.463006
## iter  20 value 0.210033
## iter  30 value 0.002807
## iter  40 value 0.000136
## final  value 0.000070 
## converged
## # weights:  11
## initial  value 118.064121 
## iter  10 value 44.548584
## iter  20 value 43.370142
## final  value 43.370139 
## converged
## # weights:  27
## initial  value 119.511193 
## iter  10 value 24.927269
## iter  20 value 21.385319
## iter  30 value 20.534634
## iter  40 value 19.336175
## iter  50 value 19.309636
## final  value 19.309618 
## converged
## # weights:  43
## initial  value 140.372747 
## iter  10 value 27.020080
## iter  20 value 19.000914
## iter  30 value 18.632112
## iter  40 value 18.599419
## iter  50 value 18.598445
## final  value 18.598273 
## converged
## # weights:  11
## initial  value 122.185509 
## iter  10 value 47.061258
## iter  20 value 21.877642
## iter  30 value 5.433563
## iter  40 value 3.842804
## iter  50 value 3.771553
## iter  60 value 3.761888
## iter  70 value 3.756290
## iter  80 value 3.750724
## iter  90 value 3.748375
## iter 100 value 3.748332
## final  value 3.748332 
## stopped after 100 iterations
## # weights:  27
## initial  value 124.785688 
## iter  10 value 8.924459
## iter  20 value 1.341735
## iter  30 value 0.676990
## iter  40 value 0.629315
## iter  50 value 0.545475
## iter  60 value 0.531835
## iter  70 value 0.511704
## iter  80 value 0.478538
## iter  90 value 0.468842
## iter 100 value 0.460245
## final  value 0.460245 
## stopped after 100 iterations
## # weights:  43
## initial  value 141.548593 
## iter  10 value 11.830278
## iter  20 value 2.441018
## iter  30 value 0.657039
## iter  40 value 0.560446
## iter  50 value 0.528996
## iter  60 value 0.498475
## iter  70 value 0.476174
## iter  80 value 0.409209
## iter  90 value 0.384185
## iter 100 value 0.367829
## final  value 0.367829 
## stopped after 100 iterations
## # weights:  11
## initial  value 129.546100 
## iter  10 value 26.854560
## iter  20 value 3.860921
## iter  30 value 2.101305
## iter  40 value 1.837631
## iter  50 value 1.616688
## iter  60 value 1.217359
## iter  70 value 1.123639
## iter  80 value 1.112773
## iter  90 value 0.972436
## iter 100 value 0.903512
## final  value 0.903512 
## stopped after 100 iterations
## # weights:  27
## initial  value 127.148875 
## iter  10 value 16.306830
## iter  20 value 1.278650
## iter  30 value 0.011387
## final  value 0.000059 
## converged
## # weights:  43
## initial  value 112.486221 
## iter  10 value 13.588651
## iter  20 value 1.722091
## iter  30 value 0.040172
## iter  40 value 0.000532
## final  value 0.000072 
## converged
## # weights:  11
## initial  value 118.184569 
## iter  10 value 54.505929
## iter  20 value 43.524275
## iter  30 value 43.515693
## final  value 43.515689 
## converged
## # weights:  27
## initial  value 127.273668 
## iter  10 value 26.357455
## iter  20 value 19.658524
## iter  30 value 19.463635
## final  value 19.462423 
## converged
## # weights:  43
## initial  value 117.754245 
## iter  10 value 22.888426
## iter  20 value 18.555475
## iter  30 value 17.984305
## iter  40 value 17.930479
## iter  50 value 17.929286
## final  value 17.929271 
## converged
## # weights:  11
## initial  value 122.906748 
## iter  10 value 50.479264
## iter  20 value 49.298094
## iter  30 value 48.296498
## iter  40 value 48.029895
## iter  50 value 47.974227
## iter  60 value 47.789855
## iter  70 value 46.565606
## iter  80 value 44.746913
## iter  90 value 24.355741
## iter 100 value 8.303852
## final  value 8.303852 
## stopped after 100 iterations
## # weights:  27
## initial  value 123.474933 
## iter  10 value 4.467343
## iter  20 value 0.451078
## iter  30 value 0.405058
## iter  40 value 0.399390
## iter  50 value 0.387838
## iter  60 value 0.344330
## iter  70 value 0.326983
## iter  80 value 0.319742
## iter  90 value 0.302299
## iter 100 value 0.300181
## final  value 0.300181 
## stopped after 100 iterations
## # weights:  43
## initial  value 135.790414 
## iter  10 value 5.896759
## iter  20 value 0.442463
## iter  30 value 0.417885
## iter  40 value 0.397514
## iter  50 value 0.376953
## iter  60 value 0.360993
## iter  70 value 0.348126
## iter  80 value 0.337283
## iter  90 value 0.326112
## iter 100 value 0.316385
## final  value 0.316385 
## stopped after 100 iterations
## # weights:  11
## initial  value 140.214297 
## iter  10 value 25.940680
## iter  20 value 5.985253
## iter  30 value 0.117994
## iter  40 value 0.053324
## iter  50 value 0.034775
## iter  60 value 0.031666
## iter  70 value 0.028355
## iter  80 value 0.026803
## iter  90 value 0.021796
## iter 100 value 0.021097
## final  value 0.021097 
## stopped after 100 iterations
## # weights:  27
## initial  value 111.243108 
## iter  10 value 7.707639
## iter  20 value 0.018123
## final  value 0.000057 
## converged
## # weights:  43
## initial  value 146.466981 
## iter  10 value 5.661274
## iter  20 value 0.068526
## iter  30 value 0.001873
## final  value 0.000072 
## converged
## # weights:  11
## initial  value 119.633013 
## iter  10 value 47.987740
## iter  20 value 42.982316
## iter  30 value 42.954005
## final  value 42.953922 
## converged
## # weights:  27
## initial  value 123.047572 
## iter  10 value 25.538062
## iter  20 value 19.955761
## iter  30 value 19.790394
## final  value 19.790045 
## converged
## # weights:  43
## initial  value 147.901934 
## iter  10 value 31.909512
## iter  20 value 18.357763
## iter  30 value 17.423852
## iter  40 value 17.098973
## iter  50 value 17.044721
## iter  60 value 17.001933
## iter  70 value 16.988283
## iter  80 value 16.986240
## final  value 16.986240 
## converged
## # weights:  11
## initial  value 124.376710 
## iter  10 value 46.491293
## iter  20 value 42.488923
## iter  30 value 10.533348
## iter  40 value 2.704622
## iter  50 value 2.120995
## iter  60 value 2.018236
## iter  70 value 1.927008
## iter  80 value 1.859757
## iter  90 value 1.858974
## iter 100 value 1.858148
## final  value 1.858148 
## stopped after 100 iterations
## # weights:  27
## initial  value 133.026903 
## iter  10 value 5.869370
## iter  20 value 0.295971
## iter  30 value 0.255851
## iter  40 value 0.241718
## iter  50 value 0.228396
## iter  60 value 0.220204
## iter  70 value 0.207437
## iter  80 value 0.197619
## iter  90 value 0.179417
## iter 100 value 0.173278
## final  value 0.173278 
## stopped after 100 iterations
## # weights:  43
## initial  value 132.848255 
## iter  10 value 10.595008
## iter  20 value 0.248972
## iter  30 value 0.202234
## iter  40 value 0.189600
## iter  50 value 0.173857
## iter  60 value 0.166954
## iter  70 value 0.161699
## iter  80 value 0.152180
## iter  90 value 0.141625
## iter 100 value 0.136838
## final  value 0.136838 
## stopped after 100 iterations
## # weights:  11
## initial  value 121.322779 
## iter  10 value 52.719706
## iter  20 value 33.489690
## iter  30 value 8.890838
## iter  40 value 5.144832
## iter  50 value 3.890460
## iter  60 value 1.681626
## iter  70 value 1.548141
## iter  80 value 1.497128
## iter  90 value 1.209945
## iter 100 value 1.168193
## final  value 1.168193 
## stopped after 100 iterations
## # weights:  27
## initial  value 124.304865 
## iter  10 value 8.985377
## iter  20 value 2.938913
## iter  30 value 0.238011
## iter  40 value 0.000148
## iter  40 value 0.000074
## iter  40 value 0.000067
## final  value 0.000067 
## converged
## # weights:  43
## initial  value 145.062613 
## iter  10 value 6.629695
## iter  20 value 2.137176
## iter  30 value 0.150724
## iter  40 value 0.004979
## iter  50 value 0.000727
## iter  60 value 0.000252
## final  value 0.000091 
## converged
## # weights:  11
## initial  value 112.607037 
## iter  10 value 46.828428
## iter  20 value 44.134973
## iter  30 value 44.133027
## final  value 44.133026 
## converged
## # weights:  27
## initial  value 123.783616 
## iter  10 value 40.338653
## iter  20 value 21.071672
## iter  30 value 20.154337
## iter  40 value 20.109906
## iter  50 value 20.108380
## final  value 20.108367 
## converged
## # weights:  43
## initial  value 121.225092 
## iter  10 value 31.514365
## iter  20 value 18.584209
## iter  30 value 18.247723
## iter  40 value 18.235445
## iter  50 value 18.235083
## final  value 18.235083 
## converged
## # weights:  11
## initial  value 125.167661 
## iter  10 value 50.419528
## iter  20 value 20.310605
## iter  30 value 7.207722
## iter  40 value 4.033087
## iter  50 value 3.870126
## iter  60 value 3.850969
## iter  70 value 3.849437
## iter  80 value 3.848170
## iter  90 value 3.846420
## iter 100 value 3.846404
## final  value 3.846404 
## stopped after 100 iterations
## # weights:  27
## initial  value 127.495222 
## iter  10 value 5.080773
## iter  20 value 1.502252
## iter  30 value 0.726711
## iter  40 value 0.682521
## iter  50 value 0.514473
## iter  60 value 0.475939
## iter  70 value 0.455208
## iter  80 value 0.438575
## iter  90 value 0.427741
## iter 100 value 0.419469
## final  value 0.419469 
## stopped after 100 iterations
## # weights:  43
## initial  value 126.025754 
## iter  10 value 19.384325
## iter  20 value 2.586477
## iter  30 value 0.667035
## iter  40 value 0.573365
## iter  50 value 0.503570
## iter  60 value 0.468939
## iter  70 value 0.444569
## iter  80 value 0.390341
## iter  90 value 0.371384
## iter 100 value 0.333589
## final  value 0.333589 
## stopped after 100 iterations
## # weights:  11
## initial  value 132.771564 
## iter  10 value 50.402804
## iter  20 value 48.623727
## iter  30 value 48.497536
## iter  40 value 48.493901
## iter  50 value 48.492231
## iter  60 value 48.491822
## final  value 48.491751 
## converged
## # weights:  27
## initial  value 115.896383 
## iter  10 value 4.458071
## iter  20 value 0.620761
## iter  30 value 0.001067
## iter  40 value 0.000288
## final  value 0.000057 
## converged
## # weights:  43
## initial  value 160.727035 
## iter  10 value 5.270259
## iter  20 value 0.099481
## iter  30 value 0.000811
## final  value 0.000086 
## converged
## # weights:  11
## initial  value 130.652361 
## iter  10 value 54.948742
## iter  20 value 44.700047
## iter  30 value 44.344448
## final  value 44.344261 
## converged
## # weights:  27
## initial  value 134.829988 
## iter  10 value 31.128481
## iter  20 value 22.035877
## iter  30 value 20.490241
## iter  40 value 20.352570
## iter  50 value 20.347782
## final  value 20.347781 
## converged
## # weights:  43
## initial  value 120.943216 
## iter  10 value 25.318673
## iter  20 value 19.120422
## iter  30 value 18.550339
## iter  40 value 18.487879
## iter  50 value 18.486144
## iter  60 value 18.485701
## final  value 18.485698 
## converged
## # weights:  11
## initial  value 129.273608 
## iter  10 value 50.031409
## iter  20 value 48.268451
## iter  30 value 48.077166
## iter  40 value 47.910697
## iter  50 value 45.104701
## iter  60 value 32.984503
## iter  70 value 17.777525
## iter  80 value 8.290523
## iter  90 value 5.021495
## iter 100 value 4.225815
## final  value 4.225815 
## stopped after 100 iterations
## # weights:  27
## initial  value 125.525009 
## iter  10 value 9.603776
## iter  20 value 2.528684
## iter  30 value 1.105970
## iter  40 value 0.909117
## iter  50 value 0.755942
## iter  60 value 0.635707
## iter  70 value 0.603678
## iter  80 value 0.562174
## iter  90 value 0.460338
## iter 100 value 0.446840
## final  value 0.446840 
## stopped after 100 iterations
## # weights:  43
## initial  value 114.378230 
## iter  10 value 5.265511
## iter  20 value 0.597545
## iter  30 value 0.422740
## iter  40 value 0.407927
## iter  50 value 0.381009
## iter  60 value 0.374813
## iter  70 value 0.347909
## iter  80 value 0.325457
## iter  90 value 0.307363
## iter 100 value 0.302519
## final  value 0.302519 
## stopped after 100 iterations
## # weights:  11
## initial  value 127.241626 
## iter  10 value 45.947253
## iter  20 value 17.166443
## iter  30 value 4.086584
## iter  40 value 3.783081
## iter  50 value 3.363297
## iter  60 value 2.812163
## iter  70 value 2.609705
## iter  80 value 2.588398
## iter  90 value 2.472121
## iter 100 value 2.325701
## final  value 2.325701 
## stopped after 100 iterations
## # weights:  27
## initial  value 120.858723 
## iter  10 value 15.501536
## iter  20 value 2.778662
## iter  30 value 0.101601
## iter  40 value 0.028438
## iter  50 value 0.004303
## iter  60 value 0.000410
## iter  70 value 0.000244
## final  value 0.000091 
## converged
## # weights:  43
## initial  value 131.655208 
## iter  10 value 18.595536
## iter  20 value 0.854071
## iter  30 value 0.010495
## final  value 0.000077 
## converged
## # weights:  11
## initial  value 118.986819 
## iter  10 value 52.196342
## iter  20 value 44.094477
## final  value 44.088036 
## converged
## # weights:  27
## initial  value 119.437816 
## iter  10 value 28.899255
## iter  20 value 20.423470
## iter  30 value 19.808605
## iter  40 value 19.738329
## final  value 19.737901 
## converged
## # weights:  43
## initial  value 110.757819 
## iter  10 value 24.753074
## iter  20 value 19.333717
## iter  30 value 18.498835
## iter  40 value 18.222314
## iter  50 value 18.203695
## iter  60 value 18.201707
## final  value 18.201699 
## converged
## # weights:  11
## initial  value 125.700424 
## iter  10 value 38.274169
## iter  20 value 17.657230
## iter  30 value 6.937457
## iter  40 value 4.605418
## iter  50 value 3.984428
## iter  60 value 3.880402
## iter  70 value 3.855540
## iter  80 value 3.853791
## iter  90 value 3.849246
## iter 100 value 3.844274
## final  value 3.844274 
## stopped after 100 iterations
## # weights:  27
## initial  value 131.009200 
## iter  10 value 19.885829
## iter  20 value 3.388221
## iter  30 value 1.009841
## iter  40 value 0.659084
## iter  50 value 0.605706
## iter  60 value 0.580143
## iter  70 value 0.549918
## iter  80 value 0.535581
## iter  90 value 0.508169
## iter 100 value 0.485308
## final  value 0.485308 
## stopped after 100 iterations
## # weights:  43
## initial  value 151.521149 
## iter  10 value 4.201071
## iter  20 value 0.836542
## iter  30 value 0.657450
## iter  40 value 0.581181
## iter  50 value 0.541263
## iter  60 value 0.506634
## iter  70 value 0.464736
## iter  80 value 0.419989
## iter  90 value 0.388431
## iter 100 value 0.367397
## final  value 0.367397 
## stopped after 100 iterations
## # weights:  11
## initial  value 135.196170 
## iter  10 value 55.257626
## iter  20 value 49.928486
## iter  30 value 49.903056
## iter  40 value 49.884020
## iter  50 value 49.186643
## iter  60 value 47.727926
## iter  70 value 33.550940
## iter  80 value 28.690387
## iter  90 value 15.958708
## iter 100 value 4.997484
## final  value 4.997484 
## stopped after 100 iterations
## # weights:  27
## initial  value 133.397811 
## iter  10 value 15.234866
## iter  20 value 2.244503
## iter  30 value 0.017374
## iter  40 value 0.001384
## iter  50 value 0.000469
## iter  60 value 0.000221
## final  value 0.000083 
## converged
## # weights:  43
## initial  value 131.465785 
## iter  10 value 4.309149
## iter  20 value 0.071554
## iter  30 value 0.001619
## final  value 0.000052 
## converged
## # weights:  11
## initial  value 126.042550 
## iter  10 value 59.677569
## iter  20 value 48.217619
## iter  30 value 43.467685
## final  value 43.467591 
## converged
## # weights:  27
## initial  value 120.133245 
## iter  10 value 38.096083
## iter  20 value 20.466370
## iter  30 value 20.004916
## iter  40 value 19.902769
## iter  50 value 19.863615
## iter  60 value 19.673750
## iter  70 value 19.642497
## final  value 19.642480 
## converged
## # weights:  43
## initial  value 118.231663 
## iter  10 value 21.643110
## iter  20 value 18.555348
## iter  30 value 18.028766
## iter  40 value 18.024806
## iter  50 value 18.024357
## iter  60 value 18.022438
## final  value 18.022013 
## converged
## # weights:  11
## initial  value 122.704842 
## iter  10 value 49.286005
## iter  20 value 19.716916
## iter  30 value 8.042403
## iter  40 value 4.768677
## iter  50 value 3.856014
## iter  60 value 3.436248
## iter  70 value 3.041105
## iter  80 value 3.001021
## iter  90 value 2.993346
## iter 100 value 2.981242
## final  value 2.981242 
## stopped after 100 iterations
## # weights:  27
## initial  value 122.736987 
## iter  10 value 8.320024
## iter  20 value 0.342060
## iter  30 value 0.312112
## iter  40 value 0.295860
## iter  50 value 0.262600
## iter  60 value 0.249667
## iter  70 value 0.228954
## iter  80 value 0.225737
## iter  90 value 0.217124
## iter 100 value 0.214320
## final  value 0.214320 
## stopped after 100 iterations
## # weights:  43
## initial  value 135.015141 
## iter  10 value 5.714008
## iter  20 value 0.365703
## iter  30 value 0.307187
## iter  40 value 0.271099
## iter  50 value 0.256079
## iter  60 value 0.248412
## iter  70 value 0.236889
## iter  80 value 0.217625
## iter  90 value 0.213566
## iter 100 value 0.205556
## final  value 0.205556 
## stopped after 100 iterations
## # weights:  11
## initial  value 137.651675 
## iter  10 value 50.858534
## iter  20 value 39.666248
## iter  30 value 13.917452
## iter  40 value 3.374208
## iter  50 value 2.224475
## iter  60 value 1.988741
## iter  70 value 1.851695
## iter  80 value 1.809737
## iter  90 value 1.714723
## iter 100 value 1.707648
## final  value 1.707648 
## stopped after 100 iterations
## # weights:  27
## initial  value 123.518051 
## iter  10 value 37.700211
## iter  20 value 33.847210
## iter  30 value 10.882173
## iter  40 value 2.058262
## iter  50 value 0.864990
## iter  60 value 0.004869
## final  value 0.000058 
## converged
## # weights:  43
## initial  value 152.873857 
## iter  10 value 19.266779
## iter  20 value 3.241344
## iter  30 value 1.397005
## iter  40 value 0.157231
## iter  50 value 0.000312
## final  value 0.000068 
## converged
## # weights:  11
## initial  value 124.963693 
## iter  10 value 53.081799
## iter  20 value 43.981556
## iter  30 value 43.950451
## final  value 43.950449 
## converged
## # weights:  27
## initial  value 117.700623 
## iter  10 value 24.858699
## iter  20 value 20.114544
## iter  30 value 19.900872
## final  value 19.900772 
## converged
## # weights:  43
## initial  value 130.837159 
## iter  10 value 29.984439
## iter  20 value 19.866631
## iter  30 value 19.295144
## iter  40 value 19.187171
## iter  50 value 19.027716
## iter  60 value 18.999312
## iter  70 value 18.998790
## iter  70 value 18.998790
## iter  70 value 18.998790
## final  value 18.998790 
## converged
## # weights:  11
## initial  value 131.721200 
## iter  10 value 51.124425
## iter  20 value 46.292085
## iter  30 value 37.493315
## iter  40 value 11.013141
## iter  50 value 4.822768
## iter  60 value 4.481167
## iter  70 value 4.007916
## iter  80 value 3.893094
## iter  90 value 3.857234
## iter 100 value 3.852782
## final  value 3.852782 
## stopped after 100 iterations
## # weights:  27
## initial  value 129.575794 
## iter  10 value 47.466768
## iter  20 value 3.932273
## iter  30 value 0.576842
## iter  40 value 0.532112
## iter  50 value 0.523746
## iter  60 value 0.493733
## iter  70 value 0.485322
## iter  80 value 0.482249
## iter  90 value 0.481810
## iter 100 value 0.480966
## final  value 0.480966 
## stopped after 100 iterations
## # weights:  43
## initial  value 114.614278 
## iter  10 value 5.158321
## iter  20 value 1.233873
## iter  30 value 0.543719
## iter  40 value 0.455410
## iter  50 value 0.399522
## iter  60 value 0.366482
## iter  70 value 0.354437
## iter  80 value 0.319719
## iter  90 value 0.302310
## iter 100 value 0.279361
## final  value 0.279361 
## stopped after 100 iterations
## # weights:  11
## initial  value 145.666784 
## iter  10 value 64.325408
## iter  20 value 50.880654
## iter  30 value 46.639462
## final  value 46.598156 
## converged
resultado_entrenamiento6 = predict(modelo6,entrenamiento)
resultado_prueba6 = predict(modelo6,prueba)

mcre6 = confusionMatrix(resultado_entrenamiento6,entrenamiento$Species)
mcre6
## 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
mcrp6 = confusionMatrix(resultado_prueba6,prueba$Species)
mcrp6
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0          9         0
##   virginica       0          1        10
## 
## 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            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

Tabla de Resultados

resultados = data.frame(
  "smvLinear" = c(mcre1$overall["Accuracy"], mcrp1$overall["Accuracy"]),
  "smvRadial" = c(mcre2$overall["Accuracy"], mcrp2$overall["Accuracy"]),
  "smvPoly" = 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
##                             smvLinear smvRadial   smvPoly     rpart        rf
## Exactitud del Entrenamiento 0.9916667 0.9916667 0.9916667 0.9666667 1.0000000
## Exactitud de la Prueba      0.9666667 0.9333333 0.9666667 0.9333333 0.9333333
##                                  nnet
## Exactitud del Entrenamiento 0.9666667
## 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.

LS0tDQp0aXRsZTogIkNBUkVUIC0gSXJpcyINCmF1dGhvcjogIk1hcsOtYSBGZXJuYW5kYSBTYW4gUm9tw6FuIE9yb3pjbyAtIEEwMTQyNDY5MSINCmRhdGU6ICIyNi8wOC8yMDI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KLS0tDQoNCiFbXShodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2EvYTMvQmxvc3NvbWluZ19pcmlzLmdpZj91dG1fc291cmNlPWNvbW1vbnMud2lraW1lZGlhLm9yZyZ1dG1fY2FtcGFpZ249aW5kZXgmdXRtX2NvbnRlbnQ9b3JpZ2luYWwpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlRlb3LDrWEgPC9zcGFuPg0KRWwgcGFxdWV0ZSAqKkNBUkVUKiogKENsYXNzaWZpY2F0aW9uIGFuZCBSZWdyZXNzaW9uIFRyYWluaW5nKSBlcyB1biBwYXF1ZXRlIGludGVncmFsIGNvbiB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGFsZ29yaXRtb3MgcGFyYSBlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoImNhcmV0IikNCmxpYnJhcnkoImNhcmV0IikNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KI2luc3RhbGwucGFja2FnZXMoImxhdHRpY2UiKQ0KbGlicmFyeSgibGF0dGljZSIpDQojaW5zdGFsbC5wYWNrYWdlcygiZGF0YXNldHMiKQ0KbGlicmFyeSgiZGF0YXNldHMiKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpDQpsaWJyYXJ5KCJEYXRhRXhwbG9yZXIiKQ0KI2luc3RhbGwucGFja2FnZXMoImtlcm5sYWIiKQ0KbGlicmFyeSgia2VybmxhYiIpDQojaW5zdGFsbC5wYWNrYWdlcygicmFuZG9tRm9yZXN0IikNCmxpYnJhcnkoInJhbmRvbUZvcmVzdCIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+Q3JlYXIgbGEgQmFzZSBkZSBEYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmID0gZGF0YS5mcmFtZShpcmlzKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkVudGVuZGVyIGxhIEJhc2UgZGUgRGF0b3MgPC9zcGFuPg0KYGBge3J9DQpzdW1tYXJ5KGRmKQ0Kc3RyKGRmKQ0KI2NyZWF0ZV9yZXBvcnQoZGYpDQpwbG90X21pc3NpbmcoZGYpDQpwbG90X2hpc3RvZ3JhbShkZikNCnBsb3RfY29ycmVsYXRpb24oZGYpDQpgYGANCioqTm90YSoqOiBFbiBtb2RlbG9zIGRlIGNsYXNpZmljYWNpw7NuLCBsYSB2YXJpYWJsZSBxdWUgcXVlcmVtb3MgcHJlZGVjaXIgZGViZSB0ZW5lciBmb3JtYXRvIGRlIEZhdG9yDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlBhcnRpciBsYSBCYXNlIGRlIERhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KIyBOb3JtYWxtZW50ZSA4MC0yMCBvIDcwLTMwDQpzZXQuc2VlZCgxMjMpDQpyZW5nbG9uZXNfZW50cmVuYW1pZW50byA9IGNyZWF0ZURhdGFQYXJ0aXRpb24oZGYkU3BlY2llcywgcD0wLjgsIGxpc3Q9RkFMU0UpDQplbnRyZW5hbWllbnRvID0gZGZbcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8sIF0NCnBydWViYSA9IGRmWy1yZW5nbG9uZXNfZW50cmVuYW1pZW50bywgXQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkRpc3RpbnRvcyB0aXBvcyBkZSBNw6l0b2RvcyBwYXJhIE1vZGVsYXIgPC9zcGFuPg0KTG9zIG3DqXRvZG9zIG3DoXMgdXRpbGl6YWRvcyBwYXJhIG1vZGVsYXIgYXByZW5kaXphamUgYXV0b23DoXRpY28gc29uOg0KKiAqKlNWTSoqOiBTdXBwb3J0IFZlY3RvciBNYWNoaW5lIGhheSB2YXJpb3Mgc3VidGlwb3M6IExpbmVhbCAoc3ZtTGluZWFyKSwgUmFkaWFsIChzdm1SYWRpYWwpLCBQb2xpbsOzbWljbyAoc3ZtUG9seSksIGV0Yy4NCiogKirDgXJib2wgZGUgRGVjaXNpw7NuKio6IHJwYXJ0DQoqICoqUmVkZXMgTmV1cm9uYWxlcyoqOiBubmV0DQoqICoqUmFuZG9tIEZvcmVzdCoqOiByZg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gMS4gU1ZNIExpbmVhbCA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzEgPSB0cmFpbihTcGVjaWVzfi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2Q9InN2bUxpbmVhciIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lR3JpZCA9IGRhdGEuZnJhbWUoQz0xKSAjIENhbWJpYXINCiAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvMSA9IHByZWRpY3QobW9kZWxvMSxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTEgPSBwcmVkaWN0KG1vZGVsbzEscHJ1ZWJhKQ0KDQptY3JlMSA9IGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzEsZW50cmVuYW1pZW50byRTcGVjaWVzKQ0KbWNyZTENCg0KbWNycDEgPSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTEscHJ1ZWJhJFNwZWNpZXMpDQptY3JwMQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPk1vZGVsbyAyLiBTVk0gUmFkaWFsIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvMiA9IHRyYWluKFNwZWNpZXN+LiwgZGF0YT1lbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgIG1ldGhvZD0ic3ZtUmFkaWFsIiwgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVHcmlkID0gZGF0YS5mcmFtZShzaWdtYT0xLCBDPTEpICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8yID0gcHJlZGljdChtb2RlbG8yLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMiA9IHByZWRpY3QobW9kZWxvMixwcnVlYmEpDQoNCm1jcmUyID0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMixlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlMg0KDQptY3JwMiA9IGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMixwcnVlYmEkU3BlY2llcykNCm1jcnAyDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPk1vZGVsbyAzLiBTVk0gUG9saW5vbWljbyA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzMgPSB0cmFpbihTcGVjaWVzfi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2Q9InN2bVBvbHkiLCAjIENhbWJpYXINCiAgICAgICAgICAgICAgICBwcmVQcm9jZXNzID0gYygic2NhbGUiLCJjZW50ZXIiKSwNCiAgICAgICAgICAgICAgICB0ckNvbnRyb2wgPSB0cmFpbkNvbnRyb2wobWV0aG9kPSJjdiIsIG51bWJlcj0xMCksDQogICAgICAgICAgICAgICAgdHVuZUdyaWQgPSBkYXRhLmZyYW1lKGRlZ3JlZT0xLCBzY2FsZT0xLCBDPTEpICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgICkNCg0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8zID0gcHJlZGljdChtb2RlbG8zLGVudHJlbmFtaWVudG8pDQpyZXN1bHRhZG9fcHJ1ZWJhMyA9IHByZWRpY3QobW9kZWxvMyxwcnVlYmEpDQoNCm1jcmUzID0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19lbnRyZW5hbWllbnRvMyxlbnRyZW5hbWllbnRvJFNwZWNpZXMpDQptY3JlMw0KDQptY3JwMyA9IGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fcHJ1ZWJhMyxwcnVlYmEkU3BlY2llcykNCm1jcnAzDQpgYGANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+TW9kZWxvIDQuIMOBcmJvbCBkZSBEZWNpc2nDs24gPC9zcGFuPg0KYGBge3J9DQptb2RlbG80ID0gdHJhaW4oU3BlY2llc34uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kPSJycGFydCIsICMgQ2FtYmlhcg0KICAgICAgICAgICAgICAgIHByZVByb2Nlc3MgPSBjKCJzY2FsZSIsImNlbnRlciIpLA0KICAgICAgICAgICAgICAgIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbChtZXRob2Q9ImN2IiwgbnVtYmVyPTEwKSwNCiAgICAgICAgICAgICAgICB0dW5lTGVuZ3RoID0gMTAgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzQgPSBwcmVkaWN0KG1vZGVsbzQsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE0ID0gcHJlZGljdChtb2RlbG80LHBydWViYSkNCg0KbWNyZTQgPSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG80LGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmU0DQoNCm1jcnA0ID0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE0LHBydWViYSRTcGVjaWVzKQ0KbWNycDQNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Nb2RlbG8gNS4gUmFuZG9tIEZvcmVzdCA8L3NwYW4+DQpgYGB7cn0NCm1vZGVsbzUgPSB0cmFpbihTcGVjaWVzfi4sIGRhdGE9ZW50cmVuYW1pZW50bywNCiAgICAgICAgICAgICAgICBtZXRob2Q9InJmIiwgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApLA0KICAgICAgICAgICAgICAgIHR1bmVMZW5ndGggPSAxMCAjIENhbWJpYXINCiAgICAgICAgICAgICAgICApDQoNCnJlc3VsdGFkb19lbnRyZW5hbWllbnRvNSA9IHByZWRpY3QobW9kZWxvNSxlbnRyZW5hbWllbnRvKQ0KcmVzdWx0YWRvX3BydWViYTUgPSBwcmVkaWN0KG1vZGVsbzUscHJ1ZWJhKQ0KDQptY3JlNSA9IGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50bzUsZW50cmVuYW1pZW50byRTcGVjaWVzKQ0KbWNyZTUNCg0KbWNycDUgPSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX3BydWViYTUscHJ1ZWJhJFNwZWNpZXMpDQptY3JwNQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPk1vZGVsbyA2LiBSZWRlcyBOZXVyb25hbGVzIDwvc3Bhbj4NCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptb2RlbG82ID0gdHJhaW4oU3BlY2llc34uLCBkYXRhPWVudHJlbmFtaWVudG8sDQogICAgICAgICAgICAgICAgbWV0aG9kPSJubmV0IiwgIyBDYW1iaWFyDQogICAgICAgICAgICAgICAgcHJlUHJvY2VzcyA9IGMoInNjYWxlIiwiY2VudGVyIiksDQogICAgICAgICAgICAgICAgdHJDb250cm9sID0gdHJhaW5Db250cm9sKG1ldGhvZD0iY3YiLCBudW1iZXI9MTApKQ0KDQpyZXN1bHRhZG9fZW50cmVuYW1pZW50bzYgPSBwcmVkaWN0KG1vZGVsbzYsZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmE2ID0gcHJlZGljdChtb2RlbG82LHBydWViYSkNCg0KbWNyZTYgPSBjb25mdXNpb25NYXRyaXgocmVzdWx0YWRvX2VudHJlbmFtaWVudG82LGVudHJlbmFtaWVudG8kU3BlY2llcykNCm1jcmU2DQoNCm1jcnA2ID0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmE2LHBydWViYSRTcGVjaWVzKQ0KbWNycDYNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5UYWJsYSBkZSBSZXN1bHRhZG9zIDwvc3Bhbj4NCmBgYHtyfQ0KcmVzdWx0YWRvcyA9IGRhdGEuZnJhbWUoDQogICJzbXZMaW5lYXIiID0gYyhtY3JlMSRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwMSRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInNtdlJhZGlhbCIgPSBjKG1jcmUyJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAyJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAic212UG9seSIgPSBjKG1jcmUzJG92ZXJhbGxbIkFjY3VyYWN5Il0sIG1jcnAzJG92ZXJhbGxbIkFjY3VyYWN5Il0pLA0KICAicnBhcnQiID0gYyhtY3JlNCRvdmVyYWxsWyJBY2N1cmFjeSJdLCBtY3JwNCRvdmVyYWxsWyJBY2N1cmFjeSJdKSwNCiAgInJmIiA9IGMobWNyZTUkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDUkb3ZlcmFsbFsiQWNjdXJhY3kiXSksDQogICJubmV0IiA9IGMobWNyZTYkb3ZlcmFsbFsiQWNjdXJhY3kiXSwgbWNycDYkb3ZlcmFsbFsiQWNjdXJhY3kiXSkNCikNCnJvd25hbWVzKHJlc3VsdGFkb3MpID0gYygiRXhhY3RpdHVkIGRlbCBFbnRyZW5hbWllbnRvIiwgIkV4YWN0aXR1ZCBkZSBsYSBQcnVlYmEiKQ0KcmVzdWx0YWRvcw0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkNvbmNsdXNpw7NuIDwvc3Bhbj4NCkVuIGNvbmNsdXNpw7NuLCBlbCBtb2RlbG8gZGUgKipSZWRlcyBOZXVyb25hbGVzKiogZXMgZWwgcmVjb21lbmRhZG8gcGFyYSBsYSBjbGFzaWZpY2FjacOzbiBkZSBsb3MgbGlyaW9zLg==