Ein Modell für maschinelles Lernen in Python, das die Scikit-Lernbibliothek verwendet, um die Ergebnisse von Fußballspielen in der russischen Premier League (RPL) vorherzusagen.
Eintrag
Ich wurde inspiriert, diesen Artikel durch den Artikel
Maschinelles Lernen zu schreiben
: Vorhersage der EPL-Mathematik 2018 . Unser Modell für maschinelles Lernen wird die Statistiken der Spiele der russischen Premier League (RPL) ab der Saison 2015/2016 trainieren, um die Ergebnisse der kommenden Spiele vorherzusagen. Daten stammen von der Fußballstatistik-Website von wyscout.com.
Code und Daten sind auf
github verfügbar.
Daten
Wir verbinden die notwendigen Bibliotheken:
import pandas as pd import numpy as np import collections
Spieldaten sind auf
Github .
data = pd.read_csv("RPL.csv", encoding = 'cp1251', delimiter=';') data.head()

Was bedeuten xG und PPDA?xG (erwartete Ziele) ist ein Modell für erwartete Ziele. Es basiert auf dem Indikator für Torschüsse, anhand dessen wir abschätzen können, wie viele Tore das Team tatsächlich erzielen musste, wenn wir alle Schüsse berücksichtigen, die es abgegeben hat.
Erfahren Sie mehr über xG.PPDA (Passes Permowed Per Defensive Action) ist ein Fußballstatistikindikator, mit dem Sie die Druckintensität in einem Spiel bestimmen können. Je niedriger der PPDA-Wert ist, desto höher ist die Intensität des Verteidigungsspiels.
Erfahren Sie mehr über PPDAPPDA = Anzahl der Pässe des angreifenden Teams / Anzahl der Verteidigungsaktionen
Wir werden die Spielergebnisse für den zweiten Teil der Saison 2018/2019 vorhersagen (d. H. Die Spiele, die 2019 gespielt wurden). Die Liste der Mannschaften, die in dieser Saison spielen (ohne Berücksichtigung von Arsenal, Orenburg, Dynamo, Krylia Sovetov und Jenissei, da sie entweder keine Statistiken für vergangene Spielzeiten haben oder nur wenige Statistiken darüber):
RPL_2018_2019 = pd.read_csv('Team Name 2018 2019.csv', encoding = 'cp1251') teamList = RPL_2018_2019['Team Name'].tolist() teamList

Wir entfernen Spiele mit Mannschaften, die nicht an der Saison 2018/2019 teilnehmen:
deleteTeam = [x for x in pd.unique(data['']) if x not in teamList] for name in deleteTeam: data = data[data[''] != name] data = data[data[''] != name] data = data.reset_index(drop=True)
Funktion, die Teamstatistiken für eine Saison zurückgibt:
def GetSeasonTeamStat(team, season): goalScored = 0
Beispiel für die Funktionsnutzung:
GetSeasonTeamStat("", 2018)

Der Einfachheit halber können wir den Code hinzufügen:
returnNames = ["", "", "", "\n ", " ", "\n ", "\nxG ( )", "PPDA ( )", "\n", " ", "\n", " ", "\n", " ", "\n ( )"] for i, n in zip(returnNames, GetSeasonTeamStat("", 2018)): print(i, n)

Warum unterscheiden sich unsere Statistiken von echten Statistiken?Echte Statistiken von Spartak in der Saison 2017/2018:

