[PYTHON] 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

introduction

Aimez-vous les courses de chevaux? Je suis un débutant qui a commencé cette année, mais c'est vraiment amusant de collecter diverses informations, de prévoir et de deviner!

Au début, c'était amusant d'anticiper, mais l'envie de ** "Je ne veux pas perdre" ** a débordé.

Donc, quand je surfais sur le net, je me demandais s'il y avait une délicieuse façon de gagner, et il me semblait intéressant de prédire les courses de chevaux en utilisant l'apprentissage automatique, alors j'ai décidé de l'essayer après avoir étudié.

Cible

Il semble que le taux de retour des courses de chevaux soit d'environ 70 à 80%, donc si vous l'achetez correctement, le taux de récupération est susceptible de converger vers ce niveau.

Alors pour le moment, j'aimerais viser un ** taux de récupération de 100% ou plus ** en utilisant les données obtenues avant la course!

Décidez du cadre

Même si vous parlez de prédiction de courses de chevaux, je pense qu'il y a plusieurs choses comme simplement prédire le classement ou optimiser la méthode de pari en tenant compte des cotes. Il existe également différents types de billets de paris à acheter.

Cette fois, je voudrais diviser le classement des courses de chevaux en 3 groupes au sein de la 3e place, moyenne et inférieure, et effectuer ** classement multi-classes **.

