
* Ferme - (de l'agriculture anglaise) - une répétition longue et ennuyeuse de certaines actions de jeu dans un but précis (acquérir de l'expérience, obtenir des ressources, etc.).
Présentation
Récemment (1er octobre), une nouvelle session de l' excellent cours DS / ML a été lancée (je recommande fortement à tous ceux qui veulent, comme on l'appelle maintenant, de "saisir" DS comme cours initial). Et, comme d'habitude, après avoir terminé un cours, les diplômés ont une question - où acquérir une expérience pratique maintenant pour consolider des connaissances théoriques brutes. Si vous posez cette question sur n'importe quel forum de profil, la réponse en sera probablement une - allez résoudre Kaggle. Kaggle est oui, mais par où commencer et comment utiliser cette plate-forme le plus efficacement pour des compétences pratiques? Dans cet article, l'auteur tentera de donner des réponses à ces questions sur sa propre expérience, ainsi que de décrire l'emplacement du râteau principal sur le terrain de la DS compétitive, afin d'accélérer le processus de pompage et d'obtenir un fan de celui-ci.
Quelques mots sur le parcours de ses créateurs:
Le cours mlcourse.ai est l'une des activités à grande échelle de la communauté OpenDataScience. @yorko et l'entreprise (~ 60 personnes) démontrent que des compétences intéressantes peuvent être acquises en dehors de l'université, et même absolument gratuitement. L'idée principale du cours est la combinaison optimale de la théorie et de la pratique. D'une part, la présentation des concepts de base ne se fait pas sans les mathématiques, d'autre part - beaucoup de devoirs, les concours et projets Kaggle Inclass donneront, avec un certain investissement de votre part, d'excellentes compétences en apprentissage automatique. Il est impossible de ne pas noter la nature compétitive du cours - une évaluation générale des étudiants est en cours, ce qui motive fortement. Le cours est également différent en ce qu'il se déroule dans une communauté vraiment dynamique.
Le cours comprend deux compétitions Kaggle Inclass. Les deux sont très intéressants, ils fonctionnent bien dans la construction d'enseignes. Le premier est l'identification des utilisateurs par la séquence des sites visités . La seconde est la prédiction de la popularité d'un article sur le Medium . Le principal avantage est de deux devoirs, où vous devez être intelligent et battre les lignes de base dans ces compétitions.
Après avoir rendu hommage au parcours et à ses créateurs, nous continuons notre histoire ...
Je me souviens d'il y a un an et demi, un cours (toujours la première version) d'Andrew Ng a été achevé, une spécialisation de l'Institut de physique et de technologie de Moscou a été achevée , une montagne de livres a été lue - tête pleine théorique, mais lorsque vous essayez de résoudre n'importe quelle tâche de combat de base - une stupeur survient. Non, comment résoudre le problème - il est clair quels algorithmes appliquer - est également compréhensible, mais le code est très difficile à écrire, avec l'aide de sklearn / pandas accessible toutes les minutes, etc. Pourquoi donc - il n'y a pas de pipelines accumulés et la sensation du code "à portée de main".
Cela ne fonctionnera pas, pensa l'auteur, et se rendit à Kaggle. Il était effrayant de commencer tout de suite une compétition de combat, et la House of Competition « House Prices: Advanced Regression Techniques » est devenue le premier signe, qui a formé l'approche d'un pompage efficace décrite dans cet article.
Dans ce qui sera décrit plus loin, il n'y a pas de savoir-faire, toutes les techniques, méthodes et techniques sont évidentes et prévisibles, mais cela n'enlève rien à leur efficacité. Au moins, après eux, l'auteur a réussi à prendre le dé Kaggle Competition Master pendant six mois et trois compétitions en mode solo et, au moment de la rédaction de cet article, entrer dans le top 200 du classement mondial Kaggle . Soit dit en passant, cela répond à la question de savoir pourquoi l'auteur s'est même donné le courage d'écrire un article de ce genre.
En un mot, qu'est-ce que Kaggle

Kaggle est l'une des plates-formes les plus célèbres pour l'organisation de concours en science des données. Dans chaque concours, les organisateurs téléchargent une description du problème, des données pour résoudre ce problème, la métrique par laquelle la solution sera évaluée - et fixent des délais et des prix. Les participants disposent de 3 à 5 tentatives (par la volonté des organisateurs) par jour de «soumettre» (envoi de leur propre solution).
Les données sont divisées en un échantillon de formation (train) et un test (test). Pour la partie entraînement, la valeur de la variable cible (cible) est connue, pour la partie test - non. La tâche des participants est de créer un modèle qui, étant formé sur la partie formation des données, produira le résultat maximum sur le test.
Chaque participant fait des prédictions pour l'échantillon de test - et envoie le résultat à Kaggle, puis le robot (qui connaît la variable cible pour le test) évalue le résultat envoyé, qui est affiché dans le classement.
Mais tout n'est pas si simple - les données de test, à leur tour, sont divisées dans une certaine proportion entre la partie publique (publique) et la partie privée (privée). Pendant le concours, la décision envoyée est évaluée, selon la métrique définie par les organisateurs, sur la partie publique des données et présentée sur le classement (le soi-disant classement public) - par lequel les participants peuvent évaluer la qualité de leurs modèles. La décision finale (généralement deux - au choix du participant) est évaluée sur la partie privée des données de test - et le résultat tombe sur le classement privé, qui n'est disponible qu'après la fin du concours et par lequel, en fait, les résultats finaux sont évalués, des prix, des brioches et des médailles sont distribués.
Ainsi, pendant la compétition, seules les informations sont à la disposition des participants car leur modèle s'est comporté (quel résultat - ou a montré la vitesse) sur la partie publique des données du test. Si, dans le cas d'un cheval sphérique dans le vide, la partie privée des données coïncide dans la distribution et les statistiques avec le public - tout va bien, mais sinon - alors un modèle qui a bien fonctionné en public peut ne pas fonctionner dans la partie privée, c'est-à -dire overfix (recyclage). Et ici se pose ce que l'on appelle «fuite» dans le jargon, lorsque les gens de la 10e place en public descendent de 1000 à 2000 places sur une partie privée, car le modèle qu'ils ont choisi a été recyclé et n'a pas pu donner la précision nécessaire pour nouvelles données.