Die Statistiken sind anders, weil Wir haben die Spiele von Teams berücksichtigt, die in der Saison 2018/2019 nicht in der RPL spielen. Das heißt, wir berücksichtigen nicht die Spiele von Spartak - SKA, Spartak - Tosno usw.
Funktion, die Statistiken aller Teams für die Saison zurückgibt:
def GetSeasonAllTeamStat(season): annual = collections.defaultdict(list) for team in teamList: team_vector = GetSeasonTeamStat(team, season) annual[team] = team_vector return annual
Modelltraining
Wir werden eine Funktion schreiben, die Trainingsdaten zurückgibt. Sie erstellt ein Wörterbuch mit Teamvektoren für alle Jahreszeiten. Für jedes Spiel berechnet die Funktion die Differenz zwischen den Vektoren von Teams für eine bestimmte Saison und schreibt sie in xTrain. Die Funktion setzt yTrain dann auf 1, wenn die Heimmannschaft gewinnt, und andernfalls auf 0.
def GetTrainingData(seasons): totalNumGames = 0 for season in seasons: annual = data[data[''] == season] totalNumGames += len(annual.index) numFeatures = len(GetSeasonTeamStat('', 2016))
Wir lernen Trainingsdaten für alle Jahreszeiten von 2015/2016 bis 2018/2019.
years = range(2016,2019) xTrain, yTrain = GetTrainingData(years)
Um die Gewinnwahrscheinlichkeit vorherzusagen, verwenden wir den LinearRegression-Algorithmus für maschinelles Lernen aus der Scikit-Learn-Bibliothek.
from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(xTrain, yTrain)
Wir werden eine Funktion schreiben, die Prognosen zurückgibt. Es wird ein Wert zwischen 0 und 1 zurückgegeben, wobei 0 der Verlust und 1 der Gewinn ist.
def createGamePrediction(team1_vector, team2_vector): diff = [[a - b for a, b in zip(team1_vector, team2_vector)]] predictions = model.predict(diff) return predictions
Ergebnisse
Schauen wir uns zum Beispiel die Vorhersagen des Algorithmus für das Match Zenit - Spartak an
team1_name = "" team2_name = "" team1_vector = GetSeasonTeamStat(team1_name, 2019) team2_vector = GetSeasonTeamStat(team2_name, 2019) print (', ' + team1_name + ':', createGamePrediction(team1_vector, team2_vector)) print (', ' + team2_name + ':', createGamePrediction(team2_vector, team1_vector))

Es stellt sich heraus, dass im Spiel Zenit - Spartak die Gewinnwahrscheinlichkeit für Zenit 47% beträgt (17.03.2019 Spartak 1-1 Zenit).
Ich schlage vor, eine Prognose zu erstellen, wenn Folgendes gegeben ist:
Bis zu 40% - das Team gewinnt einfach nicht (Niederlage oder Unentschieden)
Von 40% bis 60% - eine hohe Wahrscheinlichkeit eines Unentschieden
Ab 60% wird das Team definitiv nicht verlieren (gewinnen oder unentschieden)
Leiten Sie Prognosen für CSKA gegen alle anderen Vereine ab
for team_name in teamList: team1_name = "" team2_name = team_name if(team1_name != team2_name): team1_vector = GetSeasonTeamStat(team1_name, 2019) team2_vector = GetSeasonTeamStat(team2_name, 2019) print(team1_name, createGamePrediction(team1_vector, team2_vector), " - ", team2_name, createGamePrediction(team2_vector, team1_vector,))

Der Algorithmus lieferte eine korrekte Prognose für fast alle Spiele, die nicht unentschieden endeten. Die einzige ungenaue Prognose: CSKA Moskau - Zenit. Die Wahrscheinlichkeit eines CSKA-Sieges ist um 0,001 höher. Man könnte davon ausgehen, dass die Teams gleich stark sind und unentschieden spielen, aber am Ende gewann Zenit (3: 1).
Fazit
Unser Algorithmus ist sehr primitiv. Es werden nur die Statistiken der Spiele (und dann nur 15 grundlegende Parameter) berücksichtigt, und das Ergebnis im Fußball hängt von vielen Faktoren ab. Sogar der Zustand des Feldes oder das Wetter können das Ergebnis des Spiels beeinflussen.
Als nächstes möchte ich die Anzahl der Zeichen erhöhen, ein Testmuster erstellen, verschiedene Algorithmen ausprobieren, das Modell konfigurieren und die genauesten Vorhersagen erhalten.
Ich wäre Ihnen dankbar, wenn Sie Ihre Ideen und Kommentare hinterlassen würden.