Kausale KI: Erforschung der Integration kausalen Denkens in maschinelles Lernen

Foto von Irina Inga An Unsplash

Willkommen zu meiner Serie über kausale KI, in der wir die Integration kausalen Denkens in Modelle des maschinellen Lernens untersuchen. Freuen Sie sich auf eine Reihe praktischer Anwendungen in unterschiedlichen Geschäftskontexten.

Im letzten Artikel behandelten wir Messung des intrinsischen kausalen Einflusses Ihrer Marketingkampagnen. In diesem Artikel werden wir uns mit Validierung der kausalen Wirkung der synthetischen Kontrollen.

Wenn Sie den letzten Artikel zum Thema intrinsischer kausaler Einfluss verpasst haben, können Sie ihn hier nachlesen:

In diesem Artikel konzentrieren wir uns auf das Verständnis der synthetischen Kontrollmethode und untersuchen, wie wir die geschätzten kausalen Auswirkungen validieren können.

Folgende Aspekte werden behandelt:

  • Was ist die synthetische Kontrollmethode?
  • Welche Herausforderung versucht es zu bewältigen?
  • Wie können wir die geschätzten kausalen Auswirkungen validieren?
  • Eine Python-Fallstudie mit realistischen Google-Trenddaten, die zeigt, wie wir die geschätzte kausale Auswirkung der synthetischen Kontrollen validieren können.

Das vollständige Notizbuch finden Sie hier:

Was ist es?

Die synthetische Kontrollmethode ist eine kausale Technik, die verwendet werden kann, um die kausale Wirkung einer Intervention oder Behandlung zu beurteilen, wenn eine randomisierte kontrollierte Studie (RCT) oder ein A/B-Check nicht möglich struggle. Sie wurde ursprünglich 2003 von Abadie und Gardezabal vorgeschlagen. Das folgende Dokument enthält eine großartige Fallstudie, die Ihnen dabei hilft, die vorgeschlagene Methode zu verstehen:

https://net.stanford.edu/~jhain/Paper/JASA2010.pdf

Vom Benutzer erstelltes Bild

Lassen Sie uns einige der Grundlagen selbst durchgehen … Die synthetische Kontrollmethode erstellt eine kontrafaktische Model der Behandlungseinheit, indem sie eine gewichtete Kombination von Kontrolleinheiten erstellt, die weder die Intervention noch die Behandlung erhalten haben.

  • Behandelte Einheit: Die Einheit, die die Intervention erhält.
  • Steuergeräte: Eine Reihe ähnlicher Einheiten, bei denen die Intervention nicht durchgeführt wurde.
  • Kontrafaktisch: Erstellt als gewichtete Kombination der Kontrolleinheiten. Ziel ist es, für jede Kontrolleinheit Gewichte zu finden, die zu einem kontrafaktischen Ergebnis führen, das der behandelten Einheit in der Zeit vor der Intervention möglichst nahe kommt.
  • Kausale Auswirkungen: Der Unterschied zwischen der Behandlungseinheit nach der Intervention und der kontrafaktischen Scenario.

Wenn wir die Dinge wirklich vereinfachen wollten, könnten wir es als lineare Regression betrachten, bei der jede Kontrolleinheit ein Merkmal und die Behandlungseinheit das Ziel ist. Der Zeitraum vor der Intervention ist unser Trainingssatz und wir verwenden das Modell, um unseren Zeitraum nach der Intervention zu bewerten. Der Unterschied zwischen dem tatsächlichen und dem vorhergesagten Wert ist die kausale Auswirkung.

Nachfolgend finden Sie einige Beispiele, die verdeutlichen, wann wir einen Einsatz in Betracht ziehen könnten:

  • Bei einer TV-Marketingkampagne können wir das Publikum nicht nach dem Zufallsprinzip in diejenigen einteilen, die die Kampagne sehen können und diejenigen, die sie nicht sehen können. Wir könnten jedoch sorgfältig eine Area auswählen, um die Kampagne zu testen, und die übrigen Regionen als Kontrolleinheiten verwenden. Sobald wir die Wirkung gemessen haben, könnte die Kampagne in anderen Regionen eingeführt werden. Dies wird oft als Geo-Carry-Check bezeichnet.
  • Politische Veränderungen, die in einigen Regionen eingeführt werden, in anderen jedoch nicht – Beispielsweise kann ein Gemeinderat eine politische Veränderung in Kraft setzen, um die Arbeitslosigkeit zu senken. Andere Regionen, in denen die Politik nicht umgesetzt wurde, könnten als Kontrolleinheiten dienen.

