Analiza

Predviđanje MVP-a NBA lige za 2018-19 sezonu koristeći strojno učenje

Surfin USA: tko će osvojiti naslov u NBA ligi?
danchyy | 05/2019

Iako smo već duboko u playoff fazi, još uvijek nije poznat MVP za prethodnu sezonu pa sam odlučio pronaći podatke i probati napraviti nekakve predikcije pomoću tehnika strojnog učenja.

Pronašao sam podatke na basketball-reference stranici. Podaci glasanja za MVP-a lige sežu sve do 1968-69 sezone, no uzeo sam samo one od 1980-81 sezone pošto su tada počeli novinari odlučivati o pobjedniku. Evo primjera kako izgledaju podaci za 2015-16 sezonu.

Također ovdje sam pasteao sažetu verziju te tablice.

Most Valuable Player Table

 Voting Per GameShootingAdvanced
RankPlayerAgeTmFirstPts WonPts MaxShareGMPPTSTRBASTSTLBLKFG%3P%FT%WSWS/48
1 Stephen Curry 27 GSW 131.0 1310.0 1310 1.000 79 34.2 30.1 5.4 6.7 2.1 0.2 .504 .454 .908 17.9 .318
2 Kawhi Leonard 24 SAS 0.0 634.0 1310 0.484 72 33.1 21.2 6.8 2.6 1.8 1.0 .506 .443 .874 13.7 .277
3 LeBron James 31 CLE 0.0 631.0 1310 0.482 76 35.6 25.3 7.4 6.8 1.4 0.6 .520 .309 .731 13.6 .242

Provided by Basketball-Reference.com: View Original Table
Generated 5/15/2019.

Uz prethodne podatke, scrapeao sam web basketball-reference stranice za neke napredne statistike koje nisu bile dostupne, poput BPM, PER, TS%, i slično.

Pune podatke možete vidjeti na mom Github repozitoriju.

DEFINIRANJE PROBLEMA

Nakon što su podaci otprilike definirani, može se definirati problem koji će algoritmi strojnog učenja rješavati. Pošto je ovo zadatak rangiranja u svojoj suštini, a nema mnogo out of the box rješenja za taj problem, odlučio sam koristiti regresijski pristup (predviđanje vrijednosti) za rješavanje problema. 

Vrijednost koja će se predviđati jest Share stupac iz podataka koje sam linkao. Taj broj će uvijek biti između 0 i 1 i predstavlja udio glasova koje je igrač osvojio (zapravo udio bodova koje je igrač dobio u glasanju).

Dakle, ovdje praktički želim modelirati glasanje medija, tj želim predvidjeti kako će novinari glasati. Naravno ovdje izuzimamo bilo kakvu subjektivnost koja može biti prisutna kod njih, jer nije baš lako mjerljiva.

No odmah naletavamo na problem jer su ovi podaci vrlo nebalansirani, na histogramu za award share vrijednost, odnosno vrijednost koju želimo predvidjeti, može se vidjeti da je jako puno vrijednosti na razini 0.0* što je veliki problem.

ODABIR ZNAČAJKI ZA MODEL

Prije no što opišem način na koji sam trenirao i validirao model, prvo ću se dotaknuti odabira značajki i njihovog značenja. Mislim da će većina vas znati za većinu statistika koje su navedeni u podacima. No svejedno ću opisati nekoliko naprednih statistika.

PER stoji za Player Efficiency Rating, to je praktički zbrajanje svih pozitivnih i negativnih statistika uz neke sitne modifikacije.

BPM predstavlja Box Plus Minus i to je napredna statistika za evaluiranje kvalitete igrača i njegov doprinos ekipi. Uzima neke team based statistike u obzir, poput REB%, AST%, koje znači udio svih ekipnih skokova/asistencija koje je igrač uzeo dok je bio na terenu. Slično za ostale statistike.

TS_PCT stoji za True Shooting Percentage, i izračun je sljedeći: PTS / (2 * (FGA + 0.44 * FTA)) * 100

USG_PCT je skraćenica za Usage Percentage i to je procjena koliko timskih akcija igrač iskorištava dok je na terenu, izračun se može naći ovdje.

I za kraj, WS WS_per_48 stoje za Win Shares i Win shares per 48 minutes. Ta statistika pokušava podijeliti timski uspjeh na pojedince unutar ekipe.

Odabir značajki

Dosta tih statistika je vrlo slično pa sam odlučio izbaciti one koje ne doprinose sa mnoštvom informacija. Iskoristio sam nekoliko postupaka kako bih odlučio koje nisu potrebne.

Prvo je korištenjem uzajamne informacije, rezulati "bitnosti" značajka su sljedeći:

  • ws: 0.2884
  • per: 0.2811
  • ws_per_48: 0.2592
  • bpm: 0.2013
  • pts_per_g: 0.1482
  • usg_pct: 0.1053
  • win_pct: 0.0973
  • fta: 0.0948
  • ts_pct: 0.0872
  • fga: 0.0871
  • trb_per_g: 0.0695
  • mp_per_g: 0.0668
  • fg3a: 0.0355
  • ft_pct: 0.0311
  • ast_per_g: 0.0279
  • stl_per_g: 0.0139
  • fg_pct: 0.0089
  • blk_per_g: 0.0066
  • fg3_pct: 0.0000