Comment éviter cela? Pour cela, tout d'abord, il est nécessaire de construire le schéma de validation correct, quelque chose qui est enseigné dans les premières leçons de presque tous les cours DS. Parce que si votre modèle ne peut pas donner les prévisions correctes sur les données qu'il n'a jamais vues - quelle que soit la technique sophistiquée que vous utilisez, quelle que soit la complexité des réseaux de neurones que vous construisez - en production, un tel modèle ne peut pas être produit, car ses résultats ne valent rien.
Pour chaque compétition sur Kaggle, une page séparée est créée sur laquelle il y a une section avec des données, avec une description de la métrique - et le plus intéressant pour nous - un forum et des noyaux.
Forum lui et le forum Kaggle, les gens écrivent, discutent et partagent des idées. Mais les noyaux sont déjà plus intéressants. En fait, c'est la possibilité d'exécuter votre propre code qui a un accès direct aux données de la concurrence dans le cloud Kaggle (analogue d'Amazon AWS, GCE de Google, etc.) Des ressources limitées sont allouées pour chaque noyau, donc s'il n'y a pas beaucoup de données, alors travaillez avec avec eux, vous pouvez directement à partir du navigateur sur le site Web de Kaggle - écrire du code, l'exécuter pour exécution, soumettre le résultat. Il y a deux ans, Kaggle a été acquis par Google, il n'est donc pas surprenant que cette fonctionnalité utilise Google Cloud Engine «sous le capot».
De plus, il y avait plusieurs compétitions (récentes - Mercari ), où vous pouviez travailler avec des données en général uniquement via des noyaux. Un format très intéressant, nivelant la différence de matériel entre les participants et forçant le cerveau à s'activer pour l'optimisation du code et des approches, car, naturellement, les noyaux avaient une limite de ressources stricte, à l'époque - 4 cœurs / 16 Go de RAM / 60 minutes d'exécution / 1 Go d'espace disque disponible et de sortie. En travaillant sur ce concours, l'auteur en a appris plus sur l'optimisation des réseaux de neurones que sur n'importe quel cours théorique. Un peu ne suffisait pas à l'or, a terminé en solo le 23, mais a reçu beaucoup d'expérience et de plaisir ...
Je profite de cette occasion pour remercier encore une fois mes collègues de ods.ai - Arthur Stepanenko (arthur) , Konstantin Lopukhin (kostia) , Sergey Fironov (sergeif) pour leurs conseils et leur soutien dans ce concours. En général, il y avait de nombreux points intéressants, Konstantin Lopukhin (kostia) , qui a pris la première place avec Paweł Jankiewicz , a ensuite présenté ce qui a été appelé "l' humiliation de référence de 75 lignes " dans la salle de discussion - un noyau en 75 lignes de code qui renvoie le résultat à la zone dorée du classement. Cela, bien sûr, doit être vu :)
D'accord, distrait, etc. - les gens écrivent le code et présentent les noyaux avec des solutions, des idées intéressantes et plus encore. Habituellement, dans chaque compétition, après quelques semaines, un ou deux excellents EDA du noyau (analyse exploratoire des données) apparaissent, avec une description détaillée de l'ensemble de données, des statistiques, des caractéristiques, etc. Et quelques lignes de base (solutions de base), qui, bien sûr, ne montrent pas le meilleur résultat dans le classement, mais elles peuvent être utilisées comme point de départ pour créer votre propre solution.
Pourquoi Kaggle?

