行動提案モデルをゼロから作る:batch1 → class-weight までの実験ログ
この記事は、以下のQiita記事の続編です。
- 前編:動画からアクション候補UIを構造化する前処理パイプライン
https://qiita.com/y4o4/items/54322210927721cb98c5
本稿では、そこから先の
- state → action(行動)を提案するモデル を
- ゼロから作り
- batch1 → batch3 までデータを増やしながら
- 偏り・リーク・評価設計の問題にぶつかり
- class-weight まで導入して改善する
という一連の 実験ログ をまとめます。
目的の再整理
最終的にやりたいことはシンプルです。
ゲームのプレイ動画を入力すると、
「今この状態なら、次に出す行動候補はこれ」という
行動提案(Top-k) を返したい
そのために、以下の2段階モデルを採用しています。
-
state 抽出モデル
- 動画 → 入力状態状態(one-hot)
-
行動提案モデル(本記事の主役)
- state → action(クラス分類)
この記事では ②のみ を扱います。
データ定義(最初はこれだけ)
v1: 最小構成
{
"in_hand_state": [0,1,0,1,1,0,0,0],
"role": 4
}
-
in_hand_state: 入力状態8枚の one-hot -
role: 実際に出した行動(0–7のクラス)
まずは「入力状態だけ見て、何を出したか当てる 」という
一番単純な問題設定から始めました。
batch1:とにかく動かす
データ
- batch1 = 数試合分の動画
- 数十サンプル規模
結果
- 学習は動く
- ただし
全部、同じ行動を出すモデル
原因
- データ数が少ない
- クラス分布が極端
👉 まずはデータを増やす必要がある
batch2:データを増やすと見える問題
データ
- batch2 = 約5試合
- 約200サンプル
評価
- Top-1 accuracy: 約0.33
- Top-3 accuracy: 約0.65
一見それっぽいが、
confusion matrix を見ると…
- 特定クラスに極端に偏る
👉 「当てに行っているというより、逃げている」
prev_action を入れる(v2)
発想
人間は、
- 直前に何を出したか
を前提に次の行動を決めます。
v2 feature
{
"in_hand_state": [...],
"prev_action_onehot": [...],
"role": 4
}
結果
- Top-1: 微増
- Top-3: 改善
👉 文脈は効くが、まだ弱い
batch3:新規動画で汎化を確認
方針
- batch1,2 とは完全に別の試合を録画
- 18試合 / 513サンプル
評価(batch2学習モデル)
- Top-1: 0.25
- Top-3: 0.55
baseline 比較
| モデル | Top-1 | Top-3 |
|---|---|---|
| mostfreq | 0.19 | 0.39 |
| random | 0.10 | 0.33 |
| 提案モデル | 0.25 | 0.55 |
👉 学習はしているが、まだ弱い
問題の正体:クラス不均衡
実際の分布(例)
[98, 55, 51, 89, 31, 74, 48, 67]
- よく使う行動
- ほとんど使わない行動
が混在。
👉 通常の CrossEntropy では
「当たりやすい行動だけ出す」
モデルになる。
class-weight の導入
方針
- train split の分布から重みを算出
- rare class を重く、frequent class を軽く
python -m scripts.train_proposal_model \
--class-weight balanced
効果
- Top-1: 0.45
- Top-3: 0.70
- macro F1 が大きく改善
confusion matrix を見ると
- 以前は出なかったクラスも
- きちんと予測されるようになった
👉 「それっぽい提案」になった
学んだこと
- 精度より先に 評価設計 が重要
- データリーク・分布偏りはすぐ起きる
- Top-k 評価は「提案」には必須
- class-weight は最後の一押しとして効く
次にやること
- group split + holdout(動画単位評価)
- batch4 を完全テストとして固定
- state の表現をもう一段リッチにする
まとめ
このプロジェクトは
強いモデルを作る話
というより
どうやって「ちゃんとした実験」に育てるか
の記録です。
同じように
- 行動ログを学習したい人
- ゲームAIを作りたい人
の参考になれば幸いです。