[PYTHON] Eine Geschichte über das Erreichen einer Wiederherstellungsrate von Pferderennen von über 100% durch maschinelles Lernen

Einführung

Magst du Pferderennen? Ich bin ein Anfänger, der dieses Jahr angefangen hat, aber es macht wirklich Spaß, verschiedene Informationen zu sammeln, vorherzusagen und zu raten!

Anfangs hat es Spaß gemacht, nur zu antizipieren, aber der Wunsch, ** "Ich will nicht verlieren" **, floss über.

Als ich im Internet surfte, fragte ich mich, ob es einen köstlichen Weg gibt, um zu gewinnen, und es schien interessant, Pferderennen mit maschinellem Lernen vorherzusagen. Deshalb beschloss ich, es nach dem Studium zu versuchen.

Ziel

Die Rücklaufquote bei Pferderennen scheint zwischen 70 und 80% zu liegen. Wenn Sie es also richtig kaufen, wird die Wiederherstellungsrate wahrscheinlich auf dieses Niveau konvergieren.

Daher möchte ich vorerst eine ** Wiederherstellungsrate von 100% oder mehr ** anstreben, indem ich die vor dem Rennen erhaltenen Daten verwende!

Legen Sie die Einstellung fest

Selbst wenn Sie eine Vorhersage für Pferderennen sagen, gibt es meiner Meinung nach verschiedene Dinge, wie beispielsweise die einfache Vorhersage des Rankings oder die Optimierung der Wettmethode unter Berücksichtigung der Gewinnchancen. Es gibt auch verschiedene Arten von Wettkarten zu kaufen.

Dieses Mal möchte ich die Rangliste der Pferderennen in 3 Gruppen innerhalb des 3. Platzes, der Mitte und der unteren, aufteilen und eine ** Mehrklassenklassifizierung ** durchführen.

Und ich werde ein ** Win-Type ** Wett-Ticket für das Pferd kaufen, das in den erwarteten Ergebnissen an erster Stelle steht. Der Grund dafür ist, dass die Win-Win-Rücklaufquote höher ist als die von hochpreisigen Wettkarten wie Triple. (Referenz: Buenas Blog-Wissen über Pferderennen für Wettscheine)

Außerdem werde ich keine Informationen zu Beliebtheit und Gewinnchancen für Feature-Mengen verwenden. Wie wäre es mit Informationen, die erst kurz vor dem Rennen entschieden werden? Und das liegt daran, dass ich dachte, es wäre nicht interessant, einfach ein beliebtes Pferd zu kaufen. (Die etwa 50 Minuten vor dem Start des Rennens ermittelten Pferdegewichtsdaten werden als Merkmalsbetrag behandelt.)

Dieses Mal möchte ich mich auf das Rennen auf der Tokyo Racecourse konzentrieren und wie folgt vorgehen. Der Grund für die Eingrenzung der Rennstrecke ist, dass es aufgrund des schlechten Algorithmus und der Zeit von 1 Sekunde Zeit braucht, um die Renndaten zu kratzen. (Die Datenerfassung dauerte von 2008 bis 2019 etwa 50 Stunden ...)

Es ist ein Ärger, aber wenn Sie sich die Zeit nehmen, können Sie Daten für alle Rennstrecken sammeln.

Verfahren

  1. Sammeln Sie Renndaten, indem Sie von dieser Website (netkeiba.com) kratzen.
  2. Verarbeiten Sie die Daten vor.
  3. Trainieren Sie mit LightGBM, um ein Modell zu erstellen.
  4. Überprüfen Sie anhand des erstellten Modells die Wiederherstellungsrate für ein Jahr.

Schaben

Sammeln Sie durch Scraping von dieser Site (netkeiba.com). Soweit ich robots.txt (das überhaupt nicht vorhanden war) und die Nutzungsbedingungen gelesen habe, schien es für das Scraping in Ordnung zu sein, also habe ich darauf geachtet, es nicht zu überladen. Für die Schabemethode habe ich auf den folgenden Artikel verwiesen.

Das Ergebnis der Datenerfassung ist wie folgt.

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

Beim Schaben haben wir Informationen über Pferde entfernt, die in den letzten drei Rennen keine Leistung erbracht haben. Dies liegt daran, dass wir glauben, dass die Zukunft nicht für Dinge vorhergesagt werden kann, die keine Informationen aus der Vergangenheit haben.

