Hackathon SNA 2019

En février-mars 2019, un concours a été organisé pour classer le fil des réseaux sociaux Hackathon SNA 2019, dans lequel notre équipe a pris la première place. Dans l'article, je parlerai de l'organisation du concours, des méthodes que nous avons essayées et des paramètres catboost pour la formation sur le big data.

Hackathon SNA 2019

Hackathon SNA

C'est la troisième fois qu'un hackathon sous ce nom est organisé. Il est organisé par le réseau social ok.ru, respectivement, la tâche et les données sont directement liées à ce réseau social.
Dans ce cas, le SNA (analyse des réseaux sociaux) est plus correctement compris non pas comme une analyse d'un graphe social, mais plutôt comme une analyse d'un réseau social.

  • En 2014, la tâche consistait à prédire le nombre de likes qu’une publication obtiendrait.
  • En 2016 - la tâche VVZ (vous la connaissez peut-être), plus proche de l'analyse du graphe social.
  • En 2019, classement du flux de l’utilisateur en fonction de la probabilité que l’utilisateur aime la publication.

Je ne peux pas parler de 2014, mais en 2016 et 2019, en plus des capacités d'analyse de données, des compétences nécessaires pour travailler avec le Big Data étaient également requises. Je pense que c'est la combinaison des problèmes d'apprentissage automatique et de traitement du Big Data qui m'a attiré vers ces compétitions, et mon expérience dans ces domaines m'a aidé à gagner.

mlbootcamp

En 2019, le concours était organisé sur la plateforme https://mlbootcamp.ru.

Le concours a débuté en ligne le 7 février et comprenait 3 tâches. Tout le monde pouvait s'inscrire sur le site, télécharger de base et chargez votre voiture pendant quelques heures. À la fin de l'étape en ligne le 15 mars, les 15 premiers de chaque épreuve de saut d'obstacles ont été invités au bureau de Mail.ru pour l'étape hors ligne, qui s'est déroulée du 30 mars au 1er avril.

Tâche

Les données sources fournissent des ID utilisateur (userId) et des ID de publication (objectId). Si une publication a été présentée à l'utilisateur, les données contiennent une ligne contenant l'ID utilisateur, l'ID objet, les réactions de l'utilisateur à cette publication (commentaires) et un ensemble de diverses fonctionnalités ou liens vers des images et des textes.

