Incorporaciones en el aprendizaje automático: hacer que los datos complejos sean simples

Publicado: 2022-03-11

Trabajar con datos no numéricos puede ser difícil, incluso para científicos de datos experimentados. Un modelo típico de aprendizaje automático espera que sus características sean números, no palabras, correos electrónicos, páginas de sitios web, listas, gráficos o distribuciones de probabilidad. Para ser útiles, los datos deben transformarse primero en un espacio vectorial. ¿Pero cómo?

Un enfoque popular sería tratar una característica no numérica como categórica . Esto podría funcionar bien si el número de categorías es pequeño (por ejemplo, si los datos indican una profesión o un país). Sin embargo, si intentamos aplicar este método a los correos electrónicos, probablemente obtendremos tantas categorías como muestras. No hay dos correos electrónicos exactamente iguales, por lo que este enfoque no sería útil.

Otro enfoque sería definir una distancia entre las muestras de datos , una función que nos dice qué tan cerca están dos muestras. O podríamos definir una medida de similitud , que nos daría la misma información excepto que la distancia entre dos muestras cercanas es pequeña mientras que la similitud es grande. Calcular la distancia (similitud) entre todas las muestras de datos nos daría una matriz de distancia (o similitud). Estos son datos numéricos que podríamos usar.

Sin embargo, estos datos tendrían tantas dimensiones como muestras, lo que generalmente no es bueno si queremos usarlo como una característica (ver maldición de la dimensionalidad) o para visualizarlo (mientras que una gráfica puede manejar incluso 6D, todavía no tengo para ver un diagrama de 100D). ¿Podríamos reducir el número de dimensiones a una cantidad razonable?

¡La respuesta es sí! Para eso tenemos incrustaciones .

¿Qué es una incrustación y por qué usarla?

Una incrustación es una representación de baja dimensión de datos de alta dimensión. Por lo general, una incrustación no capturará toda la información contenida en los datos originales. Sin embargo, una buena incrustación capturará lo suficiente para resolver el problema en cuestión.

Existen muchas incrustaciones diseñadas para una estructura de datos particular. Por ejemplo, es posible que haya oído hablar de word2vec para datos de texto o descriptores de Fourier para datos de imágenes de formas. En su lugar, discutiremos cómo aplicar incrustaciones a cualquier dato en el que podamos definir una distancia o una medida de similitud. Siempre que podamos calcular una matriz de distancia, la naturaleza de los datos es completamente irrelevante. Funcionará igual, ya sean correos electrónicos, listas, árboles o páginas web.

En este artículo, le presentaremos diferentes tipos de incrustaciones y discutiremos cómo funcionan algunas incrustaciones populares y cómo podríamos usarlas para resolver problemas del mundo real que involucran datos complejos. También repasaremos los pros y los contras de este método, así como algunas alternativas. Sí, algunos problemas se pueden resolver mejor por otros medios, pero desafortunadamente, no existe una panacea en el aprendizaje automático.

Empecemos.

Cómo funcionan las incorporaciones

Todas las incrustaciones intentan reducir la dimensionalidad de los datos mientras conservan la información "esencial" en los datos, pero cada incrustación lo hace a su manera. Aquí, veremos algunas incrustaciones populares que se pueden aplicar a una matriz de distancia o similitud.

Ni siquiera intentaremos cubrir todas las incrustaciones que existen. Hay al menos una docena de incrustaciones conocidas que pueden hacer eso y muchas más incrustaciones menos conocidas y sus variaciones. Cada uno de ellos tiene su propio enfoque, ventajas y desventajas.

Si desea ver qué otras incrustaciones existen, puede comenzar aquí:

  • Guía del usuario de Scikit-learn
  • Los elementos del aprendizaje estadístico (segunda edición), capítulo 14

Matriz de distancia

Toquemos brevemente las matrices de distancia. Encontrar una distancia adecuada para los datos requiere una buena comprensión del problema, algunos conocimientos de matemáticas y, a veces, pura suerte . En el enfoque descrito en este artículo, ese podría ser el factor más importante que contribuya al éxito o fracaso general de su proyecto.

También debe tener en cuenta algunos detalles técnicos. Muchos algoritmos de incrustación supondrán que una matriz de distancia (o disimilitud ) $\textbf{D}$ tiene ceros en su diagonal y es simétrica. Si no es simétrico, podemos usar $(\textbf{D} + \textbf{D}^T) / 2$ en su lugar. Los algoritmos que usan el truco del núcleo también supondrán que una distancia es una métrica, lo que significa que se cumple la desigualdad del triángulo:

\[\para todo a, b, c \;\; d(a,c) \leq d(a,b) + d(b,c)\]

