t-SNE

t-SNE (T-distributed Stochastic Neighbor Embedding) es un algoritmo diseñado para la visualización de conjuntos de datos de alta dimensionalidad. Si el número de dimensiones es muy alto, Scikit-Learn recomienda en su documentación utilizar un método de reducción de dimensionalidad previo (como PCA) para reducir el conjunto de datos a un número de dimensiones razonable (por ejemplo 50), lo que reducirá el ruido y aligerará la ejecución de t-SNE.

t-SNE se ejecuta en dos pasos: en primer lugar construye una distribución de probabilidad sobre parejas de muestras en el espacio original, de forma tal que las muestras semejantes reciben alta probabilidad de ser escogidas, mientras que las muestras muy diferentes reciben baja probabilidad de ser escogidas. El concepto de "semejanza" se basa en la distancia entre puntos y densidad en las proximidades de un punto. Tal y como lo describen los autores:

La similaridad entre el punto xj y el punto xj es la probabilidad condicional de que xi escogiese a xj como su vecino si los vecinos fueses escogidos proporcionalmente a su densidad de probabilidad bajo una curva gaussiana centrada en xi

En segundo lugar, t-SNE lleva los puntos del espacio de alta dimensionalidad al espacio de baja dimencionalidad de forma aleatoria, define una distribución de probabilidad semejante a la vista en el espacio destino (el espacio de baja dimensionalidad), y minimiza la denominada divergencia Kullback-Leibler entre las dos distribuciones con respecto a las posiciones de los puntos en el mapa (la divergencia de Kullback-Leibler mide la similitud o diferencia entre dos funciones de distribución de probabilidad). Dicho con otras palabras: t-SNE intenta reproducir la distribución que existía en el espacio original en el espacio final.

Scikit-Learn implementa este algoritmo en sklearn.manifold.TSNE. Esta clase incluye varios parámetros que definen el comportamiento del algoritmo:

  • n_components (2 por defecto): Dimensiones del conjunto transformado.
  • perplexity (30 por defecto): Según la documentación de Scikit-Learn, se recomienda un valor entre 5 y 50 (mayor cuanto mayor sea el dataset), aunque se indica que el algoritmo no es muy sensible a este valor.
  • early_exaggeration (12 por defecto): Este parámetro controla la distancia entre bloques semejantes en el espacio final. La elección de este valor no es crítico.
  • learning_rate (200 por defecto): Habitualmente en el rango (10-1000). Si es muy elevado, los datos transformados estarán formados por una bola de puntos equidistantes unos de otros. Si es muy bajo, los puntos se mostrarán comprimidos en una densa nube con algunos outliers.
  • n_iter (1000 por defecto): Número máximo de iteraciones para la optimización. Debería ser, por lo menos, 250.
  • metric: métrica para la medición de las distancias.
  • method: algoritmo a usar para el cálculo del gradiente.

A pesar de los comentarios de Scikit-Learn sobre la poca sensibilidad del algoritmos a ciertos parámetros, lo cierto es que cambiar en una única unidad parámetros como perplexity, early_exaggeration o learning_rate da lugar a visualizaciones completamente diferentes.