Python Advent Calendar 2018 - Qiitaに16日目の投稿です。
以前にやった記事の続きをやりたいと思います。
簡単に言うと、ゲーム「FIFA18」のステータスでCR7こと、クリスティアーノ・ロナウドが何点取れるか予測するという話です。
今シーズン、スペインのレアル・マドリードからイタリアのユベントスに移籍してます。
プレイヤーのステータスと実際のゴールをトレーニングして予測というアプローチを取ります。
※注意:当方、仕事でバリバリ機械学習してますとかいう人種ではありません。予測結果を鵜呑みにせず、生温かい目で見送ってください。
LightGBM
今回はLightGBMというアルゴリズムを採用します。
Welcome to LightGBM’s documentation! — LightGBM documentation
採用した理由は、
- Kaggle のコンペで上位に入ってるから
- なんか凄そうなアルゴリズムだから
だけ、です。流行っているから飛びついた? はい、そうです。
後輩にこのアルゴリズムについて話すと、
アンサンブル学習
ブースティング
などという言葉が。
私のようなニワカとの違いを痛感しました。
急いでこれらの単語を調査。
アルゴリズムについて理解を深めたところで、下記の記事を参考にインストール完了。
LightGBMをAnaconda経由で簡単にインストールする方法 - Qiita
実装は下記の記事を参考にしました。
LightGBMによるFIFA18の選手データでの市場価値推定 | orizuru
リッジ回帰、ラッソ回帰に比べて、RMSEが良くなっており、高まる期待。
前回は予測する気にもなれないモデルでしたが、これは行けそうな予感。
肝心のクリスティアーノ・ロナウドのデータを投入します。
ちなみにクリスティアーノ・ロナウドはゲーム上で最強プレイヤーのステータスとなっています。
そんな勇者のデータを投入します。
クリスティアーノ・ロナウドの前シーズンは26ゴール。
さあ、さあ!
高まる期待。
いざ!
8ゴール?
これが100ゴールなら、ネタとしては笑えますが、8ゴールだとしょっぱすぎて話になりません。
そして、挫折へ
自分なりにこの結果について反省したところ
- データが少ない
- スキルが足りない
- そもそもゲームのパラメータでリアルを予測することが無謀。厨二病かも。
というレベルの結論。
課題
そこで、後輩に泣きつきました。
すると、
- 弱識別器は合ってそう
- 次元の呪いにかかってる。主成分分析で、PCAを使えばとりあえず良くなりそう
- サッカーは一部の選手が高得点を叩き出す。0点の選手に引きずられるのでは
- ポジションは使いたい
あたりの対策が。
主成分分析
理論はいくつかのサイトでやっているのですが、3次元を2次元にした時の説明が多く、実際に次元が多い場合は、何次元にすればいいの?という対応方法については下記を参考にさせていただきました。
TFIDF-LightGBM Pipeline with RandomSearchCV | Kaggle
PCA ? Pipeline ? などネットの海をさまよいました。
0点の選手に引きずられるのでは
PCAを用いると精度は上がったのですが、実は結果は変わりませんでした。
サッカーというスポーツはそこまで点の入らないスポーツです。
両チーム合わせて22人の選手が参加して、得点は合わせて多くて4点。データは控え選手も含みます。
ならば、得点したこともなくシーズンを終える選手も少なくないのでは?
と思って分析したところ、取得できたデータのうち60%以上の選手が0得点でした。
訓練データの中から0点のデータを減らしては見ましたが、逆に精度が悪くなってしまいました。
できれば、目標値(得点)が満遍なく分布していると精度は高まるのですが。
データを収集しよう
改めてやっては見たものの、今のデータのままでは物足りないようです。
時間がないので、
- スペイン、ドイツ、イングランドのデータも含める(理由はチャンピオンズ2017-18でベスト4に入ったチームの所属するリーグ)
- 得点分布に基づき、得点ランキングに入るようなスコアラーのデータに絞る
- リーグごとにisSpainなどのフラグパラメータを追加してリーグによる差異が出るように
- ただしクリスティアーノ・ロナウド本人のデータは含めない
で集めました。
対数変換
データを増やしたとはいえ、やはり、分布としてはハイスコアラーは少ないです。
そこで、対数変換を試みることにしてみました。
試行錯誤した結果
32ゴールとなりました。
※注意:あくまでも私のモデルによる予測です。鵜呑みにはしないでください。
正直、ゲームからリアルを予測するのは無理がありました。試行錯誤した中で、それらしい値を採用してます。ごめんなさい。
ツッコミどころは多々ありますが、ゲームの能力以上に得点力の違いはあるかなという気はしています。
最終的には、点が取れる選手に絞って生成したモデルで判定することにしました。
ここまで読んでいただき、ありがとうございました。
まとめ
かわいいフリー素材集 いらすとやの素材を使わせていただきました。