Nakon toga sam iskoritio Random Forest Regressor. Na način da se natrenira jedna instanca modela te se pronađu najbitnije značajke za taj model. Ovo je rezultat:

  • ws: 0.3911
  • win_pct: 0.1326
  • per: 0.0938
  • bpm: 0.0537
  • ws_per_48: 0.0428
  • fga: 0.0368
  • usg_pct: 0.0310
  • ft_pct: 0.0263
  • ast_per_g: 0.0253
  • mp_per_g: 0.0251
  • fg_pct: 0.0231
  • fta: 0.0213
  • pts_per_g: 0.0183
  • fg3_pct: 0.0159
  • ts_pct: 0.0155
  • trb_per_g: 0.0153
  • blk_per_g: 0.0118
  • stl_per_g: 0.0103
  • fg3a: 0.0101

I za kraj, pronašao sam korelacijsku matricu između značajki, to mi je čak najviše pomoglo jer je to dobar način za vizualiziranje featurea koji su međusobno povezani što često nije dobro za modele poput linearne regresije te da pronađem značajke koje su korelirane s ciljnom vrijednošću (što je dobro).

Maknuo sam sve značajke/statistike koje su međusobno jako korelirane ili one koje predstavljaju praktički istu stvar (npr. TS_PCT i FG_PCT). No svejedno sam ostavio neke koje su mi se činile kao logičan odabir što nije možda u potpunosti korektno, no nekad treba imati hunch :)

Ovo su finalne značajke koje koristim:

  • ts_pct
  • bpm
  • mp_per_g
  • pts_per_g
  • trb_per_g
  • ast_per_g
  • stl_per_g
  • blk_per_g
  • ws
  • win_pct

Pokušao sam natrenirati nekoliko modela sa svim značajkama i rezultati su bili generalno lošiji što je dobar pokazatelj da odabir ovih značajki ima smisla i validan je.

TRENIRANJE I VALIDACIJA

Uvijek je poželjan postupak Cross-Validationa kada se radi sa postupcima strojnog učenja te sam ih i ja ovdje iskoristio. Pošto sam imao na raspolaganju 38 sezona te trebalo je odlučiti između nekoliko vrsta modela i mnoštva parametara koje ih predstavljaju odlučio sam pronaći hiperparametre tako da sam uvijek modele trenirao na 37 sezona, a validirao rezultate na 1 preostaloj sezoni. Glavna metrika je bila Mean Squared Error za svaku od tih sezona te sam u konačnici uprosječio tih 38 rezultata i po tome rangirao modele i parametre. Uz to koristio sam i mjeru točnosti za najboljeg igrača, i najboljih 5 igrača.

Ovo su modeli koje sam koristio:

  • Linear Regression
  • Ridge Regression
  • Gradient Boosting Regressor
  • Random Forest Regressor
  • SVR

Također iskoristio sam polinomijalne značajke 2 i 3. stupnja te pokušao sam skalirati podatke između 0 i 1. 

Potpune rezultate možete vidjeti na GitHub repozitoriju u sljedećim fajlovima: reg_results_mse_sorted.txt, reg_results_sorted_top_1.txt, and reg_results_sorted_top_5.txt.

PREDIKCIJE ZA 2018-19 SEZONU

I za kraj evo predikcija za ovu sezonu, prvo ću prikazati rezultate za nekoliko modela koji su bili najbolji po Mean Squared Error metrici.

Gradient Boosting Regressor

Druge varijacije ovog modela, odnosno modeli s drukčijim parametrima su imali slične rezultate te je gotovo uvijek Harden bio na prvom mjestu.

Random Forest Regressor

Ovaj model je također rekao Harden, no kada sam isprobao druge parametre dobio sam malo drukčije rezultate.

Ridge Regression

Ovo je regularizirana linearna regresija.

Linearna Regresija

Najzabavniji rezultati.

Pošto je ovo najjednostavniji algoritam, i poprilično glup algoritam, može se vrlo lako prenaučiti na nekim značajkama i onda dođe do ove situacije. 

Support Vector Regression

Varijacija SVM modela za regresiju.

UPROSJEČENE PREDIKCIJE

Uz predikcije po pojedinačnim modelima, također sam izvrtio predviđanje na top 50 modela po MSE metrici.

Harden ima vrlo malu prednost ispred Giannisa, nakon njih slijedi Jokara, a poslije njega je sve tu vrlo gusto, iako će te vrijednosti u realnosti biti puno manje.

ZAKLJUČAK

Čestitke Jamesu Hardenu na još jednom MVP naslovu! Ili bar tako kažu ovi algoritmi. Vidjet ćemo za mjesec dana što će se dogoditi i hoće li ovi modeli biti imalo precizni. Nekako mi se čini da su novinari skloniji Giannisu no Hardenu, što će uvelike utjecati na konačne rezultate, al eto, Harden je ipak imao vrlo dobru sezonu i nosio svoju ekipu.

Ovdje imate link na Jupyter Notebook u kojem je kod za sve ovo što sam opisao.

Također napisao sam članak na mediumu (praktički ovo, al engleski).

Uživajte i nadam se da je bilo zanimljivo :)

Fantastično , koristiš li R osim Pythona, pruža odlične alate za vizalizaciju - chelsea_2012, 16.5.19. 13:11, 0 0 0
Hvala :) R je super al nažalost jako malo sam ga koristio. Al zapravo sam preko njega ušao u cijeli svijet vizualizacije i grafova preko ovog posta: https://thedatagame.com.au/2015/09/27/how-to-create-nba-shot-charts-in-r/ - danchyy, 16.5.19. 21:58, 0 0 0
Prati nas

©2017. Vingd, Inc. Sva prava pridržana.