El texto de este manual es una recopilación de documentos presentes tanto en Internet como de artículos revisados en publicaciones. Contiene además códigos de ejemplo tanto de producción propia como de aquellas fuentes mencionadas. Pretende ser un acotado manual para introducirlos al análisis predictivo. Este documento se encuentra en constante revisión y actualización.
El análisis predictivo es el proceso de utilizar el análisis de datos para realizar predicciones basadas en los datos. En este proceso se hace uso de los datos junto con técnicas analíticas, estadísticas y de aprendizaje automático a fin de crear un modelo predictivo para predecir eventos futuros.
El análisis predictivo agrupa una variedad de técnicas estadísticas de modelización, aprendizaje automático y minería de datos que analiza los datos actuales e históricos reales para hacer predicciones acerca del futuro o acontecimientos no conocidos.
En el ámbito de los negocios los modelos predictivos extraen patrones de los datos históricos y transaccionales para identificar riesgos y oportunidades. Los modelos predictivos identifican relaciones entre diferentes factores que permiten valorar riesgos o probabilidades asociadas sobre la base de un conjunto de condiciones, guiando así al decisor durante las operaciones de la organización.
El efecto funcional que pretenden estas iniciativas técnicas es que el análisis predictivo provea una puntuación (probabilidad) para cada sujeto (cliente, empleado, paciente, producto, vehículo, componente, máquina y otra unidad en la organización) con el objeto de determinar, informar o influir procesos en la organización en el que participen un gran número de sujetos, tal y como ocurre en marketing, evaluación de riesgo de crédito, detección de fraudes, fabricación, salud y operaciones gubernamentales como el orden público.
Lo fundamental del análisis predictivo está en identificar relaciones entre las variables explicativas y las variables predictivas del pasado de forma que se pueda escalar a lo que está por ocurrir. Es importante advertir, en cualquier caso, que la fiabilidad y usabilidad de los resultados dependerán mucho del nivel de análisis del dato y la calidad de las hipótesis.
Flujo de trabajo de un análisis predictivo. Fuente: https://es.mathworks.com/discovery/predictive-analytics.html#c%C3%B3mo-funciona
El término “análisis predictivo” describe la aplicación de una técnica estadística o de aprendizaje automático para crear una predicción cuantitativa sobre el futuro. Con frecuencia, se utilizan técnicas de aprendizaje automático supervisado para predecir un valor futuro (¿Cuánto tiempo puede funcionar esta máquina antes de necesitar mantenimiento?) o para calcular una probabilidad (¿Qué posibilidad existe de que este cliente no pueda pagar un préstamo?).
El análisis de regresión es una técnica estadística para estudiar la relación entre variables. Tanto en el caso de dos variables (regresión simple) como en el caso de más de dos variables (regresión múltiple), el análisis puede utilizarse para explorar y cuantificar la relación entre una variable llamada dependiente o criterio (Y) y una o más variables llamadas independientes, predictoras o regresoras (X1, X2, …, Xn), así como para desarrollar una ecuación lineal con fines predictivo.En problemas de regresión se dispone de una serie de datos de entrenamiento que representan las entradas y las correspondientes salidas de un sistema lineal o no lineal. El objetivo de la regresión es descubrir la relación funcional entre la entrada y la salida de este sistema, para poder así predecir la salida del sistema cuando se le presenta un dato de entrada nuevo.
El análisis de regresión es una técnica estadística para estudiar la relación entre variables. El término regressión fue introducido por Francis Galton. Su trabajo se centró en la descripción de los rasgosfísicos de los descendientes (variable A) a partir de los de sus padres (variable B). Estudiando la altura de padres e hijos a partir de más de mil registros de grupos familiares, se llegó a la conclusión de que los padres muy altos tenían una tendencia a tener hijos que heredaban parte de esta altura, pero que revelaban también una tendencia a regresar a la media. Galton generalizó esta tendencia bajo la ley de la regresión universal.
Tomado de https://rpubs.com/joser/RegresionSimple
Los datos del fichero corresponden a tres variables medidas en 25 individuos: edad, peso y cantidad de grasas en sangre. Para leer el fichero de datos y saber los nombres de las variables:
Para determinar las relaciones existentes entre cada par de variables se representa una matriz de diagramas de dispersión. Al parecer existe una relación lineal bastante clara entre la edad y las grasas, pero no entre los otros dos pares de variables. Por otra parte el fichero contiene un dato atípico.
Para cuantificar el grado de relación lineal, calculamos la matriz de coeficientes de correlación:
## peso edad grasas
## peso 1.0000000 0.2400133 0.2652935
## edad 0.2400133 1.0000000 0.8373534
## grasas 0.2652935 0.8373534 1.0000000
Representacion de la recta de mínimos cuadrados
El comando básico es lm (linear models) donde el primer argumento de este comando es una fórmula y ~ x en la que se especifica cuál es la variable respuesta o dependiente (y) y cuál es la variable regresora o independiente (x). Mediante el comando summary obtenemos un resumen de los principales resultados:
##
## Call:
## lm(formula = grasas ~ edad, data = grasas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -63.478 -26.816 -3.854 28.315 90.881
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 102.5751 29.6376 3.461 0.00212 **
## edad 5.3207 0.7243 7.346 1.79e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 43.46 on 23 degrees of freedom
## Multiple R-squared: 0.7012, Adjusted R-squared: 0.6882
## F-statistic: 53.96 on 1 and 23 DF, p-value: 1.794e-07
la columna ´Estimate´ de la tabla ´Coefficients´ de la salida anterior define la relación entre grasa en sangre y peso.
El coeficiente de determinación (es decir, el coeficiente de correlación al cuadrado) mide la bondad del ajuste de la recta a los datos. A partir de la salida anterior, vemos que su valor en este caso es Multiple R-squared: 0.701.
Para graficar la recta utilizamos plot.
Cálculo de predicciones
Para predecir sobre nuevos valores basta agtegar nuevos datos, sea directamente o en un nuevo archivo.
## 1 2 3 4 5 6 7 8
## 262.1954 267.5161 272.8368 278.1575 283.4781 288.7988 294.1195 299.4402
## 9 10 11 12 13 14 15 16
## 304.7608 310.0815 315.4022 320.7229 326.0435 331.3642 336.6849 342.0056
## 17 18 19 20 21
## 347.3263 352.6469 357.9676 363.2883 368.6090
El análisis de supervivencia es otro nombre para el análisis del tiempo hasta el evento. Estas técnicas se desarrollaron principalmente en las ciencias médicas y biológicas, pero también se usan ampliamente en las ciencias sociales como la economía, así como en la ingeniería (fiabilidad y análisis del tiempo de falla), ocurrencia de accidentes laborales, etc.
La censura y la no-normalidad, que son características de los datos de supervivencia no aplican bien usando modelos estadísticos normales como la regresión lineal múltiple. Además la distribución normal, simétrica, que aporta tanto valores positivos comom negativos, no aplican en análisis de tiempo (no hay valores negativos para el tiempo).
El concepto de censura aplica a los datos con información incompleta. Hay personas durante el tiempo del estudio no se produce el evento en estudio (la muerte) esto es censura por la derecha tambien para personas que abandonan el estudio.
El tiempo hasta el evento de interés (ej.: muerte) se mide de forma secuencial, por tanto no aplica: * Calcular medias y desviaciones estándar * Dibujar histogramas o nubes de puntos * Basar la inferencia en prueba de t-student, análisis de varianza o pruebas de rangos.
A realizar: * Tomar cuenta de la censura y calcular su porcentaje * Utilizar medianas y percentiles * Usar técnicas que impliquen la censura y den estimadores sin sesgo de la supervivencia.
Es la probabilidad de que el evento de interés suceda después del tiempo t.
\[S(t) = Prob (T \gt t)\]
Suponiendo la siguiente tabla de mortalidad en un estudio a 8 años.
| Yi: | 13 | 14+ | 15+ | 16 | 20 | 24+ | 28 | 34 |
|---|---|---|---|---|---|---|---|---|
| di: | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
| ni: | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| di/ni: | 1/8 | 0 | 0 | 1/5 | 1/4 | 0 | 1/2 | 1 |
Donde:
\[ \hat{S}(t) = \prod_{i:Y_i\lt t} \left( 1-\frac{d_i}{n_i} \right)\]
Los árboles de clasificación y regresión (Classification And Regression Trees, CART) son una técnica de aprendizaje de árboles de decisión no paramétrica que produce árboles de clasificación o regresión, dependiendo de si la variable dependiente es categórica (cualitativo) o numérica (continua), respectivamente.
En comparación a la alternativa de análisis de clasificación y regresión posee una mayor tolerancia a los outliers. y que mantiene la estructura de clasificación en forma de árbol y su facilidad de interpretación. La principal ventaja de los árboles de decisión frente a otros métodos de regresión es su fácil interpretación y la gran utilidad de su representación gráfica.
Genera un esquema de dicotomías, anidadas con forma de árbol de manera que cada rama se obtiene desde cada iteración de análisis. Al seguir el recorrido de las ramas o nodo se obtiene una predicción de pertenencia en el caso de clasificaciones, o de valor en caso de regresiones, para los individuos que cumplen con las propiedades que se han analizado en el recorrido del árbol.
Cuando tratan con variables continuas, pierden parte de su información al categorizarlas en el momento de la división de los nodos. Por esta razón, suelen ser modelos que consiguen mejores resultados en clasificación que en regresión.
Los árboles de decisión se utilizan para resolver problemas de:
La partición en cada nodo describe dos conjuntos separados del dataset, donde el corte que separa los datos esta determinao por una o varias condiciones en una de las variables explicativas. El particionamiento es recursivo. Se detiene en los nodos terminales y a cada nodo terminal se le asigna uno de los estados de la variable criterio Y. Para cada nueva observación, el estado de la variable respuesta se predice por el estado del nodo terminal al que dicha observación pertenece.
Elementos de un árbol.
Todo árbol tiene como mínimo un nodo raíz, un nodo interno y nodos terminales. El nodo raíz es particionado en nodos internos (hijos o ramas).
Se busca la homogeneidad de los nodos terminales, esto es que las variables resultantes en cada nodo terminal sean homogéneas. Lo que esta definido por una noción de impureza que puede estar determinado a su vez por tres funciones diferentes:
Los nodos terminales son aquellos que ya no pueden ser divididos en base a las variables determinantes.
Los árboles de decisión se generan a partir de algoritmos de segmentación recursiva, que determinan el mecanismo de segmentación y el criterio de parada definiendo el nodo terminal, esta determinado por tres procedimientos:
Los árboles de regresión trabajan con variables continuas
Este algoritmo fue desarrollado en la Universidad de Berkeley, y consiste en tres pasos:
Clasificación de nuevos datos a partir del árbol ya construido.
Da lugar a estructuras de árbol de mayor profundidad.
Ejercicios:
Dataset: https://www.kaggle.com/janiobachmann/bank-marketing-dataset
## ── Attaching packages ────────
## ✔ ggplot2 3.2.1 ✔ purrr 0.3.2
## ✔ tibble 2.1.3 ✔ dplyr 0.8.3
## ✔ tidyr 1.0.0 ✔ stringr 1.4.0
## ✔ readr 1.3.1 ✔ forcats 0.4.0
## ── Conflicts ─────────────────
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
# Datos
#download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", "wine.data")
# Información
#download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.names", "wine.names")
vino <- read.table("wine.data", sep = ",", header = FALSE)
# copiar archivo de nombres de variables de vinos
file.copy(from = "wine.names", to = "wine_names.txt")## [1] FALSE
#file.show("wine_names.txt")
#obtener los nombres de las columnas
nombres <-
readLines("wine_names.txt")[58:70] %>%
gsub("[[:cntrl:]].*\\)", "", .) %>%
trimws() %>%
tolower() %>%
gsub(" |/", "_", .) %>%
# Agregamos el nombre "tipo", para nuestra primera columna con los tipos de vino
c("tipo", .)
names(vino) <- nombres
# cambiar el tipo de dato de la columna tipo a factor usando la función mutate_at() de dplyr, para poder hacer clasificaciones
vino <- vino %>%
mutate_at("tipo", factor)
head(vino)## tipo alcohol malic_acid ash alcalinity_of_ash magnesium total_phenols
## 1 1 14.23 1.71 2.43 15.6 127 2.80
## 2 1 13.20 1.78 2.14 11.2 100 2.65
## 3 1 13.16 2.36 2.67 18.6 101 2.80
## 4 1 14.37 1.95 2.50 16.8 113 3.85
## 5 1 13.24 2.59 2.87 21.0 118 2.80
## 6 1 14.20 1.76 2.45 15.2 112 3.27
## flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue
## 1 3.06 0.28 2.29 5.64 1.04
## 2 2.76 0.26 1.28 4.38 1.05
## 3 3.24 0.30 2.81 5.68 1.03
## 4 3.49 0.24 2.18 7.80 0.86
## 5 2.69 0.39 1.82 4.32 1.04
## 6 3.39 0.34 1.97 6.75 1.05
## od280_od315_of_diluted_wines proline
## 1 3.92 1065
## 2 3.40 1050
## 3 3.17 1185
## 4 3.45 1480
## 5 2.93 735
## 6 2.85 1450
# Usamos la función sample_frac() de dplyr para obtener un subconjunto de nuestros datos, que consiste en 70% del total de ellos. Usamos también set.seed() para que este ejemplo sea reproducible.
set.seed(1649)
vino_entrenamiento <- sample_frac(vino, .7)
# Con setdiff() de dplyr, obtenemos el subconjunto de datos complementario al de entrenamiento para nuestro set de prueba, esto es, el 30% restante.
vino_prueba <- setdiff(vino, vino_entrenamiento)####Entrenamiento Rpart es la función que pide una formula para especificar la variable objetivo de la clasificación. La formula que usaremos es tipo ~ ., la cual expresa que intentaremos clasificar tipo usando a todas las demás variables como predictoras.
## n= 125
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 125 75 2 (0.35200000 0.40000000 0.24800000)
## 2) proline>=755 48 6 1 (0.87500000 0.04166667 0.08333333)
## 4) flavanoids>=2.35 41 1 1 (0.97560976 0.02439024 0.00000000) *
## 5) flavanoids< 2.35 7 3 3 (0.28571429 0.14285714 0.57142857) *
## 3) proline< 755 77 29 2 (0.02597403 0.62337662 0.35064935)
## 6) flavanoids>=1.265 51 4 2 (0.03921569 0.92156863 0.03921569) *
## 7) flavanoids< 1.265 26 1 3 (0.00000000 0.03846154 0.96153846) *
Dentro del rectángulo de cada nodo se nos muestra qué proporción de casos pertenecen a cada categoría y la proporción del total de datos que han sido agrupados allí. Por ejemplo, el rectángulo en el extremo inferior izquierdo de la gráfica tiene 92% de casos en el tipo 1, y 4% en los tipos 2 y 3, que representan 39% de todos los datos.
La precisión o “accuray” es el porcentaje de instancias correctamente clasificadas de todas las instancias en su conjunto. Es más útil en una clasificación binaria que en los problemas de clasificación multiclase porque puede ser menos claro cómo se desglosa exactamente la precisión entre esas clases (por ejemplo, es necesario profundizar con una matriz de confusión).
El coeficiente Kappa mide la concordancia entre la clasificación y los valores reales. Un valor kappa de 1 representa un acuerdo perfecto, mientras que un valor de 0 representa ningún acuerdo. Kappa es como la precisión de clasificación, excepto que se normaliza en la línea de base del azar en su conjunto de datos. Es una medida más útil para usar en problemas que tienen un desequilibrio en las clases (por ejemplo, una división de 70-30 para las clases 0 y 1 y se puede alcanzar una precisión del 70% prediciendo que todos los casos son para la clase 0).
prediccion_1 <- predict(arbol_1, newdata = vino_prueba, type = "class")
#Cruzamos la predicción con los datos reales de nuestro set de prueba para generar una matriz de confusión, usando confusionMatrix() de caret.
confusionMatrix(prediccion_1, vino_prueba[["tipo"]])## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 15 0 0
## 2 0 15 3
## 3 0 6 14
##
## Overall Statistics
##
## Accuracy : 0.8302
## 95% CI : (0.702, 0.9193)
## No Information Rate : 0.3962
## P-Value [Acc > NIR] : 1.106e-10
##
## Kappa : 0.7444
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 1.000 0.7143 0.8235
## Specificity 1.000 0.9062 0.8333
## Pos Pred Value 1.000 0.8333 0.7000
## Neg Pred Value 1.000 0.8286 0.9091
## Prevalence 0.283 0.3962 0.3208
## Detection Rate 0.283 0.2830 0.2642
## Detection Prevalence 0.283 0.3396 0.3774
## Balanced Accuracy 1.000 0.8103 0.8284
A valorar: Accuracy, Kappa
set.seed(7439)
vino_entrenamiento_2 <- sample_frac(vino, .7)
vino_prueba_2 <- setdiff(vino, vino_entrenamiento)
arbol_2 <- rpart(formula = tipo ~ ., data = vino_entrenamiento_2)
prediccion_2 <- predict(arbol_2, newdata = vino_prueba_2, type = "class")
rpart.plot(arbol_2)## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 14 0 0
## 2 1 21 0
## 3 0 0 17
##
## Overall Statistics
##
## Accuracy : 0.9811
## 95% CI : (0.8993, 0.9995)
## No Information Rate : 0.3962
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9713
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 0.9333 1.0000 1.0000
## Specificity 1.0000 0.9688 1.0000
## Pos Pred Value 1.0000 0.9545 1.0000
## Neg Pred Value 0.9744 1.0000 1.0000
## Prevalence 0.2830 0.3962 0.3208
## Detection Rate 0.2642 0.3962 0.3208
## Detection Prevalence 0.2642 0.4151 0.3208
## Balanced Accuracy 0.9667 0.9844 1.0000
Otra prueba
set.seed(8476)
vino_entrenamiento_3 <- sample_frac(vino, .7)
vino_prueba_3 <- setdiff(vino, vino_entrenamiento)
arbol_3 <- rpart(formula = tipo ~ ., data = vino_entrenamiento_3)
prediccion_3 <- predict(arbol_3, newdata = vino_prueba_3, type = "class")
rpart.plot(arbol_3)## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 15 4 0
## 2 0 17 0
## 3 0 0 17
##
## Overall Statistics
##
## Accuracy : 0.9245
## 95% CI : (0.8179, 0.9791)
## No Information Rate : 0.3962
## P-Value [Acc > NIR] : 8.174e-16
##
## Kappa : 0.8871
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 1.0000 0.8095 1.0000
## Specificity 0.8947 1.0000 1.0000
## Pos Pred Value 0.7895 1.0000 1.0000
## Neg Pred Value 1.0000 0.8889 1.0000
## Prevalence 0.2830 0.3962 0.3208
## Detection Rate 0.2830 0.3208 0.3208
## Detection Prevalence 0.3585 0.3208 0.3208
## Balanced Accuracy 0.9474 0.9048 1.0000
Los árboles de clasificación (decisión) son bastantes eficientes para capturar las variables desde los datos de entrenamiento. Sin embargo, como predictores Para suplir esta deficiencia se utiliza una serie de árboles dentro de un conjunto (ensemble) denominado Random Forest. En este modelo cada árbol se entrena con un subconjunto distinto de datos y de variables (al azar), de modo que los resultados obtenidos se combinan, ya sea mediante el uso de la media para casos de regresión o de probabilidad para problemas de clasificación.
Es ampliamente utilizado ya es simple de entrenar y usar.
Dentro de sus características destacadas tenemos:
Desventajas
Seis sujetos varones de edades comprendidas entre los 20 y los 28 años se les colocaron acelerómetros en el cinturón, el antebrazo y el brazo. Un acelerómetro adicional colocado en la mancuerna. Los sujetos realizaron levantamientos de mancuernas de cinco maneras diferentes, una manera correcta (clase A) y cuatro maneras incorrectas diferentes (clases B, C, D, E). Las mediciones de los acelerómetros se capturaron durante el ejercicio en ventanas de tiempo de deslizamiento que oscilaban entre 0,5 y 2,5 segundos.
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
## Rattle: A free graphical interface for data science with R.
## Versión 5.2.0 Copyright (c) 2006-2018 Togaware Pty Ltd.
## Escriba 'rattle()' para agitar, sacudir y rotar sus datos.
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:rattle':
##
## importance
## The following object is masked from 'package:gridExtra':
##
## combine
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
Carga de datos
url <- "https://d396qusza40orc.cloudfront.net/predmachlearn/pml-training.csv"
filename <- "pml-training.csv"
# method for mac
download.file(url, destfile = filename, method = "curl")Durante la mportación a R, los caracteres “NA” y “#DIV/0!” fueron transformados a valores “NA”.
filename <- "pml-training.csv"
data <- read.csv(filename, header = TRUE, na.strings = c("NA", "#DIV/0!"))El data frame resultante contiene 19622 observaciones y 160 variables.
En primer lugar, se verificaron los nombres de las variables. El analista notó que la primera variable no tenía una cabecera de columna. Esta variable es un pseudo número de fila, y por lo tanto fue renombrada como observationId. Al revisar los nombres de las variables en la tabla de abajo, el analista notó que las medidas estaban agrupadas por posición del acelerómetro, y que cada grupo de variables compartían las mismas medidas. Para cada grupo hay medidas brutas (es decir, medidas de balanceo, inclinación, guiñada, guiñada, x, y, z), y medidas estadísticas y de resumen (es decir, asimetría, curtosis, etc.).
Los algoritmos de aprendizaje automático funcionan con datos sin valores faltantes, por lo que se eliminaron las variables con valores faltantes.
# create a T/F vector identify variables with at least one NA
missingcols <- sapply(data, function(x) { any(is.na(x)) })
# replace data by keeping only those variables that don't have missing data
data <- data[ , !missingcols]Curiosamente, todas las medidas estadísticas y de resumen, excepto las medidas de aceleración total, contenían valores faltantes y fueron eliminadas. El conjunto de datos resultante incluye las variables de observación identificadoras[1-7], las medidas del acelerómetro bruto más la variable de resumen aceleración total[8-59], y la forma en que se realizó el ejercicio (clase).
El conjunto de datos es lo suficientemente grande como para realizar una validación cruzada utilizando una división 70/30 de los datos de formación y pruebas. Se estableció una semilla arbitraria para asegurar la reproducibilidad, y se crearon los conjuntos de entrenamiento y pruebas utilizando createDataPartition del paquete caret. Las dimensiones de los conjuntos de datos resultantes se confirmaron a través de la salida.
Siempre realizar un análisis de los datos previo a cualquier proceso.
Mirando las gráficas de las medidas de las correas en balanceo, cabeceo, guiñada y aceleración total agrupadas por el método en el que se realizó el levantamiento de la barra. Está claro que los valores medios del método A difieren mucho de los métodos B, C, D y E en lo que se refiere a balanceo, guiñada y aceleración. Sin embargo, no parece que haya valores medianos distintivos que ayuden a clasificar los métodos B, C, D y E entre sí.
p.roll.belt <- ggplot(training, aes(classe, roll_belt))
p.roll.belt <- p.roll.belt + geom_boxplot() + ggtitle("Roll Belt")
p.pitch.belt <- ggplot(training, aes(classe, pitch_belt))
p.pitch.belt <- p.pitch.belt + geom_boxplot() + ggtitle("Pitch Belt")
p.yaw.belt <- ggplot(training, aes(classe, yaw_belt))
p.yaw.belt <- p.yaw.belt + geom_boxplot() + ggtitle("Yaw Belt")
p.accel.belt <- ggplot(training, aes(classe, total_accel_belt))
p.accel.belt <- p.accel.belt + geom_boxplot() + ggtitle("Total Accel Belt")
gridExtra::grid.arrange(p.roll.belt, p.pitch.belt, p.yaw.belt, p.accel.belt, ncol = 2, nrow = 2) #### Arbol de decisión simple
A pesar de que no parecía que los métodos pudieran clasificarse utilizando sólo el cinturón de balanceo, el cinturón de cabeceo, el cinturón de guiñada y el cinturón de aceleración total, el analista tenía curiosidad por saber cuán preciso podía ser un modelo de árbol de decisión simple que utilizara sólo estas cuatro medidas como predictores. El árbol de decisión se ejecutó con 25 repeticiones de bootstrapping.
# simple decision tree model, isolating the class (60) as the outcome and
# variables 8 - 11 as predictors
modFit <- caret::train(classe ~ ., method = "rpart", data = training[,c(8:11,60)])
rattle::fancyRpartPlot(modFit$finalModel) ##### Accuray y predicción
# make sure to use the same variables from the testing set as were used in the training set.
predictions <- predict(modFit, newdata = testing[,c(8:11,60)])
# output confusion matrix
confusionMatrix(predictions, testing$classe)## Confusion Matrix and Statistics
##
## Reference
## Prediction A B C D E
## A 1665 1136 1026 861 434
## B 0 0 0 0 0
## C 0 0 0 0 0
## D 0 0 0 0 0
## E 9 3 0 103 648
##
## Overall Statistics
##
## Accuracy : 0.393
## 95% CI : (0.3805, 0.4056)
## No Information Rate : 0.2845
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.1669
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: A Class: B Class: C Class: D Class: E
## Sensitivity 0.9946 0.0000 0.0000 0.0000 0.5989
## Specificity 0.1791 1.0000 1.0000 1.0000 0.9761
## Pos Pred Value 0.3251 NaN NaN NaN 0.8493
## Neg Pred Value 0.9882 0.8065 0.8257 0.8362 0.9153
## Prevalence 0.2845 0.1935 0.1743 0.1638 0.1839
## Detection Rate 0.2829 0.0000 0.0000 0.0000 0.1101
## Detection Prevalence 0.8703 0.0000 0.0000 0.0000 0.1297
## Balanced Accuracy 0.5868 0.5000 0.5000 0.5000 0.7875
Aunque el código y la salida no se muestran aquí, se ejecutó un árbol de decisión simple usando todas las variables como predictores. Incluso con tal modelo, la precisión de la predicción fue de sólo el 55,2%. Por lo tanto, el analista decidió seguir un algoritmo forestal aleatorio para lograr una mejor tasa de predicción.
Se construyó un modelo forestal aleatorio utilizando todas las variables de predicción y la variable de clase como resultado categórico. Se intentó un bosque aleatorio con la función tren del paquete caret y también con la función bosque aleatorio del paquete bosque aleatorio. El analista dejó que la función de tren funcionara durante 75 minutos y la función nunca se completó. El método randomForest funcionó en menos de dos minutos, y por lo tanto se utilizó el método randomForest para construir el bosque aleatorio.
# random forest using all predictors
# using
modFit.rf <- randomForest::randomForest(classe ~ ., data = training[,c(8:60)])
modFit.rf##
## Call:
## randomForest(formula = classe ~ ., data = training[, c(8:60)])
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 7
##
## OOB estimate of error rate: 0.5%
## Confusion matrix:
## A B C D E class.error
## A 3902 3 0 0 1 0.001024066
## B 10 2643 5 0 0 0.005643341
## C 0 16 2377 3 0 0.007929883
## D 0 0 24 2227 1 0.011101243
## E 0 0 2 4 2519 0.002376238
Predicciones
predictions.rf <- predict(modFit.rf, newdata = testing[,c(8:60)])
confusionMatrix(predictions.rf, testing$classe)## Confusion Matrix and Statistics
##
## Reference
## Prediction A B C D E
## A 1674 4 0 0 0
## B 0 1130 4 0 0
## C 0 5 1022 7 4
## D 0 0 0 957 4
## E 0 0 0 0 1074
##
## Overall Statistics
##
## Accuracy : 0.9952
## 95% CI : (0.9931, 0.9968)
## No Information Rate : 0.2845
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.994
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: A Class: B Class: C Class: D Class: E
## Sensitivity 1.0000 0.9921 0.9961 0.9927 0.9926
## Specificity 0.9991 0.9992 0.9967 0.9992 1.0000
## Pos Pred Value 0.9976 0.9965 0.9846 0.9958 1.0000
## Neg Pred Value 1.0000 0.9981 0.9992 0.9986 0.9983
## Prevalence 0.2845 0.1935 0.1743 0.1638 0.1839
## Detection Rate 0.2845 0.1920 0.1737 0.1626 0.1825
## Detection Prevalence 0.2851 0.1927 0.1764 0.1633 0.1825
## Balanced Accuracy 0.9995 0.9956 0.9964 0.9960 0.9963
Errores
Este gráfico muestra las tasas de error de clase del modelo Random Forest. A medida que aumenta el número de árboles, la tasa de error se acerca a cero.
El aprendizaje computacional se empleó originalmente para desarrollar técnicas que permitieran a las computadoras aprender. Hoy en día, ya que incluye una serie de métodos estadísticos avanzados para la regresión y la clasificación, tiene aplicación en una amplia variedad de campos, incluyendo diagnósticos médicos, detección de fraudes de tarjetas de crédito, reconocimiento de la cara y el habla y el análisis del mercado de valores.
Las redes neuronales son técnicas de modelado no lineal sofisticadas que son capaces de modelar funciones complejas. Pueden aplicarse a problemas de predicción, clasificación o control en un amplio espectro de campos como las finanzas, la psicología cognitiva/neurociencia, la medicina, la ingeniería y la física.
Estas redes estan inspirada en la red de neuronas biológicas conectadas entre sí en forma múltiple. En que cada neurona transmite señal a otras y que se disponen en una serie de capas, existiendo a lo menos tres. Una capa de entrada, una capa oculta y una de salida.
Es una forma de aprendizaje automático en que cada
Esquema de redes neuronales. Fuente: https://www.asimovinstitute.org/neural-network-zoo/
Las máquinas de vectores de soporte (SVM) se usan para detectar y explotar patrones complejos de datos agrupando, ordenando y clasificando los datos.
Son máquinas de aprendizaje que se utilizan para realizar clasificaciones binarias y estimaciones de regresión. Usualmente usan métodos basados en kernel para aplicar técnicas de clasificación lineal a problemas de clasificación no lineal. Hay una serie de tipos de SVM tales como lineal, polinomial, sigmoide, etc.
El clasificador bayesiano “ingenuo” se basa en la regla de probabilidad condicional de Bayes, que se utiliza para la tarea de clasificación. El clasificador bayesiano asume que los predictores son estadísticamente independientes, lo que hace que sea una herramienta de clasificación eficaz que sea fácil de interpretar. Se emplea mejor cuando se enfrenta al problema de la “maldición de la dimensionalidad”, es decir, cuando el número de predicciones es muy alto.
El algoritmo vecino más próximo k-NN (Nearest Neighbor) pertenece a la clase de métodos estadísticos de reconocimiento de patrones. El método no impone a priori ninguna suposición sobre la distribución de la que se extrae la muestra de modelado.
Estadística: