Realizar validación cruzada
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
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?)
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 <- read.csv("https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/datos/pulsar_stars.csv")
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.
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"))
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)])
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
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")
| 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_validacion <- subset(datos, divide == FALSE)
kable(head(datos_validacion, 20), caption="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
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 :
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)
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")
| 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 |
Accu.RL <- f_RegresionLogistica(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.RL)
## [1] "Accuracy = 0.980124952510142"
Accu.KNN <- f.KNN(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.KNN)
## [1] "Accuracy = 0.978927379401258"
Accu.SVM <- f_SVM(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.SVM)
## [1] "Accuracy = 0.978687826532616"
Accu.NV <- f_NV(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.NV)
## [1] "Accuracy = 0.946280811037535"
Accu.AC <- f_AC(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.AC)
## [1] "Accuracy = 0.978049358855042"
Accu.RF <- f_RF(registros, datos_entrenamiento)
paste("Accuracy = ", Accu.RF)
## [1] "Accuracy = 0.979486038619135"
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")
| 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.
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 <- predict(object = modelo, newdata = datos_validacion, type = 'response')
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")
| 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 |
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.
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