Welche Herausforderung versucht es zu bewältigen?

Wenn wir eine hohe Dimensionalität (viele Merkmale) mit begrenzten Beobachtungen kombinieren, kann ein überangepasstes Modell entstehen.

Nehmen wir zur Veranschaulichung das Beispiel des Geo-Lifts. Wenn wir wöchentliche Daten aus dem letzten Jahr als Zeitraum vor der Intervention verwenden, erhalten wir 52 Beobachtungen. Wenn wir uns dann entscheiden, unsere Intervention in mehreren Ländern Europas zu testen, erhalten wir ein Verhältnis von Beobachtung zu Merkmal von 1:1!

Wir haben bereits darüber gesprochen, wie die synthetische Kontrollmethode mithilfe einer linearen Regression implementiert werden könnte. Das Verhältnis von Beobachtung zu Merkmal bedeutet jedoch, dass es sehr wahrscheinlich ist, dass die lineare Regression überanpasst, was zu einer schlechten Schätzung der kausalen Auswirkungen in der Zeit nach der Intervention führt.

Bei der linearen Regression können die Gewichte (Koeffizienten) für jedes Merkmal (Kontrolleinheit) negativ oder positiv sein und ihre Summe kann eine Zahl größer als 1 ergeben. Die synthetische Kontrollmethode lernt die Gewichte jedoch unter Anwendung der folgenden Einschränkungen:

  • Beschränkung der Gewichte auf die Summe von 1
  • Gewichte müssen ≥ 0 sein
Vom Benutzer generiertes Bild

Diese Einschränkungen helfen bei der Regularisierung und vermeiden eine Extrapolation über den Bereich der beobachteten Daten hinaus.

Es ist erwähnenswert, dass Ridge- und Lasso-Regression dies in Bezug auf die Regularisierung erreichen können und in einigen Fällen sinnvolle Alternativen sind. Aber wir werden dies in der Fallstudie testen!

Wie können wir die geschätzten kausalen Auswirkungen validieren?

Eine wohl noch größere Herausforderung besteht in der Tatsache, dass wir die geschätzten kausalen Auswirkungen in der Zeit nach der Intervention nicht validieren können.

Wie lang sollte meine Vorinterventionsphase sein? Sind wir sicher, dass wir unsere Vorinterventionsphase nicht überangepasst haben? Wie können wir wissen, ob unser Modell in der Nachinterventionsphase intestine verallgemeinert werden kann? Was ist, wenn ich verschiedene Implementierungen der synthetischen Kontrollmethode ausprobieren möchte?

Wir könnten nach dem Zufallsprinzip einige Beobachtungen aus der Zeit vor der Intervention auswählen und sie zur Validierung zurückhalten. Doch wir haben bereits die Herausforderungen hervorgehoben, die sich aus der begrenzten Anzahl an Beobachtungen ergeben, sodass wir die Dinge möglicherweise sogar noch schlimmer machen!

Was wäre, wenn wir vor der Intervention eine Artwork Simulation durchführen könnten? Könnte uns das helfen, einige der oben hervorgehobenen Fragen zu beantworten und Vertrauen in die von unseren Modellen geschätzten kausalen Auswirkungen zu gewinnen? Alles wird in der Fallstudie erklärt!

Hintergrund

Nachdem Sie die Finanzabteilung davon überzeugt haben, dass Markenmarketing einen echten Mehrwert schafft, kommt das Marketingteam auf Sie zu und fragt Sie nach Geo-Carry-Exams. Jemand von Fb hat ihnen gesagt, dass das der nächste große Development ist (obwohl es dieselbe Particular person struggle, die ihnen gesagt hat, dass Prophet ein gutes Prognosemodell ist) und sie möchten wissen, ob sie es zur Messung ihrer neuen, bevorstehenden TV-Kampagne verwenden können.

Sie sind ein wenig besorgt, da das Marketinganalyseteam bei Ihrem letzten Geo-Carry-Check der Meinung struggle, es wäre eine gute Idee, mit dem verwendeten Vorinterventionszeitraum herumzuexperimentieren, bis ein schöner, großer kausaler Einfluss festgestellt würde.

Dieses Mal schlagen Sie vor, eine „Vorinterventionssimulation“ durchzuführen und anschließend vor Beginn des Exams den Vorinterventionszeitraum zu vereinbaren.