En fait, peu importe sur quelle plateforme vous jouerez, juste Kaggle est l'une des premières et des plus populaires, avec une excellente communauté et un environnement assez confortable (j'espère qu'ils affineront les noyaux pour la stabilité et les performances, et beaucoup se souviennent de l'enfer qui se passait dans Mercari ) Mais, en général, la plateforme est très pratique et autosuffisante, et ses dés sont toujours appréciés.
Une petite digression en général sur le thème de la DS compétitive. Très souvent, dans les articles, les conversations et autres communications, la pensée semble que ce ne sont que des conneries, l'expérience dans les compétitions n'a rien à voir avec de vraies tâches, et les gens là -bas sont engagés dans le réglage de la 5e décimale, qui est la folie et divorcée de la réalité. Examinons ce problème plus en détail:
En tant que spécialistes DS en exercice, contrairement au monde universitaire et à la science, dans notre travail, nous devons et allons résoudre les problèmes commerciaux. C'est (voici une référence à CRISP-DM ) pour résoudre la tâche, il est nécessaire:
- comprendre le défi commercial
- évaluer les données sur le sujet pour savoir si la réponse à cette tâche commerciale peut y être cachée
- collecter des données supplémentaires si elles ne suffisent pas pour obtenir une réponse
- choisissez la mesure qui se rapproche le plus de l'objectif commercial
- et seulement après cela, sélectionnez le modèle, convertissez les données dans le modèle sélectionné et "drainez hgbusta". (C)
Les quatre premiers points de cette liste ne sont enseignés nulle part (corrigez-moi, si de tels cours sont apparus - je m'inscrirai sans hésitation), ici nous ne pouvons apprendre que de l'expérience de collègues travaillant dans cette industrie. Et voici le dernier point - à partir du choix du modèle et au-delà , il est possible et nécessaire de pomper en compétition.
Dans tous les concours, la plupart du travail pour nous a été effectué par les organisateurs. Nous avons l'objectif commercial décrit, la métrique approximative a été sélectionnée, les données ont été collectées - et notre tâche est de construire un pipeline de travail à partir de tout ce lego. Et ici, les compétences sont renforcées - comment travailler avec des passes, comment préparer des données pour les réseaux de neurones et les arbres (et pourquoi les réseaux de neurones nécessitent une approche spéciale), comment construire correctement la validation, comment ne pas se recycler, comment choisir les hyperparamètres, comment ....... une douzaine ou deux «comment» dont la performance compétente distingue un bon spécialiste des personnes de passage dans notre métier.
Ce que vous pouvez "cultiver" sur Kaggle

Fondamentalement, et c'est raisonnable, tous les nouveaux arrivants viennent à Kaggle pour acquérir et pomper une expérience pratique, mais n'oubliez pas qu'en plus de cela, il y a au moins deux autres objectifs:
- Médailles de la ferme et dés
- Réputation agricole à la communauté de Kaggle
La principale chose à retenir est que ces trois objectifs sont complètement différents, des approches différentes sont nécessaires pour les atteindre, et vous ne devriez pas les mélanger, surtout au stade initial!
Ce n'est pas pour rien qu'il est souligné "au stade initial" lorsque vous pompez - ces trois objectifs fusionneront en un seul et seront résolus en parallèle, mais pendant que vous débutez - ne les mélangez pas ! De cette façon, vous éviterez la douleur, la déception et le ressentiment face à ce monde injuste.
Voyons brièvement les objectifs de bas en haut:
- Réputation - stimulée par la rédaction de bons messages (et commentaires) sur le forum et la création de noyaux utiles. Par exemple, les noyaux EDA (voir ci-dessus), les articles décrivant des techniques non standard, etc.
- Les médailles sont un sujet très controversé et haineux, mais bon. Il est pompé en mélangeant les noyaux publics (*), en participant à une équipe avec un parti pris dans l'expérience et en créant votre propre pipeline supérieur.
- Expérience - stimulée par l'analyse des décisions et le travail sur les erreurs.
(*) Le mélange public de noyaux est une technique de médaille de ferme dans laquelle les noyaux disposés avec une vitesse maximale dans un classement public sont sélectionnés, leurs prédictions sont moyennées (mélangées) et le résultat est soumis. En règle générale, cette méthode conduit à un sur-équipement dur (recyclage pour s'entraîner) et à voler en troène, mais parfois elle vous permet d'obtenir une soumission presque en argent. L'auteur, au stade initial, ne recommande pas une approche similaire (lire ci-dessous sur la ceinture et le pantalon).
Je recommande le premier objectif de choisir "expérience" et de s'y tenir jusqu'au moment où vous sentez que vous êtes prêt à travailler sur deux / trois objectifs en même temps.
Il y a deux autres points qui méritent d'être mentionnés (Vladimir Iglovikov (ternaus) - merci pour le rappel).
Le premier est la conversion des efforts investis dans Kaggle en un nouveau lieu de travail plus intéressant et / ou bien rémunéré. Peu importe comment les matrices Kaggle sont nivelées maintenant, pour comprendre les gens, la ligne dans le résumé du maître de la compétition Kaggle et d'autres réalisations valent toujours quelque chose.
Pour illustrer ce point, nous pouvons citer deux entretiens ( un , deux ) avec nos collègues Sergey Mushinsky (cepera_ang) et Alexander Buslaev (albu)
Et aussi l'avis de Valery Babushkin ( venheads) :
Valery Babushkin - Responsable Data Science chez X5 Retail Group (l'effectif actuel est de 30 personnes + 20 postes vacants depuis 2019)
Responsable du groupe analytique Yandex Advisor
Kaggle Competition Master est une excellente mesure proxy pour évaluer un futur membre de l'équipe. Bien sûr, dans le cadre des derniers événements sous forme d'équipes de 30 personnes et de locomotives non déguisées, une étude un peu plus approfondie du profil s'impose qu'avant, mais cela reste une question de quelques minutes. Une personne qui a atteint le titre de maître, avec un haut degré de probabilité, sait écrire du code de qualité au moins moyenne, est assez versée dans l'apprentissage automatique, sait nettoyer les données et construire des solutions stables. Si vous ne pouvez toujours pas vous vanter de la langue d'un maître, le fait de participer est également un plus, au moins le candidat connaît l'existence de Kagl et n'était pas trop paresseux et a passé du temps à le maîtriser. Et si autre chose qu'un noyau public a été lancé et que la solution résultante a dépassé ses résultats (ce qui est assez facile à vérifier), alors c'est une occasion pour une discussion détaillée sur les détails techniques, ce qui est beaucoup mieux et plus intéressant que les questions de la théorie classique, dont les réponses donnent moins de compréhension de la façon dont une personne fera le travail à l'avenir. La seule chose dont je devrais avoir peur et avec ce que j'ai rencontré, c'est que certaines personnes pensent que le travail de DS est quelque chose comme Kagl, qui est fondamentalement faux. Beaucoup plus pensent que DS = ML, ce qui est aussi une erreur
Le deuxième point est que la solution à de nombreux problèmes peut être formulée sous la forme de pré-impressions ou d'articles, qui d'une part permettent de savoir que l'esprit collectif a donné naissance pendant la compétition pour ne pas mourir dans la nature du forum, mais d'autre part ajoute une ligne de plus au portfolio des auteurs et +1 à la visibilité, qui a en tout cas un effet positif sur la carrière et l'indice de citation.
Par exemple, la liste des travaux de nos collègues suite aux résultats de plusieurs concoursAuteurs (par ordre alphabétique):
Andrei O., Ilya, albu, aleksart, alex.radionov, almln, alxndrkalinin, cepera_ang, dautovri, davydov, fartuk, golovanov, ikibardin, kes, mpavlov, mvakhrushev, n01z3, rakhlin, rauf scut snikolenko, ternaus, twoleggedeye, versus, vicident, zfturbo
Comment éviter la douleur de perdre une médaille

Pour marquer!
Je vais vous expliquer. Dans presque tous les concours, plus près de sa fin, un noyau est présenté au public avec une solution qui déplace le classement entier vers le haut, mais pour vous, avec votre décision, vers le bas en conséquence. Et chaque fois que le forum commence DOULEUR! Comment se fait-il que j'aie pris une décision sur l'argent, et maintenant je ne tire même pas sur le bronze. Quoi de neuf, récupérez-le.
N'oubliez pas - Kaggle est une DS compétitive. La place dans le classement où vous vous trouvez dépend de vous. , , , .
— .
, — . , , , - . , — . , - .
, , — … . , , — — .
, . — . ( Talking Data , 8- ) , (ppleskov) : " , , — ". , .
— :
" "()
, .

— python 3.6 jupyter notebook ubuntu . Python - DS, , jupyter , jupyter_contrib_nbextensions , , ubuntu — , bash :)
jupyter_contrib_nbextensions :
- Collapsible headings ( )
- Code folding ( )
- Split cells (, - )
.
- , . — . — .
, jupyter notebook , , . ( , , ( (ternaus) )
, jupyter - IDE, pycharm .
, , " ". , .
/OOF (.) .
(*) OOF — out of folds , -. . .
Comment? :
En général, dans la communauté, on a tendance à passer progressivement à la troisième option, car et le premier et le second ont leurs inconvénients, mais ils sont simples, fiables et, franchement, pour Kaggle ils suffisent.

Oui, plus sur python pour ceux qui ne sont pas programmeurs - n'ayez pas peur de cela. Votre tâche est de comprendre la structure de base du code et l'essence de base du langage afin de comprendre les noyaux des autres et d'écrire vos bibliothèques. Il y a beaucoup de bons cours pour les débutants sur le Web, peut-être dans les commentaires, ils vous diront exactement où. Malheureusement (ou heureusement) je ne peux pas évaluer la qualité de ces cours, donc je ne fournis pas de liens dans l'article.
Passons donc au cadre.

Remarque
Toute autre description sera basée sur le travail avec des données tabulaires et textuelles. Les images, qui sont maintenant très présentes sur Kaggle, sont un sujet distinct avec des cadres distincts. À un niveau de base, il est bon de pouvoir les traiter, ne serait-ce que pour conduire à travers quelque chose comme ResNet / VGG et retirer des fonctionnalités, mais un travail plus approfondi et plus subtil avec eux est un sujet séparé et très étendu qui n'est pas pris en compte dans le cadre de cet article.
L'auteur admet honnêtement qu'il n'est pas très bon en photo. La seule tentative pour s'impliquer dans la beauté a été le concours Camera Identification , dans lequel, en passant, nos équipes avec le tag [ ods.ai ] ont fait exploser le classement entier à un point tel que les administrateurs de Kaggle ont dû nous rendre visite dans le mou pour s'assurer que tout était à l'intérieur règles - et rassurer la communauté. Donc, dans ce concours, j'ai obtenu une médaille d'argent honorifique avec la 46e place, et quand j'ai lu la description des meilleures solutions de nos collègues, j'ai réalisé que je ne pouvais pas aller plus haut et ils utilisent vraiment la magie noire avec augmentation, la bonté de 300 Go de données, sacrifices et ainsi de suite.
En général, si vous voulez commencer avec des images, vous avez besoin d'autres cadres et autres guides.
Objectif principal
Votre tâche consiste à écrire des pipelines (conçus comme des cahiers + modules jupyter) pour les tâches suivantes:
- EDA (analyse exploratoire des données) . Ici, nous devons faire un commentaire - il y a des gens spécialement formés chez Kaggle :) qui ont vu de magnifiques noyaux EDA à chaque compétition. Vous réussirez à peine à les dépasser, mais vous devez encore comprendre comment vous pouvez regarder les données, car Dans les missions de combat, cette personne spécialement formée sera vous. Par conséquent, nous étudions les approches, élargissons nos bibliothèques.
- Nettoyage des données - tout sur le nettoyage des données. Émissions, omissions, etc.
- Préparation des données - tout ce qui concerne la préparation des données pour le modèle. Quelques blocs:
- Les modèles
- Modèles linéaires
- Modèles d'arbres
- Réseaux de neurones
- Exotique (FM / FFM)
- Sélection des fonctionnalités
- Recherche d'hyperparamètres
- Ensemble
Dans les noyaux, généralement toutes ces tâches sont collectées dans un seul code, ce qui est compréhensible, mais je recommande fortement que pour chacune de ces sous-tâches, un ordinateur portable séparé et un module séparé (ensemble de modules) soient créés. Ce sera donc plus facile pour vous plus tard.
Attention à l'holivar possible - la structure de ce cadre n'est pas la vérité ultime, il existe de nombreuses autres façons de structurer vos pipelines - ce n'est que l'un d'entre eux.
Les données sont transmises entre les modules soit sous forme de CSV, soit de plume / cornichon / hdf - ce qui est plus pratique pour vous et ce à quoi vous êtes habitué ou l'âme se trouve.
En fait, beaucoup dépend encore de la quantité de données, dans TalkingData, par exemple, j'ai dû passer par memmap pour contourner le manque de mémoire lors de la création d'un ensemble de données pour lgb.
Dans d'autres cas, les données principales sont stockées dans hdf / feather, quelque chose de petit (comme un ensemble d'attributs sélectionnés) est dans CSV . Je le répète - il n'y a pas de modèles, qui est habitué à quoi, travailler avec ça.
Étape initiale

Nous allons à n'importe quel concours de démarrage (comme déjà mentionné, l'auteur a commencé avec House Prices: Advanced Regression Techniques ) et commençons à créer nos ordinateurs portables. Nous lisons les noyaux publics, copions des morceaux de code, des procédures, des approches, etc. etc. Nous exécutons les données dans le pipeline, soumettons - nous regardons le résultat, nous nous améliorons et ainsi de suite en cercle.
À ce stade, la tâche consiste à collecter un pipeline à cycle complet fonctionnant efficacement, depuis le chargement et le nettoyage des données jusqu'à la soumission finale.
Un exemple de liste de ce qui devrait être prêt et fonctionner à 100% avant de passer à l'étape suivante:
- EDA . (statistiques sur l'ensemble de données, les boîtes à moustaches, la gamme des catégories, ...)
- Nettoyage des données. (passe par fillna, nettoyage des catégories, combinaison des catégories)
- Préparation des données
- Général (catégories de traitement - étiquette / fréquence / fréquence, projection des nombres sur les catégories, transformation des nombres, regroupement)
- Pour les régressions (différentes échelles)
- Les modèles
- Modèles linéaires (régressions diverses - crête / logistique)
- Modèles d'arbres (lgb)
- Sélection des fonctionnalités
- grille / recherche aléatoire
- Ensemble
Allez au combat

Choisissez la compétition que vous aimez et ... commencez :)
Bien qu'il n'y ait pas de schéma de validation fonctionnel - pas d'autres étapes !!!
- Exécutez les données via notre pipeline généré et soumettez le résultat
- Nous nous saisissons la tĂŞte, fous, nous calmons ... et continuons ...
- Nous avons lu tous les noyaux concernant les techniques et les approches utilisées.
- Lire toutes les discussions du forum
- Nous remodelons / complétons les pipelines avec de nouvelles techniques
- Nous passons à l'étape 1
N'oubliez pas - notre objectif à ce stade est d'acquérir de l'expérience ! Remplissez nos pipelines d'approches et de méthodes de travail, remplissez nos modules de code de travail. Nous ne nous soucions pas des médailles - ou plutôt, c'est génial si vous pouvez immédiatement prendre votre place dans le classement, mais sinon, ne vous inquiétez pas. Nous ne sommes pas venus ici pendant cinq minutes, les médailles et les matrices n’iront nulle part.
Ici, la compétition est terminée, êtes-vous quelque part là -bas, il semblerait que tout le monde saisisse le prochain?
NON!
Que faites-vous ensuite:
- Attendre cinq jours. Ne lisez pas le forum, oubliez Kaggle pour le moment. Laissez votre cerveau se détendre et brouiller vos yeux.
- Retournez à la compétition. Pendant ces cinq jours, selon les règles du bon goût, tous les sommets publieront une description de leurs décisions - dans des messages sur le forum, sous la forme de noyaux, sous la forme de référentiels github.
Et ici commence votre ENFER personnel!
- Vous prenez plusieurs feuilles de format A4, sur chacune écrivez le nom du module du framework ci-dessus (EDA / Préparation / Modèle / Ensemble / Sélection de fonctionnalité / Recherche d'hyperparamètres / ...)
- Lisez constamment toutes les solutions, écrivez de nouvelles techniques, méthodes et approches qui vous sont inconnues dans les brochures correspondantes.
Et le pire:
- De manière cohérente pour chaque module, écrivez (espionnez) la mise en œuvre de ces approches et méthodes, en étendant votre pipeline et vos bibliothèques.
- En mode post-soumission, exécutez les données via votre pipeline mis à jour jusqu'à ce que vous ayez une solution dans la zone aurifère ou jusqu'à ce que la patience et les nerfs s'épuisent.
Et seulement après cela, nous passons à la prochaine compétition.
Non, je ne suis pas foutu. Oui, c'est possible et plus simple. Vous décidez.
Pourquoi attendre 5 jours et ne pas lire tout de suite, car sur le forum vous pouvez poser des questions? À ce stade (à mon avis), il est préférable de lire les fils déjà formés avec des discussions sur les solutions, les questions que vous pouvez avoir - soit quelqu'un pose déjà , soit il vaut mieux ne pas leur poser du tout, mais chercher la réponse vous-même)
Pourquoi tout cela fait-il cela? Eh bien, encore une fois - la tâche de cette étape est de développer une base de données de solutions, méthodes et approches. Base de travail de combat. Pour que lors de la prochaine compétition, vous ne perdiez pas de temps, mais dites immédiatement - oui, le codage cible peut entrer, et en passant, j'ai le bon code pour cela à travers les plis dans les plis. Ou oh! Je me souviens alors que l'ensemble est passé par scipy.optimize , et au fait, le code est déjà prêt pour moi.
Quelque chose comme ça ...
Passer en mode travail

Dans ce mode, nous résolvons plusieurs compétitions. A chaque fois on remarque qu'il y a de moins en moins d'enregistrements sur les feuilles, et de plus en plus de code dans les modules. Petit à petit, la tâche d'analyse se réduit au fait que vous venez de lire la description de la solution, dites oui, wow, oh la voilà ! Et ajoutez un ou deux nouveaux sorts ou approches à votre tirelire.
Après cela, le mode passe au mode de gestion des erreurs. La base est prête pour vous, il ne vous reste plus qu'à l'appliquer correctement. Après chaque compétition, en lisant la description des solutions, voyez ce que vous n'avez pas fait, ce qui pourrait être mieux fait, ce que vous avez manqué ou où vous y êtes allé, comme je l'avais fait dans Toxic . Il marchait assez bien, dans le ventre d'or, et en privé, il a volé 1 500 positions. C'est dommage de pleurer ... mais s'est calmé, a trouvé une erreur, a écrit un message en retard - et a appris une leçon.
Un signe de la sortie finale du mode de fonctionnement peut être le fait qu'une des descriptions de la solution supérieure sera écrite à partir de votre surnom.
Ce qui devrait être approximativement dans les pipelines à la fin de cette étape:
- Toutes sortes d'options pour le prétraitement et la création d'entités numériques - projections, relations,
- Différentes méthodes de travail avec les catégories - Encodage cible moyen dans la bonne version, fréquence, étiquette / ohe,
- Divers schémas d'intégration sur du texte (Glove, Word2Vec, Fasttext)
- Divers schémas de vectorisation de texte (Count, TF-IDF, Hash)
- Plusieurs schémas de validation (N * M pour la validation croisée standard, temporelle, par groupe)
- Optimisation bayésienne / hyperopt / autre chose pour sélectionner les hyperparamètres
- Shuffle / permutation cible / Boruta / RFE - pour sélectionner les caractéristiques
- Modèles linéaires - dans le même style sur un ensemble de données
- LGB / XGB / Catboost - dans le même style sur un ensemble de données
L'auteur a créé des métaclasses séparément pour les modèles linéaires et arborescents, avec une seule interface externe pour niveler les différences dans l'API pour différents modèles. Mais maintenant, vous pouvez exécuter sur une seule clé une ligne, par exemple, LGB ou XGB sur un seul ensemble de données traitées.
- Plusieurs réseaux de neurones pour toutes les occasions (nous ne prenons pas de photos pour l'instant) - plongements / CNN / RNN pour le texte, RNN pour les séquences, Feed-Forward pour tout le reste. Il est bon de comprendre et de pouvoir auto-encoder .
- Ensemble basé sur lgb / régression / scipy - pour les tâches de régression et de classification
- C’est bien de pouvoir déjà utiliser les algorithmes génétiques , parfois ils vont bien
Pour résumer
Tout sport, et la DS de compétition est aussi un sport, c'est beaucoup de sueur et beaucoup de travail. Ce n'est ni bon ni mauvais, c'est un fait. La participation à des compétitions (si vous abordez correctement le processus) stimule très bien les compétences techniques, en plus cela secoue plus ou moins l'esprit sportif lorsque vous ne voulez vraiment pas faire quelque chose, casse tout directement - mais vous vous mettez à votre ordinateur portable, refaites le modèle, lancez le calcul, de sorte que ronger cette malheureuse 5e décimale.
Alors décidez Kaggle - expérience à la ferme, médailles et fan!
Quelques mots sur les pipelines de l'auteur

Dans cette section, je vais essayer de décrire l'idée principale des pipelines et des modules collectés sur un an et demi. Encore une fois - cette approche ne prétend pas être universelle ou unique, mais soudain, quelqu'un vous aidera.
- Tous les codes d'ingénierie des fonctionnalités, à l'exception de l'encodage cible moyen, sont extraits dans un module séparé sous forme de fonctions. J'ai essayé de collecter à travers des objets, cela s'est avéré être lourd, et dans ce cas, ce n'est pas nécessaire non plus.
- Toutes les fonctionnalités de l'ingénierie des fonctionnalités sont réalisées dans le même style et ont une signature d'appel et de retour unique:
def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): # do something return _data, new_attrs
Nous passons l'ensemble de données, les attributs pour le travail, un préfixe pour les nouveaux attributs et des paramètres supplémentaires à l'entrée. En sortie, nous obtenons un nouvel ensemble de données avec de nouveaux attributs et une liste de ces attributs. De plus, ce nouvel ensemble de données est enregistré dans un cornichon / plume séparé.
Cela nous donne la possibilité d'assembler rapidement un ensemble de données pour la formation à partir de blocs pré-générés. Par exemple, pour les catégories, nous effectuons trois traitements à la fois - Label Encoding / OHE / Frequency, enregistrez-le dans trois plumes distinctes, puis au stade de la modélisation, nous jouons simplement avec ces blocs, créant divers ensembles de données d'apprentissage en un seul mouvement élégant.
pickle_list = [ 'attrs_base', 'cat67_ohe', # 'cat67_freq', ] short_prefix = 'base_ohe' _attrs, use_columns, data = load_attrs_from_pickle(pickle_list) cat_columns = []
Si vous devez créer un autre ensemble de données, modifiez pickle_list
, redémarrez et travaillez avec le nouvel ensemble de données.
L'ensemble principal de fonctions sur les données tabulaires (réelles et catégorielles) comprend divers codages de catégories, la projection d'attributs numériques sur des catégories, ainsi que diverses transformations.
def do_cat_le(data, attrs, params=None, prefix='le_'): def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): def do_cat_cnt(data, attrs, params=None, prefix='cnt_'): def do_cat_fact(data, attrs, params=None, prefix='bin_'): def do_cat_comb(data, attrs_op, params=None, prefix='cat_'): def do_proj_num_2cat(data, attrs_op, params=None, prefix='prj_'):
Un couteau suisse universel pour combiner les attributs, dans lequel nous transférons une liste d'attributs source et une liste de fonctions de conversion, en sortie, nous obtenons, comme d'habitude, un ensemble de données et une liste de nouveaux attributs.
def do_iter_num(data, attrs_op, params=None, prefix='comb_'):
Plus divers convertisseurs spécifiques supplémentaires.
Pour traiter les données de texte, un module distinct est utilisé, qui comprend diverses méthodes de prétraitement, de tokenisation, de lemmatisation / stemming, de traduction dans une table de fréquences, etc. etc. Tout est standard avec sklearn , nltk et keras .
Les séries chronologiques sont également traitées par un module distinct, avec des fonctions de conversion de l'ensemble de données d'origine pour les tâches ordinaires (régression / classification) et séquence à séquence. Merci à François Chollet d'avoir fini les keras pour que la construction des modèles seq-2-seq ne ressemble pas à un rituel vaudou d'appeler des démons.
Dans le même module, d'ailleurs, il y a des fonctions de l'analyse statistique habituelle des séries - vérification de la stationnarité, décomposition STL, etc. ... Cela aide beaucoup au stade initial de l'analyse à "sentir" la série et voir à quoi elle ressemble.
Les fonctions qui ne peuvent pas être appliquées immédiatement à l'ensemble de données, mais qui doivent être utilisées à l'intérieur des plis lors de la validation croisée, sont placées dans un module distinct:
- Signification du codage cible
- Suréchantillonnage / sous-échantillonnage
Ils sont passés à l'intérieur de la classe de modèle (lire les modèles ci-dessous) au stade de la formation.
_fpreproc = fpr_target_enc _fpreproc_params = fpr_target_enc_params _fpreproc_params.update(**{ 'use_columns' : cat_columns, })
- Pour la modélisation, une métaclasse a été créée qui généralise le concept d'un modèle avec des méthodes abstraites: fit / predire / set_params / etc. Pour chaque bibliothèque spécifique (LGB, XGB, Catboost, SKLearn, RGF, ...) une implémentation de cette métaclasse est créée.
Autrement dit, pour travailler avec LGB, nous créons un modèle
model_to_use = 'lgb' model = KudsonLGB(task='classification')
Pour XGB:
model_to_use = 'xgb' metric_name= 'auc' task='classification' model = KudsonXGB(task=task, metric_name=metric_name)
Et toutes les fonctions fonctionnent en outre avec le model
.
Pour la validation, plusieurs fonctions ont été créées qui calculent immédiatement à la fois la prédiction et l'OOF pour plusieurs graines pendant la validation croisée, ainsi qu'une fonction distincte pour la validation régulière via train_test_split. Toutes les fonctions de validation sont exploitées à l'aide de méthodes de méta-modèle, ce qui donne un code indépendant du modèle et facilite la connexion au pipeline de toute autre bibliothèque.
res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
XX_train [use_columns], yy_train, XX_Kaggle [use_columns], plis, marqueur = marqueur, METRIC_NAME = METRIC_NAME, fpreproc = _fpreproc, fpreproc_params = _fpreproc_params, model_seed = model_seed, silence = True res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
Pour la sélection des fonctionnalités - rien d'intéressant, RFE standard et ma permutation aléatoire préférée de toutes les manières possibles.
Pour rechercher des hyperparamètres, l'optimisation bayésienne est principalement utilisée, toujours sous une forme unifiée afin que vous puissiez exécuter une recherche pour n'importe quel modèle (via le module de validation croisée). Cette unité vit dans le même ordinateur portable que la simulation.
Plusieurs fonctions ont été créées pour les ensembles, unifiées pour les tâches de régression et de classification basées sur Ridge / Logreg, LGB, le réseau neuronal et mon scipy.optimize préféré.
Une petite explication - chaque modèle du pipeline donne comme résultat deux fichiers: sub_xxx et oof_xxx , qui sont la prédiction pour le test et la prédiction OOF pour le train. Ensuite, dans le module d'ensemble du répertoire spécifié, nous téléchargeons des paires de prédictions de tous les modèles dans deux trames de données - df_sub / df_oof . Eh bien, nous examinons les corrélations, sélectionnons les meilleures, puis construisons des modèles de niveau 2 sur df_oof et appliquons à df_sub .
Parfois, pour rechercher le meilleur sous-ensemble de modèles, la recherche par algorithmes génétiques est bonne (l'auteur utilise cette bibliothèque ), parfois la méthode de Caruana . Dans les cas les plus simples, les régressions standard et scipy.optimize fonctionnent correctement.
Les réseaux de neurones vivent dans un module séparé, l'auteur utilise des keras dans un style fonctionnel , oui, pas aussi flexibles que pytorch , mais assez pour l'instant. Encore une fois, des fonctions de formation universelles sont écrites qui sont invariantes au type de réseau.
Ce pipeline a été une fois de plus testé lors d'un récent concours de Home Credit , l'utilisation prudente et précise de tous les blocs et modules a apporté la 94e place et l'argent.
L'auteur est généralement prêt à exprimer une idée séditieuse que pour les données tabulaires et un pipeline normalement créé, la soumission finale pour tout concours devrait entrer dans le top 100 du classement. Naturellement, il existe des exceptions, mais en général, cette affirmation semble être vraie.
À propos du travail d'équipe

Ce n'est pas si simple de décider si Kaggle en équipe ou en solo dépend beaucoup de la personne (et de l'équipe), mais mon conseil pour ceux qui débutent est d'essayer de commencer un solo. Pourquoi? Je vais essayer d'expliquer mon point de vue:
- Tout d'abord, vous comprendrez vos forces, vous verrez les faiblesses et, en général, vous pourrez évaluer votre potentiel en tant que pratique DS.
- Deuxièmement, même lorsqu'ils travaillent en équipe (sauf s'il s'agit d'une équipe établie avec séparation des rôles), ils attendent toujours une solution complète prête à l'emploi de votre part - c'est-à -dire que vous devriez déjà avoir des pipelines en état de marche. (" Soumettre ou non ") (C)
- Et troisièmement, il est optimal lorsque le niveau de joueurs dans l'équipe est à peu près le même (et assez élevé), alors vous pouvez apprendre quelque chose de vraiment très utile) Dans les équipes faibles (il n'y a rien de dérogatoire, je parle du niveau de formation et d'expérience à Kaggle) il est très difficile d'apprendre quoi que ce soit, il vaut mieux mordre le forum et les noyaux. Oui, vous pouvez cultiver des médailles, mais voir ci-dessus pour les objectifs et une ceinture pour maintenir le pantalon)
Conseils utiles du capitaine pour obtenir des preuves et la carte de râteau promise :)