Darüber hinaus fehlt möglicherweise der Zeitindex usw. für Pferde, die in ländlichen Gebieten oder in Übersee gelaufen sind, aber dieser Teil ist mit dem Durchschnittswert gefüllt.

Funktionswert

Dieses Mal wurden die folgenden Elemente als Merkmalsmengen behandelt. Daten des Tages

Variablennamen Inhalt
kai Wie oft
day Welchen Tag findet statt?
race_num Was R.
field Shiba oder Dreck
dist Entfernung
turn Welche Richtung
weather Wetter
field_cond Baba Staat
~~place~~ ~~Tagungsort~~
sum_num Wie viele Köpfe
prize Gewinnerpreis
horse_num Pferdenummer
sex Sex
age Alter
weight_carry Gewicht
horse_weight Pferdegewicht
weight_change Änderung des Pferdegewichts
l_days Wie viele Tage sind seit dem letzten Lauf vergangen?

Daten der letzten 3 Rennen (01 → vorheriger Lauf, 02 → 2 Rennen vor, 03 → 3 Rennen vor)
Variablennamen Inhalt
p_place Tagungsort
p_weather Wetter
p_race_num Was R.
p_sum_num Wie viele Köpfe
p_horse_num Pferdenummer
p_rank Rangfolge
p_field Shiba oder Dreck
p_dist Entfernung
p_condi Baba Staat
p_condi_num Baba Index
p_time_num Zeitindex

Vorverarbeitung

Ich habe nur die Zeit in Sekunden angegeben und die kategorialen Variablen beschriftet. Unten finden Sie als Beispiel den Code für die Beschriftung des Wetters.

encode.py


num = df1.columns.get_loc('weather')
    for i in range(df1['weather'].size):
        copy = df1.iat[i, num]
        if copy == 'Fein':
            copy = '6'
        elif copy == 'Regen':
            copy = '1'
        elif copy == 'leichter Regen':
            copy = '2'
        elif copy == 'Leichter Schnee':
            copy = '3'
        elif copy == 'Wolkig':
            copy = '4'
        elif copy == 'Schnee':
            copy = '5'
        else:
            copy = '0'
        df1.iat[i, num] = int(copy)

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

Beschriften Sie jede Kategorievariable auf diese Weise mit einem Label.

Ich dachte, es wäre einfacher mit LabelEncoder, aber ich habe es nicht verwendet, weil es unmöglich schien, die Kompatibilität konvertierter Zahlen und Variablen zwischen mehreren Datendateien zu vereinheitlichen.

Außerdem scheint LightGBM, das diesmal verwendete Framework für maschinelles Lernen, einen Entscheidungsbaum für den schwachen Klassifikator zu verwenden, sodass keine Standardisierung erforderlich ist. (Referenz: Einführung in LightGBM)

Vorhersagemodell

Erstellen Sie ein Modell mit LightGBM, einem Framework zur Erhöhung des Gradienten. Der Grund, warum ich mich dafür entschieden habe, ist, dass es schnell und (wahrscheinlich) am stärksten in nicht-tief ist.

Und was die Vorhersagemethode betrifft, haben wir diesmal eine Mehrklassenklassifikation vorgenommen, die in eine der drei Gruppen mit dem 3. Platz oder weniger, dem mittleren 1/3 ohne den 3. Platz und dem unteren 1/3 eingeteilt wird. Zum Beispiel ist bei 15 Köpfen der 1. bis 3. Platz die Gruppe 0, der 4. bis 8. Platz die Gruppe 1 und der 9. bis 15. Platz die Gruppe 2.

Ich habe auf die folgende Seite verwiesen, um zu erfahren, wie man es benutzt. (Referenz: [[Für Anfänger] LightGBM (Klassifizierung mehrerer Klassen) [Python] [Maschinelles Lernen]](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% 91lightgbm-% 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 /))

Die Trainingsdaten und Verifizierungsdaten sind wie folgt.

Trainingsdaten / Verifizierungsdaten Testdaten
Tokyo_2008_2018 Tokyo_2019

Die Trainingsdaten werden durch train_test_split in Trainingsdaten und Modellbewertungsdaten unterteilt. Es wurde keine spezielle Abstimmung der Parameter durchgeführt.

train.py


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

#Trainingsdaten erklären Variable Daten(X_train)Und objektive variable Daten(y_train)Eingeteilt in
X_train = train_set.drop('rank', axis=1)
y_train = train_set['rank']

