machine learning - ¿Cuántos componentes principales tomar?
machine-learning data-mining (6)
Sé que el análisis de componentes principales hace una SVD en una matriz y luego genera una matriz de valores propios. Para seleccionar los componentes principales, solo debemos tomar los primeros valores propios. Ahora, ¿cómo decidimos el número de valores propios que deberíamos tomar de la matriz de valores propios?
Como otros dijeron, no hace daño trazar la varianza explicada.
Si utiliza PCA como paso de preprocesamiento para una tarea de aprendizaje supervisado, debe cruzar la validación completa del procesamiento de datos y tratar el número de dimensión PCA como un hiperparámetro para seleccionar utilizando una cuadrícula de búsqueda en el puntaje supervisado final (p. Ej., Puntaje F1 para clasificación o RMSE para la regresión).
Si la búsqueda cruzada con validación cruzada en todo el conjunto de datos es demasiado costosa pruebe con 2 muestras secundarias, por ejemplo, una con el 1% de los datos y la segunda con el 10% y vea si obtiene el mismo valor óptimo para las dimensiones del PCA.
Hay una serie de usos heurísticos para eso.
Por ejemplo, tomando los primeros k vectores propios que capturen al menos el 85% de la varianza total .
Sin embargo, para alta dimensionalidad, estas heurísticas generalmente no son muy buenas.
No hay una respuesta correcta, está en algún lugar entre 1 y n.
Piense en un componente principal como una calle en una ciudad que nunca ha visitado antes. ¿Cuántas calles debes tomar para conocer la ciudad?
Bueno, obviamente deberías visitar la calle principal (el primer componente) y tal vez algunas de las otras calles grandes también. ¿Necesitas visitar cada calle para conocer bien la ciudad? Probablemente no.
Para conocer la ciudad a la perfección, debes visitar todas las calles. Pero, ¿y si pudieras visitar, digamos 10 de las 50 calles, y tener un 95% de comprensión de la ciudad? ¿Es eso lo suficientemente bueno?
Básicamente, debe seleccionar suficientes componentes para explicar lo suficiente de la varianza con la que se siente cómodo.
Recomiendo encarecidamente el siguiente artículo de Gavish y Donoho: El umbral óptimo óptimo para valores singulares es 4 / sqrt (3) .
Publiqué un resumen más extenso de esto en CrossValidated (stats.stackexchange.com) . En resumen, obtienen un procedimiento óptimo en el límite de matrices muy grandes. El procedimiento es muy simple, no requiere ningún parámetro ajustado a mano, y parece funcionar muy bien en la práctica.
Tienen un buen suplemento de código aquí: https://purl.stanford.edu/vg705qn9070
Dependiendo de su situación, puede ser interesante definir el error relativo máximo permitido al proyectar sus datos en dimensiones ndim
.
Ilustraré esto con un pequeño ejemplo de matlab. Simplemente omita el código si no está interesado en él.
Primero generaré una matriz aleatoria de n
muestras (filas) y funciones p
que contienen exactamente 100 componentes principales distintos de cero.
n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
data = data + rand(n, 1)*rand(1, p);
end
La imagen se verá similar a:
Para esta imagen de muestra, se puede calcular el error relativo realizado al proyectar los datos de entrada a ndim
dimensiones de ndim
siguiente manera:
[coeff,score] = pca(data,''Economy'',true);
relativeError = zeros(p, 1);
for ndim=1:p
reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)'';
residuals = data - reconstructed;
relativeError(ndim) = max(max(residuals./data));
end
Trazar el error relativo en función del número de dimensiones (componentes principales) da como resultado el siguiente gráfico:
Según este gráfico, puede decidir cuántos componentes principales debe tener en cuenta. En esta imagen teórica, tomar 100 componentes da como resultado una representación de imagen exacta. Entonces, tomar más de 100 elementos es inútil. Si desea, por ejemplo, un error máximo del 5%, debe tomar alrededor de 40 componentes principales.
Descargo de responsabilidad : los valores obtenidos solo son válidos para mis datos artificiales. Por lo tanto, no use los valores propuestos a ciegas en su situación, pero realice el mismo análisis y realice una transacción entre el error que comete y la cantidad de componentes que necesita.
Referencia de código
- El algoritmo iterativo se basa en el código fuente de
pcares
- Una publicación de sobre
pcares
Para decidir cuántos valores propios / vectores propios conservar, debe considerar su razón para hacer PCA en primer lugar. ¿Lo está haciendo para reducir los requisitos de almacenamiento, para reducir la dimensionalidad de un algoritmo de clasificación o por algún otro motivo? Si no tienes restricciones estrictas, te recomiendo trazar la suma acumulada de valores propios (suponiendo que estén en orden descendente). Si divide cada valor por la suma total de valores propios antes del trazado, su trazado mostrará la fracción de la varianza total retenida frente al número de valores propios. La trama proporcionará una buena indicación de cuándo se llega al punto de rendimientos decrecientes (es decir, se gana poca varianza al retener valores propios adicionales).