Ces conseils reflètent l'expérience de l'auteur, ne sont pas des dogmes et peuvent (et devraient) être vérifiés par nos propres expériences
Commencez toujours par établir une validation compétente - il n'y en aura pas; tous les autres efforts iront dans le four. Regardez à nouveau le classement Mercedes .
L'auteur est vraiment heureux que dans ce concours, il ait construit un système de validation croisée stable (3 x 10 fois), qui a maintenu la vitesse et a amené la 42ème place légitime)
Si une validation compétente est établie, faites toujours confiance aux résultats de votre validation . Si la vitesse de vos modèles s'améliore lors de la validation, mais s'aggrave sur le public - il est plus raisonnable de faire confiance aux validations. Lors de l'analyse, lisez simplement cette donnée sur laquelle le classement public est considéré comme un autre pli. Vous ne voulez pas trop remplir votre modèle d'un pli?
Si le modèle et le schéma le permettent, faites toujours des prédictions OOF et gardez-les près du modèle. Au stade de l'ensemble, vous ne savez jamais ce qui se déclenchera.
Gardez toujours le code / OOF à côté du résultat pour le recevoir . Peu importe sur github, localement, n'importe où. Deux fois, il s'est avéré que dans l'ensemble, le meilleur modèle était celui qui avait été fabriqué il y a deux semaines hors de la boîte et pour lequel le code n'était pas enregistré. La douleur
Marteau sur la sélection du "bon" côté pour la validation croisée , il a lui-même péché au début. Mieux vaut en choisir trois et effectuer une validation croisée 3xN. Le résultat sera plus stable et plus facile.
Ne poursuivez pas le nombre de modèles dans l'ensemble - c'est mieux moins, mais plus diversifié - plus diversifié dans les modèles, dans le prétraitement, dans les jeux de données. Dans le pire des cas, selon les paramètres, par exemple, un arbre profond à régularisation rigide, un arbre peu profond.
Utilisez shuffle / boruta / RFE pour sélectionner les fonctionnalités , rappelez-vous que l'importance des fonctionnalités dans divers modèles arborescents est une métrique en perroquets sur un sac de sciure.
Opinion personnelle de l'auteur (peut ne pas coïncider avec l'opinion du lecteur) Optimisation bayésienne > recherche aléatoire> hyperopt pour la sélection d'hyperparamètres. (">" == mieux)
Le classement déchirant présenté sur un noyau public est mieux géré comme suit:
- Il y a du temps - nous regardons ce qui est nouveau et nous nous construisons
- Moins de temps - refaire pour notre validation, faire OOF - et le fixer Ă l'ensemble
- Il n'y a pas de temps du tout - nous avons stupidement mélangé avec notre meilleure solution et regardons vite.
Comment choisir deux soumissions finales - par intuition, bien sûr. Mais sérieusement, alors généralement tout le monde pratique les approches suivantes:
- Soumission conservatrice (sur les modèles durables) / soumission risquée.
- Meilleur sur OOF / Public Leaderboard
N'oubliez pas - tout est un chiffre et les possibilités de son traitement ne dépendent que de votre imagination. Utilisez la classification au lieu de la régression, traitez les séquences comme une image, etc.
Et enfin:
- Rejoignez le chat ods.ai :) et amusez-vous de DS et de la vie! )
Liens utiles

