[PYTHON] Une méthode concrète pour prédire les courses de chevaux et simuler le taux de récupération par apprentissage automatique

Objectif

Prédisez les courses de chevaux avec l'apprentissage automatique et visez un taux de récupération de 100%

Que faire cette fois

Cet article est une continuation de l'article suivant.

Cette fois, je vais essayer de simuler combien je peux gagner si je parie réellement sur des doubles victoires en utilisant ce modèle.

Code source

Commencez par gratter le tableau de remboursement. スクリーンショット 2020-07-11 15.16.52.png Si vous grattez normalement, double win et wide ne seront pas séparés comme indiqué ci-dessous, donc convertissez la balise de saut de ligne </ font> en une chaîne de caractères. スクリーンショット 2020-07-11 15.17.45.png

f = urlopen(url)
html = f.read()
html = html.replace(b'<br />', b'br')

スクリーンショット 2020-07-12 11.43.26.png

Comme dans l'article précédent, si vous incluez une liste de race_id, créez et exécutez une fonction qui gratte les données de remboursement et les convertit en type DataFrame.

import pandas as pd
import time
from tqdm.notebook import tqdm
from urllib.request import urlopen

def scrape_return_tables(race_id_list, pre_return_tables={}):
    return_tables = pre_return_tables
    for race_id in tqdm(race_id_list):
        if race_id in return_tables.keys():
            continue
        try:
            url = "https://db.netkeiba.com/race/" + race_id
            f = urlopen(url)
            html = f.read()
            html = html.replace(b'<br />', b'br')
            dfs = pd.read_html(html)
            return_tables[race_id] = pd.concat([dfs[1], dfs[2]])
            time.sleep(1)
        except IndexError:
            continue
        except:
            break
    return return_tables

return_tables = scrape_return_tables(race_id_list)
for key in return_tables:
    return_tables[key].index = [key] * len(return_tables[key])
return_tables = pd.concat([return_tables[key] for key in return_tables])

Ensuite, créez une classe Retrun et traitez les données double win afin qu'elles puissent être utilisées.

class Return:
    def __init__(self, return_tables):
        self.return_tables = return_tables
    
    @property
    def fukusho(self):
        fukusho = self.return_tables[self.return_tables[0]=='Double victoire'][[1,2]]
        wins = fukusho[1].str.split('br', expand=True).drop([3], axis=1)
        wins.columns = ['win_0', 'win_1', 'win_2']
        returns = fukusho[2].str.split('br', expand=True).drop([3], axis=1)
        returns.columns = ['return_0', 'return_1', 'return_2']
        
        df = pd.concat([wins, returns], axis=1)
        for column in df.columns:
            df[column] = df[column].str.replace(',', '')
        return df.fillna(0).astype(int)

rt = Return(return_tables)
rt.fukusho

スクリーンショット 2020-07-11 15.26.37.png Ensuite, insérez le LightGBM et les données de remboursement que vous venez de récupérer, puis créez une classe ModelEvaluator qui calculera le score AUC et équilibrera et évaluera le modèle.

from sklearn.metrics import roc_auc_score

class ModelEvaluator:
    def __init__(self, model, return_tables):
        self.model = model
        self.fukusho = Return(return_tables).fukusho
    
    def predict_proba(self, X):
        return self.model.predict_proba(X)[:, 1]
    
    def predict(self, X, threshold=0.5):
        y_pred = self.predict_proba(X)
        return [0 if p<threshold else 1 for p in y_pred]
    
    def score(self, y_true, X):
        return roc_auc_score(y_true, self.predict_proba(X))
    
    def feature_importance(self, X, n_display=20):
        importances = pd.DataFrame({"features": X.columns, 
                                    "importance": self.model.feature_importances_})
        return importances.sort_values("importance", ascending=False)[:n_display]
    
    def pred_table(self, X, threshold=0.5, bet_only=True):
        pred_table = X.copy()[['Numéro de cheval']]
        pred_table['pred'] = self.predict(X, threshold)
        if bet_only:
            return pred_table[pred_table['pred']==1]['Numéro de cheval']
        else:
            return pred_table
        
    def calculate_return(self, X, threshold=0.5):
        pred_table = self.pred_table(X, threshold)
        money = -100 * len(pred_table)
        df = self.fukusho.copy()
        df = df.merge(pred_table, left_index=True, right_index=True, how='right')
        for i in range(3):
            money += df[df['win_{}'.format(i)]==df['Numéro de cheval']]['return_{}'.format(i)].sum()
        return money