#Erläutern Sie die Modellbewertungsdaten. Variablendaten(X_test)Und objektive variable Daten(y_test)Eingeteilt in
X_test = test_set.drop('rank', axis=1)
y_test = test_set['rank']

#Stellen Sie die zum Lernen verwendeten Daten ein
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, #Bezeichnung der Trainingsdaten
        valid_sets=lgb_eval, #Angeben von Verifizierungsdaten
        verbose_eval=10
)


### Versuche dich zu bewegen Ich habe es tatsächlich bewegt. ![model_pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666677/86df2b27-05bc-cc96-fc27-cc34733ac103.png)

Die richtige Antwortrate liegt bei 54%. Sie raten mehr als die Hälfte. Dieser Wert hat sich nicht viel geändert, auch wenn ich die Parameter manipuliert habe. Dieses Mal werde ich so weitermachen, wie er ist.

Überprüfung

Wir werden die verifizierten Daten 2019 für ein Jahr auf der Rennbahn von Tokio veröffentlichen.

Hier als Bedingung

Es wird gesagt. Der Grund für die zweite Bedingung besteht darin, Rennen auszuschließen, die mit ziemlicher Sicherheit fehlen, wie das 2-jährige Rennen, bei dem nur ein Pferd 3 oder mehr vergangene Renndaten hat.

Unten ist das resultierende Diagramm.

tansho.png


**: entspannt: Es fühlt sich gut an: entspannt: **
Um ehrlich zu sein, hätte ich nicht gedacht, dass die Wiederherstellungsrate so leicht 100% überschreiten würde.

Die Trefferquote liegt bei 26%, was ein guter Treffer ist.

Aufgrund der zweiten Bedingung gab es Rennen, bei denen ich nicht auf 100 Rennen wetten konnte, aber ich denke, es gibt keine Beschwerde über diese Wiederherstellungsrate, nachdem ich an ungefähr 80% der Rennen teilgenommen habe.


Da es sehr viel ist, möchte ich es mit anderen Wettkarten überprüfen. Darüber hinaus müssen nur 3 Einheiten 3 Kartons (6 Wege) kaufen. ![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)

Es ist sehr gut ...! Bei Mamono liegt die Wiederfindungsrate nahe bei 200%, was ein wunderbares Ergebnis ist. Wettkarten mit einer hohen Rendite anstelle einer niedrigen Trefferquote schwanken jedoch stark in der Sammelquote, daher möchte ich sie als Referenz behalten.

Der Unzufriedenheitspunkt ist, dass die Wiederherstellungsrate von Doppelsiegen weniger als 100% beträgt, obwohl wir bewerten, ob wir auf dem dritten Platz sind oder nicht. Ich möchte etwas gegen diesen Bereich unternehmen.

Fügen wir weitere Bedingungen hinzu

Bisher ist die einzige Bedingung für den Kauf eines Wettscheins die Anzahl der Pferde, aber im praktischen Gebrauch denke ich, dass dies durch das Gute oder Schlechte des erwarteten Wertes entschieden wird, anstatt alle Rennen zu kaufen.
Daher möchte ich die folgenden neuen Bedingungen hinzufügen.

** ・ Kaufen Sie nur, wenn die Differenz zwischen der 1. und 2. vorhergesagten Zahl in Gruppe 0 0,1 oder mehr beträgt. ** ** **

Mit anderen Worten, kaufen Sie nur in solchen Fällen スクリーンショット 2020-09-02 21.36.00.png Ich kaufe zu solchen Zeiten nicht スクリーンショット 2020-09-02 21.36.34.png darüber.

Der Grund für diesen Zustand

  1. Es ist schwierig vorherzusagen, ob Sie auf dem 3. Platz stehen oder nicht, da dieser bei vielen starken Pferden oder bei einer geringen Anzahl von Läufern tendenziell groß ist.
  2. Wenn es einen Unterschied in den vorhergesagten Zahlen gibt, wird erwartet, dass das Pferd im Zielrennen ziemlich stark ist. Weil.

Nachfolgend sind die Ergebnisse der Überprüfung unter diesen Bedingungen aufgeführt. tansho_1.png

**: entspannt: Es fühlt sich wirklich gut an: entspannt: **

