[PYTHON] Berücksichtigung der Neigungsbewertung und der Genauigkeit der Effektschätzung

Artikelübersicht

Ich war ein wenig besorgt, als ich den Neigungswert studierte, der im Bereich des kausalen Denkens erscheint, also experimentierte ich. Was mich interessierte, war, wie viel und wie ich mich mit der "Berechnung der Neigungsbewertung" befassen sollte. Dieses Mal habe ich absichtlich voreingenommene Daten erstellt

  1. Bei Verwendung des wahren Neigungswerts
  2. Wenn der Neigungswert unter Verwendung des gleichen Modells wie die Datensatzgenerierung berechnet wird (logistische Regression)
  3. Wenn Sie die Genauigkeit der Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Interventionen hervorheben (LightGBM)

Ich habe die Genauigkeit der Effektschätzung auf drei Arten verglichen. In diesem Artikel bedeutet "Wirkung" "ATE (Average Treatment Effect)".

** Ich bin begeistert, dass dies mein erster Beitrag ist, aber ich würde es begrüßen, wenn Sie mich wissen lassen könnten, wenn Sie irgendwelche Probleme haben. ** ** **

Vorbereiten eines voreingenommenen Datensatzes

Bestimmen Sie die Wahrscheinlichkeit (= wahre Neigungsbewertung) der Intervention $ z \ in \ {0, 1 \} $ im selben Modell wie die logistische Regression basierend auf den Merkmalen $ x_0, x_1, x_2 $. Der wahre Effekt von $ z $ beträgt 1,3 für den Text, und das Ziel des Effekts wird durch die lineare Kombination von $ x_0, x_1, x_2, z $ und dem Fehlerterm berechnet. Der Koeffizient der linearen Verbindung wird ebenfalls durch den Text bestimmt.

dataset.py


import numpy as np
import pandas as pd

# sample size
n = 10000

# features
np.random.seed(0)
x_0 = np.random.randn(n)

np.random.seed(1)
x_1 = np.random.randn(n)

np.random.seed(2)
x_2 = np.random.randn(n)

# treatment
z = np.zeros_like(x_0)
true_P_score = np.zeros_like(x_0)

# true effect of z
effect = 1.3

for i in range(n):
    # those who have high value of x_0, x_1 and x_2 tend to be z = 1.
    true_P_score[i] = 1 / (1 + np.exp(- x_0[i] - x_1[i] - x_2[i]))

    if np.random.rand(1) < true_P_score[i]:
        z[i] = 1
    else:
        z[i] = 0
        
# error
np.random.seed(3)
error = 0.01 * np.random.randn(n)

# generate target y
target = 2*x_0 + 3*x_1 + 1.5*x_2 + effect*z + error

# make dataframe
data = pd.DataFrame({'x_0': x_0,
                     'x_1': x_1,
                     'x_2': x_2,
                     'z': z,
                     'target': target,
                     'true_P_score': true_P_score})

Wenn Sie vorerst überprüfen, wie stark die Verzerrung beeinflusst wird, wenn Sie eine Zufallsstichprobe annehmen, können Sie feststellen, dass es sich um eine ziemlich große Schätzung handelt.

Wahrer Effekt: 1.3 Scheinbare Wirkung: 5.5

confirm_bias.py


# confirm the bias
print("the true effect of z = ", effect)
print('the pseudo effect of z = ',
      np.mean(data[data.z == 1].target) - np.mean(data[data.z == 0].target))

IPW unter Verwendung des Neigungsscores

Lassen Sie uns den Effekt durch IPW (inverse wahrscheinlichkeitsgewichtete Schätzung) mit dem Neigungswert als Gewicht abschätzen. Im Prinzip beträgt der Neigungswert $ P $, das Gewicht $ Z_i / P_i $ für die Stichprobe $ i $ mit $ z = 1 $ und das Gewicht $ (1-Z_i) für die Stichprobe $ i $ mit $ z = 0 $. Addiere / (1-P_i) $, um den erwarteten Wert jedes Ziels von $ z = 1, 0 $ zu berechnen, und die Differenz ist der geschätzte Effekt.

Ich möchte jedoch, dass die Bibliothek hier den t-Test durchführt. Wenn ich also ein wenig überlege, setze ich das Gewicht $ [Z_i / P_i + (1-Z_i) / (1-P_i)] $ auf alle Samples, $ z $ Sie können sehen, dass wir die ** gewichtete lineare einfache Regression ** von $ target $ by berücksichtigen sollten.

ipw.py


