[PYTHON] J'ai écrit un code qui dépasse le taux de récupération de 100% dans la prédiction des courses de chevaux en utilisant LightGBM (partie 2)

introduction

Cet article

・ J'ai écrit un code qui dépasse le taux de récupération de 100% dans la prédiction des courses de chevaux en utilisant LightGBM (partie 1)

Ce sera une suite de l'article.

Dans la partie 1, j'ai écrit sur le modèle avec élan, mais dans la partie 2, j'écrirai le résultat de la prévision réelle de l'avenir, et enfin publier le code.

Valeur prédite après la création du modèle

En fait, en juillet, la valeur prévue était déjà publiée dans la note. Cependant, le code utilisé pour la prédiction continue de s'améliorer lors de l'émission de la note de prédiction, et le code publié cette fois n'est que la partie de base, donc la prédiction de la note ici et la valeur de prédiction du code à publier ne sont pas nécessairement Cela ne correspond pas.

[Horse Racing Forecast] 25 juillet 2020 [Horse Racing Forecast] 26 juillet 2020 [Horse Racing Forecast] 1 août 2020 [[Horse Racing Forecast] 08/08/2020] (https://note.com/km_takao/n/n9d2acf507e60) [Horse Racing Forecast] 9 août 2020 [Horse Racing Forecast] 15 août 2020 [Horse Racing Forecast] 22 août 2020

(Les 2, 16 et 23 août 2020 n'ont pas pu être prévus en raison du besoin.)

Le taux de récupération lorsque ceux-ci sont achetés en double gain est le suivant. En ce qui concerne le montant à parier, suivant la méthode de M. Ushi expliquée dans la partie 1, «budget total x cote d'il y a 0,01 / 30 minutes» est utilisé, et le budget total est calculé à 100 000 yens.

Date de la course Montant total du pari Montant du remboursement Taux de récupération
25 juillet 2020 7,500 yens 9,440 yens 125%
26 juillet 2020 6,700 yens 7,350 yens 109%
01 août 2020 10,100 yens 10,110 yens 100%
08/08/2020 23,700 yens 23,200 yens 98%
09 août 2020 14,900 yens 15,210 yens 102%
15 août 2020 23,200 yens 26,260 yens 113%
22 août 2020 31,000 yens 30,540 yens 99%

Grâce à l'amélioration, nous avons pu augmenter le nombre d'achats, mais le taux de récupération se dégrade (en complément, il est de 3 Baba depuis le 15). Il est actuellement à l'étude de savoir si une telle course vient de se produire à ce moment ou si des améliorations supplémentaires sont nécessaires.

De même, le taux de récupération lors de l'achat d'un gain est le suivant.

Date de la course Montant total du pari Montant du remboursement Taux de récupération
25 juillet 2020 2,800 yens 4,390 yens 156%
26 juillet 2020 1,900 yens 1,580 yens 83%
01 août 2020 4,700 yens 4,410 yens 93%
08/08/2020 9,800 yens 7,600 yens 78%
09 août 2020 4,500 yens 3,380 yens 75%
15 août 2020 9,600 yens 15,060 yens 157%
22 août 2020 12,700 yens 13,900 yens 109%

Le nombre d'achats augmente ici aussi, mais il y a des jours où le taux de récupération a chuté. Soit dit en passant, voici le résultat de la victoire si vous passez à la méthode de toujours acheter seulement 100 yens quel que soit le budget, au lieu de la méthode de pari de M. Ushi.

Date de la course Montant total du pari Montant du remboursement Taux de récupération
25 juillet 2020 1,600 yens 1,850 yens 115%
26 juillet 2020 1,100 yens 1,080 yens 98%
01 août 2020 1,600 yens 3,500 yens 218%
08/08/2020 3,900 yens 11,610 yens 297%
09 août 2020 2,400 yens 8,190 yens 341%
15 août 2020 3,700 yens 4,530 yens 122%
22 août 2020 4,800 yens 5,980 yens 125%

En d'autres termes, le modèle peut prédire la victoire d'Anoma, mais avec la méthode de pari de M. Ushi, les cotes maximales pouvant être mises seront réduites en fonction du montant du budget, et il ne sera pas possible de parier sur Anoma. En conséquence, seuls les chevaux populaires à faible cote peuvent être pariés, ce qui semble être un facteur de réduction du taux de récupération. Cependant, au contraire, pour les courses qui n'ont pas été rudes, c'est un facteur pour augmenter le taux de récupération en faisant une pente comme la méthode de pari de M. Ushi. Si le budget auquel vous pensez est de 100 000 yens, cela n'aura pas beaucoup d'effet si les chances sont faibles (au plus environ 5 fois) comme une double victoire. Cependant, si les chances sont environ 10 fois ou plus lors d'une victoire, la mise minimale est de 100 yens, elle semble donc particulièrement affectée. Dans ce domaine, il est nécessaire de prendre en compte la constante de la formule de calcul de mise (0,01 dans ce cas), votre propre budget et la valeur prévue du modèle.

Publier le code

Je le publierai en note. Une explication détaillée du code est donnée dans les notes et commentaires du cahier. Ici, nous allons expliquer le flux simple.

Grattage de la base de données des performances passées

Récupération des résultats des courses passées, des cotes, etc. de la base de données de netkeiba pour la création de modèles. Comme je l'ai écrit dans la partie 1, le grattage ici est basé sur "Comment gratter les données de courses de chevaux en utilisant read_html de pandas". En plus des informations sur chaque cheval participant telles que l'ordre d'arrivée et le nom du cavalier, des informations sur la course elle-même telles que la distance, les informations sur le terrain d'équitation, la météo, etc., et les cotes de chaque cheval avant le départ de la course sont utilisées comme caractéristiques à gratter.

スクリーンショット 2020-08-21 22.33.09.png

Création de fonctionnalités

Le code que je publie est le fondement du code que j'améliore encore, et je pense qu'il est encore plus précis si vous créez vos propres fonctionnalités ou ensemble avec d'autres algorithmes à partir de ce code, par exemple. .. Bien entendu, même dans le code à publier, un nouveau montant de caractéristiques lié à l'agrégation des notes passées est créé à partir du montant de caractéristiques gratté.

Un exemple de la quantité de caractéristiques à créer est l'agrégation des performances passées des chevaux. Il est nécessaire d'agréger pour que les notes futures ne soient pas incluses au moment passé, donc ici nous allons trier race_id par ordre croissant afin que les notes futures ne soient pas agrégées à partir du moment de l'agrégation. Par exemple, si vous regardez les résultats agrégés pour Almond Eye,

スクリーンショット 2020-08-21 22.27.54.png

Par conséquent, seules les données passées sont correctement agrégées et ajoutées en tant que nouvelle quantité de fonctionnalités. (Notez que seules les données de 2018 à 2020 sont utilisées ici pour vérifier le code public.)

La modélisation

Comme le titre l'indique, nous allons créer un modèle en utilisant lightGBM. Les paramètres sont automatiquement ajustés par optuna. Je pense que la précision peut être encore améliorée en effectuant une validation d'ensemble et croisée dans cette partie.

Gratter les informations de course avant l'événement, afficher les valeurs prévues

Les informations de course pré-événement pour permettre au modèle de prédire ne sont pas la [base de données] netkeiba (https://db.netkeiba.com/?rf=navi) mais la page d'informations sur la course Obtenez de / top /? Rf = navi). Le code de base est presque le même que le grattage des notes antérieures.

Les valeurs prévues sont affichées pour chaque course. Le montant du pari similaire au calcul de M. 卍 est également affiché en plus de la colonne utilisant les cotes au moment du grattage.

Par exemple, si vous affichez Niigata 4R le samedi 8 août 2020 l'autre jour

スクリーンショット 2020-08-26 9.07.58.png

Dans ce cas, pariez sur des chevaux dont la valeur prédite dépasse une certaine valeur, ou pariez sur 3 chevaux de celui qui a la plus grande valeur.

Code complet

Le texte intégral est disponible à ici. Nous fournissons également des explications plus détaillées.

Recommended Posts

J'ai écrit un code qui dépasse le taux de récupération de 100% dans la prédiction des courses de chevaux en utilisant LightGBM (partie 2)
J'ai appris le grattage à l'aide de sélénium pour créer un modèle de prédiction de courses de chevaux.
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
J'ai essayé de ramper et de gratter le site de courses de chevaux Partie 2
J'ai écrit une classe qui facilite l'écriture en spécifiant les paroles de la partie lors de l'utilisation de Mecab avec python
J'ai écrit un script qui divise l'image en deux
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
Avec l'apprentissage en profondeur, vous pouvez dépasser le taux de récupération de 100% dans les courses de chevaux
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit un code simple qui génère automatiquement AA (Ascii Art)
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Une histoire sur l'obtention d'un taux de récupération des courses de chevaux de plus de 100% grâce à l'apprentissage automatique
J'ai écrit un module PyPI qui étend le style de paramètre dans le module sqlite3 de Python
J'ai écrit une animation que le système linéaire rétrécit avec du code sale mortel
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype