Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym

Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym
Photo by Thomas Serer on Unsplash

Zbierałem się do napisania tego wpisu już od dłuższego czasu. Pewnego dnia, gdy bawiłem się możliwościami biblioteki Apache Spark MLib wpadł mi do głowy pewien pomysł…

A gdyby tak mieć możliwość przewidzieć, która drużyna wygra mecz piłki nożnej? No i się zaczęło…

Już widziałem oczyma wyobraźni te miliony monet, które można by zarobić na zakładach bukmacherskich 🙂 No, ale do rzeczy.

Wymagania

Gdy zacząłem rozmyślać nad tym głębiej to doszedłem do wniosku, że nie chciałbym tylko mieć możliwość przewidywania wyniku meczu przed jego rozpoczęciem, ale bardziej mi zależało na tym, aby wiedzieć jak zmieniają się szanse każdej z drużyn w trakcie jego trwania.

Dodatkowo chciałbym mieć to przedstawione w jakiś graficzny sposób np. wykres. Wtedy pojawił się kolejny pomysł, żeby stworzyć aplikację webową, którą będzie przedstawiała harmonogram meczy z kilkunastu lig, ze wskazaniem na “dzisiejsze mecze” i aktualnie trwające. 

Te ostatnie miałby przedstawiać zmiany szans poszczególnych drużyn w czasie rzeczywistym. Dzięki temu mogłem śledzić jak zmienia się trend każdej z drużyn. No i w ten sposób znalazłem sobie zajęcie na kilka miesięcy (około 3). 🙂

Architektura

Od razu, gdy zacząłem tworzyć architekturę chciałem stworzyć ją tak, aby poszczególne elementy nie były ze sobą sztywno połączone, bardziej podejść do tego zagadnienia modułowo. I w ten sposób zaczęły mi się pojawiać aplikacje, które były tylko odpowiedzialne za:

  • Pobranie danych ze źródła (historyczne oraz w trakcie trwania meczu) – Java
  • Czyszczenie, normalizacja i wzbogacenie danych – Java
  • Przewidywanie wyników (Machine Learning) – Spark + Scala
  • Aplikacja webowa – HTML, CSS, PHP, JS, Bootstrap

Od razu zaznaczam, że nie jestem web deweloperem, więc cześć związana z aplikacją webową była traktowana przeze mnie z przymrużeniem oka, miało działać i tyle.

Apache Airflow

Wraz ze zwiększoną ilością aplikacji pojawiła się potrzeba, aby w jakiś sposób mieć możliwość wygodnie zarządzać uruchomieniami poszczególnych aplikacji (harmonogram) oraz mieć wgląd w ich logi. Z pomocą przyszedł mi w tym przypadku Apache Airflow, który sprawdził się bardzo dobrze. 

Uczenie maszynowe (Machine Learning ML)

Wynikiem meczu piłkarskiego może być wygrana którejś z drużyn lub remis. Coś oczywistego! Czyli mamy 3 możliwe zdzrzenia. Algorytm klasyfikacji, który zaimplmentowałem skupiał się na wyliczynie prawdopodobieństwa wystąpienia tych zdarzeń w danej chwili meczu. Bazował on na ponad 100 cechach, które brał pod uwagę wyliczająć prawdopodobieństwo któregoś ze zdarzeń.

Testy

Gdy złożyłem całą aplikację podzieloną na mikroserwisy i uruchomiłem, nadszedł czas testów. Oglądałem wybrane mecze na żywo, obserwowałem jak wygląda sytuacja na murawie i równocześnie patrzyłem co na to mój model sztucznej inteligencji. Frajda była ogromna jak, gdy spoglądałem na wykres i w dużej mierze odzwierciedlał on faktyczny stan na murawie.

Poniżęj przedstawiam kilka wybranych meczy wraz z analizą tego w jaki sposób i jakie czynniki miały wpływ na przebieg spotkania.

Mecz 1: Ajax Amsterdam [3 – 3] Bayern Monachium (12 gru 2018)