from statsmodels.regression.linear_model import WLS # weighted least square
from statsmodels.tools import add_constant

X = add_constant(data['z'])
y = data['target']
weights = data['Z/P'] + data['(1-Z)/(1-P)']
wls = WLS(y, X, weights=weights).fit()
wls.summary()

Es kann ein Slapstick sein, aber der folgende Code kann den wahren Effekt und das Schätzergebnis ausgeben.

confirm_effect.py


print("the true effect of z = ", effect)
print("effect of z is estimated as", wls.params[1])

Vergleich der Effektschätzung anhand des Neigungsscores

Nun, der wahre Effekt ist 1,3, wie zum Zeitpunkt der Datensatzgenerierung entschieden, aber ich habe ihn anhand mehrerer Neigungsbewertungen geschätzt. Wenn der Neigungswert tatsächlich im Datensatz vorhanden ist, ist der geschätzte Effekt ** unvoreingenommen **, sodass es am genauesten ist, die beim Generieren des Datensatzes verwendete Interventionswahrscheinlichkeit als Neigungswert zu verwenden. Sollte sein.

Da das logistische Regressionsmodell ** mit dem Mechanismus zur Datensatzgenerierung ** identisch ist, sollte der berechnete Neigungswert nahe am wahren Wert liegen. Daher ist auch die Schätzgenauigkeit des Effekts recht gut. Es wird erwartet. Übrigens waren es ungefähr 76% in Bezug auf die "Vorhersagegenauigkeit" der Intervention $ z $. (Es ist ein Rätsel, ob es als Vorhersage bezeichnet wird, da es nur sogenannte Trainingsdaten gibt.) Außerdem betrug der Neigungswert im Durchschnitt etwa $ \ pm 0,4 $% vom wahren Wert (dem Durchschnitt der absoluten Werte der Differenzen, nicht dem Fehlerverhältnis). ..

Schließlich habe ich versucht, die "Vorhersagegenauigkeit" der Intervention $ z $ mit LightBGM zu verbessern. Die Vorhersagegenauigkeit der Intervention $ z $ beträgt ca. 80%. Hyperparameter bleiben auf ihren Standardeinstellungen. Der Neigungswert lag im Durchschnitt bei $ \ pm 6 $% vom wahren Wert (dem Durchschnitt der absoluten Werte der Differenzen, nicht dem Fehlerverhältnis).

Die Ergebnisse der Effektschätzung unter Verwendung dieser Neigungsbewertungen sind wie folgt.

Wahrer Effekt: 1.3 Geschätztes Ergebnis unter Verwendung des wahren Neigungswerts: 1,3345 ... Geschätztes Ergebnis unter Verwendung der logistischen Regression: 1.4002 ... Geschätztes Ergebnis mit LightGBM: 2.7601 ...

Es ist ersichtlich, dass LightGBM zwar eine hohe Vorhersagegenauigkeit der Intervention $ z $ aufweist, den Effekt jedoch erheblich geschätzt hat.

Fazit

Es überrascht nicht, dass die Schätzung unter Verwendung des wahren Neigungswerts am genauesten war. Mit anderen Worten, ich denke, das Wichtigste ist nicht ** "Vorhersagegenauigkeit der Intervention $ z $", sondern "Genauigkeit der Neigungsbewertung (nicht überprüfbar)" **. Aber im Grunde kennen Sie den wahren Neigungswert nicht. Daher dachte ich, dass die folgenden Punkte bei der Berechnung des Neigungswerts in der Praxis berücksichtigt werden sollten.

  1. ** Hören Sie im Detail die Kriterien des Entscheidungsträgers, ob er eingreifen soll oder nicht. **** (= um ein Modell zu erstellen, das dem Datengenerierungsmechanismus so nahe wie möglich kommt) **

  2. ** Intervention Überwachen Sie das Gleichgewicht der Kovariaten anhand standardisierter mittlerer Differenzen usw., anstatt große Anstrengungen zu unternehmen, um die Vorhersagegenauigkeit von $ z $ zu verbessern. ** ** **   Vielen Dank für das Lesen bis zum Ende.

Verweise

Recommended Posts

Berücksichtigung der Neigungsbewertung und der Genauigkeit der Effektschätzung
Vor- und Nachteile der wahrscheinlichsten Schätzmethode
Abschätzung der Wirkung von Maßnahmen anhand von Neigungswerten
Konzept des Bayes'schen Denkens (2) ... Bayes'sche Schätzung und Wahrscheinlichkeitsverteilung
Höchstwahrscheinlich Schätzung des Mittelwerts und der Varianz mit TensorFlow