Sehen wir uns additionally an, wie eine „Simulation vor einer Intervention“ aussieht!

Erstellen der Daten

Um dies so realistisch wie möglich zu gestalten, habe ich einige Google-Trenddaten für die Mehrheit der europäischen Länder extrahiert. Der Suchbegriff ist nicht related. Tun Sie einfach so, als wäre es der Umsatz Ihres Unternehmens (und Sie sind in ganz Europa tätig).

Wenn Sie jedoch wissen möchten, wie ich an die Google-Trenddaten gekommen bin, sehen Sie sich mein Notizbuch an:

Unten sehen wir den Datenrahmen. Wir haben Verkäufe der letzten 3 Jahre in 50 europäischen Ländern. Das Marketingteam plant, seine TV-Kampagne in Großbritannien durchzuführen.

Vom Benutzer erstelltes Bild

Jetzt kommt der clevere Teil. Wir werden eine Intervention in den letzten 7 Wochen der Zeitreihe simulieren.

np.random.seed(1234)

# Create intervention flag
masks = (df('date') >= "2024-04-14") & (df('date') <= "2024-06-02")
df('intervention') = masks.astype(int)

row_count = len(df)

# Create intervention uplift
df('uplift_perc') = np.random.uniform(0.10, 0.20, measurement=row_count)
df('uplift_abs') = spherical(df('uplift_perc') * df('GB'))
df('y') = df('GB')
df.loc(df('intervention') == 1, 'y') = df('GB') + df('uplift_abs')

Lassen Sie uns nun die tatsächlichen und kontrafaktischen Verkäufe in ganz GB darstellen, um unsere Ergebnisse in die Praxis umzusetzen:

def synth_plot(df, counterfactual):

plt.determine(figsize=(14, 8))
sns.set_style("white")

# Create plot
sns.lineplot(information=df, x='date', y='y', label='Precise', shade='b', linewidth=2.5)
sns.lineplot(information=df, x='date', y=counterfactual, label='Counterfactual', shade='r', linestyle='--', linewidth=2.5)
plt.title('Artificial Management Technique: Precise vs. Counterfactual', fontsize=24)
plt.xlabel('Date', fontsize=20)
plt.ylabel('Metric Worth', fontsize=20)
plt.legend(fontsize=16)
plt.gca().xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=90)
plt.grid(True, linestyle='--', alpha=0.5)

# Excessive the intervention level
intervention_date = '2024-04-07'
plt.axvline(pd.to_datetime(intervention_date), shade='ok', linestyle='--', linewidth=1)
plt.textual content(pd.to_datetime(intervention_date), plt.ylim()(1)*0.95, 'Intervention', shade='ok', fontsize=18, ha='proper')

plt.tight_layout()
plt.present()

synth_plot(df, 'GB')
Vom Benutzer erstelltes Bild

Nachdem wir nun eine Intervention simuliert haben, können wir untersuchen, wie intestine die synthetische Kontrollmethode funktioniert.

Vorverarbeitung

Alle europäischen Länder außer GB werden als Kontrolleinheiten (Merkmale) festgelegt. Die Behandlungseinheit (Ziel) ist der Umsatz in GB mit der angewandten Intervention.

# Delete the unique goal column so we do not use it as a function by chance
del df('GB')

# set function & targets
X = df.columns(1:50)
y = 'y'

Regression

Unten habe ich eine Funktion eingerichtet, die wir mit verschiedenen Vorinterventionszeiträumen und verschiedenen Regressionsmodellen (z. B. Ridge, Lasso) wiederverwenden können:

def train_reg(df, start_index, reg_class):

df_temp = df.iloc(start_index:).copy().reset_index()

X_pre = df_temp(df_temp('intervention') == 0)(X)
y_pre = df_temp(df_temp('intervention') == 0)(y)

X_train, X_test, y_train, y_test = train_test_split(X_pre, y_pre, test_size=0.10, random_state=42)

mannequin = reg_class
mannequin.match(X_train, y_train)

yhat_train = mannequin.predict(X_train)
yhat_test = mannequin.predict(X_test)

mse_train = mean_squared_error(y_train, yhat_train)
mse_test = mean_squared_error(y_test, yhat_test)
print(f"Imply Squared Error practice: {spherical(mse_train, 2)}")
print(f"Imply Squared Error check: {spherical(mse_test, 2)}")

