El análisis de componentes principales (PCA) es un tipo de aprendizaje automático que utilizamos como un paso de preprocesamiento de datos para ayudar con algunos enfoques diferentes. En muchos casos de análisis de datos, es posible que tengamos características que están altamente correlacionadas entre sí. Si tuviéramos que explotar esos datos con un modelo de aprendizaje automático sin ningún tipo de selección de características de antemano, podríamos obtener algún error adicional en nuestro procedimiento de modelado porque algunas de nuestras características podrían estar altamente correlacionadas.
Por ejemplo, si desea modelar las ventas de un producto en función de la econometría de varios países, es posible que tenga algunos datos que podrían tener características como País, Año, Población, Porcentaje de usuarios de banda ancha, Porcentaje de población urbana, PIB, PIB. Per cápita, índice de pobreza, esperanza de vida, etc. En teoría, algunos de estos valores son muy dependientes entre sí, como el PIB y la Población. En algunos casos, pueden estar correlacionados linealmente. La función del PCA en este caso sería reducir esa correlación entre el PIB y la Población a una sola característica, que sería la relación funcional entre los dos.
Si se tuviera algún tipo de conjunto de datos de ejemplo con 30 o 40 características, pero la mayoría de ellas estuvieran altamente correlacionadas entre sí, podría ejecutar un algoritmo PCA en él y reducir los datos a solo dos características. Esto reduciría considerablemente la complejidad computacional del conjunto de datos.
Con PCA, podría reducir sus datos de algo que se parece a esto
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
a una forma más compacta, como esta:
La utilidad de PCA para la reducción de la dimensionalidad de los datos puede resultar útil para visualizar patrones de datos complejos. Los cerebros humanos son muy adeptos a la visualización y podemos leer muy bien un gráfico bidimensional. El cerebro puede discernir fácilmente las visualizaciones tridimensionales en la vida real, pero son un poco más difíciles de ver en la pantalla de una computadora. que en sí mismo es un plano bidimensional. PCA puede ayudarnos a tomar datos complejos y visualizarlos en un espacio más compacto para facilitar el análisis. La Figura 7-1 muestra un ejemplo de datos que podrían usar un pase de PCA:
pairs(mtcars[, 1:7], lower.panel = NULL)
Figura 7-1. Una selección de variables del conjunto de datos mtcars; puede utilizar PCA para encontrar correlaciones en los datos y reducir la complejidad del conjunto de datos para su procesamiento futuro.
En el conjunto de datos de mtcars
, hay una buena cantidad de características, algunas de las cuales parecen estar correlacionadas entre sí. Una buena práctica general antes de aplicar PCA es echar un vistazo a sus datos y ver si realmente hay valores que parezcan estar correlacionados.
A primera vista de los datos, parece que hay algunos valores bien correlacionados, y muchos de ellos corresponden a la variable de peso del vehículo, wt. Veamos cómo puede reducir algunas de las dependencias de estas variables y generar una imagen más simplificada de los datos.
En R, hay dos funciones que son bastante similares en términos de sintaxis que pueden hacer PCA de forma inmediata: princomp
y prcomp
. Uno de sus primeros objetivos es visualizar qué parte de la varianza puede explicar un cierto número de componentes principales en sus datos. La función princomp
tiene una funcionalidad incorporada simple que se presta mejor para trazar, así que usemos princomp
por el momento:
pca <- princomp(mtcars, scores = TRUE, cor = TRUE)
Puede utilizar el argumento score
para almacenar algunos datos utilizados para puntuar cada componente, a lo que llegaremos en un segundo. El argumento cor
se alinea con el uso de una matriz de correlación para los cálculos en lugar de una matriz de covarianza. Las diferencias son sutiles y dependen un poco de los datos o del tipo de cálculo que desea hacer, pero nos adentraremos demasiado en las malas hierbas estadísticas que avanzan por ese camino, así que use la matriz de correlación por ahora.
Echemos un vistazo a la salida del objeto pca:
summary(pca)
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## Standard deviation 2.5706809 1.6280258 0.79195787 0.51922773 0.47270615
## Proportion of Variance 0.6007637 0.2409516 0.05701793 0.02450886 0.02031374
## Cumulative Proportion 0.6007637 0.8417153 0.89873322 0.92324208 0.94355581
## Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
## Standard deviation 0.45999578 0.36777981 0.35057301 0.277572792 0.228112781
## Proportion of Variance 0.01923601 0.01229654 0.01117286 0.007004241 0.004730495
## Cumulative Proportion 0.96279183 0.97508837 0.98626123 0.993265468 0.997995963
## Comp.11
## Standard deviation 0.148473587
## Proportion of Variance 0.002004037
## Cumulative Proportion 1.000000000
Esta tabla muestra la importancia de cada uno de estos misteriosos componentes principales para el conjunto de datos general. La fila que más interesa es la Proporción de varianza, que indica qué cantidad de datos se explica para ese componente principal. Los componentes siempre se ordenan según su importancia, por lo que los componentes más importantes siempre serán los primeros. En el resultado anterior, puede ver que el componente 1 explica el 60% de los datos, con el componente 2 llegando al 24% y luego una fuerte caída para el resto. Si desea representar estos datos gráficamente, siga el ejemplo que se muestra en la Figura 7-2:
plot(pca)
Figura 7-2. Las variaciones de nuestros diversos componentes; esta es una forma más visual de ver en que medida nuestros componentes principales explican los datos.
Este gráfico muestra la importancia de los componentes e indica que el primer componente principal explica una gran parte de los datos. Combinado con el componente 2, esto explica más del 84% del conjunto de datos con solo dos características en lugar de las 11 con las que comenzamos. Pero estos componentes principales suenan algo misteriosos. ¿Qué significa el componente 1 para nosotros como seres humanos o tomadores de decisiones? En PCA, puede mirar las cargas loadings
para ver qué cantidad de cada variable está contenida en cada componente que está viendo:
pca$loadings[, 1:5]
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## mpg 0.3625305 0.01612440 0.22574419 0.022540255 0.10284468
## cyl -0.3739160 0.04374371 0.17531118 0.002591838 0.05848381
## disp -0.3681852 -0.04932413 0.06148414 -0.256607885 0.39399530
## hp -0.3300569 0.24878402 -0.14001476 0.067676157 0.54004744
## drat 0.2941514 0.27469408 -0.16118879 -0.854828743 0.07732727
## wt -0.3461033 -0.14303825 -0.34181851 -0.245899314 -0.07502912
## qsec 0.2004563 -0.46337482 -0.40316904 -0.068076532 -0.16466591
## vs 0.3065113 -0.23164699 -0.42881517 0.214848616 0.59953955
## am 0.2349429 0.42941765 0.20576657 0.030462908 0.08978128
## gear 0.2069162 0.46234863 -0.28977993 0.264690521 0.04832960
## carb -0.2140177 0.41357106 -0.52854459 0.126789179 -0.36131875
Estos valores son las correlaciones entre el componente principal y las características con las que comenzó. Este ejemplo muestra solo los primeros cinco componentes principales para ahorrar espacio, ya que los componentes del 6 al 9 no son realmente tan útiles de todos modos.
Cuanto más cercano esté el número de correlación a 1 o –1 para cada combinación de componente y característica, más importante será esa característica para ese componente. Veamos el componente 1. Este tiene un equilibrio de todas las características iniciales, siendo mpg el valor positivo dominante y cyl el valor negativo dominante. El componente 2 está dominado principalmente por las variables qsec, gear y am, en ese orden. Lo mismo para el resto de componentes.
Entonces, si tuviera que atribuir algún tipo de relación entre los componentes y las características, dirías que:
Si desea ver este tipo de información en un sentido más gráfico, puede trazar las puntuaciones de los componentes principales, como se muestra en la Figura 7-3:
scores.df <- data.frame(pca$scores) #se crea un nuevo data frame con los valores de score
scores.df$car <- row.names(scores.df) # se le estan poniendo los nombres de los carros a las filas.
plot(x = scores.df$Comp.1, y = scores.df$Comp.2, xlab = "Comp1 (mpg,cyl)",
ylab = "Comp2 (qsec, gear, am)")
text(scores.df$Comp.1, scores.df$Comp.2, labels = scores.df$car,
cex = 0.7, pos = 3)
Figura 7-3. Una gráfica de los datos en función de los dos componentes principales; Los automóviles en esta parcela que están agrupados son muy similares entre sí en función de los componentes utilizados para describirlos.
Lo que hemos hecho en esta última etapa es mostrar que muchos de los datos se pueden comprimir en dos componentes principales: uno tiene que ver principalmente con las variables mpg y cyl, y el otro es una combinación de las variables qsec, gear y am. En la Figura 7-3, puede ver que algunos autos caen en ciertos extremos del espectro en comparación con otros y pueden estar muy bien relacionados entre sí en función de muchos factores que se comprimen en solo una o dos variables.
Observe que los valores de los ejes aquí también son algo diferentes a los valores de la variable inicial. Esto se debe a que algunos algoritmos de PCA tienen técnicas de escalamiento de características integradas que aseguran que todas las variables estén dentro del mismo rango entre sí por el bien de la comparación; de lo contrario, si tuviera una variable (como el peso del vehículo) que podría ser cientos o miles de veces más grande que otra variable (como el número de cilindros), el análisis podría ser muy engañoso. Con la función princomp
, esta función de escalado está integrada, pero otros algoritmos de PCA en R pueden requerir que habilite explícitamente el escalado.
PCA busca encontrar una serie de vectores que describan la varianza en los datos. Por ejemplo, puede tener algunos datos descritos por dos características, \(X\) y \(Y\), que puede trazar. Puede encontrar un par de vectores que expliquen cuánto varían los datos en una dirección en comparación con una dirección ortogonal al primer vector, como se muestra en la Figura 7-4.
Figura 7-4: Los componentes principales describen la varianza en los datos; aquí, hay dos vectores componentes, siendo el componente principal el que describe el más largo de los dos ejes en los datos
Los conjuntos de datos más complejos pueden tener más características y más vectores, pero la idea es la misma. Por el contrario, una forma diferente de realizar el análisis de características sería con el análisis discriminante lineal (LDA). En este caso, es posible que tenga algunos datos que sean una función de \(X\) y \(Y\), nuevamente, pero esta vez, como muestra la Figura 7-5, desea clasificarlos en diferentes grupos en función de cómo se distribuyen sus datos.
Figura 7-5. LDA describe la mejor manera de separar los datos según las clases; aquí, hay un conjunto de datos que se divide efectivamente por las distribuciones a lo largo del eje \(X\) y el eje \(Y\), respectivamente
En la Figura 7-5, hay algunos datos que están graficados, pero separados en dos clases. Los datos + tienen una distribución a lo largo del eje \(X\), al igual que los otros datos. Sin embargo, los datos del eje \(Y\) no se distinguen por clases diferentes en este caso.
Veamos cómo se comparan estos dos modelos entre sí para fines de clasificación ejecutándolos con el conjunto de datos de iris
familiar. Comience usando PCA en los datos de iris
y luego observe la varianza total atribuida a cada uno de los componentes, comenzando con el uso de la función prcomp
:
iris.pca <- prcomp(iris[, -5], center = T, scale. = T) #se elimina la 5 columna, cada variable sera restada a la media de cada una de las mismas y se va a dividir por la desviación tipica así las variables quedan estandarizadas.
summary(iris.pca)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
Aquí, PCA le informa que tiene básicamente dos componentes principales. El componente 1 describe la varianza del 72% de los datos y el componente 2 describe el 23% de la varianza de los datos. Estos dos vectores combinados describen un buen 96% de los datos; puede ignorar los otros componentes por el momento (para mantener las visualizaciones un poco más simples).
Antes de saltar de lleno a LDA, primero debemos establecer cuál es la distribución previa de datos. Tocamos brevemente este tema mientras discutíamos las estadísticas bayesianas.
Para una actualización rápida, la distribución anterior es la distribución de los datos que está modelando, esencialmente. En algunos casos, no sabe con certeza cuál podría ser la distribución, pero sí en este caso. Debido a que está ejecutando un modelo de clasificación en los datos de iris
, el único tipo de datos de clase que tiene está relacionado con la variable Species
. Puede ver cuál sería la distribución anterior en este caso mirando esa variable específica:
table(iris$Species)
##
## setosa versicolor virginica
## 50 50 50
Aquí, hay tres clases, todas igualmente distribuidas. La distribución previa en este caso sería (1/3) para cada clase. Debe especificar esto como un vector al entrenar el modelo LDA. Después de hacer eso, puede ver cómo se compara el corolario de LDA con los componentes principales haciendo básicamente el mismo enfoque matemático:
library(MASS)
iris.lda <- lda(Species ~ ., data = iris, prior = c(1/3, 1/3,
1/3))
iris.lda$svd^2/sum(iris.lda$svd^2)
## [1] 0.991212605 0.008787395
El resultado aquí muestra que hay dos valores singulares, el primero que describe un enorme 99% de la varianza en los datos y el otro un mínimo 0,8%. Si desea ver cómo los dos discriminantes lineales están relacionados con cada una de las características en los datos de una manera similar a cómo lo hizo con PCA, simplemente puede llamar a las escalas:
iris.lda$scaling
## LD1 LD2
## Sepal.Length 0.8293776 0.02410215
## Sepal.Width 1.5344731 2.16452123
## Petal.Length -2.2012117 -0.93192121
## Petal.Width -2.8104603 2.83918785
A continuación, puede hacer la matriz de confusión habitual para ver qué tan bien se compara el modelo LDA con las respuestas reales para los datos de las especies de iris
:
iris.lda.prediction <- predict(iris.lda, newdata = iris)
table(iris.lda.prediction$class, iris$Species)
##
## setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 48 1
## virginica 0 2 49
El modelo LDA parece ser bastante acertado. A continuación, puede intentar visualizar la diferencia entre PCA y LDA. Recordemos las formulaciones con estos dos modelos. PCA es un alumno sin supervisión. No le decimos a la PCA que intente separar nuestros datos en función de una determinada clase, simplemente se ocupa de sus asuntos al hacerlo. Por otro lado, con LDA, necesitamos especificar una clase por la cual separarnos y, por lo tanto, este último es un modelo supervisado.
Los modelos supervisados tenderán a ser mejores para separar datos que los no supervisados. La Figura 7-6 prueba esto comparando las salidas de PCA con LDA:
combined <- data.frame(Species = iris[, "Species"], pca = iris.pca$x,
lda = iris.lda.prediction$x)
library(ggplot2)
library(gridExtra)
lda.plot <- ggplot(combined) + geom_point(aes(lda.LD1, lda.LD2,
shape = Species)) + scale_shape_manual(values = c(0, 1, 2))
pca.plot <- ggplot(combined) + geom_point(aes(pca.PC1, pca.PC2,
shape = Species)) + scale_shape_manual(values = c(0, 1, 2))
grid.arrange(pca.plot, lda.plot)
Figura 7-6. Una comparación de PCA versus LDA
La Figura 7-6 muestra PCA en la parte superior y LDA en la parte inferior. El objetivo aquí es ver qué tan bien cada modelo separa sus datos. En PCA, observe que los datos de setosa
están bien separados del resto, pero los datos versicolor
parecen tener cierta superposición con los datos de virginica
alrededor del pca. PC1 = 1,5 rango. En comparación, LDA también separa bien los datos de setosa
, pero parece que funciona mejor para mantener la superposición entre versicolor
y virginica
al mínimo.