Comment nous avons gagné dans SmartMailHack 2

Le week-end dernier (14-15 juillet), un autre hackathon SmartMailHack a eu lieu au bureau du groupe Mail.Ru. On nous a demandé de "proposer une fonctionnalité qui vous permettra d'accéder aux données du courrier et d'interagir plus efficacement avec eux".


Description des données, idées et solutions


Nous avons obtenu une boîte de test avec plus de 1500 messages, ainsi qu'un accès complet à celle-ci via l'API. Les organisateurs ont fourni un grand manuel détaillé sur son utilisation (livre de 547 pages). À l'aide d'un jeton et de requêtes JSON simples, nous pourrions recevoir toutes les informations nécessaires sur le courrier: lettres, noms d'expéditeur, diverses caractéristiques.


Après avoir discuté que chacun de nous a environ plusieurs milliers de lettres non lues provenant des listes de diffusion dans le courrier, nous avons décidé de résoudre ce problème. Dans notre cas, la pertinence de la lettre n'est plus déterminée par l'heure à laquelle elle est apparue dans la boîte aux lettres. Et étant donné que toutes les lettres ne seront pas ouvertes, il est préférable de ne montrer à l'utilisateur que celles d'entre elles qu'il est susceptible d'ouvrir. Et tout le reste peut être emporté en enfer. Nous avons donc décidé de faire un tri pour le courrier.


Les lettres de tri étaient censées être par catégorie, et les catégories devraient être placées à l'intérieur des tuiles (salut, Trello). La rangée supérieure de tuiles combinait la signification des lettres de différents expéditeurs. Il peut y avoir des «voyages», «inscription», «correspondance avec Vasya», «événements», «finances» et ainsi de suite, au total environ 10 catégories. La deuxième rangée était des tuiles avec les offres les plus cool des entreprises. Nous avons recherché les codes promotionnels les plus pertinents, les promotions les plus remises, les offres les plus intéressantes et les avons affichés ici, regroupés par entreprise. Ensuite, toutes les autres lettres distribuées aux sociétés d'envoi ont suivi, et ces expéditeurs, à leur tour, ont été répartis en catégories ("Alimentation", "Cosmétique", "Electronique" et autres). De plus, les catégories étaient également classées selon la pertinence des lettres, et seules les lettres qui franchissaient un certain seuil de pertinence étaient affichées à l'intérieur. Après avoir renforcé l'idée avec les mots «Trouver ce qui est nécessaire et se débarrasser de l'excès», nous sommes passés au ML.


Apprentissage automatique


Nous avons décidé de construire trois modèles:


  • un classificateur de plus de 30 catégories que nous avons désigné comme élémentaire pour tous les utilisateurs;
  • regroupement et mise en évidence de nouvelles catégories en fonction des préférences des utilisateurs;
  • classer les lettres dans la catégorie, du plus pertinent au moins.


Signes


Il semble que cet élément devrait être décrit individuellement pour chaque tâche. Cependant, nous avons généré un jeu de données d'entités communes et formé tous les modèles sur celui-ci. Il n'y avait pas de temps pour une sélection rigoureuse.


Il y avait un tas de signes binaires qui sont déchargés à l'aide de l'API. Cependant, la plupart d'entre eux ont été générés sur les textes:


  • tf-idf sur une collection de documents;
  • Intégrations reçues avec Word2Vec;
  • symptômes comportementaux tels que:
    - le nombre de messages lus dans la dernière fenêtre (il y a 1, 2, 5 semaines);
    - le nombre de messages de cela.

Tâche de classification


Nous avons marqué à la main 1000 lettres pour l'entraînement. Il s'est avéré que ce n'est pas un travail aussi lent et fastidieux que cela puisse paraître au premier abord. Si vous utilisez des adresses et des en-têtes, vous pouvez accélérer considérablement le travail. Par exemple, Lamoda envoie presque toujours des lettres à la catégorie «Vêtements».


Ensuite, nous formons LightGBM sur l'ensemble des signes et obtenons la qualité d'une précision de 0,913 et de 0,892 mesures f1, ce que nous avons déterminé comme un très bon résultat au niveau de la ligne de base. Cela montre que les lettres peuvent être très bien classées.


Tâche de classement


En tant que variable cible, nous avons utilisé l'indicateur binaire 0/1 - si le message a été lu par l'utilisateur. Ils ont ensuite été classés en fonction de la probabilité prédite par le modèle, car c'est précisément ce qui reflète la confiance du modèle dans la lecture ou non du message par la personne.


Ici, nous avons également formé LightGBM sur l'ensemble des fonctionnalités et obtenu une qualité d'environ 0,816 auc-roc.


Regroupement et mise en évidence de nouvelles catégories


En plus des catégories principales, nous avons la catégorie «Autre». De là, vous pouvez mettre en évidence de nouveaux sujets.


Nous avons formé le DBSCAN standard sur les lettres de ce groupe, puis nous avons sélectionné les clusters dans lesquels il y avait beaucoup de messages (le seuil peut être optimisé, mais il a été fixé par accident). Par exemple, la modélisation thématique peut être définie sur une collection de documents d'un cluster, obtenir le sujet le plus pertinent pour un cluster donné et le sélectionner dans un groupe distinct. Il n'y avait pas assez de temps pour valider cet algorithme.


Ainsi, les lettres entrantes passent par le classificateur, si elles entrent dans la catégorie «Autre» - elles sont regroupées, de nouveaux sujets essaient de se démarquer, puis le classement a lieu. Une demande de backend est envoyée, qui agrège tout, et le frontend est rendu.





Idées restantes


  • améliorer les modèles d'apprentissage automatique;
  • recueillir des données auprès d'un plus grand nombre d'utilisateurs pour mieux prédire le comportement de chacun d'eux;
  • validation approfondie des nouvelles catégories émergentes;
  • l'utilisation d'images comme signes, par exemple, l'attribution de plongements à partir de réseaux de neurones pré-formés.

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


All Articles