Además, si un algoritmo requiere una matriz de similitud, podríamos aplicar cualquier función monótona decreciente para transformar una matriz de distancia en una matriz de similitud: por ejemplo, $\exp -x$.

Análisis de componentes principales (PCA)

El análisis de componentes principales, o PCA, es probablemente la incorporación más utilizada hasta la fecha. La idea es simple: encuentre una transformación lineal de características que maximice la varianza capturada o (equivalentemente) minimice el error de reconstrucción cuadrático .

Específicamente, sean las características una matriz de muestra $\textbf{X} \in \mathbb{R}^{n \times p}$ tiene $n$ características y $p$ dimensiones. Para simplificar, supongamos que la media de la muestra de datos es cero. Podemos reducir el número de dimensiones de $p$ a $q$ multiplicando $\textbf{X}$ por una matriz ortonormal $\textbf{V}_q \in \mathbb{R}^{p \times q}$ :

\[\sombrero{\textbf{X}} = \textbf{X} \textbf{V}_q\]

Entonces, $\hat{\textbf{X}} \in \mathbb{R}^{n \times q}$ será el nuevo conjunto de funciones. Para mapear las nuevas características al espacio original (esta operación se llama reconstrucción ), simplemente necesitamos multiplicarla nuevamente por $\textbf{V}_q^T$.

Ahora, debemos encontrar la matriz $\textbf{V}_q$ que minimiza el error de reconstrucción:

\[\min_{\textbf{V}_q} ||\textbf{X}\textbf{V}_q\textbf{V}_q^T - \textbf{X}||^2\]

Las columnas de la matriz $\textbf{V}_q$ se denominan direcciones de componentes principales y las columnas de $\hat{\textbf{X}}$ se denominan componentes principales. Numéricamente, podemos encontrar $\textbf{V}_q$ aplicando la descomposición SVD a $\textbf{X}$, aunque existen otras formas igualmente válidas de hacerlo.

PCA se puede aplicar directamente a características numéricas. O, si nuestras características no son numéricas, podemos aplicarlo a una matriz de distancia o similitud.

Si usa Python, PCA se implementa en scikit-learn.

La ventaja de este método es que es rápido de calcular y bastante resistente al ruido en los datos.

La desventaja sería que solo puede capturar estructuras lineales, por lo que es probable que se pierda la información no lineal contenida en los datos originales.

PCA del núcleo

Kernel PCA es una versión no lineal de PCA. La idea es utilizar el truco del núcleo , del que probablemente haya oído hablar si está familiarizado con Support Vector Machines SVM.

Específicamente, existen algunas formas diferentes de calcular PCA. Uno de ellos es calcular la descomposición propia de la versión de doble centro de la matriz de Gram $\textbf{X} \textbf{X}^T \in \mathbb{R}^{n \times n}$. Ahora, si calculamos una matriz kernel $\textbf{K} \in \mathbb{R}^{n \times n}$ para nuestros datos, Kernel PCA la tratará como una matriz gram para encontrar los componentes principales.

Sean $x_i$, $i \in {1,..,n}$ las muestras de características. La matriz del kernel se define mediante una función del kernel $K(x_i,x_j)=\langle \phi(x_i),\phi(x_j) \rangle$.

Una opción popular es un kernel radial:

\[K(x_i,x_j)=\exp -\gamma \cdot d(x_i,x_j)\]

donde $d$ es una función de distancia.

Kernel PCA nos exigió especificar una distancia. Por ejemplo, para características numéricas, podríamos usar la distancia euclidiana: $d(x_i,x_j)=\vert\vert x_i-x_j \vert \vert ^2$.

Para funciones no numéricas, es posible que debamos ser creativos. Una cosa para recordar es que este algoritmo asume que nuestra distancia es una métrica.

Si usa Python, Kernel PCA se implementa en scikit-learn.

La ventaja del método Kernel PCA es que puede capturar estructuras de datos no lineales.

La desventaja es que es sensible al ruido en los datos y que la elección de las funciones de distancia y kernel afectará en gran medida los resultados.

Escalado multidimensional (MDS)

El escalado multidimensional (MDS) intenta preservar las distancias entre las muestras a nivel mundial. La idea es bastante intuitiva y funciona bien con matrices de distancia.

Específicamente, dadas las muestras de características $x_i$, $i \in {1,..,n}$ y una función de distancia $d$, calculamos nuevas muestras de características $z_i \in \mathbb{R}^{q}$, $i \in {1,..,n}$ minimizando una función de tensión :

\[\min_{z_1,..,z_n} \sum_{1 \leq i < j \leq n} (d(x_i, x_j) - ||z_i - z_j||)^2\]

Si usa Python, MDS se implementa en scikit-learn. Sin embargo, scikit-learn no admite la transformación de puntos fuera de la muestra, lo que podría ser un inconveniente si queremos usar una incrustación junto con un modelo de regresión o clasificación. En principio, sin embargo, es posible.