Quand je calcule réellement ...

me = ModelEvaluator(lgb_clf, return_tables)

gain = {}
n_samples = 100
for i in tqdm(range(n_samples)):
    threshold = i / n_samples
    gain[threshold] = me.calculate_return(X_test, threshold)
pd.Series(gain).plot()

スクリーンショット 2020-07-11 15.30.19.png Je perds vraiment, donc j'ai encore besoin de m'améliorer ...

Explication détaillée dans la vidéo ↓ Analyse de données / apprentissage automatique à partir de la prédiction des courses de chevaux スクリーンショット 2020-07-11 15.33.33.png

Recommended Posts

Une méthode concrète pour prédire les courses de chevaux et simuler le taux de récupération par apprentissage automatique
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
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
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
Procédure d'apprentissage automatique de base: ③ Comparez et examinez la méthode de sélection de la quantité de caractéristiques
Prédire le temps objectif d'un marathon complet avec l'apprentissage automatique-③: j'ai essayé de visualiser les données avec Python-
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
[Apprentissage automatique] Ecrivez vous-même la méthode k-plus proche voisin en python et reconnaissez les nombres manuscrits.
J'ai considéré la méthode d'apprentissage automatique et son langage d'implémentation à partir des informations de balise de Qiita
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
Avec l'apprentissage en profondeur, vous pouvez dépasser le taux de récupération de 100% dans les courses de chevaux
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 4)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 5)
Programmer la méthode gagnante des courses de chevaux
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Une méthode simple pour obtenir le taux de réponse correct de MNIST de 97% ou plus en apprenant sans enseignant (sans apprentissage par transfert)
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Examen de la méthode de prévision des échanges utilisant le Deep Learning et la conversion en ondelettes
Déterminez l'authenticité des articles publiés par machine learning (API Google Prediction).
Méthode gagnante des courses de chevaux par optimisation des combinaisons
Méthode d'évaluation du problème de régression d'apprentissage automatique (erreur quadratique moyenne et coefficient de décision)
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Prédire les travaux de courte durée de Weekly Shonen Jump par apprentissage automatique (Partie 2: Apprentissage et évaluation)
Un débutant en apprentissage automatique a essayé de créer un modèle de prédiction de courses de chevaux avec python
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Un mémorandum de méthode souvent utilisé dans l'apprentissage automatique utilisant scikit-learn (pour les débutants)
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
Classification des images de guitare par apprentissage automatique Partie 1
Tournoi Numerai - Fusion de quants traditionnels et apprentissage automatique -
Un mémorandum d'étude et de mise en œuvre du Deep Learning
Apprentissage parallèle du deep learning par Keras et Kubernetes
À propos du contenu de développement de l'apprentissage automatique (exemple)
Analyse de l'utilisation de l'espace partagé par l'apprentissage automatique
[Français] scikit-learn 0.18 Introduction de l'apprentissage automatique par le didacticiel scikit-learn
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2
Estimation raisonnable du prix de Mercari par apprentissage automatique
Classification des images de guitare par apprentissage automatique, partie 2
Touchons une partie de l'apprentissage automatique avec Python
Prise en compte des forces et faiblesses de Python
Histoire de l'analyse de données par apprentissage automatique
Feuille de route d'apprentissage et livres recommandés enseignés par les étudiants OB du Département des Systèmes d'Information ~ N ° 2 ~
Prédire les attributs offensifs et défensifs à partir du nom de la carte Yugioh --Yugiou Data Science 3. Machine Learning
[Apprentissage automatique] "Détection d'anomalies et détection de changement" Dessinons la figure du chapitre 1 en Python.
Introduction à l'apprentissage automatique ~ Montrons le tableau de la méthode du K plus proche voisin ~ (+ gestion des erreurs)
J'ai créé une application Twitter qui identifie et enregistre l'image d'un personnage spécifique sur la chronologie de Twitter par pytorch transfer learning
Procédure de génération et d'enregistrement d'un modèle d'apprentissage par machine learning, en faisant un serveur API et en communiquant avec JSON depuis un navigateur