L'autre jour, j'ai participé à un concours d'apprentissage automatique. J'ai fait de mon mieux pour tuer le week-end plusieurs fois. Du coup, même si je n'ai pas gagné de prix, j'ai pu être dans le top 3%, ce qui m'a donné confiance. Comme je n'ai pas beaucoup d'expérience dans les compétitions, mes pensées peuvent changer à l'avenir, mais d'abord je vais revenir sur cette expérience et la laisser comme mémo.
J'étudie l'apprentissage automatique en lisant des livres et en regardant des vidéos, mais je voulais savoir objectivement à quel point mes compétences étaient.
Je ne peux pas dire les détails de la compétition, mais c'est une compétition de table. J'ai combattu dans l'environnement de combat suivant.
Il existe de nombreux excellents livres sur les techniques d'apprentissage automatique, alors j'aimerais ici énumérer les choses boueuses que j'ai réellement ressenties lorsque je les ai présentées à la compétition.
Lors de la compétition, nous avons créé un script de ligne de commande polyvalent pour les deux tâches de sélection de fonctionnalités et de création de modèle prédictif, et utilisé des commandes jetables pour les autres (visualisation, prétraitement mineur, etc.). Par exemple, lors de la création d'un modèle prédictif, la sélection de l'algorithme d'apprentissage, de la graine aléatoire, du nombre de validations croisées, etc. peut être spécifiée autant que possible par des arguments. De plus, même si un nouvel algorithme est ajouté, il peut être ajouté avec un minimum de modifications. En faisant cela, je pense que j'ai pu améliorer ma productivité en pouvant changer ce que je voulais faire en changeant simplement l'argument de la commande, ou en le regroupant par lots.
Dans les concours, il est souvent obligatoire de fournir un script qui puisse reproduire la création et la prédiction des modèles lors de la victoire d'un prix et de la réception de prix (je pense). Il peut être assez difficile de savoir comment le reproduire uniquement lorsque le score augmente et que le prix est visible. Par conséquent, il est nécessaire d'établir une méthode pour assurer la reproductibilité le plus tôt possible. Les algorithmes qui incluent le caractère aléatoire dans les résultats ont souvent des paramètres tels que "random_state", j'ai donc essayé de les étudier et de les spécifier. Cependant, lorsqu'il est calculé avec GPU, il semble difficile de le réparer (cette fois, le GPU n'a été utilisé que par Keras, donc je ne l'ai pas étudié très profondément).
Les éléments suivants peuvent être considérés comme des cibles pour fixer la graine de nombre aléatoire.
--Chaque algorithme de sélection de fonctionnalités tel que Boruta --Chaque algorithme d'apprentissage automatique tel que Random Forest et XGBoost
J'ai obtenu de bons résultats en utilisant les résultats d'une méthode de sélection de fonctionnalités, mais je ne savais pas comment créer la première sélection de fonctionnalités, alors j'ai fini par recommencer à zéro. Il est important de conserver un journal dans chaque script afin que cela ne se produise pas.
Je n'ai pas implémenté tout ce qui suit, mais avec le recul maintenant, ce qui suit peut être considéré comme des choses qui devraient être enregistrées.
La même chose s'applique à d'autres scripts tels que la sélection de fonctionnalités. Notez que le journal ne doit pas nécessairement être un fichier, il suffit de créer un dossier de sortie pour chaque exécution et de sortir plusieurs types de fichiers journaux, y compris le résultat de la prédiction.
Boruta de sélection de fonctionnalités a pris une journée entière avec 500 itérations selon les données de la concurrence. En fonction du résultat, j'ai dû recommencer plusieurs fois. Si vous exécutez Boruta sans rien spécifier, il peut occuper le processeur et vous ne pourrez peut-être pas faire d'autre travail. Dans le cas d'un traitement qui occupe la CPU de cette manière, si un argument est préparé, en spécifiant explicitement le nombre de CPU, il reste de la place pour d'autres travaux. En faisant cela, d'autres travaux (par exemple, la recherche d'hyper paramètres avec un autre résultat de sélection de fonctionnalités) peuvent être effectués même pendant que Boruta est en cours d'exécution, et le temps peut être utilisé efficacement.
Cette fois, nous avons pu améliorer la précision par l'apprentissage d'ensemble pour créer le modèle de prédiction final en combinant les résultats de sortie de plusieurs algorithmes de prédiction. Dans l'apprentissage d'ensemble, on dit que plus la variété des combinaisons est grande, plus la précision est élevée. Cette fois, j'ai pu créer un script à usage général et ajouter divers algorithmes de prédiction, j'ai donc combiné autant d'algorithmes que possible. Quant à la vitesse de chaque algorithme, elle était la suivante.
--LightGBM, DeepLearng (Kearas) était assez rapide, et alors que d'autres méthodes se débattaient, même les données sans sélection de fonctionnalités étaient assez rapides. --XGB, Cat Boost et Extra Tree étaient également assez rapides.
Le fait que cela prenne du temps signifie que s'il existe de nombreuses combinaisons de recherche de paramètres, la combinaison prendra plus de temps. Pour cette raison, l'algorithme utilisé sans sélection de caractéristiques et l'algorithme utilisé après la sélection de caractéristiques ont été sélectionnés correctement. Nous pensons que cela a permis de rechercher efficacement des modèles très précis de chaque algorithme de prédiction.
À la fin du concours, bien que le score de validation croisée ait augmenté, le score du test public n'a pas augmenté. J'ai eu beaucoup de mal, mais dans le test public avec toutes les données publiées à la fin de la compétition, le résultat était presque le même que la validation croisée. Après tout, une fois que j'ai trouvé une méthode d'évaluation que je pensais fiable, j'ai réalisé qu'il était important d'y croire et de me concentrer sur l'amélioration de la précision.
Pendant la compétition, cela peut ne pas être efficace pour tous les efforts. Par exemple, cette fois, la génération de caractéristiques par programmation génétique n'a eu aucun effet (même si cela peut être une question de méthode). Je ne pouvais penser à aucune cause. Dans un tel cas, je pense qu'il est important d'abandonner rapidement et de découvrir ce qui a été efficace (dans ce cas, l'apprentissage d'ensemble).
Avec le recul, j'ai l'impression que je n'ai écrit que les choses évidentes, mais c'est probablement mon niveau actuel.
Recommended Posts