[PYTHON] Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen

Zweck

Prognostizieren Sie Pferderennen mit maschinellem Lernen und streben Sie eine Wiederherstellungsrate von 100% an

Was ist diesmal zu tun?

Dieser Artikel ist eine Fortsetzung des folgenden Artikels.

Dieses Mal werde ich versuchen zu simulieren, wie viel ich gewinnen kann, wenn ich mit diesem Modell tatsächlich auf doppelte Gewinne setze.

Quellcode

Kratzen Sie zuerst die Rückerstattungstabelle ab. スクリーンショット 2020-07-11 15.16.52.png Wenn Sie normal kratzen, werden Double Win und Wide nicht wie unten gezeigt getrennt. Konvertieren Sie daher das Zeilenvorschub-Tag </ font> in eine Zeichenfolge. スクリーンショット 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

Wenn Sie wie im vorherigen Artikel eine Liste von race_id einfügen, erstellen Sie eine Funktion, die die Rückerstattungsdaten abkratzt und in den DataFrame-Typ konvertiert.

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])

Erstellen Sie als Nächstes eine Retrun-Klasse und verarbeiten Sie die Double-Win-Daten, damit sie verwendet werden können.

class Return:
    def __init__(self, return_tables):
        self.return_tables = return_tables
    
    @property
    def fukusho(self):
        fukusho = self.return_tables[self.return_tables[0]=='Doppelsieg'][[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 Geben Sie als Nächstes das LightGBM und die Rückerstattungsdaten ein, die Sie gerade abgekratzt haben, und erstellen Sie eine ModelEvaluator-Klasse, die die AUC-Punktzahl berechnet und das Modell ausgleicht und bewertet.

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()[['Pferdenummer']]
        pred_table['pred'] = self.predict(X, threshold)
        if bet_only:
            return pred_table[pred_table['pred']==1]['Pferdenummer']
        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['Pferdenummer']]['return_{}'.format(i)].sum()
        return money

Wenn ich tatsächlich berechne ...

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 Ich verliere wirklich, also muss ich mich noch verbessern ...

Detaillierte Erklärung im Video ↓ Datenanalyse / maschinelles Lernen beginnend mit der Vorhersage von Pferderennen スクリーンショット 2020-07-11 15.33.33.png

Recommended Posts

Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Eine Geschichte über das Erreichen einer Wiederherstellungsrate von Pferderennen von über 100% durch maschinelles Lernen
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Vorhersage für Pferderennen: Wenn Sie der Meinung sind, dass die Wiederherstellungsrate beim maschinellen Lernen (Light GBM) 100% überschritten hat, haben Sie dies getan
Grundlegendes maschinelles Lernverfahren: ③ Vergleichen und untersuchen Sie die Auswahlmethode für die Merkmalsmenge
Vorhersage der Zielzeit eines vollständigen Marathons mit maschinellem Lernen - Visual: Visualisierung von Daten mit Python-
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
[Maschinelles Lernen] Schreiben Sie die Methode des nächsten Nachbarn in Python selbst und erkennen Sie handgeschriebene Zahlen.
Ich habe die Methode des maschinellen Lernens und ihre Implementierungssprache anhand der Tag-Informationen von Qiita betrachtet
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Mit Deep Learning können Sie die Erholungsrate von 100% im Pferderennen überschreiten
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
Programmieren Sie die Gewinnmethode für Pferderennen
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Eine einfache Methode, um eine korrekte MNIST-Antwortrate von 97% oder mehr zu erhalten, indem Sie ohne Lehrer lernen (ohne Transferlernen).
Python-Lernnotiz für maschinelles Lernen von Chainer bis zum Ende von Kapitel 2
Untersuchung der Austauschprognosemethode mittels Deep Learning und Wavelet-Konvertierung
Bestimmen Sie die Authentizität von veröffentlichten Artikeln durch maschinelles Lernen (Google Prediction API).
Siegermethode für Pferderennen durch Kombinationsoptimierung
Bewertungsmethode des Regressionsproblems des maschinellen Lernens (mittlerer quadratischer Fehler und Entscheidungskoeffizient)
Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes
Vorhersage kurzlebiger Arbeiten von Weekly Shonen Jump durch maschinelles Lernen (Teil 2: Lernen und Bewertung)
Ein Anfänger des maschinellen Lernens versuchte, mit Python ein Vorhersagemodell für Pferderennen zu erstellen
Annäherung nach der Methode der kleinsten Quadrate eines Kreises mit zwei festen Punkten
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ein Memorandum über Methoden, die häufig beim maschinellen Lernen mit Scikit-Learn (für Anfänger) verwendet werden.
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Numerai Turnier-Fusion von traditionellen Quants und maschinellem Lernen-
Ein Memorandum zum Studieren und Implementieren von Deep Learning
Paralleles Lernen von Deep Learning durch Keras und Kubernetes
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Analyse der gemeinsamen Raumnutzung durch maschinelles Lernen
[Übersetzung] scikit-learn 0.18 Einführung in maschinelles Lernen durch Tutorial scikit-learn
Maschinelles Lernen eines jungen Ingenieurs Teil 2
Angemessene Preisschätzung von Mercari durch maschinelles Lernen
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Berücksichtigung der Stärken und Schwächen von Python
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Lernfahrplan und empfohlene Bücher, die von OB-Studenten der Abteilung für Informationssysteme unterrichtet werden ~ Nr. 2 ~
Vorhersage offensiver und defensiver Attribute anhand des Yugioh-Kartennamens - Yugiou Data Science 3. Maschinelles Lernen
[Maschinelles Lernen] "Erkennung von Abnormalitäten und Erkennung von Änderungen" Zeichnen wir die Abbildung von Kapitel 1 in Python.
Einführung in das maschinelle Lernen ~ Zeigen wir die Tabelle der K-Methode für den nächsten Nachbarn ~ (+ Fehlerbehandlung)
Ich habe eine Twitter-App erstellt, die das Bild eines bestimmten Charakters auf der Twitter-Timeline durch Pytorch-Transfer-Lernen identifiziert und speichert
Verfahren zum Generieren und Speichern eines Lernmodells durch maschinelles Lernen, Erstellen eines API-Servers und Kommunizieren mit JSON über einen Browser