identifiant d'utilisateur ID d'objet identifiant du propriétaire Réactions satellite
3555 22 5677 [j'ai aimé, cliqué] [hachage1]
12842 55 32144 [je n'ai pas aimé] [hachage2, hachage3]
13145 35 5677 [cliqué, partagé] [hachage2]

L'ensemble de données de test contient une structure similaire, mais le champ de commentaires est manquant. La tâche consiste à prédire la présence de la réaction « aimée » dans le champ de rétroaction.
Le dossier de soumission a la structure suivante :

identifiant d'utilisateur Liste triée[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

La métrique est l’AUC ROC moyenne pour les utilisateurs.

Une description plus détaillée des données peut être trouvée sur site Internet du conseil. Vous pouvez également y télécharger des données, notamment des tests et des images.

Scène en ligne

Au stade en ligne, la tâche a été divisée en 3 parties

  • Système collaboratif — inclut toutes les fonctionnalités à l'exception des images et des textes ;
  • Изображения — inclut uniquement des informations sur les images ;
  • Textes — inclut des informations uniquement sur les textes.

Étape hors ligne

Au stade hors ligne, les données incluaient toutes les fonctionnalités, tandis que les textes et les images étaient rares. Il y avait 1,5 fois plus de lignes dans l'ensemble de données, alors qu'il y en avait déjà beaucoup.

Résolution de problèmes

Depuis que je fais du CV au travail, j'ai commencé mon parcours dans ce concours avec la tâche « Images ». Les données fournies étaient userId, objectId,ownerId (le groupe dans lequel la publication a été publiée), les horodatages pour la création et l'affichage de la publication et, bien sûr, l'image de cette publication.
Après avoir généré plusieurs fonctionnalités basées sur des horodatages, l'idée suivante était de prendre l'avant-dernière couche du neurone pré-entraîné sur imagenet et d'envoyer ces intégrations en boosting.

Hackathon SNA 2019

Les résultats n'étaient pas impressionnants. Les intégrations du neurone imagenet ne sont pas pertinentes, ai-je pensé, je dois créer mon propre encodeur automatique.

Hackathon SNA 2019

Cela a pris beaucoup de temps et le résultat ne s'est pas amélioré.

Génération de fonctionnalités

Travailler avec des images prend beaucoup de temps, j'ai donc décidé de faire quelque chose de plus simple.
Comme vous pouvez le voir immédiatement, il existe plusieurs fonctionnalités catégorielles dans l'ensemble de données, et pour ne pas trop m'embêter, j'ai juste pris catboost. La solution était excellente, sans aucun réglage, je suis immédiatement arrivé à la première ligne du classement.

Il y a beaucoup de données et elles sont présentées au format parquet, donc sans y réfléchir à deux fois, j'ai pris Scala et j'ai commencé à tout écrire dans Spark.

Les fonctionnalités les plus simples qui ont donné plus de croissance que les intégrations d'images :

  • combien de fois objectId, userId etownerId sont apparus dans les données (doivent être en corrélation avec la popularité) ;
  • combien de messages userId a vu de OwnerId (doit être en corrélation avec l'intérêt de l'utilisateur pour le groupe) ;
  • combien d’ID utilisateur uniques ont consulté les publications de OwnerId (reflète la taille de l’audience du groupe).

À partir des horodatages, il était possible d'obtenir l'heure de la journée à laquelle l'utilisateur regardait le flux (matin/après-midi/soir/nuit). En combinant ces catégories, vous pouvez continuer à générer des fonctionnalités :

  • combien de fois userId s'est connecté le soir ;
  • à quelle heure ce message est le plus souvent affiché (objectId) et ainsi de suite.

Tout cela a progressivement amélioré les paramètres. Mais la taille de l'ensemble de données de formation est d'environ 20 millions d'enregistrements, donc l'ajout de fonctionnalités a considérablement ralenti la formation.

J'ai repensé mon approche de l'utilisation des données. Bien que les données dépendent du temps, je n'ai vu aucune fuite d'informations évidente « dans le futur », néanmoins, juste au cas où, je les ai décomposées comme ceci :

Hackathon SNA 2019

L'ensemble de formations qui nous a été proposé (février et 2 semaines de mars) était divisé en 2 parties.
Le modèle a été formé sur les données des N derniers jours. Les agrégations décrites ci-dessus ont été construites sur toutes les données, y compris le test. Dans le même temps, des données sont apparues sur lesquelles il est possible de construire différents codages de la variable cible. L'approche la plus simple consiste à réutiliser du code qui crée déjà de nouvelles fonctionnalités, et à lui fournir simplement des données sur lesquelles il ne sera pas entraîné et cible = 1.

Ainsi, nous avons obtenu des fonctionnalités similaires :

  • Combien de fois userId a-t-il vu une publication dans le groupeownerId ;
  • Combien de fois userId a aimé la publication dans le groupe OwnerId ;
  • Pourcentage de publications que userId a aimées depuis OwnerId.

Autrement dit, il s'est avéré codage cible moyen sur une partie de l'ensemble de données pour diverses combinaisons de caractéristiques catégorielles. En principe, catboost construit également un codage cible et de ce point de vue, il n'y a aucun avantage, mais, par exemple, il est devenu possible de compter le nombre d'utilisateurs uniques qui ont aimé les publications de ce groupe. Dans le même temps, l'objectif principal a été atteint : mon ensemble de données a été réduit plusieurs fois et il a été possible de continuer à générer des fonctionnalités.

Alors que catboost peut créer un encodage uniquement en fonction de la réaction appréciée, les commentaires ont d'autres réactions : repartagé, détesté, non apprécié, cliqué, ignoré, les encodages pour lesquels peuvent être effectués manuellement. J'ai recalculé toutes sortes d'agrégats et éliminé les caractéristiques de faible importance afin de ne pas gonfler l'ensemble de données.

À ce moment-là, j’étais largement en première place. La seule chose qui prêtait à confusion était que les intégrations d’images ne montraient presque aucune croissance. L'idée est venue de tout donner pour catboost. Nous regroupons les images Kmeans et obtenons une nouvelle fonctionnalité catégorielle imageCat.

Voici quelques classes après filtrage manuel et fusion des clusters obtenus à partir de KMeans.

Hackathon SNA 2019

Sur la base d'imageCat, nous générons :

  • Nouvelles fonctionnalités catégorielles :
    • Quelle imageCat a été le plus souvent consultée par userId ;
    • Quelle imageCat affiche le plus souvent le OwnerId ;
    • Quelle imageCat a été appréciée le plus souvent par userId ;
  • Divers compteurs:
    • Combien d'imageCat uniques ont consulté userId ;
    • Environ 15 fonctionnalités similaires plus un encodage cible comme décrit ci-dessus.

Textes

Les résultats du concours d'images me convenaient et j'ai décidé de m'essayer aux textes. Je n'ai pas beaucoup travaillé avec des textes auparavant et, bêtement, j'ai tué la journée sur tf-idf et svd. Ensuite, j'ai vu la ligne de base avec doc2vec, qui fait exactement ce dont j'ai besoin. Après avoir légèrement ajusté les paramètres doc2vec, j'ai obtenu des intégrations de texte.

Et puis j'ai simplement réutilisé le code pour les images, dans lequel j'ai remplacé les intégrations d'images par des intégrations de texte. En conséquence, j'ai pris la 2e place au concours de texte.

Système collaboratif

Il restait une compétition que je n'avais pas encore « poussée » avec un bâton, et à en juger par l'AUC dans le classement, les résultats de cette compétition particulière auraient dû avoir le plus grand impact sur la scène hors ligne.
J'ai pris toutes les caractéristiques qui figuraient dans les données sources, j'ai sélectionné les caractéristiques et j'ai calculé les mêmes agrégats que pour les images, à l'exception des caractéristiques basées sur les images elles-mêmes. Le simple fait de mettre cela dans catboost m'a amené à la 2ème place.

Premières étapes de l'optimisation de catboost

Une première et deux deuxièmes places m'ont plu, mais il était entendu que je n'avais rien fait de spécial, ce qui signifie que je pouvais m'attendre à une perte de position.

Le but du concours est de classer les publications au sein de l'utilisateur, et pendant tout ce temps, je résolvais le problème de classification, c'est-à-dire l'optimisation de la mauvaise métrique.

Je vais donner un exemple simple:

identifiant d'utilisateur ID d'objet prédiction vérité sur le terrain
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 1
1 14 0.5 0
2 15 0.4 0
2 16 0.3 1

Faisons un petit réarrangement

identifiant d'utilisateur ID d'objet prédiction vérité sur le terrain
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 0
2 16 0.5 1
2 15 0.4 0
1 14 0.3 1

Nous obtenons les résultats suivants :

Modèle ASC Utilisateur1 AUC Utilisateur2 AUC ASC moyenne
Option 1 0,8 1,0 0,0 0,5
Option 2 0,7 0,75 1,0 0,875

Comme vous pouvez le constater, améliorer la métrique globale de l'AUC ne signifie pas améliorer la métrique AUC moyenne au sein d'un utilisateur.

Boost de chat sait comment optimiser les mesures de classement de la boite. J'ai lu des informations sur les mesures de classement, réussites lorsque vous utilisez catboost et configurez YetiRankPairwise pour qu'il s'entraîne pendant la nuit. Le résultat n'était pas impressionnant. Décidant que j'étais sous-entraîné, j'ai changé la fonction d'erreur en QueryRMSE, qui, à en juger par la documentation catboost, converge plus rapidement. Au final, j'ai obtenu les mêmes résultats que lors de l'entraînement au classement, mais les ensembles de ces deux modèles ont donné une bonne augmentation, ce qui m'a amené à la première place dans les trois compétitions.

5 minutes avant la clôture de l'étape en ligne du concours « Systèmes collaboratifs », Sergueï Shalnov m'a placé à la deuxième place. Nous avons parcouru le chemin plus loin ensemble.

Préparation à l'étape hors ligne

La victoire sur la scène en ligne nous était garantie avec une carte vidéo RTX 2080 TI, mais le prix principal de 300 000 roubles et, très probablement, même la première place finale nous ont obligés à travailler pendant ces 2 semaines.

Il s'est avéré que Sergey a également utilisé le catboost. Nous avons échangé des idées et des fonctionnalités, et j'ai découvert reportage d'Anna Veronica Dorogush qui contenait des réponses à beaucoup de mes questions, et même à celles que je n'avais pas encore eues à ce moment-là.

La visualisation du rapport m'a amené à l'idée que nous devons rétablir tous les paramètres à leur valeur par défaut et effectuer les réglages très soigneusement et seulement après avoir corrigé un ensemble de fonctionnalités. Maintenant, un entraînement durait environ 15 heures, mais un modèle a réussi à obtenir une vitesse meilleure que celle obtenue dans l'ensemble avec classement.

Génération de fonctionnalités

Dans le cadre du concours Collaborative Systems, un grand nombre de fonctionnalités sont jugées importantes pour le modèle. Par exemple, auditweights_spark_svd - le signe le plus important, mais il n'y a aucune information sur sa signification. J'ai pensé qu'il serait intéressant de compter les différents agrégats en fonction de caractéristiques importantes. Par exemple, auditweights_spark_svd moyen par utilisateur, par groupe, par objet. La même chose peut être calculée en utilisant des données sur lesquelles aucun entraînement n'est effectué et cible = 1, c'est-à-dire moyenne auditweights_spark_svd par utilisateur par objets qu'il a aimé. Signes importants en plus auditweights_spark_svd, il y en avait plusieurs. En voici quelques uns:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Par exemple, la moyenne auditweightsCtrGender selon userId, cela s'est avéré être une fonctionnalité importante, tout comme la valeur moyenne userOwnerCounterCreateLikes par userId+ownerId. Cela devrait déjà vous faire penser qu’il faut comprendre la signification des champs.

Des caractéristiques importantes étaient également auditweightsLikesCount и auditweightsShowsCount. En les divisant les uns par les autres, on a obtenu une caractéristique encore plus importante.

Fuites de données

La modélisation de la concurrence et de la production sont des tâches très différentes. Lors de la préparation des données, il est très difficile de prendre en compte tous les détails et de ne pas transmettre certaines informations non triviales sur la variable cible dans le test. Si nous créons une solution de production, nous essaierons d'éviter d'utiliser des fuites de données lors de la formation du modèle. Mais si nous voulons gagner la concurrence, les fuites de données constituent la meilleure option.

Après avoir étudié les données, vous pouvez voir que selon les valeurs objectId auditweightsLikesCount и auditweightsShowsCount changement, ce qui signifie que le rapport des valeurs maximales de ces fonctionnalités reflétera bien mieux la post-conversion que le rapport au moment de l'affichage.

La première fuite que nous avons trouvée est auditweightsLikesCountMax/auditweightsShowsCountMax.
Mais que se passe-t-il si nous regardons les données de plus près ? Trions par date de spectacle et obtenons :

ID d'objet identifiant d'utilisateur auditweightsShowsCount auditweightsLikesCount cible (est aimée)
1 1 12 3 probablement pas
1 2 15 3 peut-être oui
1 3 16 4

J'ai été surpris lorsque j'ai trouvé le premier exemple de ce type et il s'est avéré que ma prédiction ne s'était pas réalisée. Mais, compte tenu du fait que les valeurs maximales de ces caractéristiques au sein de l'objet ont augmenté, nous n'avons pas été paresseux et avons décidé de trouver auditweightsShowsCountNext и auditweightsLikesCountSuivant, c'est-à-dire les valeurs à l'instant suivant. En ajoutant une fonctionnalité
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) nous avons fait un saut brusque rapidement.
Des fuites similaires pourraient être utilisées en trouvant les valeurs suivantes pour userOwnerCounterCreateLikes dans userId+ownerId et, par exemple, auditweightsCtrGender dans objectId+userGender. Nous avons trouvé 6 champs similaires présentant des fuites et en avons extrait autant d’informations que possible.

À ce moment-là, nous avions extrait autant d'informations que possible des fonctionnalités collaboratives, mais nous ne sommes pas revenus aux concours d'images et de textes. J'ai eu une bonne idée de vérifier : combien donnent les fonctionnalités directement basées sur des images ou des textes dans les compétitions pertinentes ?

Il n'y a eu aucune fuite dans les concours d'images et de texte, mais à ce moment-là, j'avais renvoyé les paramètres catboost par défaut, nettoyé le code et ajouté quelques fonctionnalités. Le total était de :

décision vite
Maximum avec images 0.6411
Aucune image maximale 0.6297
Résultat de la deuxième place 0.6295

décision vite
Maximum avec textes 0.666
Maximum sans textes 0.660
Résultat de la deuxième place 0.656

décision vite
Maximum en collaboratif 0.745
Résultat de la deuxième place 0.723

Il est devenu évident que nous ne pourrions probablement pas tirer grand-chose des textes et des images, et après avoir essayé quelques-unes des idées les plus intéressantes, nous avons arrêté de travailler avec elles.

La génération ultérieure de fonctionnalités dans les systèmes collaboratifs n'a pas donné d'augmentation et nous avons commencé le classement. Au stade en ligne, l'ensemble classement et classement m'a donné une petite augmentation, car il s'est avéré que j'avais sous-entraîné le classement. Aucune des fonctions d'erreur, y compris YetiRanlPairwise, n'a produit un résultat proche du résultat obtenu par LogLoss (0,745 contre 0,725). Il y avait encore de l'espoir pour QueryCrossEntropy, qui n'a pas pu être lancé.

Étape hors ligne

Au stade hors ligne, la structure des données est restée la même, mais il y a eu des changements mineurs :

  • les identifiants userId, objectId,ownerId ont été rerandomisés ;
  • plusieurs panneaux ont été supprimés et plusieurs ont été renommés ;
  • les données ont augmenté d'environ 1,5 fois.

En plus des difficultés énumérées, il y avait un gros plus : l'équipe s'est vu attribuer un gros serveur avec une RTX 2080TI. J'apprécie htop depuis longtemps.
Hackathon SNA 2019

Il n'y avait qu'une seule idée : simplement reproduire ce qui existe déjà. Après avoir passé quelques heures à configurer l'environnement sur le serveur, nous avons progressivement commencé à vérifier que les résultats étaient reproductibles. Le principal problème auquel nous sommes confrontés est l’augmentation du volume de données. Nous avons décidé de réduire un peu la charge et de définir le paramètre catboost ctr_complexity=1. Cela réduit un peu la vitesse, mais mon modèle a commencé à fonctionner, le résultat était bon - 0,733. Sergey, contrairement à moi, n'a pas divisé les données en 2 parties et s'est entraîné sur toutes les données, bien que cela ait donné les meilleurs résultats au stade en ligne, au stade hors ligne, il y a eu de nombreuses difficultés. Si nous prenions toutes les fonctionnalités que nous avons générées et essayions de les intégrer dans catboost, alors rien ne fonctionnerait au stade en ligne. Sergey a optimisé les types, par exemple en convertissant les types float64 en float32. Dans cet article, Vous pouvez trouver des informations sur l'optimisation de la mémoire chez les pandas. En conséquence, Sergey s'est entraîné sur le processeur en utilisant toutes les données et a obtenu environ 0,735.

Ces résultats étaient suffisants pour gagner, mais nous cachions notre véritable vitesse et ne pouvions pas être sûrs que les autres équipes ne faisaient pas de même.

Combattez jusqu'au dernier

Réglage du Catboost

Notre solution a été entièrement reproduite, nous avons ajouté les fonctionnalités des données texte et des images, il ne restait donc plus qu'à régler les paramètres de catboost. Sergey s'est entraîné sur le CPU avec un petit nombre d'itérations, et je me suis entraîné sur celui avec ctr_complexity=1. Il restait un jour, et si vous ajoutiez simplement des itérations ou augmentiez la complexité ctr_, alors le matin, vous pourriez obtenir une vitesse encore meilleure et marcher toute la journée.

Au stade hors ligne, les vitesses pourraient être très facilement masquées en choisissant simplement la meilleure solution sur le site. Nous nous attendions à des changements drastiques dans le classement dans les dernières minutes avant la clôture des soumissions et avons décidé de ne pas nous arrêter.

Grâce à la vidéo d'Anna, j'ai appris que pour améliorer la qualité du modèle, il est préférable de sélectionner les paramètres suivants :

  • taux d'apprentissage — La valeur par défaut est calculée en fonction de la taille de l'ensemble de données. L'augmentation du learning_rate nécessite d'augmenter le nombre d'itérations.
  • l2_leaf_reg — Coefficient de régularisation, valeur par défaut 3, choisir de préférence entre 2 et 30. Diminuer la valeur entraîne une augmentation du surajustement.
  • température_d'ensachage - ajoute une randomisation aux poids des objets dans l'échantillon. La valeur par défaut est 1, où les pondérations sont tirées d'une distribution exponentielle. La diminution de la valeur entraîne une augmentation du surajustement.
  • force_aléatoire — Affecte le choix des fractionnements à une itération spécifique. Plus random_strength est élevé, plus les chances qu'une division de faible importance soit sélectionnée sont élevées. A chaque itération suivante, le caractère aléatoire diminue. La diminution de la valeur entraîne une augmentation du surajustement.

D'autres paramètres ont un effet beaucoup plus faible sur le résultat final, je n'ai donc pas essayé de les sélectionner. Une itération d'entraînement sur mon ensemble de données GPU avec ctr_complexity=1 a pris 20 minutes, et les paramètres sélectionnés sur l'ensemble de données réduit étaient légèrement différents de ceux optimaux sur l'ensemble de données complet. Au final, j'ai fait environ 30 itérations sur 10 % des données, puis environ 10 itérations supplémentaires sur toutes les données. Il s'est avéré quelque chose comme ceci :

  • taux d'apprentissage J'ai augmenté de 40 % par rapport à la valeur par défaut ;
  • l2_leaf_reg je l'ai laissé pareil ;
  • température_d'ensachage и force_aléatoire réduit à 0,8.

Nous pouvons conclure que le modèle a été sous-entraîné avec les paramètres par défaut.

J'ai été très surpris quand j'ai vu le résultat sur le classement :

Modèle Modèle 1 Modèle 2 Modèle 3 ensemble
Sans réglage 0.7403 0.7404 0.7404 0.7407
Avec réglage 0.7406 0.7405 0.7406 0.7408

J'ai conclu par moi-même que si une application rapide du modèle n'est pas nécessaire, alors il est préférable de remplacer la sélection des paramètres par un ensemble de plusieurs modèles utilisant des paramètres non optimisés.

Sergey optimisait la taille de l'ensemble de données pour l'exécuter sur le GPU. L'option la plus simple consiste à supprimer une partie des données, mais cela peut se faire de plusieurs manières :

  • supprimer progressivement les données les plus anciennes (début février) jusqu'à ce que l'ensemble de données commence à tenir en mémoire ;
  • supprimer les fonctionnalités de moindre importance ;
  • supprimer les identifiants utilisateur pour lesquels il n'y a qu'une seule entrée ;
  • ne laissez que les identifiants utilisateur qui sont dans le test.

Et finalement, créez un ensemble avec toutes les options.

Le dernier ensemble

En fin de soirée du dernier jour, nous avions présenté un ensemble de nos modèles qui donnait 0,742. Du jour au lendemain, j'ai lancé mon modèle avec ctr_complexity=2 et au lieu de 30 minutes il s'est entraîné pendant 5 heures. Ce n'est qu'à 4 heures du matin que cela a été compté et j'ai fait le dernier ensemble, qui a donné 0,7433 au classement public.

En raison de différentes approches pour résoudre le problème, nos prédictions n'étaient pas fortement corrélées, ce qui a donné une bonne augmentation de l'ensemble. Pour obtenir un bon ensemble, il est préférable d'utiliser les prédictions du modèle brut prédire (prediction_type='RawFormulaVal') et de définir scale_pos_weight=neg_count/pos_count.

Hackathon SNA 2019

Sur le site, vous pouvez voir résultats finaux sur le classement privé.

Autres solutions

De nombreuses équipes ont suivi les canons des algorithmes du système de recommandation. N'étant pas expert dans ce domaine, je ne peux pas les évaluer, mais je retiens 2 solutions intéressantes.

  • La solution de Nikolaï Anokhin. Nikolay, étant un employé de Mail.ru, n'a pas postulé pour des prix, son objectif n'était donc pas d'atteindre une vitesse maximale, mais d'obtenir une solution facilement évolutive.
  • Décision de l'équipe lauréate du Prix du Jury basée sur cet article de Facebook, a permis un très bon regroupement d'images sans travail manuel.

Conclusion

Ce qui m'est le plus resté en mémoire :

  • S'il existe des caractéristiques catégorielles dans les données et que vous savez comment effectuer correctement l'encodage cible, il est toujours préférable d'essayer catboost.
  • Si vous participez à un concours, vous ne devriez pas perdre de temps à sélectionner des paramètres autres que learning_rate et itérations. Une solution plus rapide consiste à réaliser un ensemble de plusieurs modèles.
  • Les boostings peuvent apprendre sur le GPU. Catboost peut apprendre très rapidement sur le GPU, mais il consomme beaucoup de mémoire.
  • Lors du développement et du test des idées, il est préférable de définir un petit rsm~=0.2 (CPU uniquement) et ctr_complexity=1.
  • Contrairement à d'autres équipes, l'ensemble de nos modèles a donné une forte augmentation. Nous avons seulement échangé des idées et écrit dans des langues différentes. Nous avions une approche différente pour diviser les données et, je pense, chacune avait ses propres bugs.
  • On ne sait pas pourquoi l’optimisation du classement a donné de moins bons résultats que l’optimisation de la classification.
  • J'ai acquis une certaine expérience en travaillant avec des textes et une compréhension de la façon dont les systèmes de recommandation sont créés.

Hackathon SNA 2019

Merci aux organisateurs pour les émotions, les connaissances et les prix reçus.

Source: habr.com

Ajouter un commentaire