r2_train = r2_score(y_train, yhat_train)
r2_test = r2_score(y_test, yhat_test)
print(f"R2 practice: {spherical(r2_train, 2)}")
print(f"R2 check: {spherical(r2_test, 2)}")

df_temp('pred') = mannequin.predict(df_temp.loc(:, X))
df_temp('delta') = df_temp('y') - df_temp('pred')

pred_lift = df_temp(df_temp('intervention') == 1)('delta').sum()
actual_lift = df_temp(df_temp('intervention') == 1)('uplift_abs').sum()
abs_error_perc = abs(pred_lift - actual_lift) / actual_lift
print(f"Predicted carry: {spherical(pred_lift, 2)}")
print(f"Precise carry: {spherical(actual_lift, 2)}")
print(f"Absolute error share: {spherical(abs_error_perc, 2)}")

return df_temp, abs_error_perc

Zu Beginn halten wir es einfach und verwenden eine lineare Regression, um die kausalen Auswirkungen anhand einer kurzen Vorinterventionsphase abzuschätzen:

df_lin_reg_100, pred_lift_lin_reg_100 = train_reg(df, 100, LinearRegression())
Vom Benutzer erstelltes Bild

Betrachtet man die Ergebnisse, schneidet die lineare Regression nicht besonders intestine ab. Aber das ist angesichts des Verhältnisses von Beobachtung zu Merkmal nicht überraschend.

synth_plot(df_lin_reg_100, 'pred')
Vom Benutzer erstelltes Bild

Synthetische Kontrollmethode

Lassen Sie uns direkt loslegen und sehen, wie es im Vergleich zur synthetischen Kontrollmethode abschneidet. Unten habe ich eine ähnliche Funktion wie zuvor eingerichtet, aber die synthetische Kontrollmethode mithilfe von sciPy angewendet:

def synthetic_control(weights, control_units, treated_unit):

artificial = np.dot(control_units.values, weights)

return np.sqrt(np.sum((treated_unit - artificial)**2))

def train_synth(df, start_index):

df_temp = df.iloc(start_index:).copy().reset_index()

X_pre = df_temp(df_temp('intervention') == 0)(X)
y_pre = df_temp(df_temp('intervention') == 0)(y)

X_train, X_test, y_train, y_test = train_test_split(X_pre, y_pre, test_size=0.10, random_state=42)

initial_weights = np.ones(len(X)) / len(X)

constraints = ({'kind': 'eq', 'enjoyable': lambda w: np.sum(w) - 1})

bounds = ((0, 1) for _ in vary(len(X)))

consequence = decrease(synthetic_control,
initial_weights,
args=(X_train, y_train),
technique='SLSQP',
bounds=bounds,
constraints=constraints,
choices={'disp': False, 'maxiter': 1000, 'ftol': 1e-9},
)

optimal_weights = consequence.x

yhat_train = np.dot(X_train.values, optimal_weights)
yhat_test = np.dot(X_test.values, optimal_weights)

mse_train = mean_squared_error(y_train, yhat_train)
mse_test = mean_squared_error(y_test, yhat_test)
print(f"Imply Squared Error practice: {spherical(mse_train, 2)}")
print(f"Imply Squared Error check: {spherical(mse_test, 2)}")

r2_train = r2_score(y_train, yhat_train)
r2_test = r2_score(y_test, yhat_test)
print(f"R2 practice: {spherical(r2_train, 2)}")
print(f"R2 check: {spherical(r2_test, 2)}")

df_temp('pred') = np.dot(df_temp.loc(:, X).values, optimal_weights)
df_temp('delta') = df_temp('y') - df_temp('pred')

pred_lift = df_temp(df_temp('intervention') == 1)('delta').sum()
actual_lift = df_temp(df_temp('intervention') == 1)('uplift_abs').sum()
abs_error_perc = abs(pred_lift - actual_lift) / actual_lift
print(f"Predicted carry: {spherical(pred_lift, 2)}")
print(f"Precise carry: {spherical(actual_lift, 2)}")
print(f"Absolute error share: {spherical(abs_error_perc, 2)}")

return df_temp, abs_error_perc

Ich lasse den Zeitraum vor der Intervention unverändert, um einen fairen Vergleich mit der linearen Regression zu ermöglichen:

df_synth_100, pred_lift_synth_100 = train_synth(df, 100)
Vom Benutzer erstelltes Bild

Wow! Ich gebe zu, dass ich mit einer so deutlichen Verbesserung nicht gerechnet habe!

