どの組み合わせが最適なのだろう…?
スコアを競うタイプのゲームをプレイしていると、誰もが一度は考えることだと思います。
しかしキャラクター、カード、アイテム、サポート編成など、選べる要素が多すぎて、全パターンを人力ですべて試すのは不可能です。
そこで、AWSのノーコードMLツール「SageMaker Canvas」を使って、ゲームの最適戦略を機械学習で探してみました。
本記事では、データの準備から分析結果、そしてその過程で踏んだ「リーク」という落とし穴について共有したいと思います!
ーーーーーーーーーーーーーーーーーーーーーー
【目次】
ーーーーーーーーーーーーーーーーーーーーーー
こんにちは、佐野(マナティ)です!
私が今回の機械学習で題材にしたのは、ローグライクデッキ構築型のゲームになります。
キャラクターを選択し、カードやアイテムを組み合わせてデッキを構築、ステータスを上げて…を繰り返してスコアを競います。
これらの掛け合わせは膨大であり、人力で最適解を探すのは不可能なので、シミュレーションで大量のデータを生成し、SageMaker Canvasに学習させて「どの要素がスコアに効くか」を特定するというアプローチを取りました。
■ 全体の流れ
■ シミュレーターの構築
SageMaker Canvasに投入するデータを作るために、ゲームのロジックを再現するシミュレーターをTypeScriptで実装しました(可能な範囲で)。
このシミュレーターで約50万行のデータを約50分で生成しました。実プレイに換算すると約6年分に相当します。
「なぜ50万行に設定したのか?」と疑問に思う方もいらっしゃるかもしれませんが、これは「データ量が多ければ多いほど良い」というわけではなく根拠があります。
そのため、学習時に15万行へ自動サンプリングされたとしても、各カードや行動パターンが十分に含まれるよう、元データはそれよりも大きい規模で生成しています。
つまり、50万行という数値は単に多く作ったのではなく、学習に使われる部分集合の品質を担保するためのバッファとして設定しました。
また、シミュレーターでデータを生成することで、短期間で大量の試行結果を蓄積できるだけでなく、実プレイでは観測しづらいパターンも一定数確保しやすくなります。
これにより、Canvas上での学習に必要なデータ分布を、現実的な時間内で用意できるようにしました。
SageMaker Canvasは、AWSが提供するノーコードMLツールです。
コードを一切書かずに、CSVやParquetファイルを投入するだけで機械学習モデルの構築・評価・予測ができます。内部ではSageMaker Autopilot(AutoML)が動いており、XGBoostや線形回帰など複数のアルゴリズムを自動で試行し、最良のモデルを選択してくれます。
今回使った主な機能は以下になります。
|
# |
機能 |
説明 |
|
1 |
データセット |
Parquetファイルをドラッグ&ドロップでアップロード |
|
2 |
Standard Build |
最大250のモデル候補を自動試行(2~4時間) |
|
3 |
Column Impact |
各特徴量がどれだけ予測に寄与しているかをランキング表示 |
|
4 |
Advanced Metrics |
R2、RMSE、MAEなどの精度指標 |
最初の分析では、目的変数(予測したい値)を「最終評価スコア」に設定してStandard Buildを実行しました。
R2 = 99.992%
Column Impact ①pre_exam_total(ステータス合計)= 60.436%
R2が99.992%
ここで言うR2は、プレイごとにスコアが高くなったり低くなったりする違いを、モデルがどの程度捉えられたかを示す指標です。100%に近いと良いとされています。
そのため、一見するとほぼ完璧な予測に見えました。
しかし、実際にはこれは「よく当たるモデル」ができたわけではありませんでした。
理由としては、最終評価に強く関わる情報が、すでに入力データの中に入ってしまっていたからです。
つまりモデルは未来を予測していたのではなく、答えに近い情報を使って結果をそのまま再現していただけでした。
これは機械学習でいうリーク(情報漏洩)と呼ばれる状態です。
たとえるなら、テスト本番で実力を測りたいのに、問題集の答えが見える状態で解いているようなものです。 これでは高い点が出ても、「本当に予測できている」とは言えません。
今回の結果から、「精度が高すぎるときはまず、疑ってみる」ことが大事だと学びました。
特に、ほぼ満点に近い結果が出たときは、入力データに「答えのヒント」が混ざっていないか確認する必要があります。
ただ、この分析から得られた気づきもありました。
スコアはどうやら「一部の要素にかなり強く左右されていそうだ」ということです。
そこで次は、最終評価そのものではなく、その土台になっている要素が何によって伸びるのかを見ることにしました。
次に、予測対象を「最終評価」から「ステータス合計」に変えて分析し直しました。
R2 = 99.997%
Column Impact ①total_stat_growth(成長合計)= 70.772%
これも最初はかなり良い結果に見えました。しかし、ここでも同じ問題がありました。
「成長量」というのは、ゲームプレイ途中経過で初めてわかる情報です。
つまり、実際に「これからどうスコアが伸びるのか」を予測したい場面では使えない情報が、入力に含まれていたということになります。
そのため、ここでもモデルは本当の意味で未来を当てていたのではなく、途中経過や結果に近い情報をもとに、ほぼ答えを言い当てていただけでした。
今回の分析では、「予測時点でまだわからない情報は、特徴量に入れてはいけない」と学びました。
「なぜこんなに当たるのか?」を確認していくことで、本当に予測に使える情報と後から分かるので使ってはいけない情報を切り分けられるようになりました。
3回目の分析では、考え方を大きく変えました。
これまでの分析では、プレイの途中や終了後にしか分からない情報が混ざっていたため、見かけ上はとても高い精度が出ていました。
そこで今回は、プレイを始める前の時点でわかっている情報だけを使って、どこまで結果を予測できるかを予測できるか試しました。
具体的には、使うデータを73項目から27項目まで絞り込みました。
残したのは、例えば次のような情報です。
逆に、プレイを進めないと分からない情報、例えば成長量や途中のスコア、クリア回数などはすべて除外しました。
R2 = 73.221%
RMSE = 19,991
MAE = 2,516
RMSEは大きな予測ミスを強く反映する誤差指標です。値が小さいほど良いとされます。
MAEも値が小さいほど良い指標です。予測値は、実際のスコアから平均して2,516点ずれていました。
これまでの99%台と比べると、大きく下がっています。
ただ、今回は答えに近い情報を使っていないので、こちらの方が本当の意味での予測精度だと考えています。
言い換えると、
「プレイ開始前の選択だけで、最終結果の7割以上を説明できた」
ということになります。
モデルが特に重視していたのは、次のような項目です。
この結果を見て、特に印象的だったのは、「何を持っていくか」以上に、「どのキャラクターを選択するか」が結果に大きく効いているという点でした。
例えば、キャラクター選択とプランに関する項目だけで、全体の2割以上の影響を持っていました。つまり、細かなカードやアイテムの組み合わせよりも、まず最初の方針決めがかなり重要だと考えられます。
今回の分析から見えてきたのは、「結果はプレイ中の運や細かな判断だけで決まるのではなく、開始前の選択の時点でかなり方向づけられている」ということです。
一方で、カードやアイテムの影響が思ったよりも小さかったのはデータ投入前に事前に作成していたシミュレーター側の意思決定ロジックにも理由がありそうです。
今回のシミュレーターは、基本的にその場で最も得点が高くなりそうな選択を優先する作りになっていました。そのため、実際のプレイヤーのように「序盤は準備して、終盤で一気に伸ばす」といった中長期的な進め方を十分に再現できていません。
もしこの部分を改善できれば、カードやアイテムの価値も今よりはっきり表れ、予測結果の見え方も変わってくるのかなと思います。
|
分析 |
やったこと |
R2 |
わかったこと |
|
① |
使える項目をすべて入れて最終結果を予測 |
99.99% |
結果に近い情報まで入っていて、ほぼ答え合わせになっていた |
|
② |
予測する対象を変えて再分析 |
99.99% |
まだ途中経過にあたる情報が残っていた |
|
③ |
プレイ開始前にわかる情報だけに絞る |
73.22% |
これが実際に使える予測精度に近い |
この3段階を通して強く実感したのは、機械学習ではモデル選び以上に、どんなデータを入れるかが重要だということでした。同じデータ量でも、入れる項目の選び方次第で結果は大きく変わります。
1.本当にコードを書かずに進められる
データのアップロードから、モデル作成、精度の確認、どの項目が効いているのかの確認まで、今回ほとんどコードは使っていません。設定を調整して実行するだけで、分析を何度も試せるのはかなり便利でした。
2.「どの刻目が効いているか」が見やすい
SageMaker Canvasでは、どの項目が予測にどれだけ影響していたかを、割合やグラフで確認できます。専門知識がなくても、「この情報は効いていそう」「これはあまり効いていなさそう」と直感的に把握しやすいと感じました。
3.試行錯誤しやすい
「予測したいものを変える」「使う項目を減らす」といった試し方が、数クリックでできます。コードベースで同じことをやろうとすると、前処理や学習処理を書き直す必要がありますが、SageMaker Canvasではその繰り返しがかなり早く回せました。
1.使いっぱなしにすると料金がかかる
SageMaker Canvasは開いている間に料金が発生します。
今回の検証では、実作業時間は約10時間(セットアップ→データ準備→3回のモデル構築)で、定価ベースでの費用は約$86(約12,900円)でした。ただし、SageMaker Canvasには新規ユーザー向けの無料枠として最初の2ヶ月間、月750時間のセッション無料があるため、今回の実際の請求額は$0でした。
内訳としては、Canvasのセッション料金が約$20、裏側で自動起動されるモデル学習用インスタンスの計算コストが約$47、Studioのストレージが約$20です。
一方、閉じ忘れには注意が必要です。Canvas セッションは東京リージョンで $1.90/時間 かかるため、もし1日放置すると約$46(約6,800円)、1週間で約$319(約47,900円)にもなります。使用後は Canvas 上で明示的にログアウトし、不要なエンドポイントも削除するのが確実です。
初めて試す方は無料枠の範囲内で十分に検証できるので、気軽にトライしてみてください!
2.しっかりした学習は時間がかかる
精度を重視したビルドは、1回で数時間かかることがあります。まず短時間のビルドで傾向を確認し、問題なさそうであれば本番のビルドに進む流れが効率的でした。
3.おかしな高精度を自動では見抜いてはくれない
SageMaker Canvasは、入力データに「答えに近い情報」が混ざっていても、自動で止めてくれるわけではありません。精度が高い結果が出ても、そのまま信用せず、「本当に事前にわかる情報だけで予測しているか」を人が確認する必要があります。
4.詳細レポートがうまく出ない場合がある
一部の分析では、特徴量の詳細レポートが生成されないことがありました。モデル自体は作れるものの、深堀りのしやすさという点では、少し不安定さもありました。
今回、SageMaker Canvasでゲームデータを分析してみて特に大きかった学びは3つになります。
1つ目は、「モデルそのものより、どんなデータを入れるかが重要」だということです。同じ50万行のデータでも、使う項目の選び方で結果は大きく変わりました。
2つ目は、「制度が高い結果ほど、そのまま信用してはいけない」ということです。見た目では高精度でも、実際には結果に近い情報が混ざっていただけ、というケースが今回ありました。
3つ目は、「ノーコードでも十分に試行錯誤できる」ということです。SageMaker Canvasなら、データさえ用意できれば、モデル作成から重要な項目の確認までスムーズに進められます。
今後SageMaker Canvasで分析を続けるなら、シミュレーターの行動ロジックを改善しつつ、カードごとの影響もより細かく見ていくことで、分析の精度と解像度をさらに高めていきたいです。
また今回の試行を通じて、この進め方はゲーム分析にとどまらず、複数の条件から結果を予測したいさまざまなテーマにも展開できると感じました。