より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

クリスティアーノ・ロナウドが何ゴール取るかを機械学習とFIFA18のデータで予測する

Python Advent Calendar 2018 - Qiitaに16日目の投稿です。

以前にやった記事の続きをやりたいと思います。

rimever.hatenablog.com

簡単に言うと、ゲーム「FIFA18」のステータスでCR7こと、クリスティアーノ・ロナウドが何点取れるか予測するという話です。

f:id:rimever:20181214214509p:plain
ゲームのパッケージになるほどのスーパースターです。

今シーズン、スペインのレアル・マドリードからイタリアのユベントスに移籍してます。

プレイヤーのステータスと実際のゴールをトレーニングして予測というアプローチを取ります。

※注意:当方、仕事でバリバリ機械学習してますとかいう人種ではありません。予測結果を鵜呑みにせず、生温かい目で見送ってください。

LightGBM

今回はLightGBMというアルゴリズムを採用します。

Welcome to LightGBM’s documentation! — LightGBM documentation

採用した理由は、

  • Kaggle のコンペで上位に入ってるから
  • なんか凄そうなアルゴリズムだから

だけ、です。流行っているから飛びついた? はい、そうです。

後輩にこのアルゴリズムについて話すと、

アンサンブル学習

ブースティング

などという言葉が。

f:id:rimever:20181214213306p:plain
参りました

私のようなニワカとの違いを痛感しました。

急いでこれらの単語を調査。

st-hakky.hatenablog.com

アルゴリズムについて理解を深めたところで、下記の記事を参考にインストール完了。

LightGBMをAnaconda経由で簡単にインストールする方法 - Qiita

実装は下記の記事を参考にしました。

LightGBMによるFIFA18の選手データでの市場価値推定 | orizuru

リッジ回帰、ラッソ回帰に比べて、RMSEが良くなっており、高まる期待。

前回は予測する気にもなれないモデルでしたが、これは行けそうな予感。

肝心のクリスティアーノ・ロナウドのデータを投入します。

ちなみにクリスティアーノ・ロナウドはゲーム上で最強プレイヤーのステータスとなっています。

そんな勇者のデータを投入します。

クリスティアーノ・ロナウドの前シーズンは26ゴール。

さあ、さあ!

高まる期待。

いざ!

f:id:rimever:20181214213947p:plain
8ゴール・・・

8ゴール?

これが100ゴールなら、ネタとしては笑えますが、8ゴールだとしょっぱすぎて話になりません。

そして、挫折へ

自分なりにこの結果について反省したところ

  • データが少ない
  • スキルが足りない
  • そもそもゲームのパラメータでリアルを予測することが無謀。厨二病かも。

f:id:rimever:20181214214509p:plain
かくなる上は、ゲームショップに行ってFIFA19を購入してプレイするしか!

というレベルの結論。

課題

そこで、後輩に泣きつきました。

f:id:rimever:20181214213306p:plain
教えてください

すると、

  • 弱識別器は合ってそう
  • 次元の呪いにかかってる。主成分分析で、PCAを使えばとりあえず良くなりそう
  • サッカーは一部の選手が高得点を叩き出す。0点の選手に引きずられるのでは
  • ポジションは使いたい

あたりの対策が。

主成分分析

理論はいくつかのサイトでやっているのですが、3次元を2次元にした時の説明が多く、実際に次元が多い場合は、何次元にすればいいの?という対応方法については下記を参考にさせていただきました。

ohke.hateblo.jp

TFIDF-LightGBM Pipeline with RandomSearchCV | Kaggle

PCA ? Pipeline ? などネットの海をさまよいました。

0点の選手に引きずられるのでは

PCAを用いると精度は上がったのですが、実は結果は変わりませんでした。

サッカーというスポーツはそこまで点の入らないスポーツです。

両チーム合わせて22人の選手が参加して、得点は合わせて多くて4点。データは控え選手も含みます。

ならば、得点したこともなくシーズンを終える選手も少なくないのでは?

と思って分析したところ、取得できたデータのうち60%以上の選手が0得点でした。

f:id:rimever:20181214222651p:plain

訓練データの中から0点のデータを減らしては見ましたが、逆に精度が悪くなってしまいました。

できれば、目標値(得点)が満遍なく分布していると精度は高まるのですが。

データを収集しよう

改めてやっては見たものの、今のデータのままでは物足りないようです。

時間がないので、

  1. スペイン、ドイツ、イングランドのデータも含める(理由はチャンピオンズ2017-18でベスト4に入ったチームの所属するリーグ)
  2. 得点分布に基づき、得点ランキングに入るようなスコアラーのデータに絞る
  3. リーグごとにisSpainなどのフラグパラメータを追加してリーグによる差異が出るように
  4. ただしクリスティアーノ・ロナウド本人のデータは含めない

で集めました。

対数変換

データを増やしたとはいえ、やはり、分布としてはハイスコアラーは少ないです。

そこで、対数変換を試みることにしてみました。

機械学習の目的変数を正規分布に - Qiita

試行錯誤した結果

f:id:rimever:20181216172434p:plain

32ゴールとなりました。

※注意:あくまでも私のモデルによる予測です。鵜呑みにはしないでください。

正直、ゲームからリアルを予測するのは無理がありました。試行錯誤した中で、それらしい値を採用してます。ごめんなさい。

ツッコミどころは多々ありますが、ゲームの能力以上に得点力の違いはあるかなという気はしています。

最終的には、点が取れる選手に絞って生成したモデルで判定することにしました。

f:id:rimever:20181216164507j:plain
結局、FIFA19を買いました。

ここまで読んでいただき、ありがとうございました。

まとめ

  • 予測した結果より、機械学習への理解が深まったことが収穫。
  • こうやって一人の選手を追いかけるというアプローチは機械学習のモチベーションは高まる。
  • 後輩は大事にしよう。 (改めてありがとうと言いたい)

かわいいフリー素材集 いらすとやの素材を使わせていただきました。