Objetivo

Realizar validación cruzada

Descripción

Con datos de pulsar_star obtenidos de la dirección https://raw.githubusercontent.com/alexandrehsd/Predicting-Pulsar-Stars/master/pulsar_stars.csv elaborar validación cruzada.

El documento fuente es de: (delgado2018?).

Los datos también se encuentran en : https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/datos/pulsar_stars.csv

Fundamnto teórico

La Validación Cruzada o k-fold Cross Validation consiste en tomar los datos originales y crear a partir de ellos dos conjuntos separados: un primer conjunto de entrenamiento (y prueba), y un segundo conjunto de validación.

Luego, el conjunto de entrenamiento se va a dividir en k subconjuntos y, al momento de realizar el entrenamiento, se va a tomar cada k subconjunto como conjunto de prueba del modelo, mientras que el resto de los datos se tomará como conjunto de entrenamiento.

Este proceso se repetirá k veces, y en cada iteración se seleccionará un conjunto de prueba diferente, mientras los datos restantes se emplearán, como se mencionó, como conjunto de entrenamiento. Una vez finalizadas las iteraciones, se calcula la precisión y el error para cada uno de los modelos producidos, y para obtener la precisión y el error final se calcula el promedio de los k modelos entrenados.

Una vez se cuenta con esta precisión promedio para un modelo, se puede repetir entonces el procedimiento del Cross Validation para todos los demás modelos de clasificación que se estén evaluando, y se seleccionará al final aquel que produzca el mejor valor de precisión y menor error promedio.

Entonces, puede utilizarse dicho modelo sobre el conjunto de validación generado en la primera parte, ya que, se supone, es este modelo el que mejor resultado en general ofreció durante la fase de entrenamiento.

(delgado2018a?)

Desarrollo

Librerías

library(readr)
library(caTools) # Funciones estadísticas. sample.split()
library(knitr) # Tablas amigables
library(caret) # Partir datos 
library(dplyr) # Para filter, select, mutate, %>% pipes, group_by, summarize


# Librerías para cada algoritmo
library(class)        # Para KNN Vecinos mas cercanos
library(e1071)        # Vectores de Soporte SVM
library(rpart)        # Arboles de clasificación
library(randomForest) # Bosques aleatorios

Datos

datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/datos/pulsar_stars.csv")

Descripción de los datos

str(datos)
## 'data.frame':    17898 obs. of  9 variables:
##  $ Mean.of.the.integrated.profile              : num  140.6 102.5 103 136.8 88.7 ...
##  $ Standard.deviation.of.the.integrated.profile: num  55.7 58.9 39.3 57.2 40.7 ...
##  $ Excess.kurtosis.of.the.integrated.profile   : num  -0.2346 0.4653 0.3233 -0.0684 0.6009 ...
##  $ Skewness.of.the.integrated.profile          : num  -0.7 -0.515 1.051 -0.636 1.123 ...
##  $ Mean.of.the.DM.SNR.curve                    : num  3.2 1.68 3.12 3.64 1.18 ...
##  $ Standard.deviation.of.the.DM.SNR.curve      : num  19.1 14.9 21.7 21 11.5 ...
##  $ Excess.kurtosis.of.the.DM.SNR.curve         : num  7.98 10.58 7.74 6.9 14.27 ...
##  $ Skewness.of.the.DM.SNR.curve                : num  74.2 127.4 63.2 53.6 252.6 ...
##  $ target_class                                : int  0 0 0 0 0 0 0 0 0 0 ...
summary(datos)
##  Mean.of.the.integrated.profile Standard.deviation.of.the.integrated.profile
##  Min.   :  5.812                Min.   :24.77                               
##  1st Qu.:100.930                1st Qu.:42.38                               
##  Median :115.078                Median :46.95                               
##  Mean   :111.080                Mean   :46.55                               
##  3rd Qu.:127.086                3rd Qu.:51.02                               
##  Max.   :192.617                Max.   :98.78                               
##  Excess.kurtosis.of.the.integrated.profile Skewness.of.the.integrated.profile
##  Min.   :-1.8760                           Min.   :-1.7919                   
##  1st Qu.: 0.0271                           1st Qu.:-0.1886                   
##  Median : 0.2232                           Median : 0.1987                   
##  Mean   : 0.4779                           Mean   : 1.7703                   
##  3rd Qu.: 0.4733                           3rd Qu.: 0.9278                   
##  Max.   : 8.0695                           Max.   :68.1016                   
##  Mean.of.the.DM.SNR.curve Standard.deviation.of.the.DM.SNR.curve
##  Min.   :  0.2132         Min.   :  7.37                        
##  1st Qu.:  1.9231         1st Qu.: 14.44                        
##  Median :  2.8018         Median : 18.46                        
##  Mean   : 12.6144         Mean   : 26.33                        
##  3rd Qu.:  5.4643         3rd Qu.: 28.43                        
##  Max.   :223.3921         Max.   :110.64                        
##  Excess.kurtosis.of.the.DM.SNR.curve Skewness.of.the.DM.SNR.curve
##  Min.   :-3.139                      Min.   :  -1.977            
##  1st Qu.: 5.782                      1st Qu.:  34.961            
##  Median : 8.434                      Median :  83.065            
##  Mean   : 8.304                      Mean   : 104.858            
##  3rd Qu.:10.703                      3rd Qu.: 139.309            
##  Max.   :34.540                      Max.   :1191.001            
##   target_class    
##  Min.   :0.00000  
##  1st Qu.:0.00000  
##  Median :0.00000  
##  Mean   :0.09157  
##  3rd Qu.:0.00000  
##  Max.   :1.00000