La ventaja de MDS es que su idea concuerda perfectamente con nuestro marco y que no se ve muy afectado por el ruido en los datos.

La desventaja es que su implementación en scikit-learn es bastante lenta y no admite la transformación fuera de muestra.

Caso de uso: seguimiento de envíos

Algunos asentamientos en una pequeña isla tropical han desarrollado servicios de envío de paquetes para atender a la industria turística local. Un comerciante de uno de estos asentamientos decidió tomar medidas para obtener una ventaja sobre la competencia, por lo que instaló un sistema de vigilancia por satélite que rastreaba todos los envíos de paquetes en la isla. Una vez recopilados los datos, el comerciante llamó a un científico de datos (¡somos nosotros!) para que lo ayudara a responder la siguiente pregunta: ¿Podemos predecir el destino de un paquete que está actualmente en camino?

El conjunto de datos contiene información sobre 200 envíos rastreados. Para cada envío rastreado, hay una lista de coordenadas (x, y) de todas las ubicaciones donde se detectó el paquete, lo que suele estar entre 20 y 50 observaciones. La siguiente gráfica muestra cómo se ven estos datos.

Caso de uso: seguimiento de envíos

Estos datos parecen problemas: en realidad, dos sabores diferentes de problemas.

El primer problema es que los datos con los que estamos tratando son de alta dimensión. Por ejemplo, si cada paquete se detectara en 50 ubicaciones, nuestros datos tendrían 100 dimensiones, parece mucho, en comparación con las 200 muestras a su disposición.

El segundo problema: las diferentes rutas de envío en realidad tienen un número diferente de observaciones, por lo que no podemos simplemente apilar las listas con coordenadas para representar los datos en forma tabular (e incluso si lo hubieran hecho, eso todavía no tendría sentido).

El comerciante golpea impacientemente la mesa con los dedos y el científico de datos se esfuerza por no mostrar signos de pánico.

Aquí es donde las matrices de distancia y las incrustaciones serán útiles. Solo necesitamos encontrar una manera de comparar dos rutas de envío. La distancia Frechet parece ser una opción razonable. Con una distancia, podemos calcular una matriz de distancia.

Nota: Este paso puede llevar un tiempo. Necesitamos calcular $O(n^2)$ distancias con cada distancia con $O(k^2)$ iteraciones, donde $n$ es el número de muestras y $k$ es el número de observaciones en una muestra. Escribir una función de distancia de manera eficiente es clave. Por ejemplo, en Python, podría usar numba para acelerar este cálculo muchas veces.

Visualización de incrustaciones

Ahora, podemos usar una incrustación para reducir el número de dimensiones de 200 a solo unas pocas. Podemos ver claramente que solo hay unas pocas rutas comerciales, por lo que podemos esperar encontrar una buena representación de los datos incluso en dos o tres dimensiones. Usaremos las incrustaciones que discutimos anteriormente: PCA, Kernel PCA y MDS.

En los gráficos a continuación, puede ver los datos de ruta etiquetados (dados con fines de demostración) y su representación mediante una incrustación en 2D y 3D (de izquierda a derecha). Los datos etiquetados marcan cuatro puestos comerciales conectados por seis rutas comerciales. Dos de las seis rutas comerciales son bidireccionales, lo que hace un total de ocho grupos de envío (6+2). Como puede ver, obtuvimos una separación bastante clara de los ocho grupos de envío con incrustaciones 3D.

Visualización de incrustaciones

Este es un buen comienzo.

Incrustaciones en una canalización modelo

Ahora, estamos listos para entrenar una incrustación. Aunque MDS mostró los mejores resultados, es bastante lento; Además, la implementación de scikit-learn no admite la transformación fuera de muestra. No es un problema para la investigación, pero puede serlo para la producción, por lo que usaremos Kernel PCA en su lugar. Para Kernel PCA, no debemos olvidar aplicar un kernel radial a la matriz de distancia de antemano.

¿Cómo se selecciona el número de dimensiones de salida? El análisis mostró que incluso el 3D funciona bien. Solo para estar seguros y no omitir ninguna información importante, configuremos la salida de incrustación en 10D. Para obtener el mejor rendimiento, la cantidad de dimensiones de salida se puede establecer como un hiperparámetro del modelo y luego ajustarse mediante validación cruzada.

Entonces, tendremos 10 características numéricas que podemos usar como entrada para prácticamente cualquier modelo de clasificación. ¿Qué tal un modelo lineal y otro no lineal: digamos, regresión logística y aumento de gradiente? A modo de comparación, usemos también estos dos modelos con una matriz de distancia completa como entrada. Además, probemos SVM también (SVM está diseñado para funcionar directamente con una matriz de distancia, por lo que no se requiere incrustación).