Die Trefferquote hat sich von 26% auf 39% und die Wiederherstellungsrate von 130% auf 168% deutlich verbessert. Die Anzahl der Zielrennen hat sich um etwa 250 verringert und wurde auf 100 Rennen pro Jahr eingegrenzt. Angesichts der Tatsache, dass 1/4 immer noch teilnimmt, halte ich diese Wiederherstellungsrate für gut.
Ich werde vorerst andere Wettkarten ausprobieren. fukusho_1.png umaren_1.png umatan_1.png renpuku_1.png 3rentan_1.png

Es ist gut! Es ist erwähnenswert, dass die Trefferquote bei doppelten Gewinnen 70% und die Wiederherstellungsrate 100% übersteigt. Das beliebteste Pferd hat eine doppelte Gewinnrate von etwa 60-65% (Referenz: Entwicklerblog | AlphaImpact Co., Ltd.) Das scheint sehr gut zu sein.

Informationen zur Funktionsmenge

Schauen wir uns auch die Bedeutung von Features beim Erstellen eines Modells an. feature_importance.png

Sie können sehen, dass der Zeitindex als ziemlich wichtige Merkmalsgröße behandelt wird. Offensichtlich gewinnen Pferde, die in den vergangenen Rennen gut gelaufen sind, eher.

Überraschend war, dass die Anzahl der Tage seit dem letzten Rennen ebenso wichtig war wie die Anstiegszeit und das Pferdegewicht. Ich war überrascht, dass ich nicht viele Leute sehe, die Pferderennen vorhersagen und die Rotation betonen. Dies ist auch deshalb interessant, weil es sich mit Almond Eye überschneidet, der verloren hat, indem er Rote für die Mitte von zwei Wochen gezwungen hat. Nun, ich bin mir nicht sicher, ob der Index schlechter wird, weil der Platz kurz ist, aber lol

abschließend

Heutzutage scheint die KI des Pferderennsports immer aufgeregter zu werden, da einige Websites als Dienstleister fungieren und Dwangos Cyber Award. Unter solchen Umständen konnte ich die Vorhersage von Pferderennen mithilfe von maschinellem Lernen üben, was sehr viel Spaß machte.

Die Zukunft kann jedoch nicht perfekt vorhergesagt werden. Die Verwendung dieses Modells bedeutet also nicht, dass Sie definitiv gewinnen können. Es ist möglich, dass dieses und nächstes Jahr das Rennen besiegt wird.

Ich denke nicht, dass es gut ist, von so etwas zu viel zu erwarten, aber ich denke, es gibt Träume, weil manche Leute mit Pferderennprogrammen Geld verdienen.

Da Sie darauf hingewiesen haben, dass es sich um einen Leitfaden für finanzielle Zwecke handelt, habe ich die URL gelöscht. : Bogen:

Recommended Posts

Eine Geschichte über das Erreichen einer Wiederherstellungsrate von Pferderennen von über 100% durch maschinelles Lernen
Eine konkrete Methode zur Vorhersage von Pferderennen und zur Simulation der Wiederherstellungsrate durch maschinelles Lernen
Vorhersage für Pferderennen: Wenn Sie der Meinung sind, dass die Wiederherstellungsrate beim maschinellen Lernen (Light GBM) 100% überschritten hat, haben Sie dies getan
Eine Geschichte über maschinelles Lernen mit Kyasuket
Eine Geschichte über einfaches maschinelles Lernen mit TensorFlow
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Ein Anfänger des maschinellen Lernens versuchte, mit Python ein Vorhersagemodell für Pferderennen zu erstellen
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Maschinelles Lernen eines jungen Ingenieurs Teil 2
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Informationen zur Datenvorverarbeitung von Systemen, die maschinelles Lernen verwenden
Installation von TensorFlow, einer Bibliothek für maschinelles Lernen von Google
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Eine Geschichte über das Stolpern durch PATH nach der Installation von Anaconda
(Hinweis) Eine Geschichte zum Erstellen eines Frage- und Antwortsystems mit Spring Boot und maschinellem Lernen (SVM).
Ich habe mit LightGBM einen Code geschrieben, der die Wiederherstellungsrate von 100% bei der Vorhersage von Pferderennen überschreitet (Teil 2).
Maschinelles Lernen Eine Geschichte über Menschen, die mit GBDT in GBDT in Python nicht vertraut sind
Maschinelles Lernen Über Overlearning
Eine Geschichte über das Clustering von Zeitreihendaten des Austauschs
Die Zusammenfassung des maschinellen Lernens in Python für Anfänger ist sehr kurz.
Eine Geschichte über einen 40-jährigen Ingenieurmanager, der "Deep Learning for ENGINEER" bestanden hat