Herramientas de usuario

Herramientas del sitio


clase:ia:saa:8_ml_no_supervisado:reduccion_dimensionalidad

01 - Reducción de dimensionalidad

Muchos problemas de ML implican muchas características para cada instancia. Ésto hace que el proceso de entrenamiento sea muy lento, además que puede hacer que sea difícil encontrar una buena solución.

Por suerte, la mayoría de veces es posible reducir el número de características de manera considerable.

Reducir la dimensionalidad puede causar pérdida de información (igual que cuando comprimimos una imagen a JPEG), con lo que puede reducir el rendimiento del sistema.

Existen varios métodos de reducción de dimensionalidad, entre los cuales el más popular es el Análisis de Componentes Principales (PCA), basado en el enfoque de proyección.

Proyección

En la mayoría de problemas, las instancias de entrenamiento quedan dentro (o cerca) de un subespacio con muchas menos dimensiones del espacio original. Por ejemplo, el siguiente gráfico representa un conjunto de datos 3D:

Podemos encontrar un espacio con menos dimensiones (2D) donde las instancias de entrenamiento queden cerca:

Si proyectamos perpendicularmente todas las instancias al nuevo espacio de dimensiones (plano), obtenemos un nuevo conjunto de datos 2D:

PCA

Como hemos dicho, el PCA es uno de los algoritmos de reducción de dimensionalidad más populares hoy en día. En primer lugar, identifica el hiperplano que queda más cerca de los datos y, a continuación, proyecta en él los datos.

Para encontrar ese hiperplano, la idea es preservar la máxima varianza posible para no perder demasiada información. Por ejemplo, fíjate en la siguiente imagen:

Como puedes ver, la proyección en la línea contínua preserva la varianza máxima.

El PCA identifica el eje que representa la cantidad más grande de varianza en el conjunto de entrenamiento. A continuación, encuentra un segundo eje, perpendiculas al primero, que representa la cantidad más grande de varianza restante, y así sucesivamente hasta alcanzar las dimensiones del conjunto de datos.

Este conjunto de ejes se llama componentes principales.

Una vez ha identificado todos los componentes principales, se puede reducir la dimensionalidad del conjunto de datos a d dimensiones proyectándolo en el hiperplano definido por los primeros d componentes principales.

PCA en Sklearn

La clase PCA de sklearn implementa el PCA.

Por ejemplo, vamos a usar PCA para reducir la dimensionalidad del conjunto de datos MNIST a 300 características:

df = pd.read_csv('./mnist.csv', header = None)

#Renombrar la columna objetivo a target
df.rename(columns={0: 'target'}, inplace=True)

X = df.drop(columns = 'target')
y = df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=91)

X_train.shape

(42000, 784)

Como vemos, el conjunto de datos original tiene 784 características. Vamos a aplicar PCA:

pca = PCA(n_components=300)

X_reduced = pca.fit_transform(X_train)
X_reduced.shape

(42000, 300)

El problema obvio es, ¿cuál es el número adecuado de dimensiones? En lugar de elegir de forma aleatoria el número de dimensiones al que vamos a reducir, es más fácil elegir el número de dimensiones que suma una porción lo bastante grande de la varianza.

Por suerte, en PCA de sklearn podemos, en vez de especificar el número de componentes principales, un número flotante entre 0.0 y 1.0 que representa el porcentaje de varianza que deseamos preservar:

pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X_train)
X_reduced.shape

(42000, 154)

En este caso, con sólo 154 dimensiones preservamos el 95% de la varianza.

Descomprimir el conjunto de datos reducido

También podemos descomprimir el conjunto de datos reducido para que vuelva a tener las dimensiones originales aplicando la transformación inversa de la proyección PCA. Ésto no devolverá los datos originales, ya que en el proceso de compresión se ha perdido algo de información, pero puede que se acerque a los datos originales.

Para descomprimir el conjunto de datos reducido, utilizamos el método inverse_transform de PCA:

X_recovered = pca.inverse_transform(X_reduced)
X_recovered.shape

(42000, 784)

Como vemos, volvemos a tener las 784 características originales. En la siguiente imagen, se muestra el conjunto de datos original y los dígitos después de pasar por la compresión y descompresión:

Aunque hay una pérdida leve en la calidad de la imagen, los dígitos siguen siendo fácilmente reconocibles.

clase/ia/saa/8_ml_no_supervisado/reduccion_dimensionalidad.txt · Última modificación: 2022/05/19 19:15 por cesguiro