Reducción de Dimensionalidad un poco de pca y un poco de T-Sne
En el mundo del machine learning constantemente se hace referencia a los datasets benchmark ( algunos muy conocidos por haber salido en alguna competencia grande), lo interesante de estos benchmark es ver siempre la posibilidad de como mejorarlos (en crossfit son los hero wods como fran la última vez que vi era de 1:53 min) al ser un dataset estándar lo vemos frecuentemente referenciados y mejorados con algún método matemático innovador en múltiples tutoriales.
Dado que son estándares son continuamente referenciados y son amigables a ser probador con distintos enfoques, tiempo atrás analizamos las regresiones lineales (simples o multilabel) y uno de los grandes problemas que nos enfrentamos fue la dimensionalidad.
Dimensionalidad
definición: Cantidad de atributos por dataset.
Haciendo referencia al matemático que llevo dentro ( y cientos de horas de estudio ) espero poder ayudar a entender sobre esta y llevar un ejemplo que ayude a entenderla.
Mucho de los problemas que se nos presentan involucran n cantidad de features los cuales hacen que tanto la complejidad del procesamiento computacional, tiempos de cálculo y relevancia de los features hiciera acuñar el término maldición de la dimensionalidad.
Gracias a las matemáticas, es posible reducir considerablemente la cantidad de features en un problema que tengamos en nuestras manos, haciendo viable una solución para un dataset de 64 features a 2 features (sería equivalente a dimensiones, nuestro ejemplo sería mnist).
Swiss Roll
Como vemos en la primera imagen denominada swiss roll es un roll con representación en 3d (podría tener muchas más dimensiones pero es altamente complejo para el humano poder visualizar mentalmente más de 3 o 4 dimensiones)
y el objetivo de atacar la dimensionalidad es poder llevar esto a un espacio 2d (2 features) que nos permita analizar/iterar/evaluar de mejor manera la data presentada.
Presentare 2 ejemplos donde la data mejora de gran manera el rendimiento del procesamiento de nuestros modelos y en pocos casos el performance final del modelo a construir.
Principal Component Analysis – PCA
Uno de los algoritmos preferidos para la reducción de dimensiones es el PCA, nos permite identificar el hiperplano ( yep… suena muy de cosas espaciales y cósmicas… matemáticas mijo! ) más cercano a la data, y así proyectar la data en este.
El objetivo del PCA efectivo es poder preservar de la mejor forma la varianza en nuestro modelo de entrenamiento, para esto se utiliza el análisis de los principales componentes con la técnica del Singular Value Decomposition (SVD) y siendo reconocido los componentes sabemos que dimensiones deseamos reducir.
Un caso importante para el análisis PCA, es la cantidad dimensiones objetivo uno de los mejores criterios para esto es que la varianza se mantenga en un 95% si no nuestros modelos sufrirán con el trade-off entre varianza y sesgo.
Para ver el ejemplo de cómo se pueden diferenciar las dimensiones favor revisar nuestro notebook aqui!
Kernel e Hyperparameters con PCA
Ahora unas cuantas aclaraciones sobre el ejemplo mostrado, este cubre los aspectos básicos de un PCA dejando de lado el tunning respectivo el cual nos ayuda a realmente aprovechar esta técnica tenemos la posibilidad de añadir uno de los grandes apoyos a la hora de hacer los análisis de kernel polinomiales la técnica de kernel trick (que implica el apoyo de las SVM) .
En código sería y nos muestra la posibilidad de modificar su gamma y su kernel para cuando utilicemos gridSearch
from sklearn.decomposition import KernelPCA pca = KernelPCA(n_components=2, kernel="rbf", gamma=0.05) X_con_menos_dimensiones = pca.fit_transform(X)
Este modelo de PCA es una de las primeras cosas que atacar para luego aplicar realmente un modelo (cosas que no me enseñaron de manera adecuada en su momento y espero poder mejorar eso a otros) .
El PCA no es un algoritmo predictivo sino, es una ayuda para alguna regresión por ejemplo, esto se ve por ejemplo en el siguiente pipeline, comentar que este pipeline es de alto consumo al estar en una búsqueda de grilla
from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline pca = Pipeline([ ("pca", KernePCA(n_components=2)), ("lin_reg", LogisticRegression()) ]) param_grid = ({ "pca__gamma": np.linspace(0.01, 0.1, 50), "pca__kernel": ['rbf','sigmoid'] }) gs = GridSearchCV(pca, param_grid, cv=5) gs.fit(X,y)
Conclusión, podemos reducir las dimensiones de un dataset y generar predicciones para modelos más «simples» con una cierta pérdida de varianza.
t-SNE
Otro algoritmo para atacar la dimensionalidad es el t-Distributed Stochastic Neighbor Embedding, este intenta reducir la dimensionalidad mientras intenta hacer cierto nivel de clustering (asociar elementos similares y separar los diferentes), es principalmente utilizado para visualización de tipo cluster así poder visualizar mnist en un plano de 2d.
Para ver correctamente favor ingresar aquí!
Intentando haber clarificado una de las grandes dudas que mantuve por mucho tiempo me despido!