Como se va a evaluar modelos de clasificación se identifica la variable clasificatoria (variable objetivo o dependiente o de salida o la etiqueta) que target_class del conjunto de datos.

Transformar datos

Modificar variable clasificatoria

Se define la variable dependiente target_class como una variable categórica de nombre Clase con valores de Pulsar y NoPulsar.

colnames(datos)[9] <- "Clase"
datos$Clase <- factor(datos$Clase, levels = c("0", "1"), labels = c("No", "Si"))

Reescalar los valores de las variables independientes.

Se escalan los valores numéricos de los datos con la función scale() que implica centrar valores numéricos por default.

Por definición se utiliza la siguiente fórmula para escalar datos numéricos:

\[ x.escalada = \frac{x-min(x)}{max(x)-min(x)} \]

\[ x_i.escala = \frac{x_i - \bar{x}}{\sigma} \]

# Reescalar
datos[, c(1:8)] <- scale(x = datos[, c(1:8)])

Descripción nueva de los datos

Nuevamente se describen los datos

summary(datos)
##  Mean.of.the.integrated.profile Standard.deviation.of.the.integrated.profile
##  Min.   :-4.1035                Min.   :-3.18236                            
##  1st Qu.:-0.3957                1st Qu.:-0.60988                            
##  Median : 0.1559                Median : 0.05815                            
##  Mean   : 0.0000                Mean   : 0.00000                            
##  3rd Qu.: 0.6239                3rd Qu.: 0.65374                            
##  Max.   : 3.1785                Max.   : 7.63232                            
##  Excess.kurtosis.of.the.integrated.profile Skewness.of.the.integrated.profile
##  Min.   :-2.212200                         Min.   :-0.5775                   
##  1st Qu.:-0.423630                         1st Qu.:-0.3176                   
##  Median :-0.239293                         Median :-0.2548                   
##  Mean   : 0.000000                         Mean   : 0.0000                   
##  3rd Qu.:-0.004259                         3rd Qu.:-0.1366                   
##  Max.   : 7.134757                         Max.   :10.7543                   
##  Mean.of.the.DM.SNR.curve Standard.deviation.of.the.DM.SNR.curve
##  Min.   :-0.4208          Min.   :-0.9736                       
##  1st Qu.:-0.3628          1st Qu.:-0.6106                       
##  Median :-0.3329          Median :-0.4040                       
##  Mean   : 0.0000          Mean   : 0.0000                       
##  3rd Qu.:-0.2426          3rd Qu.: 0.1079                       
##  Max.   : 7.1516          Max.   : 4.3304                       
##  Excess.kurtosis.of.the.DM.SNR.curve Skewness.of.the.DM.SNR.curve Clase     
##  Min.   :-2.53941                    Min.   :-1.0030              No:16259  
##  1st Qu.:-0.55970                    1st Qu.:-0.6562              Si: 1639  
##  Median : 0.02884                    Median :-0.2046                        
##  Mean   : 0.00000                    Mean   : 0.0000                        
##  3rd Qu.: 0.53248                    3rd Qu.: 0.3234                        
##  Max.   : 5.82240                    Max.   :10.1971

Crear datos de entrenamiento y validación

Datos de entrenamiento

Se toma 70% para datos de entrenamiento y 30% para datos de validación. Se utiliza la función sample.split() de la librería caTools.

