Saltar para o conteúdo

Technical

Convertir las clases en datos de entrada

Kelwin · 22 de septiembre de 2022

Seamos honrados: todos hemos trabajado en proyectos de Machine Learning donde necesitábamos predecir un número absurdamente elevado de clases. Lo suficientemente grande como para que el número de observaciones por clase resulte ser un subconjunto vergonzosamente pequeño. La mayoría de las personas modelan estas tareas como un problema de clasificación multiclase en el que, para cada observación de entrada, debemos predecir la clase más probable (o las probabilidades de la clase).

Ejemplos de tales tareas son predecir el modelo de un automóvil, la especie de un animal, la intención de un usuario en un chat, el código SIC/NAICS de una empresa y el producto en una imagen de un mercado, entre muchos otros.

Un número dinámico de clases también caracteriza estos ejemplos. Por ejemplo, supongamos que estamos entrenando un modelo de Computer Vision para reconocer el artículo en una foto para una tienda minorista autónoma. Cada día se lanzan nuevos productos al mercado. Si adoptas el enfoque tradicional, debes entrenar un nuevo modelo diariamente para mantener el catálogo actualizado.

Esto haría que el mantenimiento del modelo (y las operaciones) se vuelvan caóticas. No es algo que desees.

Nuestra receta para entrenar modelos grandes de clasificación multiclase

Nuestro truco para este tipo de modelo es convertir las clases en parte de la pregunta. Así, en lugar de entrenar un modelo de clasificación multiclase que prediga:

¿Cuál es la clase de la observación? – una pregunta categórica

hacemos la pregunta:

¿Pertenece esta observación a una categoría determinada? – una pregunta de sí o no.

Me gusta llamar a este truco "voltear el modelo", convirtiendo el resultado en parte de las entradas.

Técnicamente, transformamos nuestro modelo predictivo

![$$F :: observation \rightarrow class$$](/wp-content/ql-cache/quicklatex.com-218b20920dfa31bbb36288579e585be3_l3.png)

en

![$$F :: observation x class \rightarrow yes/no$$](/wp-content/ql-cache/quicklatex.com-44853cca312313377d485134c1f9af8e_l3.png)

Luego, para cualquier observación dada, solo necesitas preguntar por todas las clases y elegir la que tenga la probabilidad más alta.

![$$argmax_{class} F(observation, class)$$](/wp-content/ql-cache/quicklatex.com-d30407b209e0aadd45226d25e4aba10f_l3.png)

¿Hay una clase nueva? No te preocupes; solo haz una pregunta adicional la próxima vez que necesites generar una predicción. No se requiere reentrenamiento. Me gusta llamar a este truco "voltear el modelo", convirtiendo el resultado en parte de las entradas.

Aclaración: siempre y cuando tu subconjunto inicial de clases sea lo suficientemente general. De lo contrario, reentrena de vez en cuando.

¿Cómo podemos codificar las clases como entrada? Clasificación multiclase como clasificación binaria

Supongamos que tienes características que describen las clases. Entonces, solo necesitas codificar la clase como el conjunto de características que la describen. Por ejemplo, en el ejemplo de reconocimiento de productos minoristas, puedes caracterizar el artículo por su categoría, marca, peso, tamaño, color, descripción, ingredientes, etc.

![$$F :: observation \times classFeatures \rightarrow yes/no$$](/wp-content/ql-cache/quicklatex.com-24d0cd194e1af3b148fc90ce84fe7e50_l3.png)

Sin embargo, no es tan común tener características que describan las clases. ¿Cómo describirías la intención de un usuario en un chat? ¿Cómo describirías un modelo de automóvil o un animal?

Sería posible hacerlo. Pero, mi apuesta es que no tendrás acceso a tales datos.

¿Qué hacer en tal situación?

Un recurso en la manga

Debes estar de acuerdo en que tienes las características de las entidades pertenecientes a esa clase, ¿verdad? En ese caso, puedes obtener características sobre la distribución de las observaciones en esa clase. Valores estadísticos como el promedio, mínimo, máximo y varianza de las características para las observaciones en esa clase. Ahora tienes características que describen la clase. De nada.

Oye Kelwin, pero sabes, ¿no son las características algo anticuado? Todos trabajamos con deep learning hoy en día y dejamos que el modelo aprenda sus propias características. Me alegra que preguntes, aprendiz.

¿Quieres profundizar en esta idea?

Agenda una reunión con Kelwin Fernandes

Conoce a Kelwin Más información

Puedes entrenar una red neuronal siamesa que responda la pregunta:

¿Pertenecen estas dos observaciones a la misma clase?

O, en un lenguaje más formal:

![$$F :: observation_1 \times observation_2 \rightarrow yes/no$$](/wp-content/ql-cache/quicklatex.com-f15d99a8f67510f442b694ac323a0b53_l3.png)

Ahora, puedes hacer la pregunta comparando tu nueva observación de prueba contra todos los puntos de datos de entrenamiento, agregar las probabilidades por clase (por ejemplo, máximo, promedio) y devolver la clase con la puntuación más alta. Básicamente, puedes transformar un problema multiclase en uno de aprendizaje de similitud.

¿Estás loco? Esto no escalará en absoluto. Bueno, sí escalará. En primer lugar, solo necesitas indexar todas las observaciones de entrenamiento. Así, siempre que llegue nueva entrada, ejecutas tu red neuronal en la instancia de entrada para obtener sus características latentes más una comparación simple de vecinos más cercanos contra todos los otros puntos de datos.

¿Aún así, puedes imaginarte haciendo eso sobre millones de observaciones? Por supuesto que no, pero siempre puedes elegir pivotes que representen tu clase adecuadamente utilizando cualquier técnica, como k-medoids en el espacio latente. Facilísimo.

Ahora tienes un modelo escalable que se adapta a nuevas clases sin necesidad de reentrenamiento.

Hemos utilizado este truco en varias industrias y casos de uso, y siempre se ha pagado solo.

Curso

The Machine Learning Spectrum

Aprende más trucos como este en nuestro curso de Machine Learning.

Más información

Ganas mucha eficiencia operativa, además de mitigar el problema de clases con baja frecuencia.

¿Ya no es relevante una clase? Retira sus observaciones de tu índice.

¿Hay una clase nueva? Añade nuevas observaciones a tu índice.

¡Así de fácil!

Hay un par de trucos adicionales que podemos enseñarte, pero tendrás que esperar a otro artículo. Tengo que irme. Pero tú no. Así que suscríbete ahora a nuestro boletín a continuación para mantenerte informado.