Général
http://ods.ai/ - pour ceux qui veulent rejoindre la meilleure communauté DS :)
https://mlcourse.ai/ - Site Web du cours ods.ai
https://www.Kaggle.com/general/68205 - poste sur le cours sur Kaggle
En général, je recommande fortement que dans le même mode que celui décrit dans l'article, regardez le cycle vidéo de mltrainings - il y a beaucoup d'approches et de techniques intéressantes.
Vidéo
Cours
Vous pouvez en savoir plus sur les méthodes et les approches pour résoudre les problèmes chez Kaggle à partir de la deuxième année de spécialisation , " Comment gagner un concours de science des données: apprendre des meilleurs Kagglers"
Lecture parascolaire:
Conclusion

Le sujet de la Data Science en général et de la Data Science compétitive en particulier est aussi inépuisable que l'atome (C). Dans cet article, l'auteur n'a révélé que légèrement le sujet du pompage des compétences pratiques à l'aide de plateformes compétitives. Si cela devient intéressant - connectez-vous, regardez autour de vous, accumulez de l'expérience - et écrivez vos articles. Plus le contenu est bon, mieux c'est pour nous tous!
Anticiper les questions - non, les pipelines et les bibliothèques de l'auteur ne sont pas encore disponibles gratuitement.
Un grand merci aux collègues de ods.ai: Vladimir Iglovikov (ternaus) , Yuri Kashnitsky (yorko) , Valery Babushkin ( venheads) , Alexei Pronkin (pronkin_alexey) , Dmitry Petrov (dmitry_petrov) , Arthur Kuzin (n01z3) , et aussi tous ceux qui vous lisent article avant publication, pour modifications et critiques.
Un merci spécial à Nikita Zavgorodnoy (njz) pour la relecture finale.
Merci de votre attention, j'espère que cet article sera utile à quelqu'un.
Mon surnom chez Kaggle / ods.ai : kruegger