Ich habe einen Datensatz, für den ich versuche, eine Regression durchzuführen, und der fehlschlägt.
Die Situation:
- Tausende von Kampfroboterbetreibern kämpfen mit Kampfrobotern untereinander.
- Einige Kampfroboter sind stark und mächtig, andere sind schwach; Die Starken gewinnen öfter und verursachen mehr Schaden.
- Die Fähigkeiten der Roboterbediener variieren, wobei die erfahreneren häufiger gewinnen und mehr Schaden verursachen
- Wir haben einige zusammenfassende Informationen über die Ergebnisse ihrer Schlachten, aber nicht alle Details.
- Wir wissen, welche Kampfroboter sie in ihren Schlachten eingesetzt haben und wie oft (einschließlich der Anzahl dieser Schlachten, die sie gewonnen haben), und wir kennen den Gesamtschaden, den sie insgesamt verursacht haben (von zwei Arten, Schaden A und Schaden B)
- Einige Roboter können besser Schaden A zufügen, während andere Schaden B verursachen
- Für unbekannte Kampfroboterbetreiber, die nur darauf basieren, welche Roboter sie in Schlachten eingesetzt haben (und wie oft), möchten wir schätzen, wie viel Schaden jeder Art sie erleiden würden und wie viel Prozent der Schlachten sie höchstwahrscheinlich gewonnen haben
Zum Beispiel:
- John hat Roboter A für 4 Schlachten und Roboter B für 2 Schlachten verwendet und 240 Einheiten Schaden A zugefügt
- James hat Roboter A für 1 Schlacht und Roboter B für 10 Schlachten verwendet und 1010 Einheiten Schaden A zugefügt
Ich kann daher schätzen, dass Roboter A wahrscheinlich 10 Einheiten Schaden A pro Kampf verursacht, während Roboter B 100 Einheiten Schaden A pro Kampf verursacht, und daher, wenn er gebeten wird, den von Matthew verursachten Schaden A zu schätzen, für den nur jeder der beiden Roboter gespielt hat Jeweils 2 Schlachten werden auf 220 == (10 * 2 + 100 * 2) geschätzt.
Leider sind die realen Daten nicht so sauber und unkompliziert, wahrscheinlich weil:
- Es gibt eine signifikante Abweichung aufgrund der Fähigkeiten des Roboterbedieners, z. B. könnte ein guter Bediener 20 Einheiten Schaden mit Roboter A verursachen, während ein schlechter nur 5 Einheiten Schaden zufügt.
- Es gibt einige zufällige Abweichungen aufgrund von Gegnern, die im Falle einer kleinen Stichprobe gezogen werden (z. B. zieht jemand einen starken Gegner und verliert, obwohl er einen besseren Roboter als der Gegner hat), obwohl dies letztendlich ausgeglichen werden würde
- Es kann eine geringfügige Auswahlverzerrung geben, da es den besten Roboterbetreibern gelingt, die besten Roboter auszuwählen, die häufiger in den Kampf gezogen werden sollen
Der reale Datensatz ist hier verfügbar (630.000 Einträge bekannter Ergebnisse von Kampfbetreibern):
Der Datensatz ist wie folgt organisiert, mit einem Roboterbedienereintrag pro Zeile:
- Spalte 1 ohne Label - Operator ID
- Schlachten - Gesamtschlachten, an denen dieser Betreiber teilgenommen hat
- Siege - Gesamtschlachten, die dieser Betreiber gewonnen hat
- Niederlagen - totale Schlachten, die dieser Operator verloren hat
- SchadenA - Gesamtschaden A Punkte
- Schaden B - Gesamtschaden B Punkte zugefügt
- 130 Spaltenpaare wie folgt:
- Schlachten_ [Roboter-ID] - Schlachten mit Roboter [Roboter-ID]
- victories_ [robotID] - Siege, die mit robot [robotID] erzielt wurden
Was ich bisher gemacht habe:
- Versuchte ein paar lineare Modelle mit dem R-
biglm
Paket, die eine Formel erstellen, umdamageA ~ 0 + battles_1501 + battles_4201 + ...
zu versuchen, angepasste "erwartete" Werte für jeden der Roboter zu erhalten. - Gleiches, aber Entfernen des erzwungenen Ursprungsabschnitts durch Nichteinbeziehung
0 +
in die Formel - Gleich, aber auch
victories_[robotID]
in den unabhängigen Variablen enthalten - Wie zuvor, jedoch nur diejenigen Roboteroperatoren auswählen, deren Siegzahlen nahe an ihren Niederlagenzahlen liegen
- Eine lineare Regressionsmodell für
damageA ~ 0 + battles_1501 + battles_non_1501
wobattles_non_1501
sind alle Schlachten in Roboter andere als Robotermodell 1501. Dann gilt für alle anderen Robotertypen wiederholt.
Ich habe die Gesundheit überprüft, indem ich mir die vorhergesagten Werte für Schaden A und Schaden B angesehen und das Verhältnis von Siegen zu Schlachten mit dem tatsächlichen Verhältnis von Siegen zu Schlachten verglichen habe, das wir für jeden der Roboter tatsächlich genau berechnen können.
In allen Fällen waren die Ergebnisse zwar nicht vollständig falsch, aber ausreichend schlecht, um festzustellen, dass das Modell nicht ganz funktioniert. Zum Beispiel haben einige Roboter negative Schadenszahlen erreicht, was eigentlich nicht passieren sollte, da Sie in einem Kampf keinen negativen Schaden anrichten können.
Für den Fall, dass ich auch die bekannten victories_[robotID]
Werte in der Formel verwendet habe, waren viele der battle_[robotID]
Koeffizienten etwas große negative Zahlen, also habe ich versucht, für den "durchschnittlichen" Operator nach zu schätzen, battle_[robotID] + victories_[robotID] / 2
aber das ergab auch keine vernünftigen Ergebnisse.
Ich habe jetzt etwas keine Ideen mehr.
lme
anstelle meines zu stecken biglm
, aber natürlich muss ich viel mehr darüber lesen, um zu verstehen, was genau als Parameter dafür bereitgestellt werden soll.