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

You are currently viewing Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym – 1 przykład architektury
Photo by Thomas Serer on Unsplash
Share This Post, Help Others, And Earn My Heartfelt Appreciation! :)
4.9
(94)

Piłka nożna, Uczenie maszynowe, przewidywanie wyników meczów: 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 -> Uczenie maszynowe

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 i Uczenie maszynowe (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 zdarzenia. Algorytm klasyfikacji, który zaimplmentowałem skupiał się na wyliczeniu prawdopodobieństwa wystąpienia tych zdarzeń w danej chwili meczu. Bazował on na ponad 100 cechach, które brał pod uwagę wyliczając 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żej 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 algorytm dobrze przewidział stały wzrost szans dla gospodarzy.
  • pomiędzy 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 prawdopodobny (zielona linia)
  • 95′ – w doliczonym czasie Ajax wyrównuje na 3:3.
BigData-ETL: Screenshot from 2019 10 07 23 17 04
Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym – 1 przykład architektury

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 stwarza więcej 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 spoczęła na laurach. Ich gra stała się statyczna. Za to w drużynie gości narastała chęć zdobycia wyrównującej bramki. Co ciekawe algorytm „stwierdził”, że Borussia M’gladbach ma wyrównane szanse, żeby wygrać mecz tak samo jak gospodarze. Zabrakło tylko czasu i szczęścia.

BigData-ETL: Screenshot from 2019 10 08 11 02 13
Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym – 1 przykład architektury

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
BigData-ETL: Screenshot from 2019 10 08 14 41 39
Piłka nożna: Uczenie maszynowe – przewidywanie wyników meczów w czasie rzeczywistym – 1 przykład architektury

Dalszy rozwój -> Uczenie maszynowe i Piłka nożna

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 na to zabawę. Aby przebić się dziś wśród konkurencji potrzeba przede wszystkim czasu i 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ć! 🙂

How useful was this post?

Click on a star to rate it!

Average rating 4.9 / 5. Vote count: 94

No votes so far! Be the first to rate this post.

Subscribe
Powiadom o
guest
0 Comments
Inline Feedbacks
View all comments