みなさん、Worlds2020(WCS)は楽しんでいるでしょうか。
筆者はこれまでWCSの観戦日記とPICK'EMに関してブログを更新してきましたが、読者のかたに何か新しい知見を提供できたかというと、残念ながらできていないと考えております。そこで、今回の記事ではこれまでとは趣向を変えて、筆者が普段研究で用いている機械学習や深層学習の手法とLeague of Legends(LoL)を関連させたものにしようと思います。
LJLの実況解説をご覧になっている方はご存知と思いますが、LJLではBanPick終了後や試合途中に勝率予想を行う「ブリッツ君」(表記は不明)が登場していました。気になったので、Google検索などしてみたのですが引っ掛かりませんでした。(情報がございましたら教えてください。)個人的に観戦中の一要素として楽しみにしていたのと、今回のWCSでブリッツ君が現れないこともあって、それじゃあ自分で再現してみようという試みを始めています。とりあえず名前は「Bli2君プロジェクト」としています。*1
ノックアウトステージまでに間に合わせたいという時間的な制約があり、本記事はプロジェクトの中身をかいつまんだものになっています。まだまだ、改善部分がある点と記事に書かれていない部分の手順も存在する点に留意して読んでいただけると嬉しいです。今後、時間がある時に、最新および詳細な内容と新しい記事として更新していく予定です。
細かい部分が気にならない方は、「学習結果&試しに使ってみた」から読むと面白いと思います。
プロトタイプ第1弾の概要
詳細は省きながらザクザクと説明していきます。
学習データの準備
今回、機械学習モデルを学習させるために、KRのチャレンジャーのSoloQの試合のデータを、「Riot Developer API」 [link]を用いて約1200試合分用意して、学習用に8割・テスト用に2割の分割を行っています。(細かい作法は無視しています)PatchはWCSにあわせて10.19のものに限定しています。APIでデータ取得時点では、もっとサンプル数が多かったのですが、データ整形や欠損値の処理を行って少なくなりました。「Riot Developer API」 の使用方法に関しては、別途記事を書こうと思います。
使用する機械学習モデル
Random Forest[link]とLightGBM[link]の分類器を使用しました。どちらも決定木[Wiki]ベースのモデルで、それぞれバギング[Wiki]とブースティング[Wiki]というテクニックが使われています。
これらのモデルを筆者が気に入っている理由に、特徴量の重要度が分かることがあります。特徴量の重要度から、patchごとのメタなチャンピオンが分かる可能性があります。
モデルへの入力情報
BlueチームがPickした5体のチャンピオンの情報と、RedチームがPickした5体のチャンピオンの情報を結合したものを用います。5体のチャンピオンをどう表現するかというと、まず全チャンピオン151体分の0のベクトル[0,0,...,0]を作ります。そのベクトルのうち、pickされたチャンピオンに対応する部分だけ1に変えます。専門用語を用いると、pickしたチャンピオンについて、one-hot encodeしたベクトルを同じチームのなかで足し合わせた、というようになると思います。下の図を参考にしていただくと分かりやすいかと思います。
問題点
お気づきの通り、複数問題があります。この方法だと、どのチャンピオンがどのロールに対応するかや、対面のチャンピオンが何かといった情報が毀損しています。また、one-hotで表現するとスパースであることも、一般的に言われています。
そもそも、予測に有益な情報はもっとありますが、この辺りはfuture workです。
予測対象
Blueチームが勝つかRedチームが勝つかの2値分類
今回の狙い
この時点で違和感を抱かれた方は多いかと思います。
なぜなら、LoLというゲームは非常に複雑で、たとえ同じプレイヤー10人が同じPickをしたとしても、同じ結果にはならないようなゲームです。そんなゲームの勝敗をPickしたチャンピオンのみで予測しようというのは荒唐無稽な話です。
ただ、ここで思い出していただきたいのが、今回のプロジェクトの目的は正確に勝率を予想するモデルを構築することではなく、試合観戦における1要素として楽しめる者かが主題です。つまり、どんなに正確に勝利チームを予想するモデルを作ったとしても、そのチームが100%勝ちますという出力をするようなモデルでは白けて見る気がうせてしまいます。*2それよりかは、ある程度不正確であっても、勝率が拮抗するように(50%の知覚になるように)出力するモデルが理想的です。
以上のような理由で、上手くモデルが学習できないことが予想されていても、試してみる価値はあると思っています。
Bli2君 プロトタイプ第1弾 学習結果&試しに使ってみる
Random Forestのaccuracyが0.46、LightGBMが0.48でした。参考として、完全にランダムに予測してもこの値は0.5になります。
これだけ見ると、正直使い物にならない気がしますが、逆に0.5でないということはランダムに予測しているのではなく、何かしら学習したルールに基づいているかもしれない。という希望を残して、実際のWCS グループステージの試合をいくつかピックアップして試しに使ってみます。
WCS Group Stage の試合で使ってみた!
左側のチームがBlue、右側のチームがRedチームです。この3つの試合は筆者がてきとうに選んだので、これでどうこう言えるわけではないが、Random Forestの挙動は使いようがありそうですが、LightGBMを使うのは難しそうです。
また、次節で紹介する、モデルが学習した「チャンピオン重要度」を見た上で本節の勝率予想を見ると、考察が捗ると思います。時間のある方はぜひ折り返し読んでみてください。
Group Stage Day5 Tiebreaker: Suning vs G2:Suning Win
- Suning:GP、グレイブス、アカリ、アッシュ、レオナ
- G2:サイオン、リリア、シンドラ、セナ、セト
- Random Forestの勝率予想:60% vs 40%
- LightGBM の勝率予想:94% vs 6%
- 所感:どちらもあってはいるが、Suningの勝率が大きすぎる。よくない。
Group Stage Day6: JDG vs DRX:JDG Win
- JDG:カミール、リリア、TF、MF、バード
- DWG:セト、グレイブス、ガリオ、カリスタ、アリスター
- Random Forestの勝率予想:56% vs 44%
- LightGBM の勝率予想:70% vs 30%
- 所感:Random Forestの値なら見ても萎えない程度かもしれない。トップとサポートでJDGの方がメタをとっているのが、評価されていそう。
Group Stage Day8: DRX vs TES:TES Win
- DRX:オーン、キンドレッド、ガリオ、ケイトリン、バード
- TES: ブラッド、グレイブス、オリアナ、アッシュ、ルル
- Random Forestの勝率予想:50.2% vs 49.8%
- LightGBM の勝率予想:85% vs 15%
- 所感:このピックに関しては、個人的にも興味があった。TESはlate最強のブラッドとメタのグブ・アッシュがいるが、タンクとエンゲージ要素のあるDRXの構成がよく見える。ケイトリンもメタから落ちたとはいえ弱くはなさそうだし、オーンとキンドレッドのスケールも悪くはない。両モデルがDRX有利と予測して、外している。LightGBMは大外ししているので厳しい。
おまけ:特徴量重要度からメタが分かるかも!
それぞれのモデルが重要だと考えているチャンピオンピックが上位に来ていると考えています。この図と照らし合わせて、前節の3試合の勝率予測に関して考えると、より考察が深まりそうです。
Random Forestの方で出てきているシンジャオは、ひとつ前のpatch10.18でのバフを受けてのサプライズ登場な気がします。また、しばらくメタから遠ざかっていたと個人的に思っていたエズリアルがランクインしているのが印象的です。実際、WCSでpickされるシーンも見るので、ブリンク持ちのadcとして返り咲いてきたのでしょう。
その他にも、グレイブス・カミール・ルシアン・ジン・ニダリーといったよく見る顔ぶれが揃っています。もう1つ面白いのが、Random Forestでは高評価のバードがLightGBMでは姿を消して、パンテオン・ルル・スレッシュがランクインしていて、意見が割れた様子が見れるのは興味深いです。どちらも今年のWCSではよく見るサポートなので、共通して重要度が高くてもいいと思うのですが....
最後に
時間に追われて、雑多な記事になってしまいましたが、楽しんでいただけたでしょうか。今後改善していく予定なので、興味のある方はぜひチェックしてみてください。
また、有識者のかたはアドバイスや注文などコメントで寄せていただけると助かります。