Model pembelajaran mesin dengan Python menggunakan perpustakaan Scikit-learning untuk memprediksi hasil pertandingan sepak bola di Liga Premier Rusia (RPL).
Entri
Saya terinspirasi untuk menulis artikel ini dengan artikel
Machine learning: memprediksi 2018 matematika EPL . Model pembelajaran mesin kami akan melatih pada statistik pertandingan Liga Premier Rusia (RPL) mulai dari musim 2015/2016 untuk memprediksi hasil pertandingan mendatang. Data diambil dari situs web statistik sepakbola wyscout.com.
Kode dan data tersedia di
github .
Data
Kami menghubungkan perpustakaan yang diperlukan:
import pandas as pd import numpy as np import collections
Data pertandingan ada di
github .
data = pd.read_csv("RPL.csv", encoding = 'cp1251', delimiter=';') data.head()

Apa yang dimaksud xG dan PPDA?xG (tujuan yang diharapkan) adalah model tujuan yang diharapkan. Ini didasarkan pada indikator tembakan ke gawang, atas dasar itu kita dapat memperkirakan berapa banyak gol yang harus dicetak tim jika kita memperhitungkan semua tembakan yang diterapkannya.
Pelajari lebih lanjut tentang xG.PPDA (Passes Allow Per Defensive Action) adalah indikator statistik sepakbola yang memungkinkan Anda menentukan intensitas tekanan dalam pertandingan. Semakin rendah nilai PPDA, semakin tinggi intensitas permainan di pertahanan.
Pelajari lebih lanjut tentang PPDAPPDA = jumlah operan yang dilakukan oleh tim penyerang / jumlah aksi di lini pertahanan
Kami akan memprediksi hasil pertandingan untuk bagian kedua musim 2018/2019 (mis. Pertandingan yang dimainkan pada 2019). Daftar tim yang bermain musim ini (tidak termasuk Arsenal, Orenburg, Dynamo, Krylia Sovetov dan Yenisei, karena mereka tidak memiliki statistik untuk musim lalu, atau ada beberapa statistik pada mereka):
RPL_2018_2019 = pd.read_csv('Team Name 2018 2019.csv', encoding = 'cp1251') teamList = RPL_2018_2019['Team Name'].tolist() teamList

Kami menghapus pertandingan dengan tim yang tidak berpartisipasi di musim 2018/2019:
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)
Fungsi yang mengembalikan statistik tim untuk satu musim:
def GetSeasonTeamStat(team, season): goalScored = 0
Contoh penggunaan fungsi:
GetSeasonTeamStat("", 2018)

Untuk kenyamanan, kami dapat menambahkan kode:
returnNames = ["", "", "", "\n ", " ", "\n ", "\nxG ( )", "PPDA ( )", "\n", " ", "\n", " ", "\n", " ", "\n ( )"] for i, n in zip(returnNames, GetSeasonTeamStat("", 2018)): print(i, n)

Mengapa statistik kami berbeda dari statistik nyataStatistik nyata Spartak di musim 2017/2018:

Statistiknya berbeda karena Kami memperhitungkan pertandingan tim yang tidak bermain di RPL di musim 2018/2019. Artinya, kami tidak memperhitungkan pertandingan Spartak - SKA, Spartak - Tosno, dll.
Fungsi yang akan mengembalikan statistik semua tim untuk musim ini:
def GetSeasonAllTeamStat(season): annual = collections.defaultdict(list) for team in teamList: team_vector = GetSeasonTeamStat(team, season) annual[team] = team_vector return annual
Pelatihan model
Kami akan menulis fungsi yang akan mengembalikan data pelatihan. Dia membuat kamus dengan vektor tim untuk semua musim. Untuk setiap permainan, fungsi menghitung perbedaan antara vektor tim untuk musim tertentu dan menulisnya ke xTrain. Fungsi ini kemudian menetapkan yTrain ke 1 jika tim tuan rumah menang, dan 0 sebaliknya.
def GetTrainingData(seasons): totalNumGames = 0 for season in seasons: annual = data[data[''] == season] totalNumGames += len(annual.index) numFeatures = len(GetSeasonTeamStat('', 2016))
Kami mempelajari data pelatihan untuk semua musim dari 2015/2016 hingga 2018/2019.
years = range(2016,2019) xTrain, yTrain = GetTrainingData(years)
Untuk memprediksi kemungkinan menang, kita akan menggunakan algoritma pembelajaran mesin LinearRegression dari pustaka Scikit-Learn.
from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(xTrain, yTrain)
Kami akan menulis fungsi yang akan mengembalikan perkiraan. Ini akan mengembalikan nilai antara 0 dan 1, di mana 0 adalah kerugian dan 1 adalah keuntungan.
def createGamePrediction(team1_vector, team2_vector): diff = [[a - b for a, b in zip(team1_vector, team2_vector)]] predictions = model.predict(diff) return predictions
Hasil
Sebagai contoh, mari kita lihat prediksi algoritma untuk pertandingan Zenit - Spartak
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))

Ternyata dalam pertandingan Zenit - Spartak, probabilitas kemenangan untuk Zenit adalah 47% (17/03/2019 Spartak 1-1 Zenit).
Saya mengusulkan untuk membuat perkiraan mengingat hal berikut:
Hingga 40% - tim tidak akan menang (kalah atau seri)
Dari 40% hingga 60% - probabilitas tinggi hasil seri
Dari 60% - tim pasti tidak akan kalah (menang atau seri)
Turunkan perkiraan untuk CSKA terhadap semua klub lainnya
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,))

Algoritma memberikan perkiraan yang benar untuk hampir semua pertandingan yang tidak berakhir imbang. Satu-satunya perkiraan yang tidak akurat: CSKA Moscow - Zenit. Probabilitas kemenangan CSKA lebih tinggi sebesar 0,001, dapat diasumsikan bahwa tim memiliki kekuatan yang sama dan akan bermain imbang, tetapi pada akhirnya Zenit menang (3-1).
Kesimpulan
Algoritma kami sangat primitif. Hanya memperhitungkan statistik pertandingan (dan kemudian hanya 15 parameter dasar), dan hasil dalam sepak bola tergantung pada banyak faktor. Bahkan kondisi lapangan atau cuaca dapat mempengaruhi hasil pertandingan.
Selanjutnya, saya ingin menambah jumlah tanda, membuat sampel uji, mencoba berbagai algoritme, mengkonfigurasi model, dan mendapatkan perkiraan paling akurat.
Saya akan berterima kasih jika Anda meninggalkan ide dan komentar Anda.