Zdecydowanym faworytem był Bayern Monachium. Lecz Ajax pokazał na boisku wolę walki i umiejętności co przełożyło się na wynik spotkania, gdzie remis 3:3 był dla Ajaxu odzwierciedleniem ich dobrej gry.

Przebieg spotkania:

  • 13′ – gol dla Bayernu (Robert Lewandowski) – widać na wykresie, że od tej minuty szanse gości wzrosły o kilka procent.
  • około 35′ po dwóch żółtych kartkach dla Bayernu i słabszego momentu i ich grze szanse Ajax’u wzrosły. Tendencja zwyżkowa utrzymywała się jeszcze przez dłuższy czas.
  • 61′ – gol Ajaxu na 1:1 – od tej pory widać, że Ajax przejął inicjatywę i na tym nie poprzestał.
  • w oknie pomiędzy 61′ – 87‘ można zauważyć, że Ajax stale zwiększał swoje szanse na wygranie meczu. Co udowodnił strzelając drugą bramkę na 2:1 w 84′. Na wykresie można zauważyć, że algolytrm dobrze przewidział stały wzrost szans dla gospodarzy.
  • pomiedzy 87′-90′ minutą następuje załamanie w drużynie gospodarzy po dwóch szybkich golach ze strony Bayern’u i jest już 2:3 dla gości. Ale Ajax się nie poddaje co widać, że wynik remisem stał się bardzo prawdopodoby (zielona linia)
  • 95′ – w doliczonym czasie Ajax wyrównuje na 3:3.

Mecz 2: Borussia Dortmund [2 – 1] Borussia M’gladbach (21 gru 2018)

Generalnie Borussia Dortmund zagrała słabe spotkanie, lecz nie zawsze wygrywa ten co stwrza wiecej szans i statystycznie jest lepszy, lecz ten kto te szanse wykorzystuje. Lecz z wykresu da się łatwo zauważyć lepsze i gorsze momenty gry obu drużyn.

Przebieg spotkania:

  • 43′ – gol dla Borussi Dortmund
  • 45′ – gol dla Borussi M’gladbach
  • 54′ – kolejny gol dla Borussi Dortmund (Reus)

Po golu Reus’a Borussia Dortmund spoczeła na laurach. Ich gra stała się statyczna. Za to w drużynie gości narastała chęć zdobyća wyrwnującej walki. Co ciekawe alorytm “stwierdził”, że Borussia M’gladbach ma wywrównane szanse, żeby wygrać mecz tak samo jak gospodarze. Zabrakło tylko czasu i szcześcia.

Mecz 3: Lazio [3 – 1] Eintracht Frankfurt (13 gru 2018)

Eintracht Frankfurt był faworytem meczu od pierwszych minut, ale to Lazio strzeliło pierwszego gola w 56′ meczu. Lecz gracze Eintracht wyrównali w 65′ i następnie objeli prowadzenie w 71′.

Przebieg spotkania:

  • 50′ – żółta kartka dla Luis Albert (Lazio)
  • 56′ – piwerwszy gol dla Lazio
  • potem kolejno 65′ i 71‘ – dwa gole dla Eintracht Frankfurt

Dalszy rozwój

Niestety utrzymanie serwerów oraz opłaty związane z subskrypcją u dostawcy danych o meczach przekroczyły mój budżet, który przewidziałem ną to zabawę. Aby przebić się dziś wśród konkurencji potrzeba przedewszystkim czasu i przedewszstykim pieniędzy na utrzymanie.

Drugą kwestią jest to, że jeśli dziś miałbym podjąć się drugi raz tego tematu to podszedłbym do niego w inny sposób. W niektórych przypadkach użyłbym innych technologii 🙂

Jeśli prowadzisz serwis z podobną tematyką i chciałbyś rozszerzyć swój serwis o podobną usługę, napisz do mnie. Może uda nam się coś ciekawego razem stworzyć! 🙂

Leave a Reply

avatar
  Subscribe  
Powiadom o
Close Menu