回帰を実行しようとして失敗したデータセットがあります。
状況:
- 何千人ものバトルロボットオペレーターが、バトルロボットを使用して互いに戦います。
- 戦闘ロボットの中には、強力で強力なものもあれば、弱いものもあります。強いものはより頻繁に勝ち、より多くのダメージを与えます。
- ロボットオペレーターのスキルはさまざまで、スキルの高いオペレーターが勝つ頻度が高く、より多くのダメージを与えます
- 彼らの戦いの結果に関するいくつかの要約情報がありますが、詳細のすべてではありません。
- 彼らが戦闘で使用した戦闘ロボットとその回数(勝利した戦闘の数を含む)、および彼らが与えた合計ダメージ(2種類のダメージAとダメージB)がわかります
- 一部のロボットはダメージAを与えるのが得意ですが、他のロボットはダメージBを与えます。
- 戦闘で使用したロボット(およびその回数)のみに基づいて不明な戦闘ロボットオペレーターの場合、達成できる各種類のダメージの量と、勝った可能性が最も高い戦闘の割合(%)を推定します
例えば:
- ジョンはロボットAを4戦、ロボットBを2戦使用し、240ユニット分のダメージを与えました
- ジェームズはロボットAを1戦、ロボットBを10戦使用し、1010ユニット分のダメージを与えました
したがって、ロボットAはおそらく1戦あたり10ユニットのダメージAを与える一方、ロボットBは1戦あたり100ユニットのダメージAを与えると見積もることができるため、2つのロボットのそれぞれをプレイしただけのマシューによって与えられたダメージAを見積もるそれぞれ2戦、220 ==(10 * 2 + 100 * 2)と推定されます。
残念ながら、実際のデータはそれほどクリーンで簡単ではありません。
- ロボットオペレーターのスキルには大きな違いがあります。たとえば、優れたオペレーターはロボットAに20ユニットのダメージを与え、悪いオペレーターは5ユニットしかダメージを与えることができません。
- 小さなサンプルの場合、対戦相手が引き寄せられるため、ランダムな差異があります(たとえば、誰かが強い対戦相手を引き、対戦相手よりも優れたロボットを持っているにもかかわらず負けます)。
- 最高のロボットオペレーターが最高のロボットを選んでより頻繁に戦闘に参加するという点で、いくつかのマイナーな選択バイアスがあるかもしれません
実際のデータセットはこちらから入手できます(既知の戦闘オペレーターの結果の63万件)。
データセットは次のように構成され、行ごとに1つのロボットオペレーターエントリがあります。
- ラベルのない列1-オペレーターID
- 戦闘-このオペレーターが参加した戦闘の合計
- 勝利-このオペレーターが獲得した合計戦闘数
- 敗北-このオペレーターが負けた合計戦闘数
- DamageA-与えられたダメージAポイントの合計
- DamageB-与えられたダメージBポイントの合計
- 次の130組の列:
- battles_ [robotID]-ロボット[robotID]を使用した戦闘
- victories_ [robotID]-ロボット[robotID]を使用して獲得した勝利
これまでに行ったこと:
- R
biglm
パッケージを使用していくつかの線形モデルをdamageA ~ 0 + battles_1501 + battles_4201 + ...
試して、ロボットごとに「期待される」値のフィッティングを取得するなどの式を作成しました。 - 同じですが
0 +
、数式に含めないことで強制原点インターセプトを削除します - 同じですが
victories_[robotID]
、独立変数にも含まれています - 以前と同じですが、勝利数が敗北数に近いロボットオペレーターのみを選択します
- ロボットモデル1501以外のロボットでのすべてのバトルが
damageA ~ 0 + battles_1501 + battles_non_1501
どこにbattles_non_1501
あるかについての線形回帰モデル。他のすべてのロボットタイプに対して繰り返されます。
予想されるDamageAとDamageBの値を確認し、勝利/戦闘の比率を各ロボットについて実際に正確に計算できる実際の勝利/戦闘の比率と比較することにより、健全性チェックを行いました。
すべての場合において、結果は完全にオフではありませんでしたが、モデルが十分に機能していないことを確認するのに十分オフでした。たとえば、一部のロボットは負のダメージ数を達成しましたが、これは戦闘で負のダメージを与えることができないため、実際には起こりません。
victories_[robotID]
式で既知の値も使用した場合、battle_[robotID]
係数の多くはやや大きな負の数になるため、「平均」演算子の推定を試みましたbattle_[robotID] + victories_[robotID] / 2
が、それでも妥当な結果が得られませんでした。
私は今ややアイデアがなくなっています。
lme
代わりにプラグインを試しましたが、biglm
パラメーターとして何を提供すべきかを正確に理解するには、これについてさらに多くのことを読む必要があります。