La precisión del modelo en el conjunto de prueba se muestra a continuación (se generaron 10 conjuntos de datos de prueba y tren para que pudiéramos estimar la varianza del modelo):

  • Gradient Boosting junto con una incrustación (KernelPCA+GB) obtiene el primer lugar. Superó a Gradient Boosting sin incrustaciones (GB). Aquí, Kernel PCA demostró ser útil.
  • La regresión logística funcionó bien. Lo que es interesante es que la regresión logística sin incrustación (LR) funcionó mejor que con una incrustación (KernelPCA+LR). Esto no es del todo inesperado. Los modelos lineales no son muy flexibles pero son relativamente difíciles de adaptar. Aquí, la pérdida de información causada por una incrustación parece superar el beneficio de una dimensionalidad de entrada más pequeña.
  • Por último, pero no menos importante, SVM también funcionó bien, aunque la variación de este modelo es bastante significativa.

Precisión del modelo

Precisión del modelo

El código de Python para este caso de uso está disponible en GitHub.

Conclusión

Hemos explicado qué son las incrustaciones y demostrado cómo se pueden usar junto con matrices de distancia para resolver problemas del mundo real. Hora del veredicto:

¿Las incrustaciones son algo que un científico de datos debería usar? Echemos un vistazo a ambos lados de la historia.

Pros y contras de usar incrustaciones

Ventajas:

  • Este enfoque nos permite trabajar con estructuras de datos inusuales o complejas siempre que pueda definir una distancia, lo cual, con un cierto grado de conocimiento, imaginación y suerte, generalmente puede hacerlo.
  • El resultado son datos numéricos de baja dimensión, que puede analizar, agrupar o usar fácilmente como características de modelo para prácticamente cualquier modelo de aprendizaje automático que exista.

Contras:

  • Usando este enfoque, necesariamente perderemos algo de información:

    • Durante el primer paso, cuando reemplazamos los datos originales con la matriz de similitud
    • Durante el segundo paso, cuando reducimos la dimensionalidad usando una incrustación
  • Según los datos y la función de distancia, el cálculo de una matriz de distancia puede llevar mucho tiempo. Esto puede ser mitigado por una función de distancia escrita eficientemente.
  • Algunas incrustaciones son muy sensibles al ruido en los datos. Esto puede mitigarse con una limpieza de datos adicional.
  • Algunas incrustaciones son sensibles a la elección de sus hiperparámetros. Esto puede mitigarse mediante un análisis cuidadoso o el ajuste de hiperparámetros.

Alternativas: ¿Por qué no usar…?

  • ¿Por qué no usar una incrustación directamente en los datos, en lugar de una matriz de distancia?
    Si conoce una incrustación que puede codificar de manera eficiente sus datos directamente, por supuesto, utilícela. El problema es que no siempre existe.
  • ¿Por qué no usar simplemente la agrupación en clústeres en una matriz de distancia?
    Si su único objetivo es segmentar su conjunto de datos, estaría bien hacerlo. Algunos métodos de agrupamiento también aprovechan las incrustaciones (por ejemplo, el agrupamiento espectral). Si desea obtener más información, aquí hay un tutorial sobre la agrupación en clústeres.
  • ¿Por qué no usar simplemente una matriz de distancia como características?
    El tamaño de una matriz de distancia es $(n_{muestras}, n_{muestras})$. No todos los modelos pueden manejarlo de manera eficiente: algunos pueden sobreajustarse, algunos pueden tardar en adaptarse, algunos pueden no encajar por completo. Los modelos con varianza baja serían una buena opción aquí, como los modelos lineales y/o regularizados.
  • ¿Por qué no usar SVM con una matriz de distancia?
    SVM es un gran modelo, que funcionó bien en nuestro caso de uso. Sin embargo, hay algunas advertencias. Primero, si queremos agregar otras características (podrían ser simplemente números numéricos), no podremos hacerlo directamente. Tendríamos que incorporarlos en nuestra matriz de similitud y potencialmente perder información valiosa. En segundo lugar, por muy bueno que sea SVM, otro modelo puede funcionar mejor para su problema particular.
  • ¿Por qué no usar el aprendizaje profundo?
    Es cierto, para cualquier problema, puede encontrar una red neuronal adecuada si busca lo suficiente. Sin embargo, tenga en cuenta que el proceso de encontrar, entrenar, validar e implementar esta red neuronal no será necesariamente simple. Entonces, como siempre, usa tu mejor juicio.

en una frase

Las incrustaciones junto con las matrices de distancia son una herramienta increíblemente útil si trabaja con datos no numéricos complejos, especialmente cuando no puede transformar sus datos en un espacio vectorial directamente y prefiere tener una entrada de baja dimensión para su modelo.