Introducción
Siempre me ha apasionado el aprendizaje y me considero un aprendiz de por vida. Estar en SAS, como científico de datos, me permite aprender y probar nuevos algoritmos y funcionalidades que regularmente lanzamos a nuestros clientes.
Muchas veces, los algoritmos no son técnicamente nuevos pero son nuevos para mí, lo que hace que sea muy divertido.
Recientemente, tuve la oportunidad de aprender más sobre la incrustación de vecinos estocásticos distribuidos (tSNE). En esta publicación voy a dar una descripción general de alto nivel del algoritmo tSNE. También compartiré un ejemplo de código python donde usaré tSNE tanto en el conjunto de datos de Dígitos como en el de MNIST.
¿Qué es tSNE?
Incrustación Stochastic Neighbor-t distribuida (tSNE ) es una técnica no lineal no supervisada utilizada principalmente para la exploración de datos y la visualización de datos de alta dimensión.
En términos más simples, tSNE le da una sensación o intuición de cómo se organizan los datos en un espacio de alta dimensión. Fue desarrollado por Laurens van der Maatens y Geoffrey Hinton en 2008.
tSNE vs PCA
Si está familiarizado con Análisis de componentes principales (PCA), entonces como yo , probablemente se esté preguntando la diferencia entre PCA y tSNE.
Lo primero a tener en cuenta es que PCA se desarrolló en 1933, mientras que tSNE se desarrolló en 2008. Mucho ha cambiado en el mundo de la ciencia de datos desde 1933, principalmente en el ámbito del cálculo y el tamaño de los datos.
En segundo lugar, PCA es una técnica de reducción de dimensión lineal que busca maximizar la varianza y preserva las distancias pares grandes. En otras palabras, las cosas que son diferentes terminan muy separadas. Esto puede conducir a una visualización deficiente, especialmente cuando se trata de estructuras distribuidoras no lineales. Piense en una estructura múltiple como cualquier forma geométrica como: cilindro, bola, curva, etc.
tSNE difiere de PCA al preservar solo pequeñas distancias por pares o similitudes locales, mientras que PCA se preocupa por preservar distancias pares grandes para maximizar la varianza.
Laurens ilustra bastante bien el enfoque PCA y tSNE utilizando el conjunto de datos Swiss Roll en la Figura 1 [1].
Puede ver que debido a la no linealidad de este conjunto de datos de juguete (múltiple) y la preservación de grandes distancias, PCA conservaría incorrectamente la estructura de los datos.
Cómo funciona tSNE
Ahora que sabemos por qué podríamos usar tSNE sobre PCA, analicemos cómo funciona tSNE. El algoritmo tSNE calcula una medida de similitud entre pares de instancias en el espacio de alta dimensión y en el espacio de baja dimensión. Luego trata de optimizar estas dos medidas de similitud usando una función de costo. Vamos a dividirlo en 3 pasos básicos.
1. Paso 1, mide similitudes entre puntos en el espacio de alta dimensión. Piense en un conjunto de puntos de datos dispersos en un espacio 2D (Figura 2).
Para cada punto de datos (xi) centraremos una distribución Gaussiana sobre ese punto. Luego medimos la densidad de todos los puntos (xj) bajo esa distribución Gaussiana. Luego renormalize para todos los puntos.
Esto nos da un conjunto de probabilidades (Pij) para todos los puntos. Esas probabilidades son proporcionales a las similitudes.
Todo lo que eso significa es que si los puntos de datos x1 y x2 tienen valores iguales bajo este círculo gaussiano, entonces sus proporciones y similitudes son iguales y, por lo tanto, tienes similitudes locales en la estructura de este espacio de alta dimensión.
La distribución gaussiana o el círculo se pueden manipular usando lo que se llama perplejidad, que influye en la varianza de la distribución (tamaño del círculo) y esencialmente en el número de vecinos más cercanos. El rango normal para la perplejidad está entre 5 y 50 [2].
2. El paso 2 es similar al paso 1, pero en lugar de usar una distribución gaussiana se usa una distribución t de Student con un grado de libertad, que también se conoce como la distribución de Cauchy (Figura 3). Esto nos da un segundo conjunto de probabilidades (Qij) en el espacio de baja dimensión.
Como puede ver, la distribución t de Student tiene colas más pesadas que la distribución normal. Las colas pesadas permiten un mejor modelado de distancias muy separadas.
3. El último paso es que queremos que este conjunto de probabilidades del espacio de baja dimensión (Qij) refleje las del espacio de alta dimensión (Pij) de la mejor manera posible.
Queremos que las dos estructuras de mapa sean similares. Medimos la diferencia entre las distribuciones de probabilidad de los espacios bidimensionales utilizando la divergencia de Kullback-Liebler (KL).
No incluiré mucho en KL, excepto que es un enfoque asimétrico que compara de manera eficiente los grandes valores Pij y Qij. Finalmente, utilizamos el descenso de gradiente para minimizar nuestra función de costo KL.
Caso de uso para tSNE
Ahora que sabe cómo funciona tSNE hablemos rápidamente sobre dónde se usa. Laurens van der Maaten muestra muchos ejemplos en su presentación de video [1].
Menciona el uso de tSNE en áreas como investigación del clima, seguridad informática, bioinformática, investigación del cáncer, etc. tSNE podría usarse en datos de alta dimensión y luego el resultado de esas dimensiones se convierte en insumos para algún otro modelo de clasificación .
Además, tSNE podría usarse para investigar, aprender o evaluar la segmentación. Muchas veces seleccionamos la cantidad de segmentos antes del modelado o iteramos después de los resultados. tSNE a menudo puede mostrar una separación clara en los datos.
Esto se puede usar antes de usar su modelo de segmentación para seleccionar un número de clúster o después para evaluar si sus segmentos realmente se mantienen. tSNE, sin embargo, no es un enfoque de agrupamiento, ya que no conserva las entradas como PCA y los valores a menudo pueden cambiar entre ejecuciones, por lo que es pura exploración.
Ejemplo de código
A continuación se muestra un código python (Figuras a continuación, con un enlace a GitHub) donde puede ver la comparación visual entre PCA y tSNE en los conjuntos de datos Dígitos y MNIST. Selecciono estos dos conjuntos de datos debido a las diferencias de dimensionalidad y, por lo tanto, a las diferencias en los resultados.
También muestro una técnica en el código donde puede ejecutar PCA antes de ejecutar tSNE. Esto se puede hacer para reducir los cálculos y típicamente reducirías hasta ~ 30 dimensiones y luego ejecutar tSNE.
Ejecuté esto usando python y llamando a las bibliotecas SAS . Puede parecer un poco diferente de lo que estás acostumbrado y puedes ver eso en las imágenes a continuación. Utilicé Seaborn para mis imágenes, lo que pensé que era genial, pero con tSNE puedes obtener clusters realmente compactos y necesitar acercarlos.
Otra herramienta de visualización, como Plotly, puede ser mejor si necesitas acercar o manipular tu objeto de trazado. . Además, una simple llamada de% matplotlib portátil antes de trazar obras también suponiendo que el uso de Matplotlib.
Verifique el cuaderno completo en GitHub para que pueda ver todos los pasos intermedios y tener el código:
Paso 1: Cargue las bibliotecas de Python.
Cree una conexión al servidor SAS (llamada ‘CAS’, que es un motor distribuido en memoria). Cargue conjuntos de acciones CAS (piense en estos como bibliotecas). Lea los datos y vea la forma.
Paso 2: hasta este punto, todavía estoy trabajando en mi máquina local. Voy a cargar esos datos en el servidor CAS que mencioné. Esto me ayuda a aprovechar el entorno distribuido y obtener eficiencia en el rendimiento. Luego realizo un análisis PCA tanto en dígitos como en datos MNIST.
Paso 3: visualice los resultados de PCA para ambos dígitos y MNIST
Paso 4 – Ahora probemos los mismos pasos que antes, pero usando el algoritmo tSNE
Y ahora para el conjunto de datos MNIST …
Conclusión
Espero que hayan disfrutado esta visión general y el ejemplo del algoritmo tSNE. Encontré tSNE como una herramienta de visualización muy interesante y útil. Ya que casi todos los datos en los que he trabajado parecían ser de gran dimensión.
Voy a publicar los recursos que encontré súper útiles a continuación. El mejor recurso para mí fue el video de YouTube de Laurens. Es un poco largo en casi 1 hora, pero bien explicado y donde encontré la explicación más clara con detalles.
Recursos adicionales Encontré Útil:
- tSNE contra PCA: https://www.quora.com/What-advantages-does-the-tSNE-algorithm-have-over-PCA
- Divergencia de Kullback-Liebler: https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence
- tSNE Wikipedia: https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding
- Tutorial de tSNE: https://www.analyticsvidhya.com/blog/2017/01/tsne-implementation-r-python/
- Buena información del hiperparámetro: https://distill.pub/2016/misread-tsne/
- Página GitHub de Lauren van der Maaten: https://lvdmaaten.github.io/tsne/
- Desarrollador SAS del Conjunto de Acción tSNE y Crédito: Jorge Silva
Referencias
- Youtube. (2013, 6 de noviembre). Visualización de datos utilizando tSNE [Video File]. Obtenido de https://www.youtube.com/watch?v=RJVL80Gg3lA
- L.J.P. van der Maaten y G.E. Hinton. Visualización de datos de alta dimensión con tSNE. Journal of Machine Learning Research 9 (noviembre): 2579-2605, 2008.