set.seed(2022) # Año actual 
divide <- sample.split(datos$Clase, SplitRatio = 0.70)
datos_entrenamiento <- subset(datos, divide == TRUE)

kable(head(datos_entrenamiento, 20), caption="Datos de Entrenamiento primeros 20")
Datos de Entrenamiento primeros 20
Mean.of.the.integrated.profile Standard.deviation.of.the.integrated.profile Excess.kurtosis.of.the.integrated.profile Skewness.of.the.integrated.profile Mean.of.the.DM.SNR.curve Standard.deviation.of.the.DM.SNR.curve Excess.kurtosis.of.the.DM.SNR.curve Skewness.of.the.DM.SNR.curve Clase
2 -0.3341589 1.8022150 -0.0117844 -0.3705251 -0.3710915 -0.5889076 0.5044128 0.2115755 No
3 -0.3143634 -1.0532928 -0.1452285 -0.1165896 -0.3220980 -0.2353216 -0.1259926 -0.3913625 No
4 1.0006664 1.5532110 -0.5133943 -0.3901672 -0.3043957 -0.2756588 -0.3122567 -0.4812869 No
5 -0.8713781 -0.8588548 0.1156055 -0.1048632 -0.3879995 -0.7630898 1.3239891 1.3867553 No
6 -0.6825595 0.0217124 0.0507947 -0.2194515 -0.3724816 -0.6050896 0.5144574 0.2491331 No
7 0.3276197 0.3237566 -0.4195304 -0.3051999 -0.3940989 -0.8755214 2.4195410 3.5196966 No
8 0.7524614 -0.9798758 -0.5978912 -0.2238583 -0.3865811 -0.6136221 1.1619603 0.8766761 No
9 -0.1492994 0.8881161 -0.0236544 -0.2593959 -0.3488785 -0.6080798 0.1547790 0.0292429 No
11 1.2083668 -0.1843379 -0.7501465 -0.2409772 -0.2455865 0.1378174 -0.4942843 -0.6292692 No
12 0.8645344 -0.3640536 -0.5252784 -0.2683108 -0.3726235 -0.7354026 0.8141224 0.8513931 No
13 0.9309254 0.4390928 -0.5762577 -0.3000607 -0.0650737 0.7711909 -0.9785912 -0.8517758 No
14 0.2676241 -0.1524076 -0.1432462 -0.1797722 -0.3317719 -0.1647699 0.1419536 -0.2101320 No
15 1.0563984 0.7269932 -0.4790325 -0.2794271 -0.2132173 0.2696291 -0.6985247 -0.7390014 No
16 0.1281420 0.7885481 -0.5379086 -0.3337049 -0.3350911 -0.4691503 0.1657881 -0.0774148 No
18 -0.3987226 0.7590014 -0.0789637 -0.2888367 -0.3316017 -0.2409142 -0.0002917 -0.3123831 No
19 0.9750846 0.7513270 -0.4922431 -0.3310837 -0.1110033 0.6044961 -0.8783927 -0.8091295 No
20 -0.4565864 -0.7273406 1.0049810 0.3864884 0.5069330 1.8177432 -1.3525575 -0.9500584 Si
23 -0.5930230 -0.6560697 -0.1423540 -0.1567430 -0.3658149 -0.7230165 0.6537317 0.6794665 No
24 0.2450877 1.0753877 -0.2066688 -0.3526846 -0.2237990 -0.0801410 -0.7757882 -0.7448288 No
25 -0.1727495 1.4346601 -0.0935136 -0.3302009 -0.3453323 -0.4068265 0.2385889 -0.0750835 No

Datos de validación