synth_plot(df_synth_100, 'pred')
Vom Benutzer erstelltes Bild

Vergleich der Ergebnisse

Lassen Sie uns noch nicht zu weit ausholen. Im Folgenden führen wir noch ein paar Experimente durch, in denen wir Modelltypen und Zeiträume vor der Intervention untersuchen:

# run regression experiments
df_lin_reg_00, pred_lift_lin_reg_00 = train_reg(df, 0, LinearRegression())
df_lin_reg_100, pred_lift_lin_reg_100 = train_reg(df, 100, LinearRegression())
df_ridge_00, pred_lift_ridge_00 = train_reg(df, 0, RidgeCV())
df_ridge_100, pred_lift_ridge_100 = train_reg(df, 100, RidgeCV())
df_lasso_00, pred_lift_lasso_00 = train_reg(df, 0, LassoCV())
df_lasso_100, pred_lift_lasso_100 = train_reg(df, 100, LassoCV())

# run artificial management experiments
df_synth_00, pred_lift_synth_00 = train_synth(df, 0)
df_synth_100, pred_lift_synth_100 = train_synth(df, 100)

experiment_data = {
"Technique": ("Linear", "Linear", "Ridge", "Ridge", "Lasso", "Lasso", "Artificial Management", "Artificial Management"),
"Information Measurement": ("Massive", "Small", "Massive", "Small", "Massive", "Small", "Massive", "Small"),
"Worth": (pred_lift_lin_reg_00, pred_lift_lin_reg_100, pred_lift_ridge_00, pred_lift_ridge_100,pred_lift_lasso_00, pred_lift_lasso_100, pred_lift_synth_00, pred_lift_synth_100)
}

df_experiments = pd.DataFrame(experiment_data)

Wir verwenden den folgenden Code, um die Ergebnisse zu visualisieren:

# Set the model
sns.set_style="whitegrid"

# Create the bar plot
plt.determine(figsize=(10, 6))
bar_plot = sns.barplot(x="Technique", y="Worth", hue="Information Measurement", information=df_experiments, palette="muted")

# Add labels and title
plt.xlabel("Technique")
plt.ylabel("Absolute error share")
plt.title("Artificial Controls - Comparability of Strategies Throughout Totally different Information Sizes")
plt.legend(title="Information Measurement")

# Present the plot
plt.present()

Vom Benutzer erstelltes Bild

Die Ergebnisse für den kleinen Datensatz sind wirklich interessant! Wie erwartet hat die Regularisierung geholfen, die Schätzungen der kausalen Auswirkungen zu verbessern. Die synthetische Kontrolle ging dann noch einen Schritt weiter!

Die Ergebnisse des großen Datensatzes legen nahe, dass längere Zeiträume vor der Intervention nicht immer besser sind.

Ich möchte Ihnen jedoch zeigen, wie wertvoll die Durchführung einer Simulation vor der Intervention ist. Es gibt so viele Möglichkeiten, die Sie mit Ihrem eigenen Datensatz erkunden könnten!

Heute haben wir uns mit der synthetischen Kontrollmethode beschäftigt und wie Sie die kausalen Auswirkungen validieren können. Ich möchte Ihnen noch ein paar abschließende Gedanken mit auf den Weg geben:

  • Aufgrund ihrer Einfachheit ist die synthetische Steuerungsmethode eine der am häufigsten eingesetzten Techniken aus dem Werkzeugkasten der kausalen KI.
  • Leider wird dieser Wert auch am häufigsten missbraucht. Lassen Sie uns das R CausalImpact-Paket ausführen und den Zeitraum vor der Intervention ändern, bis wir eine Steigerung sehen, die uns gefällt. 😭
  • Aus diesem Grund empfehle ich dringend, vor der Intervention Simulationen durchzuführen, um das Testdesign im Voraus zu vereinbaren.
  • Die synthetische Kontrollmethode ist ein intensiv erforschter Bereich. Es lohnt sich, die vorgeschlagenen Anpassungen Augmented SC, Strong SC und Penalized SC zu prüfen.

Alberto Abadie, Alexis Diamond und Jens Hainmueller (2010) Synthetische Kontrollmethoden für vergleichende Fallstudien: Schätzung der Auswirkungen des kalifornischen Tabakkontrollprogramms, Journal of the American Statistical Affiliation, 105:490, 493–505, DOI: 10.1198/jasa.2009.ap08746

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert