Cómo ganamos en SmartMailHack 2

El pasado fin de semana (14-15 de julio), se realizó otro hackathon SmartMailHack en la oficina del Grupo Mail.Ru. Se nos pidió "crear una función que le permita acceder a los datos del correo e interactuar de manera más efectiva con ellos".


Descripción de datos, ideas y soluciones


Obtuvimos un cuadro de prueba con más de 1500 mensajes, así como acceso completo a él a través de la API. Los organizadores proporcionaron un manual grande y detallado sobre su uso (libro de 547 páginas). Con la ayuda de un token y solicitudes JSON simples, podríamos recibir toda la información necesaria sobre el correo: cartas, nombres de remitentes, diversas características.


Habiendo discutido que cada uno de nosotros tiene varios miles de cartas no leídas de las listas de correo en el correo, decidimos tratar este problema. En nuestro caso, la relevancia de la carta ya no está determinada por el momento en que apareció en el buzón. Y basándose en el hecho de que no se abrirán todas las cartas, entonces es mejor mostrarle al usuario solo aquellas que probablemente abrirá. Y todo lo demás puede ser llevado al infierno. Así que decidimos hacer una especie de correo.


Se suponía que las letras de clasificación debían ser por categoría, y las categorías deberían colocarse dentro de las fichas (hola, Trello). La fila superior de mosaicos combina el significado de las letras de diferentes remitentes. Puede haber "Viajes", "Registro", "Correspondencia con Vasya", "Eventos", "Finanzas" y así sucesivamente, en total unas 10 categorías. La segunda fila eran azulejos con las mejores ofertas de las empresas. Buscamos los códigos promocionales más relevantes, las promociones con más descuentos, las ofertas más valiosas, y los mostramos aquí, agrupados por empresa. Luego vinieron todas las otras cartas distribuidas por las compañías emisoras, y estos remitentes, a su vez, se dispersaron en categorías ("Alimentos", "Cosméticos", "Electrónica" y otros). Además, las categorías también se clasificaron según la relevancia de las letras, y solo las letras que cruzaban un cierto umbral de relevancia se mostraban dentro. Habiendo reforzado la idea con las palabras "Encuentre lo que se necesita y elimine el exceso", subimos a ML.


Aprendizaje automático


Decidimos construir tres modelos:


  • un clasificador de más de 30 categorías que hemos designado como básicas para todos los usuarios;
  • agrupar y resaltar nuevas categorías basadas en las preferencias del usuario;
  • Clasificación de letras dentro de la categoría, desde la más relevante hasta la menos.


Signos


Parece que este elemento debe describirse individualmente para cada tarea. Sin embargo, generamos un conjunto de datos de características comunes y capacitamos a todos los modelos en él. No había tiempo para una cuidadosa selección.


Hubo un montón de signos binarios que se descargan mediante la API. Sin embargo, la mayoría de ellos se generaron en los textos:


  • tf-idf en una colección de documentos;
  • Inserciones recibidas con Word2Vec;
  • síntomas de comportamiento como:
    - el número de mensajes leídos en la última ventana (hace 1, 2, 5 semanas);
    - el número de mensajes de esto.

Tarea de clasificación


Marcamos con las manos 1000 letras para entrenamiento. Resultó que este no es un trabajo tan lento y tedioso como podría parecer al principio. Si usa direcciones y encabezados, puede acelerar significativamente el trabajo. Por ejemplo, Lamoda casi siempre envía cartas a la categoría "Ropa".


Luego, entrenamos a LightGBM en todo el conjunto de signos y obtenemos la calidad de precisión 0.913 y 0.892 f1, lo que determinamos como un muy buen resultado a nivel de línea base. Esto muestra que las letras se pueden clasificar muy bien.


Tarea de clasificación


Como la variable de destino, utilizamos el indicador binario 0/1, si el usuario leyó el mensaje. Se clasificaron aún más según la probabilidad predicha por el modelo, ya que esto es precisamente lo que refleja la confianza del modelo en si la persona leerá el mensaje o no.


Aquí también capacitamos a LightGBM en todo el conjunto de características y obtuvimos una calidad de aproximadamente 0.816 auc-roc.


Agrupación y resaltado de nuevas categorías.


Además de las categorías principales, tenemos la categoría "Otros". Desde allí puedes resaltar nuevos temas.


Capacitamos al DBSCAN estándar en letras de este grupo, y luego seleccionamos aquellos grupos en los que había muchos mensajes (el umbral se puede optimizar, pero se solucionó por accidente). Por ejemplo, el modelado temático se puede establecer en una colección de documentos de un grupo, obtener el tema más relevante para un grupo determinado y seleccionarlo en un grupo separado. No hubo tiempo suficiente para validar este algoritmo.


Por lo tanto, las letras entrantes se pasan a través del clasificador, si entran en la categoría "Otros": se agrupan, se tratan de destacar nuevos temas y luego se realiza la clasificación. Se envía una solicitud de back-end, que agrega todo, y se representa el frontend.





Ideas restantes


  • mejora de modelos de aprendizaje automático;
  • recolectando datos de más usuarios para predecir mejor el comportamiento de cada uno de ellos;
  • validación exhaustiva de nuevas categorías emergentes;
  • el uso de imágenes como signos, por ejemplo, la asignación de incrustaciones de redes neuronales pre-entrenadas.

Source: https://habr.com/ru/post/es417531/


All Articles