PyTorchでNBA選手の生涯得点を予想してみた

PyTorchを触り始めて、畳み込みニューラルネットワーク(CNN)まで行ったので、振り返りつつまとめ。

Deep Learningの応用分野として、画像処理が手法的に最も進んでいるっぽい。

Githubには上げていないが、試しに画像生成系を試してみると個人でで触るには、マシンパワーの要求がものすごく高い。
MNISTの手書き文字データは、1画像あたり縦*横*色の種類=28*28*1だが、ちょっとキャラの立ち絵なんかを
読み込むと400*1000*3とかが当たり前。
人間が見てわかるレベルに100*250*3にしてもまだ大きくて、30*75*3あたりにすると虫眼鏡が必要になるレベル。
これでも、枚数を揃えると、メモリの必要量が500GB(!!!)とかになって断念しました。
なおかつ、学習時間がかかるので、結構扱いづらいです。


と言うわけで、手に入りやすく、なおかつ件数が充実しているスポーツ関連データで予測できないかなと。
kaggleNBAのデータがあったので、それを使ってみます。


レブロンが移籍したので、記念(?)に予想してみます。
すでに、殿堂入りすることは確実なレブロンですが、
どこまでスタッツ(今回は得点)を伸ばせるか興味があったので、これをネタにすることにしました。


前処理は結構手間
データの穴が結構あります。
→そもそも3Pが始まったのが1980年以降なので、それまでにデビューしている人のデータは使えません。
→親切のために入れたであろう、blankのカラムの邪魔なこと邪魔なこと。結局前処理(という名の地味なデータ加工)に7割ほどの時間を使うことに・・・


さて本題。

レーニングデータは下記の5種類+ラベルとしてその選手の総得点

  1. 得点のみ4層
  2. 全てのスタッツで4層
  3. 全てのスタッツで8層
  4. 全てのスタッツで畳み込みあり、プーリングなし4層
  5. 全てのスタッツで畳み込み、プーリングあり4層

上記のの5種類で予測してみました。

結果まとめ
https://docs.google.com/spreadsheets/d/1TY5ynmPQBLVMFO7uBh3Rui4P0Fwiv6ybYwS-6Zmd5dY/edit?usp=sharing


結果を言うと、レブロンの生涯総得点予想値は34184になりました。
→この成績の通りになるなら、 歴代3位です



表の中で挙げられているレブロン以外の4人は、割と特徴的なスタッツを持つレジェンドです。
スコッティ・ピッペン:オールラウンダーSF → レブロンに似ているタイプ
コービー・ブライアント:スコアラー      → 得点力が一番優れている
ジョン・ストックトン:アシスト、スティール王 → 得点よりもアシスト、スティールに優れる
デニス・ロッドマン:リバウンド王     → 得点よりもリバンウンド、ディフェンススタッツに優れる
ロッドマンの予測値が上振れしていますが、レブロンと似ている(と書くとどこからか批判が来そう)ピッペンでの誤差が少ないので割といい結果かなという印象です。


以下、手法に対する考察みたいなもの

一番驚いたのは、全てのスタッツを入れただけで大幅に精度が改善したことです。
(参考:訓練データとラベル

スタッツ全てを訓練データに入れると得点以外が得意な選手は、そこで活躍して結果的にキャリアが長くなるというところまで学習してくれるかなと思っていたのですが、予想以上でした。
また、層を4->8に増やすと認識精度が上がったので、もう少し層を増やして過学習するかどうかを見てみたいところです。

畳み込みは、隣の配列と密接な関係がある場合に有効というのがよくわかりました。
今回のNBAのデータは、下記のcsvの形式なので、1人の選手のスタッツを2次元に変換すると
年齢軸とスタッツの種類軸になります。
同じ選手で29歳と30歳のときのアシスト(AST)が関連しそうな気はしますが(ゲームメイク担当者はその役割を同水準で求められ続けるetc)、
29歳のアシストとと30歳のときのスティール(STL)が畳み込み処理でするべきかというとかなり疑問だったので、
フィルタサイズをスタッツ軸のみに伸ばして、年齢軸には伸ばさないようにしました。
それでも累積誤差が増えました。