Cześć.
Co roku FIFA wybiera najlepszego piłkarza na świecie. Mam na myśli ranking, w którym zawsze wygrywa Ronaldo albo Messi, a Neymar jest na trzecim miejscu. Na końcu ostatniego roku, kiedy znowu wybierany był najlepszy piłkarz, pomyślałem o niedoskonałościach sposobu, w jaki jest dokonywany wybór. Najlepszy piłkarz jest wybierany poprzez głosy dziennikarzy i trenerów, więc jeżeli przykładowo najwięcej dziennikarzy jest z Hiszpanii, to największe szanse mają piłkarze z ligi hiszpańskiej (nie wiem dokładnie w jaki sposób to działa, ale na pewno nie jest to doskonały sposób). Pomyślałem o tym, jak to powinno być zrobione i napisałem program, który używa maszynowego uczenia się do tego by nauczyć się, jakie są umiejętności piłkarzy i kto jest najlepszym piłkarzem na świecie.
Co to znaczy, że dany piłkarz jest dobry? Piłka nożna to sport zespołowy, zatem opieram się na założeniu, że najlepszy piłkarz to taki, który najbardziej zwiększa prawdopodobieństwo wygranej drużyny poprzez swoją obecność w składzie.
W tym artykule dzielę się z Wami wynikami wygenerowanymi przez program.
Algorytm przeanalizował 23788 meczy. To są dane, które algorytm otrzymał na temat każdego analizowanego meczu (na podstawie tych danych algorytm stworzył ranking):
- Zawodnicy grający od pierwszej minuty w pierwszym zespole.
- Zawodnicy grający od pierwszej minuty w drugim zespole.
- Wynik meczu.
- Długość meczu (czasami więcej niż 90 minut z powodu dogrywki).
- Dokonane zmiany (kto wszedł, za kogo, w której minucie).
- Gole (która drużyna strzeliła, w której minucie).
- Kiedy odbył się mecz.
Zauważ, że algorytm NIE posiada informacji o tym, kto strzelił gole (posiada tylko informacje, który zespół strzelił gola i w której minucie), który piłkarz jest znany albo który piłkarz jest najbardziej przystojny. Zatem algorytm jest obiektywny. Bierze pod uwagę tylko, kto był na boisku w danej minucie i w jakiej minucie została strzelona bramka dla którego zespołu.
Jak trafna jest ocena algorytmu?
Z jednej strony jest bardziej trafna niż ocena człowieka - algorytm analizuje wszystkie mecze, człowiek ogląda tylko kilka meczy ligi mistrzów. Ocena człowieka jest bardzo subiektywna i jest wiele rzeczy, których człowiek nie zauważa, jak na przykład ciężka praca obrońcy, który regularnie rozgrywa dobre mecze pozostając w cieniu napastników, którzy strzelają bramki.
Z drugiej strony jest wiele rzeczy, których algorytm nie widzi, bo nie ogląda meczu - pomyłki sędziowskie, to że ktoś zaliczył asystę albo że ktoś strzelił bramkę w trudnej sytuacji.
Dlatego należy zsumować wyniki algorytmu z tym co wiemy i wtedy można uzyskać trafną ocenę (sugerując się bardziej tym co wiemy).
Wyniki
Algorytm przeanizował 23788 meczy i wziął pod uwagę 25196 zawodników - wszystkie mecze i wszystkich zawodników z poniższych lig i turniejów w przeciągu ostatnich 5 lat (dane są pobierane z API sportmonks.com):
World Cup Qualification Worldwide (all of the continents) + World Cup, Copa America, European Championship, Champions league (including qualifications), Europa league, English league, German league, French league, Italian league, Spanish league, Brazilian league, Argentinian league, Dutch league, Portuguese leauge, Scottish league, Turkish league, Fifa Club World Cup, Copa Libertadores, CONCACAF Champions League, CONCACAF Gold Cup, Confederations Cup, Africa Cup of Nations.
Jeżeli jakiś piłkarz nie występował w którychś z powyższych rozgrywek w ciągu ostatnich 5 lat, to nie został uwzględniony.
Poniższy ranking pokazuje 10 najlepszych piłkarzy na świecie (stan na 17 kwietnia 2018 r., przed półfinałami ligi mistrzów) wg algorytmu maszynowego uczenia się:
Jak możesz zobaczyć, najlepszym piłkarzem wg algorytmu jest Mohammed Salah z Liverpoolu. Zwróć uwagę, że algorytm wybrał go spośród 25 000 piłkarzy nie posiadając informacji o popularności danego piłkarza ani o tym kto strzelał bramki w danym meczu, posiadając tylko informację o tym kto był na boisku i kiedy padła bramka dla którego zespołu.
Pod tym linkiem możesz znaleźć ranking 50 najlepszych piłkarzy wg algorytmu:
50 najlepszych piłkarzy (2018-04-17)
Chciałbym zaznaczyć, że te wyniki są dosyć płynne, tzn. różnica pomiędzy zawodnikami jest niewielka i pozycje zawodników zmieniają się w krótkim czasie. Piłkarz, który w tej chwili jest na pierwszym miejscu za pół roku może być na 20.
Zaskoczeniem może się się wydawać, że w pierwszej 10 nie ma Leo Messiego (a Neymar jest 12, jakby się ktoś pytał). Algorytm uznał, że Messi ma już swoje najlepsze za sobą i obecnie jest na 28 miejscu. Uruchomiłem program również dla poprzednich lat i gdyby algorytm decydował o tym, kto ma otrzymać złotą piłkę, to Messi otrzymałby ich najwięcej od 2010 roku.
Oto kto otrzymałby Złotą Piłkę wg algorytmu dla każdego roku:
Tak naprawdę powyższa tabela nie pokazuje, kto był najlepszy w całym roku, tylko kto był najlepszym piłkarzem (lub drugim albo trzecim piłkarzem na świecie) na końcu danego roku.
Tutaj możesz znaleźć szczegółowe wyniki dla poprzednich lat:
2010-01-01
2011 01 01
2012 01 01
2013 01 01
2014 01 01
2015 01 01
2016 01 01
2017 01 01
2018 01 01
Na koniec graf pokazujący wynik piłkarzy (ich umiejętności porównując do innych zawodników w danym czasie) w każdym roku. W grafie zostali uwzględnieni wszyscy piłkarze, którzy przynajmniej raz zdobyli Złotą Piłkę wg algorytmu oraz Mohammed Salah, który obecnie jest najlepszym piłkarzem na świecie wg algorytmu.
Jak działa algorytm?
Jeżeli chcesz wiedzieć, jak działa algorytm, to jest to wytłumaczone w pliku Readme.md w repozytorium projektu na Github:
https://github.com/damc/football
Pozdrawiam,
Damian (damianc1092[at]gmail.com).
Komentarze (175)
najlepsze
Komentarz usunięty przez moderatora
@cxnmlhuipwetr: No, i dlatego to są "sieci neuronowe", a nie kaskada ifów. Właśnie dlatego, że algorytm się sam zmienia, bez ingerencji programisty.
Problemem może być natomiast to, czy wybrano optymalną metodę. Przykładowo, użyta wielokrotna regresja liniowa wymaga, żeby zmienne niezależne nie były kolinearne. Czy nie są w przypadku, kiedy wielu piłkarzy z głównego składu jest na boisku w momencie zdobycia bramki mam wątpliwości, a nie
Wytłumaczyłem to w tym komentarzu:
https://www.wykop.pl/link/4297375/comment/54797167/#comment-54797167
- gra najczęściej mecze
- w tych meczach pada dużo goli
Tylko, że skład druzyny wybierany jest przez pewnych ludzi, których liczysz tym algorytmem.
Ale wyniki są interesujące, dlatego że bazują na czymś innym niż na subiektywnej ocenie i mogą dostarczyć informacji, których nie widać z punktu widzenia człowieka (np. z punktu widzenia człowieka nie widać że David Alba jest bardzo dobry, a wg rankingu jest
Jeżeli Mirko Vučinić był najlepszym piłkarzem świata w 2012 roku dlaczego już 2 lata później przeniósł się do ligi w emiratach arabskich?
Ten człowiek nigdy nie wybijał się ponad przeciętność w piłce-bezdyskusyjny fakt.
Skoro to ma być "uczenie maszynowe" to zadam kilka pytań, na które nie znalazłem odpowiedzi w podlinkowanym README.md.
Widzę, że w kodzie są ustawione na sztywno dwa hiperparametry modelu, tj.:
Dlaczego akurat takie, co przemówiło za ich wyborem? Czy został zastosowany jakiś sposób wyznaczenia hiperparametrów? Może dobór hiperparametrów ze przy użyciu zbioru walidującego?
Podobne pytanie dotyczy tej wartości:
Czy były
"Z kodu wynika, że zbioru testującego nie było (testing = False) - dlaczego? Czy wobec braku testu wiadomo jak dobrze/źle generalizuje uzyskany model?"
W finalnej wersji, którą wrzuciłem do repozytorium na GitHubie testing = False, ale wcześniej oczywiście sprawdzałem na danych testowych jakie wartości hiperparametrów dają najlepsze rezultaty (i wtedy ustawiałem testing na True i ustawiałem odpowiedni zbiór testowy). Więc testowałem algorytm z różnymi wartościami hiperparametrów (chociaż muszę przyznać, że
@jacekKobr: Zgadza się - udział zawodnika w meczu nie jest zmienną niezależną od pozostałych. Ale w jaki sposób to się przekłada na rezultaty? W taki sposób, że algorytm nie bada tak naprawdę, jak bardzo dany piłkarz zwiększa szanse wygranej po włożeniu go do losowego zbioru innych piłkarzy, tylko bada jak dobrzy są piłkarze jeżeli grają
Algorytm po prostu pokazuje który zawodnik był na boisku gdy drużyna wygrywa. A właśnie o wygrywanie chodzi i bycie wtedy na boisku ( ͡° ͜ʖ ͡°) Jeżeli nie ma zawodnika na boisku gdy drużyna wygrywa
On był wtedy obciążeniem dla Realu a nie czołowym piłkarzem.
Kaka dużo meczy wchodził z ławy przy rozstrzygniętym wyniku a nie decydował o czymś,
Dostał szanse w meczu z Bayernem i zmarnował setę i przestrzelił karnego.
Skoro był taki to dlaczego rok później odszedł za darmo do Milanu w którym nic nie pokazał?
Te wyniki są złe i tyle.
Nie trać zapału
Masakra jaka glupota
Jak najbardziej zawodnik, który czasem siada na ławce ma szanse z zawodnikiem, który cały czas gra w podstawowym składzie.
Wadą algorytmu jest to, że zawodnicy, którzy są kontuzjowani lub często siedzą na ławce mają większe szanse na bycie na szczycie (również na dole) rankingu, dlatego że algorytm ma większe szanse się wtedy nauczyć, czy dany zawodnik decyduje o tym, że dana drużyna wygrywa/przegrywa. Przykładowo Piszczek jest bardzo wysoko w rankingu
@ostoja: To znaczy że bez Messiego Bbarcelona daje radę, więc nie jest on taki wazny dla swojego zespołu.
Wasz kolega z drużyny stoi otoczony czterema przeciwnikami i wy mu podajecie piłkę tak, że ją przyjmuję, ale po chwili przeciwnik ją zabiera. Więc jest to podanie udane, bo dostarczyliście piłkę koledze czy nieudane, bo wrzuciliście go na minę i ten piłkę stracił?
@cdwdj: tylko, że wszyscy liczą podania "celne", a nie "udane" z tego prostego powodu, że definicja takich rzeczy musi być możliwe ścisła. Podanie, które opisujesz było celne, co łatwo ustalić. To, czy było udane może być kwestią debaty, więc taka ocena jest trudna, niejednoznaczna i obarczona błędem.
Umówmy się, że ten algorytm to analiza statystyczna, która wybiera najlepszego piłkarza na podstawie bardzo jasno zdefiniowanego algorytmu.
Gdyby przeanalizować wszystkie dostępne dane (pytanie jakie dane sa dostepne ale np. ilość podań udanych / nie udanych, asysty, dystans przebiegniety przez zawodnika) moznaby przeanalizować, które cechy przyczyniły się w najwiekszym stopniu to wygranej druzyny i na tej podstawie budować algorytm.
Ja walczyłem kiedyś z polską piłką - zapraszam http://prokulski.net/index.php/tag/ekstraklasa/
Zobacz jak to wygląda w przypadku bramkarzy:
W zdecydowanej większości klubów ta pozycja nie podlega rotacji - czyli pełne 90 minut, łapie go każda bramka strzelona i stracona, każdy przegrany i wygrany mecz.
Ale jedna sugestia - powinieneś oceniać cały rok a nie premiowac ostatnie mecze. Kluczowy jest kwiecień, maj i jak jest mundial to czerwiec/lipiec. To tam wszyscy szykują formę. Jeśli wazniejszy od wiosny jest grudzień w podsumowaniu roku, a tam nikt o nic nie gra to wyniki są nie miarodajne
Jak widzisz na szczycie rankingu są piłkarze najlepszych drużyn, więc to nie tak. Mówiąc "najbardziej zwiększa prawdopodobieństwo wygranej drużyny poprzez obecność w składzie" mam na myśli, że jeżeli umieścisz go z jakimiś losowymi zawodnikami, to najlepszy jest ten, który najbardziej zwiększy szanse wygranej. Chociaż algorytm nie bada dokładnie jak danymi piłkarz gra z losowymi zawodnikami, bo bazuje na danych, gdzie zawodnik grał z innymi zawodnikami ze swojej drużyny (czyli np.
Swoją drogą, takie czysto teoretyczne pytanie, jakby ranking zareagował na drużynę, która wygrałaby wszystkie mecze w sezonie?