datos_validacion <- subset(datos, divide == FALSE)
kable(head(datos_validacion, 20), caption="Datos de Validación primeros 20")
Datos de Validación primeros 20
Mean.of.the.integrated.profile Standard.deviation.of.the.integrated.profile Excess.kurtosis.of.the.integrated.profile Skewness.of.the.integrated.profile Mean.of.the.DM.SNR.curve Standard.deviation.of.the.DM.SNR.curve Excess.kurtosis.of.the.DM.SNR.curve Skewness.of.the.DM.SNR.curve Clase
1 1.1492849 1.3347944 -0.6695508 -0.4004478 -0.3194313 -0.3706151 -0.0727957 -0.2874301 No
10 -0.1489949 -1.0306661 -0.0112546 -0.0984777 -0.2895870 -0.0691349 -0.2011668 -0.4419394 No
17 -0.0561083 0.3606682 -0.3197450 -0.3286328 -0.3768221 -0.7320593 1.1238940 1.1132819 No
21 -0.3971999 0.7804640 0.1406238 -0.2913103 -0.2962254 -0.1685234 -0.2996806 -0.4936253 No
22 -0.2196496 -0.7905032 -0.3150291 -0.2350648 -0.3074879 -0.2861497 -0.1251647 -0.3411547 No
27 0.7707342 0.8597345 -0.3150827 -0.2839524 -0.3382117 -0.5481133 0.2575642 0.1015397 No
29 0.4728882 0.6617500 -0.2805163 -0.3157574 -0.3565098 -0.4830234 0.3943056 0.0722989 No
31 -0.0378356 -0.7644625 -0.3599460 -0.1762616 -0.3937301 -0.6830944 1.4120783 1.1861895 No
38 -0.1185403 -1.7008573 -0.1472696 0.0083257 -0.2956864 -0.1337641 -0.1769485 -0.4128150 No
40 0.3026469 -0.0902521 -0.5517650 -0.2646917 -0.3488501 -0.5963094 0.2952933 0.1296722 No
41 1.0673620 0.3459840 -0.4863063 -0.3155884 -0.3451054 -0.4115548 0.0819641 -0.2045586 No
47 -0.1870631 -0.5155120 -0.0648371 -0.1196943 -0.3733610 -0.4661064 0.8447758 0.4427306 No
49 0.5712565 0.8925941 -0.4241764 -0.3566704 -0.2634307 0.1853916 -0.4309097 -0.6065153 No
52 -0.2324405 -0.2129861 -0.0122264 -0.1446552 -0.2826649 -0.1211674 -0.3863688 -0.5463143 No
55 0.9787391 0.7896003 -0.5152900 -0.3651962 -0.3991770 -0.8550845 2.3153097 3.0656166 No
66 0.2517877 0.1729360 -0.2863784 -0.3114396 -0.3920279 -0.6182238 1.3033060 0.9709508 No
67 1.2476533 0.4928174 -0.5971755 -0.3118740 -0.3070908 -0.2587717 -0.2144739 -0.4289486 No
69 0.3437606 1.0632430 -0.3143480 -0.3726879 -0.2908636 -0.0897448 -0.3822076 -0.5629109 No
74 0.6656658 0.0507614 -0.6175431 -0.2879578 -0.2857004 -0.2089490 -0.4109549 -0.5480104 No
75 0.1768694 -0.9146547 -0.3450575 -0.2038055 -0.0330734 0.7000330 -1.0348806 -0.8653573 No

Se observa por ejemplo que el registro 1 está en los datos de validación y no en los datos de entrenamiento y que los registros del 2 al 9 están en los datos de entrenamiento y no en los datos de validación.

Con la función table() se obtienen la cantidad de observaciones que son del tipo Pulsar y No Pulsar de acuerdo a la variable Clase, tanto en los datos de entrenamiento como en los datos de validación.

Se observa también la partición de los datos en 70% y 30% de manera respectiva para cada conjunto o partición de datos.

table(datos_entrenamiento$Clase, dnn = "Entrenamiento")
## Entrenamiento
##    No    Si 
## 11381  1147
table(datos_validacion$Clase, dnn = "Validacion")
## Validacion
##   No   Si 
## 4878  492

Implementación del Cross Validation para los Modelos de Clasificación

Se va a evaluar los algoritmos de clasificación mediante la técnica de validación cruzada con los datos de entrenamiento.

Se debe obtener una medida de Exactitud (accuracy) conforme matriz de confusión para concluir en cual modelo es mejor para clasificar el Tipo de Estrella como variable resultado.

Participan varios algoritmos :

  • Regresión Logística
  • k-NN
  • Kernel-SVM
  • Naive Bayes
  • Decision Tree
  • Random Forests

Se utilizan funciones previamente codificadas que devuelven o retornan el valor de la eficiencia y/o exactitud (“Accuracy”) para cada algoritmo.

Varios subconjuntos de los datos de entrenamiento usando la función createFolds() de la librería caret.

Se crean 10 subcojuntos con los registros aleatoriamente seleccionados de los datos de entrenamiento.

Estos números de registros de envían a las funciones correspondientes que devuelven la métrica de Accuracy = Eficiencia conforme a matriz de confusión.

registros <- createFolds(y = datos_entrenamiento$Clase, k = 10)

Mostrar registros

Se muestran los primeros 20 registros de cada conjunto de datos, llamando a funciones preparadas previamente codificadas