Et j'achèterai un ticket de pari ** de type gagnant ** pour le cheval qui s'est classé premier dans les résultats attendus. La raison en est que le taux de retour gagnant-gagnant est supérieur à celui des billets de paris à prix élevé tels que les triplets. (Référence: Buena's Horse Racing Blog-Knowledge for Betting Tickets)

De plus, je n'utiliserai pas d'informations sur la popularité et les cotes pour les quantités de fonctionnalités. Que diriez-vous d'utiliser des informations qui ne sont décidées que juste avant la course? Et c'est parce que je pensais que ce ne serait pas intéressant d'acheter simplement un cheval populaire. (Les données de poids du cheval déterminées environ 50 minutes avant le début de la course sont traitées comme une quantité de caractéristiques)

Cette fois, je voudrais me concentrer sur la course à l'hippodrome de Tokyo et procéder comme suit. La raison de la réduction de l'hippodrome est qu'il faut du temps pour gratter les données de course en raison du mauvais algorithme et du temps de sommeil de 1 seconde. (Il a fallu environ 50 heures pour collecter les données de 2008 à 2019 ...)

C'est un problème, mais si vous prenez le temps, vous pouvez collecter des données pour tous les hippodromes.

procédure

  1. Collectez les données de course en grattant sur ce site (netkeiba.com).
  2. Prétraitez les données.
  3. Entraînez-vous avec LightGBM pour créer un modèle.
  4. À l'aide du modèle créé, vérifiez le taux de récupération sur un an.

Grattage

Collectez en grattant sur ce site (netkeiba.com). Pour ce qui est de la lecture du fichier robots.txt (qui n'était pas là en premier lieu) et des conditions d'utilisation, cela semblait convenir pour le grattage, j'ai donc pris soin de ne pas le surcharger. Pour la méthode de grattage, je me suis référé à l'article suivant.

Le résultat de la collecte des données est comme ça.

スクリーンショット 2020-09-02 20.06.59.png

Lors du grattage, nous avons supprimé les informations sur les chevaux qui n'ont pas joué lors des trois dernières courses. C'est parce que nous pensons que l'avenir ne peut pas être prédit pour des choses qui n'ont pas d'informations passées.

En outre, l'indice de temps, etc. peut faire défaut pour les chevaux qui couraient dans les zones rurales ou à l'étranger, mais cette partie est remplie avec la valeur moyenne.

Valeur de la fonctionnalité

Cette fois, les éléments suivants ont été traités comme des quantités de caractéristiques. Données du jour

Nom de variable Contenu
kai Combien de fois
day Quel jour a-t-il lieu
race_num Qu'est-ce que R
field Shiba ou saleté
dist distance
turn Quelle direction
weather Météo
field_cond État de Baba
~~place~~ ~~Lieu~~
sum_num Combien de têtes
prize Prix gagnant
horse_num Numéro de cheval
sex sexe
age âge
weight_carry Poids
horse_weight Poids du cheval
weight_change Changement de poids du cheval
l_days Combien de jours se sont écoulés depuis la précédente exécution

Données des 3 dernières courses (01 → course précédente, 02 → 2 courses avant, 03 → 3 courses avant)
Nom de variable Contenu
p_place Lieu
p_weather Météo
p_race_num Qu'est-ce que R
p_sum_num Combien de têtes
p_horse_num Numéro de cheval
p_rank Classement
p_field Shiba ou saleté
p_dist distance
p_condi État de Baba
p_condi_num Index Baba
p_time_num Index de temps

Prétraitement

Je mets juste le temps en secondes et j'encode les variables catégoriques par étiquette. Vous trouverez ci-dessous le code de l'étiquette codant la météo à titre d'exemple.

encode.py


num = df1.columns.get_loc('weather')
    for i in range(df1['weather'].size):
        copy = df1.iat[i, num]
        if copy == 'Bien':
            copy = '6'
        elif copy == 'pluie':
            copy = '1'
        elif copy == 'pluie légère':
            copy = '2'
        elif copy == 'Neige légère':
            copy = '3'
        elif copy == 'Nuageux':
            copy = '4'
        elif copy == 'neige':
            copy = '5'
        else:
            copy = '0'
        df1.iat[i, num] = int(copy)

df1['weather'] = df1['weather'].astype('int64')

Étiquetez chaque variable de catégorie de cette manière.

Je pensais que ce serait plus facile avec LabelEncoder, mais je ne l'ai pas utilisé car il semblait impossible d'unifier la compatibilité des nombres et des variables convertis entre plusieurs fichiers de données.

De plus, LightGBM, le cadre d'apprentissage automatique utilisé cette fois, semble utiliser un arbre de décision pour le classificateur faible, il n'est donc pas nécessaire de le standardiser. (Référence: Introduction à LightGBM)

Modèle prédictif

Créez un modèle avec LightGBM, un cadre de renforcement des dégradés La raison pour laquelle j'ai choisi ceci est parce qu'il est rapide et (probablement) le plus fort en non-profond.

Et quant à la méthode de prédiction, nous en avons cette fois fait un classement multi-classes, qui est classé dans l'un des trois groupes de 3ème place ou moins, 1/3 moyen hors 3ème place et 1/3 inférieur. Par exemple, dans le cas de 15 têtes, la 1ère à la 3ème place est le groupe 0, la 4ème à la 8ème place est le groupe 1 et la 9ème à la 15ème place est le groupe 2.

Je me suis référé au site suivant pour savoir comment l'utiliser. (Référence: [[Pour les débutants] LightGBM (classification multi-classes) [Python] [Apprentissage automatique]](https://mathmatical22.xyz/2020/04/11/%E3%80%90%E5%88%9D % E5% AD% A6% E8% 80% 85% E5% 90% 91% E3% 81% 91% E3% 80% 91gbm léger-% E5% 9F% BA% E6% 9C% AC% E7% 9A% 84% E3% 81% AA% E4% BD% BF% E3% 81% 84% E6% 96% B9-% E5% A4% 9A% E3% 82% AF% E3% 83% A9% E3% 82% B9% E5 % 88% 86% E9% A1% 9E% E7% B7% A8 /))

Les données d'entraînement et les données de vérification sont les suivantes.

Données de formation / données de vérification données de test
Tokyo_2008_2018 Tokyo_2019

Les données d'apprentissage sont divisées en données d'apprentissage et données d'évaluation de modèle par train_test_split. Aucun réglage particulier des paramètres n'a été effectué.

train.py


train_set, test_set = train_test_split(keiba_data, test_size=0.2, random_state=0)

#Expliquer les données d'entraînement Données variables(X_train)Et des données variables objectives(y_train)Divisée en
X_train = train_set.drop('rank', axis=1)
y_train = train_set['rank']

#Expliquer les données d'évaluation du modèle Données variables(X_test)Et des données variables objectives(y_test)Divisée en
X_test = test_set.drop('rank', axis=1)
y_test = test_set['rank']

#Définir les données utilisées pour l'apprentissage
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)

params = {
        'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'multiclassova',
        'num_class': 3,
        'metric': {'multi_error'},
}

model = lgb.train(params,
        train_set=lgb_train, #Désignation des données d'entraînement
        valid_sets=lgb_eval, #Spécification des données de vérification
        verbose_eval=10
)


### Essayez de bouger Je l'ai en fait déplacé. ![model_pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/86df2b27-05bc-cc96-fc27-cc34733ac103.png)

Le taux de réponse correcte est d'environ 54%. Vous en devinez plus de la moitié. Cette valeur n'a pas beaucoup changé même si j'ai falsifié les paramètres, donc cette fois je vais continuer comme ça.

Vérification

Nous publierons les données vérifiées à l'hippodrome de Tokyo pendant un an en 2019.

Ici, comme condition

C'est dit. La raison de la deuxième condition est d'exclure les courses qui manquent presque certainement, comme la course de 2 ans, où un seul cheval a 3 ou plus de données de course passées.

Voici le graphique résultant.

tansho.png


**: détendu: ça fait du bien: détendu: **
Pour être honnête, je ne pensais pas que le taux de récupération dépasserait 100% si facilement.

Le taux de réussite est d'environ 26%, ce qui est un bon succès.

En raison de la deuxième condition, il y avait des courses où je ne pouvais pas parier environ 100 courses, mais je pense qu'il n'y a pas de plainte à propos de ce taux de récupération après avoir participé à environ 80% des courses.


Comme c'est une bonne affaire, je voudrais le vérifier avec d'autres billets de paris. De plus, seulement 3 unités sont sur le principe d'acheter 3 boîtes (6 façons). ![fukusho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/0a27b45c-5aa9-2c7b-844a-410e7d077f0c.png) ![umaren00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/6c12ed8d-dd26-c9dc-d707-0d1f3cc4d877.png) ![umatan00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/7a6a1813-35ba-876b-d776-1e8fe57ab257.png) ![renpuku00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/613b1601-51e4-6b1c-534a-36dc666aa98a.png) ![3rentan_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/7f5151f8-4e9a-6e9c-c912-3dfca7635443.png)

C'est plutôt bon ...! Quant à Mamono, le taux de récupération est proche de 200%, ce qui est un résultat magnifique. Cependant, les billets de paris avec un retour important au lieu d'un faible taux de réussite auront une grande fluctuation dans le taux de collecte, je voudrais donc le garder comme référence.

Le point d'insatisfaction est que le taux de récupération des doubles victoires est inférieur à 100%, même si nous évaluons si nous sommes ou non à la troisième place. J'aimerais faire quelque chose dans ce domaine.

Ajoutons plus de conditions

Pour le moment, la seule condition pour acheter un billet de pari était le nombre de chevaux, mais dans la pratique, je pense que cela sera décidé par le bon ou le mauvais de la valeur attendue plutôt que d'acheter toutes les courses.
Par conséquent, je voudrais ajouter les nouvelles conditions suivantes.

** ・ N'achetez que si la différence entre les 1er et 2ème chiffres prévus classés dans le groupe 0 est de 0,1 ou plus. ** **

En d'autres termes, n'achetez que dans de tels cas スクリーンショット 2020-09-02 21.36.00.png Je n'achète pas à de tels moments スクリーンショット 2020-09-02 21.36.34.png à propos de ça.

La raison de cette condition

  1. Il est difficile de prédire si vous serez ou non à la 3e place, car il a tendance à être grand s'il y a beaucoup de chevaux forts ou si le nombre de coureurs est petit.
  2. S'il y a une différence dans les chiffres prévus, on s'attend à ce que le cheval soit assez fort dans la course cible. Parce que.

Voici les résultats de la vérification dans ces conditions. tansho_1.png

**: détendu: on se sent vraiment bien: détendu: **

Le taux de réussite s'est considérablement amélioré de 26% à 39%, et le taux de récupération s'est considérablement amélioré de 130% à 168%. Le nombre de courses cibles a diminué d'environ 250, et il a été réduit à 100 courses par an, mais étant donné que 1/4 participe toujours, je pense que ce taux de récupération est bon.
Je vais essayer d'autres billets de paris pour le moment. fukusho_1.png umaren_1.png umatan_1.png renpuku_1.png 3rentan_1.png

C'est bon! Il est à noter que le taux de réussite des doubles victoires dépasse 70% et le taux de récupération dépasse 100%. Le cheval le plus populaire a un taux de double victoire d'environ 60 à 65% (Référence: Developer Blog | AlphaImpact Co., Ltd.) Cela semble très bien.

À propos de la quantité de fonctionnalités

Regardons également l'importance des fonctionnalités lors de la création d'un modèle. feature_importance.png

Vous pouvez voir que l'index temporel est traité comme une quantité de caractéristiques assez importante. De toute évidence, les chevaux qui ont bien couru lors des courses précédentes ont plus de chances de gagner.

Ce qui était surprenant, c'est que le nombre de jours qui s'étaient écoulés depuis la dernière course était considéré comme une caractéristique aussi importante que l'augmentation du temps et du poids du cheval. J'ai été surpris de ne pas voir beaucoup de gens qui prédisent les courses de chevaux et qui mettent l'accent sur la rotation. En outre, c'est intéressant car il chevauche Almond Eye qui a perdu en forçant Rote pendant les deux semaines du milieu. Eh bien, je ne suis pas sûr que l'indice s'aggrave car l'espace est court, mais lol

en conclusion

De nos jours, l'IA des courses de chevaux semble être de plus en plus enthousiasmée, certains sites fonctionnant en tant que service et le cyber Award de Dwango. Dans de telles circonstances, j'ai pu pratiquer la prédiction de courses de chevaux en utilisant l'apprentissage automatique, ce qui était très amusant.

Cependant, l'avenir ne peut pas être parfaitement prédit, donc utiliser ce modèle ne signifie pas que vous pouvez définitivement gagner. Il est possible que la course de cette année et de l'année prochaine soit vaincue.

Je ne pense pas qu'il soit bon d'attendre trop de ce genre de choses, mais je pense qu'il y a des rêves parce que certaines personnes gagnent de l'argent grâce aux programmes de courses de chevaux.

Puisque vous avez souligné qu'il s'agissait d'un article d'orientation à des fins financières, j'ai supprimé l'url. : arc:

Recommended Posts

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
Une méthode concrète pour prédire les courses de chevaux et simuler le taux de récupération par apprentissage automatique
Prédiction des courses de chevaux: Si vous pensez que le taux de récupération a dépassé 100% en machine learning (LightGBM), c'est une histoire
Une histoire sur l'apprentissage automatique avec Kyasuket
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Histoire de l'analyse de données par apprentissage automatique
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
À propos du contenu de développement de l'apprentissage automatique (exemple)
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2
Touchons une partie de l'apprentissage automatique avec Python
Une histoire de prédiction du taux de change avec Deep Learning
À propos du prétraitement des données des systèmes utilisant l'apprentissage automatique
Installation de TensorFlow, une bibliothèque d'apprentissage automatique de Google
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Une histoire sur le changement du nom principal de BlueZ
Une histoire de trébucher sur PATH après l'installation d'anaconda
(Remarque) Une histoire sur la création d'un système de questions et réponses à l'aide de Spring Boot et de l'apprentissage automatique (SVM).
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)
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
Apprentissage automatique sur le surapprentissage
Une histoire de regroupement de données de séries chronologiques d'échange
Un résumé de l'apprentissage automatique Python pour débutant est très concis.
L'histoire d'un ingénieur directeur de 40 ans qui réussit "Deep Learning for ENGINEER"