opponent-archetype-classifier について
opponent-archetype-classifierは、観測した特徴から相手の戦略タイプを推定するスキルです。ファンタジースポーツやポーカーなどに使え、ベイズ分類で事後分布、確信度、特徴ごとの寄与、定義済みの対応ヒントを返します。
主な機能
- 01指定された分類体系と特徴分布を使用
- 02各タイプの特徴尤度を計算
- 03ベイズ則で事後分布を算出
- 04事後確率と観測重みから確信度を計算
- 05特徴の寄与と対応ヒントを提示
- 06確信度が低い場合は判定保留
活用シーン
- 01ロースターや活動記録からファンタジースポーツの相手を分類
- 02ベットやハンドの特徴からポーカーの相手を分析
- 03観測の蓄積に応じて相手の分類を更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lyndonkl/ claude --skill opponent-archetype-classifierインストール後、Claude Code で/opponent-archetype-classifierを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
resources/methodology.mdtemplate.mdresources/evaluators/rubric_opponent_archetype_classifier.json詳細
対戦相手のアーキタイプ分類
目次
例
シナリオ:ファンタジーベースボールリーグの第5週です。対戦相手の「Manager A」を、6つのアーキタイプ(balanced、stars_and_scrubs、punt_sv、punt_sb、punt_wins_qs、hitter_heavy)のいずれかに分類します。
入力(要約版。分類体系の全容はresources/template.mdを参照してください):
archetype_taxonomy:
balanced: {prior: 0.30, feature_distributions: {sp_roster_share: {mean: 0.40, std: 0.06}, closer_count: {mean: 2.0, std: 0.6}, sb_speed_count: {mean: 3.0, std: 1.0}, moves_per_week: {mean: 2.5, std: 1.0}, bid_aggression: {low: 0.5, high: 0.5}}}
stars_and_scrubs: {prior: 0.15, ...}
punt_sv: {prior: 0.15, feature_distributions: {closer_count: {mean: 0.3, std: 0.4}, ...}}
punt_sb: {prior: 0.15, feature_distributions: {sb_speed_count: {mean: 0.8, std: 0.7}, ...}}
punt_wins_qs: {prior: 0.10, feature_distributions: {sp_roster_share: {mean: 0.20, std: 0.05}, closer_count: {mean: 3.0, std: 0.8}, moves_per_week: {mean: 4.0, std: 1.2}, ...}}
hitter_heavy: {prior: 0.15, feature_distributions: {sp_roster_share: {mean: 0.28, std: 0.05}, ...}}
observed_features:
sp_roster_share: 0.22 # low -- thin on starters
closer_count: 3 # heavy RP
sb_speed_count: 2 # moderate speed
moves_per_week: 4.2 # high activity
bid_aggression: high # active FAAB bidder
observation_weight: 0.7 # ~4 weeks of data
計算(特徴量ごとの対数尤度を合計し、指数変換した値に事前確率を掛け、正規化):
| アーキタイプ | log L(features) | L * prior | 正規化後の事後確率 |
|---|---|---|---|
| balanced | -14.8 | 1.1e-7 | 0.04 |
| stars_and_scrubs | -12.5 | 5.6e-7 | 0.21 |
| punt_sv | -18.2 | 1.8e-9 | 0.00 |
| punt_sb | -22.6 | 2.3e-11 | 0.00 |
| punt_wins_qs | -10.1 | 1.8e-6 | 0.68 |
| hitter_heavy | -13.2 | 4.2e-7 | 0.16 |
出力:
posterior:
balanced: 0.04
stars_and_scrubs: 0.21
punt_sv: 0.00
punt_sb: 0.00
punt_wins_qs: 0.68
hitter_heavy: 0.16
map_archetype: punt_wins_qs
classification_confidence: 47.6 # = max_posterior (0.68) * observation_weight (0.7) * 100
best_response_hints:
- "Concede K and QS; lock 6 of remaining 8 cats"
- "Don't stream starting pitchers against them"
- "They will dominate SV and ratios via all-RP staff; push hitting cats hard"
feature_contribution_breakdown:
sp_roster_share: {map_likelihood: 0.92, alternative_max: 0.15, likelihood_ratio: 6.1} # low SP share -- strong punt_wins_qs signal
closer_count: {map_likelihood: 0.52, alternative_max: 0.46, likelihood_ratio: 1.1} # 3 closers fits several archetypes
sb_speed_count: {map_likelihood: 0.38, alternative_max: 0.41, likelihood_ratio: 0.9} # not discriminating
moves_per_week: {map_likelihood: 0.33, alternative_max: 0.28, likelihood_ratio: 1.2}
bid_aggression: {map_likelihood: 0.70, alternative_max: 0.60, likelihood_ratio: 1.2}
assumptions_flagged:
- "Conditional independence across features assumed -- sp_roster_share and moves_per_week may be correlated (active punt strategy drives both)"
- "Feature distributions are SME priors, not empirically fit -- refresh after season 1 with posterior data"
信頼度に関する注記:事後確率は0.68が最大ですが、observation_weight=0.7(データは4週間分のみ)により、信頼度は47.6に抑えられています。40のしきい値を上回っているためMAPが報告されますが、判定の精度を高めるには、さらに2~3週間観察することを推奨します。
ワークフロー
このチェックリストをコピーして、進捗を記録してください。
Opponent Archetype Classification Progress:
- [ ] Step 1: Load archetype taxonomy (names, priors, feature distributions)
- [ ] Step 2: Collect observed features for the target opponent
- [ ] Step 3: Compute per-feature likelihood under each archetype
- [ ] Step 4: Combine likelihoods (assume conditional independence; flag it)
- [ ] Step 5: Apply Bayes rule, normalize posterior
- [ ] Step 6: Select MAP archetype; compute confidence
- [ ] Step 7: Check inconclusive threshold; report or defer
- [ ] Step 8: Produce feature-contribution breakdown and best-response hints
Step 1: アーキタイプの分類体系を読み込む
分類体系は呼び出し元から提供されます。必須フィールドについては、resources/template.md を参照してください。
- 各アーキタイプに、名前、事前確率、観測可能な各特徴量の特徴分布がある
- 事前確率の合計が 1.0 である(そうでない場合は正規化する)
- 各特徴量が、パラメトリック分布(平均値/標準偏差を用いたガウス分布)またはカテゴリ分布(値 -> 確率)のいずれかを持つ
- 各アーキタイプに、文書化された
best_response文字列配列がある
Step 2: 観測された特徴量を収集する
観測された特徴量は、分類体系内の特徴量名と一致している必要があります。欠落した特徴量は補完せずに除外し、その旨を記録します。
- 特徴量名が分類体系のキーと完全に一致している
- 数値特徴量が分類体系で想定される単位になっている
- カテゴリ特徴量が分類体系のカテゴリラベルを使用している
-
observation_weight(0-1)が指定されている。サンプル数が増えるほど高くなります。methodology.md を参照してください。
Step 3: 特徴量ごとの尤度を計算する
各(アーキタイプ、特徴量)の組み合わせについて、P(feature_value | archetype) を計算します。methodology.md を参照してください。
- ガウス特徴量:
L = (1/(std*sqrt(2*pi))) * exp(-0.5 * ((x - mean)/std)^2) - カテゴリ特徴量:
L = P_archetype[category]。ゼロの場合はラプラス平滑化を適用する - 5 個以上の特徴量を組み合わせる際のアンダーフローを避けるため、対数空間(
log L)で処理する
Step 4: 尤度を組み合わせる(条件付き独立性)
第一近似として、特徴量はアーキタイプを条件とした場合に互いに独立であると仮定します。この仮定が厳密に成り立つことはまれなので、その旨を記録してください。
- アーキタイプごとに、特徴量全体の対数尤度を合計する
- 相関のある特徴量の組み合わせ(例:ファンタジーベースボールにおける
sp_roster_shareとmoves_per_week)を記録する - 2 つの特徴量に強い相関がある場合は、統合するか、どちらかの重みを下げることを検討し、その判断を文書化する
Step 5: ベイズの定理を適用し、正規化する
posterior_unnorm[a] = exp(sum_log_L[a]) * prior[a]
posterior[a] = posterior_unnorm[a] / sum_a(posterior_unnorm[a])
- 数値安定性を保つために対数空間で計算してから、指数関数を適用する前に最大値を減算する
-
sum(posterior) == 1.0が丸め誤差の範囲内で成り立つことを確認する - 事後確率が 1e-6 未満のアーキタイプは「除外」として記録する
Step 6: MAP アーキタイプを選択し、信頼度を計算する
map_archetype = argmax(posterior)
classification_confidence = max(posterior) * observation_weight * 100
- MAP は最も可能性の高いアーキタイプであり、唯一の可能性ではありません
- 信頼度は、事後確率の分布の集中度と観測結果への信頼度を組み合わせたものです
Step 7: 判定保留のしきい値
classification_confidence < 40 の場合:
-
map_archetype: "inconclusive"を返す - 事後確率全体も返す(呼び出し元は上位 2 つに基づいて判断できる場合があります)
- 次のように案内する:「分類を確定する前に、あと 2~3 週間観察データを収集してください」
Step 8: 特徴量への寄与の内訳と最適な対応のヒント
- 各特徴量について、尤度比
L(feature | MAP) / max_{a != MAP} L(feature | a)を計算する - MAP アーキタイプで文書化された文字列配列から
best_response_hintsを取得する - 呼び出し元がこのアーキタイプが選ばれた理由を把握できるよう、事後確率とともに返す
共通パターン
パターン 1:ファンタジースポーツ(野球、バスケットボール、ホッケー)のマネージャーの類型
- 分類体系:カテゴリリーグの戦略を網羅する、
balanced、punt_<cat>、stars_and_scrubs、inactiveなどの 5~8 種類の類型です。 - 特徴:ポジションごとのロースター構成、取引頻度、FAAB での積極性、ラインナップ設定の正確さです。
- 条件付き独立性のリスク:複数の特徴が共変します(活動していないマネージャーは、移籍も入札も少なく、ラインナップも更新されません)。重みを下げるか、統合してください。
- 観測の重み:第 2 週までに 0.3、第 5 週までに 0.6、第 10 週までに 0.85 です。
パターン 2:ポーカーの対戦相手の類型
- 分類体系:
tight_aggressive (TAG)、loose_aggressive (LAG)、tight_passive (rock)、loose_passive (calling station)、maniacです。 - 特徴:VPIP、PFR、3-bet %、アグレッションファクター、C ベット頻度、ショーダウン頻度です。
- 条件付き独立性のリスク:VPIP と PFR は強く関連しています。両方を残しつつ、相関があることに留意してください。
- 観測の重み:ハンド数とともに急増します。100 ハンドで 0.4、500 ハンドで 0.75、2000 ハンド以上で 0.9 です。
パターン 3:DFS のラインナップ構築の類型
- 分類体系:
cash_game_optimizer、GPP_ceiling_chaser、contrarian_pivot、chalk_herdingです。 - 特徴:平均サラリー使用額、スタック数、予測に対するオーナーシップの比率、トーナメントとキャッシュゲームのエントリー比率です。
- 条件付き独立性のリスク:GPP のプレイヤーでは、スタック数と予測に対するオーナーシップが共変します。
パターン 4:M&A/オークション入札者の類型
- 分類体系:
strategic_premium_bidder、financial_disciplined_bidder、fishing_expedition、structured_earnout_prefererです。 - 特徴:四半期ごとの発表済み入札件数、戦略的または財務的なプレスリリースの表現、支払ったプレミアム倍率、取引構造(現金、株式、アーンアウト)です。
- 観測の重み:単独の取引だけでは低く、入札履歴が蓄積するほど高くなります。
ガードレール
-
条件付き独立性が厳密に成り立つことは、ほとんどありません。 必ずその点を明示してください。2つの特徴量が強く相関している場合(|r| > 0.6)、それらを1つの複合特徴量にまとめるか、片方の重みを50%下げてください。そうしないと、確信度の高いアーキタイプが、同じ根本的なシグナルに対して二重に評価されます。
-
データが少ない場合、事前分布は重要です。 一様事前分布は選択肢の1つであり、中立的な既定値ではありません。母集団の分布がわかっている場合は、ドメイン知識に基づく事前分布を使用してください(例:12チームのファンタジーリーグでは、
inactiveの実際の基本率は、1/12ではなく約1~2人のマネージャーです)。 -
数値の安定性を保つため、対数空間で計算してください。 小さな尤度を5つ以上乗算すると、float64ではアンダーフローして0になります。対数尤度を合計し、指数関数を適用する前に最大の対数事後確率を引いてから、正規化してください。
-
カテゴリ変数にはラプラス平滑化を適用してください。 あるアーキタイプの分布で
P(category=X) = 0となっており、観測値がXの場合、そのアーキタイプの事後確率は0になり、1つのデータ点だけで永久に除外されます。加算イプシロンによる平滑化を適用してください(epsilon = 0.01が一般的です)。 -
判定不能は失敗ではなく、特徴の1つです。 確信度の低い分類は有益な情報です。確定する前に、より多くのデータを収集するよう呼び出し元に伝えます。確信度が40未満の場合はMAPを無理に選ばないでください。
-
最適応答のヒントは分類器ではなく、分類体系から取得します。 スキルが戦略を作り出してはいけません。分類体系の作成者がそのアーキタイプについて記録した内容を取得してください。分類体系の
best_responseが空の場合は、空の配列を返し、分類体系に情報を追加する必要があることを伝えてください。 -
事後分布は点推定ではなく、分布です。 後続のエージェントが出力を使用する際は、MAPに集約するのではなく、理想的には事後分布全体を使って、その上で期待値に基づく判断を行うべきです。両方を公開してください。
-
新たな観測値が届くたびに、逐次更新してください。 今週の事後分布を翌週の事前分布として使用します。再帰式については、methodology.mdを参照してください。
-
特徴量の寄与の内訳は、過学習を防ぐのに役立ちます。 1つの特徴量の尤度比が > 10 の場合、その特徴量だけで分類結果が左右されています。結果を信頼する前に、その特徴量が正確に測定されたことを確認してください。
-
実データが利用可能になったら、特徴量の分布を更新してください。 初期分布はSMEの事前分布です。N人の対戦相手にラベルを付けて観測した後、分布を実データに基づいて推定し、SMEの事前分布を置き換えてください。
クイックリファレンス
主な数式:
Gaussian likelihood:
L(x | a) = (1 / (std_a * sqrt(2*pi))) * exp(-0.5 * ((x - mean_a) / std_a)^2)
Categorical likelihood (with Laplace smoothing, epsilon = 0.01):
L(x = c | a) = (count_a[c] + epsilon) / (sum_c' count_a[c'] + epsilon * num_categories)
Joint likelihood (conditional independence assumption):
L(features | a) = prod_f L(feature_f | a)
Log-space joint likelihood:
log L(features | a) = sum_f log L(feature_f | a)
Bayes posterior:
posterior(a) proportional to L(features | a) * prior(a)
posterior(a) = posterior_unnorm(a) / sum_a' posterior_unnorm(a')
MAP selection:
map_archetype = argmax_a posterior(a)
Classification confidence:
confidence = max_a posterior(a) * observation_weight * 100
if confidence < 40:
map_archetype = "inconclusive"
Sequential update (week t):
prior_t(a) = posterior_{t-1}(a)
posterior_t(a) proportional to L(new_features_t | a) * prior_t(a)
Feature contribution (likelihood ratio):
LR(feature_f) = L(feature_f | MAP) / max_{a != MAP} L(feature_f | a)
信頼度の範囲:
| 信頼度 | 解釈 | 対応 |
|---|---|---|
| 0-39 | 判断不能 | さらにデータを収集する |
| 40-59 | MAP の確度が低い | MAP を暫定的なものとして扱い、その後の判断では慎重を期す |
| 60-79 | MAP の確度が高い | MAP に基づいて行動するが、上位 2 件も考慮する |
| 80-100 | MAP の確度が非常に高い | MAP に決定する |
主なリソース:
- resources/template.md:アーキタイプ分類スキーマ(YAML)、観測特徴スキーマ、出力スキーマ、6 種類のアーキタイプを使ったファンタジーベースボールの完全な例。
- resources/methodology.md:ベイズ分類の入門、尤度関数の設計、特徴分布の構築方法(経験的手法と SME)、条件付き独立の仮定とそれが成り立たない場合、逐次的な事後確率の更新。
- resources/evaluators/rubric_opponent_archetype_classifier.json:出力を評価するための 10 項目の品質基準。
必須入力:
archetype_taxonomy:アーキタイプ名 ->{prior, feature_distributions, best_response}の辞書observed_features:特徴名 -> 観測値の辞書observation_weight:0-1。事前確率に対して観測をどの程度信頼するかarchetype_prior(任意):アーキタイプ名 -> 事前確率の辞書。デフォルトでは分類スキーマの事前確率を使用します(または一様分布)。
出力:
posterior:アーキタイプ -> 確率の辞書。合計は 1map_archetype:最も可能性の高いアーキタイプを示す文字列(または"inconclusive")classification_confidence:0-100best_response_hints:文字列の配列。MAP アーキタイプに記録された最善の対応から取得feature_contribution_breakdown:特徴 -> {map_likelihood, alternative_max, likelihood_ratio} の辞書assumptions_flagged:文字列の配列。相関する特徴、平滑化の適用、事前確率を一様分布に強制した場合など