Llamar las funciones

# source("../funciones/funciones para validacion cruzada.r")

source("https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/funciones/funciones%20para%20validacion%20cruzada.R")

Mostrar cuales registros para cada conjunto

tabla <- f_convertir_list_adf(registros)
kable(head(tabla, 20), caption = "Registros de cada subconjunto. Los primeros 20")
Registros de cada subconjunto. Los primeros 20
1 2 3 4 5 6 7 8 9 10
15 4 50 7 2 22 3 6 5 1
30 8 55 10 21 34 20 13 9 24
37 12 57 11 61 59 28 25 17 26
43 14 67 16 62 66 29 47 23 35
45 19 84 18 68 70 31 48 44 46
52 27 87 33 72 71 39 73 63 75
54 32 90 36 79 78 40 89 65 91
58 38 118 42 88 115 41 125 76 92
64 77 135 49 98 117 110 139 83 95
74 86 136 51 102 123 111 148 94 97
80 93 153 53 105 142 134 158 100 99
82 96 174 56 116 170 144 172 103 106
85 101 182 60 122 171 162 177 107 109
138 113 183 69 132 212 176 199 108 120
147 119 187 81 133 213 185 215 112 124
149 126 190 104 146 219 207 218 114 128
157 127 225 121 163 233 217 228 151 137
161 129 227 131 168 253 235 229 180 140
167 130 230 155 173 261 246 232 193 143
189 141 238 164 178 267 256 244 196 150

Regresión logística

Accu.RL <- f_RegresionLogistica(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.RL)
## [1] "Accuracy =  0.980124952510142"

KNN Vecinos mas cercanos

Accu.KNN <- f.KNN(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.KNN)
## [1] "Accuracy =  0.978927379401258"

SVM Support Vector Machine

Accu.SVM <- f_SVM(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.SVM)
## [1] "Accuracy =  0.978687826532616"

Redes Bayesianas Naive Bayes

Accu.NV <- f_NV(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.NV)
## [1] "Accuracy =  0.946280811037535"

Arboles de Clasificación

Accu.AC <- f_AC(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.AC)
## [1] "Accuracy =  0.978049358855042"

Random Forests. Bosques aleatorios

Accu.RF <- f_RF(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.RF)
## [1] "Accuracy =  0.979486038619135"

Eficiencia Exactitud (Accuracy) de todos los algoritmos

Se presenta una tabla de la eficiencia de cada algoritmo usando la técnica de validación cruzada, es decir antes de probar con datos de validación y determinar la eficiencia con estos datos, se determina anticipadamente cual algoritmo resulta más eficiente para estos datos.

algoritmos <- c("RL Regresión Logística", "KNN. Vecinos mas cercanos", "SVM Máquinas de Soporte Vectorial", "RB Redes Bayesianas", "AC Arboles de Clasificación", "RF Bosques Aleatorios")

Acc <- data.frame(Algoritmos = algoritmos, Exactitud = c(Accu.RL, Accu.KNN, Accu.SVM, Accu.NV, Accu.AC, Accu.RF))

kable(Acc, caption = "Exactitud y/o Eficiencia de cada algoritmo con estos datos Usando validación cruzada")
Exactitud y/o Eficiencia de cada algoritmo con estos datos Usando validación cruzada
Algoritmos Exactitud
RL Regresión Logística 0.9801250
KNN. Vecinos mas cercanos 0.9789274
SVM Máquinas de Soporte Vectorial 0.9786878
RB Redes Bayesianas 0.9462808
AC Arboles de Clasificación 0.9780494
RF Bosques Aleatorios 0.9794860

Se observa que para estos datos el algoritmo de clasificación con mayor eficiencia sería en el regresión logística, seguido del algoritmo de random forest.

Ahora hay que determinar la eficiencia con los datos de entrenamiento y datos de validación con el algoritmo de regresión logística y evaluar la similitud de la exactidu y/o eficiencia con la validación cruzada, es decir antes y después.

Crear modelo de Regresión Logística

modelo <- glm(data = datos_entrenamiento, 
              formula = Clase ~ ., family = binomial)
summary(modelo)
## 
## Call:
## glm(formula = Clase ~ ., family = binomial, data = datos_entrenamiento)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -4.4773  -0.1602  -0.0965  -0.0534   3.6330  
## 
## Coefficients:
##                                              Estimate Std. Error z value
## (Intercept)                                  -4.36068    0.10975 -39.734
## Mean.of.the.integrated.profile                0.93655    0.18406   5.088
## Standard.deviation.of.the.integrated.profile -0.22008    0.08586  -2.563
## Excess.kurtosis.of.the.integrated.profile     7.58345    0.39949  18.983
## Skewness.of.the.integrated.profile           -4.13318    0.31646 -13.061
## Mean.of.the.DM.SNR.curve                     -0.76017    0.12078  -6.294
## Standard.deviation.of.the.DM.SNR.curve        0.91780    0.18323   5.009
## Excess.kurtosis.of.the.DM.SNR.curve           0.21664    0.46440   0.466
## Skewness.of.the.DM.SNR.curve                 -0.54320    0.38206  -1.422
##                                              Pr(>|z|)    
## (Intercept)                                   < 2e-16 ***
## Mean.of.the.integrated.profile               3.61e-07 ***
## Standard.deviation.of.the.integrated.profile   0.0104 *  
## Excess.kurtosis.of.the.integrated.profile     < 2e-16 ***
## Skewness.of.the.integrated.profile            < 2e-16 ***
## Mean.of.the.DM.SNR.curve                     3.09e-10 ***
## Standard.deviation.of.the.DM.SNR.curve       5.47e-07 ***
## Excess.kurtosis.of.the.DM.SNR.curve            0.6409    
## Skewness.of.the.DM.SNR.curve                   0.1551    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 7670.2  on 12527  degrees of freedom
## Residual deviance: 1775.8  on 12519  degrees of freedom
## AIC: 1793.8
## 
## Number of Fisher Scoring iterations: 8

Predicciones con datos de validación

predicciones <- predict(object = modelo, newdata = datos_validacion, type = 'response')

Crear tabla comparativa

tabla.comparar <- data.frame(real = datos_validacion$Clase, predicciones)

tabla.comparar <- tabla.comparar %>%
  mutate(Pred = if_else(predicciones > 0.5, 1, 0))

tabla.comparar <- tabla.comparar %>%
  mutate(ClasePred = if_else(Pred == 0, "No", "Si"))


kable(head(tabla.comparar, 20), caption = "Primeros 20 registros de tabla comparativa")
Primeros 20 registros de tabla comparativa
real predicciones Pred ClasePred
1 No 0.0009506 0 No
10 No 0.0266346 0 No
17 No 0.0018224 0 No
21 No 0.0862532 0 No
22 No 0.0034001 0 No
27 No 0.0050206 0 No
29 No 0.0066149 0 No
31 No 0.0010118 0 No
38 No 0.0069594 0 No
40 No 0.0005892 0 No
41 No 0.0029968 0 No
47 No 0.0097485 0 No
49 No 0.0057195 0 No
52 No 0.0239018 0 No
55 No 0.0004706 0 No
66 No 0.0038268 0 No
67 No 0.0017302 0 No
69 No 0.0085395 0 No
74 No 0.0009044 0 No
75 No 0.0077322 0 No

Creando la matriz de confusión

Se utiliza confusionMatrix de la librería caret

Se factorizan los valores

tabla.comparar$real <- as.factor(tabla.comparar$real)
tabla.comparar$ClasePred <- as.factor(tabla.comparar$ClasePred)
matriz <- confusionMatrix(tabla.comparar$real, tabla.comparar$ClasePred)


matriz$overall[1]
##  Accuracy 
## 0.9776536

El valor de eficiencia igual a 0.9776536 es similar al valor de eficiencia con valor de 0.9780494 de la validación cruzada.

Interpretación

Se desarrolla la técnica de validación cruzada para evaluar la métrica de Accuracy por medio de la matriz de confusión con varios algoritmos de clasificación.

Con estos datos al 70% para datos de entrenamiento y 30% para datos de validación el algoritmo que sale mas eficiente es el de regresión logística.

Los datos de Accuracy eficiencia son similares con validación cruzada y con las predicciones sobre los datos de validación.

Al probar este documento con una partición del 80% para datos de entrenamiento y 20% para datos de validación se generan los resultados siguientes mediante técnica de validación cruzada. Identificando el mejor algoritmo el de bosques aleatorios seguido de Regresión Lógística

  • RL Regresión Logística 0.9796761
  • KNN. Vecinos mas cercanos 0.9780691
  • SVM Máquinas de Soporte Vectorial 0.9789076
  • RB Redes Bayesianas 0.9464307
  • AC Arboles de Clasificación 0.9781393
  • RF Bosques Aleatorios 0.9800251

Bibliografía