Ryan – chatgpz.de – KI-Tools & Praxiswissen http://chatgpz.de Unabhängige Tests, Anleitungen und Hintergründe zu KI-Tools. Mon, 27 Jan 2025 05:33:43 +0000 de-DE hourly 1 https://wordpress.org/?v=6.4.2 234900186 Optimieren von Budgets mit Advertising -Combine -Modellen in Python | Von Ryan O’Sullivan | Januar 2025 http://chatgpz.de/machine-learning/optimieren-von-budgets-mit-advertising-combine-modellen-in-python-von-ryan-osullivan-januar-2025/ http://chatgpz.de/machine-learning/optimieren-von-budgets-mit-advertising-combine-modellen-in-python-von-ryan-osullivan-januar-2025/#respond Mon, 27 Jan 2025 05:33:43 +0000 http://chatgpz.de/machine-learning/optimieren-von-budgets-mit-marketing-mix-modellen-in-python-von-ryan-osullivan-januar-2025/ [ad_1]

Teil 3 einer praktischen Anleitung, mit der Sie MMM in PYMC beherrschen können

10 min lesen

Vor 17 Stunden

Foto von TOWFIqu Barbhuiya An Unplash

Willkommen in Teil 3 meiner Serien über Advertising Combine Modeling (MMM), einem praktischen Leitfaden, mit dem Sie MMM beherrschen können. In dieser Serie werden wir wichtige Themen wie Modelltraining, Validierung, Kalibrierung und Budgetoptimierung behandeln, die alle mit dem leistungsfähigen Pymc-Advertising Python -Paket. Egal, ob Sie neu in MMM sind oder Ihre Fähigkeiten schärfen möchten, in dieser Serie werden Sie praktische Werkzeuge und Erkenntnisse zur Verbesserung Ihrer Marketingstrategien ausstatten.

Wenn Sie Teil 2 verpasst haben, schauen Sie es sich hier an:

In der dritten Folge der Serie werden wir abdecken, wie wir anfangen können, den Geschäftswert aus unseren Advertising -Combine -Modellen zu erhalten, indem wir die folgenden Bereiche abdecken:

  • Warum möchten Unternehmen ihre Marketingbudgets optimieren?
  • Wie können wir die Ausgaben unseres Advertising -Combine -Modells verwenden, um Budgets zu optimieren?
  • Eine Python -Walkthrough, die zeigt, wie die Budgets mithilfe von Budgets optimiert werden können Pymc-Advertising.

Das vollständige Notizbuch finden Sie hier:

Benutzergenerierte Bild

Dieses berühmte Zitat (von John Wanamaker, denke ich?!) Zeigt sowohl die Herausforderung als auch die Chancen im Advertising. Während moderne Analysen einen langen Weg zurückgelegt haben, bleibt die Herausforderung related: Verständnis, welche Teile Ihres Marketingbudgets Wert liefern.

Marketingkanäle können in Bezug auf ihre Leistung und ROI aufgrund mehrerer Faktoren erheblich variieren:

  • Publikum Reichweite und Engagement – Einige Kanäle sind effektiver darin, bestimmte Aussichten zu erreichen, die an Ihre Zielgruppe ausgerichtet sind.
  • Akquisitionskosten – Die Kosten für die Erreichung der Aussichten unterscheiden sich zwischen Kanälen.
  • Kanalsättigung – Überbeanspruchung eines Marketingkanals kann zu sinkenden Renditen führen.

Diese Variabilität schafft die Möglichkeit, kritische Fragen zu stellen, die Ihre Marketingstrategie verändern können:

Benutzergenerierte Bild

Eine effektive Budgetoptimierung ist ein kritischer Bestandteil moderner Marketingstrategien. Durch die Nutzung der Ergebnisse von MMM können Unternehmen fundierte Entscheidungen darüber treffen, wo ihre Ressourcen für maximale Auswirkungen zugewiesen werden können. MMM bietet Einblicke in die Artwork und Weise, wie verschiedene Kanäle zum Gesamtumsatz beitragen und es uns ermöglichen, Verbesserungs- und Optimierungsmöglichkeiten zu ermitteln. In den folgenden Abschnitten werden wir untersuchen, wie wir MMM -Ausgaben in umsetzbare Budgetzuweisungsstrategien umsetzen können.

2.1 Antwortkurven

Eine Antwortkurve kann die Ausgaben von MMM in eine umfassende Kind umsetzen und zeigen, wie der Verkauf auf die Ausgaben für jeden Marketingkanal reagiert.

Benutzergenerierte Bild

Die Antwortkurven allein sind sehr mächtig und ermöglichen es uns, was-wenn-wenn-Szenarien auszuführen. Mit der obigen Antwortkurve als Beispiel könnten wir schätzen, wie der Vertriebsbeitrag aus sozialen Veränderungen mehr ausgibt. Wir können auch visuell sehen, wo die Rückgänge in Kraft treten. Aber was ist, wenn wir versuchen möchten, komplexere Was-wäre-wenn-Szenarien wie die Optimierung der Budgets der Kanalebene bei einem festen Gesamtbudget zu beantworten? Hier kommt die lineare Programmierung ins Spiel – lassen Sie uns dies im nächsten Abschnitt untersuchen!

2.2 Lineare Programmierung

Die lineare Programmierung ist eine Optimierungsmethode, mit der die optimale Lösung einer linearen Funktion bei einigen Einschränkungen ermittelt werden kann. Es ist ein sehr vielseitiges Software aus dem Operations -Forschungsbereich, erhält jedoch nicht oft die Anerkennung, die es verdient. Es wird verwendet, um Probleme mit den Planung, Transport- und Ressourcenzuweisung zu lösen. Wir werden untersuchen, wie wir es verwenden können, um Marketingbudgets zu optimieren.

Versuchen wir, die lineare Programmierung mit einem einfachen Budgetoptimierungsproblem zu verstehen:

  • Entscheidungsvariablen (x): Dies sind die unbekannten Mengen, die wir für die optimalen Werte für die Marketingausgaben für jeden Kanal schätzen möchten.
  • Objektive Funktion (z): Die lineare Gleichung, die wir versuchen, z.
  • Einschränkungen: Einige Einschränkungen der Entscheidungsvariablen, die normalerweise durch lineare Ungleichheiten dargestellt werden, z.
Benutzergenerierte Bild

Der Schnittpunkt aller Einschränkungen bildet eine realisierbare Area, die die Menge aller möglichen Lösungen ist, die die angegebenen Einschränkungen erfüllen. Das Ziel der linearen Programmierung ist es, den Punkt innerhalb des realisierbaren Bereichs zu finden, der die objektive Funktion optimiert.

Angesichts der Sättigungstransformation, die wir für jeden Marketingkanal anwenden, ist die Optimierung von Budgets der Kanalebene tatsächlich ein nichtlineares Programmierungsproblem. Die sequentielle Programmierung der kleinsten Quadrate (SLSQP) ist ein Algorithmus zur Lösung nichtlinearer Programmierprobleme. Es ermöglicht sowohl Gleichheit als auch Ungleichheit, dass es für unseren Anwendungsfall eine vernünftige Wahl macht.

  • Gleichstellungsbeschränkungen zB Gesamtmarketingbudget beträgt 50 Mio. GBP
  • Ungleichheitsbeschränkungen EG Channel Stage Budgets zwischen 5 Mio. GBP und 15 Mio. GBP

Scipy hat eine großartige Implementierung von SLSQP:

Das folgende Beispiel zeigt, wie wir es verwenden können:

from scipy.optimize import reduce

consequence = reduce(
enjoyable=objective_function, # Outline your ROI operate right here
x0=initial_guess, # Preliminary guesses for spends
bounds=bounds, # Channel-level finances constraints
constraints=constraints, # Equality and inequality constraints
technique='SLSQP'
)
print(consequence)

Das Schreiben von Budgetoptimierungscode von Grund auf ist eine komplexe, aber sehr lohnende Übung. Glücklicherweise die Pymc-Advertising Das Crew hat das starke Heben durchgeführt und bietet einen robusten Rahmen für die Ausführung von Budgetoptimierungsszenarien. Im nächsten Abschnitt werden wir untersuchen, wie ihr Paket den Budgetallokationsprozess optimieren und es für Analysten zugänglicher macht.

Jetzt verstehen wir, wie wir die Ausgabe von MMM verwenden können, um Budgets zu optimieren. Lassen Sie uns sehen, wie viel Wert wir mit unserem Modell aus dem letzten Artikel fahren können! In dieser Vorgehensweise werden wir abdecken:

  • Daten simulieren
  • Coaching des Modells
  • Validierung des Modells
  • Antwortkurven
  • Budgetoptimierung

3.1 Simulation von Daten

Wir werden den Datengeneratprozess aus dem ersten Artikel wiederverwenden. Wenn Sie eine Erinnerung an den Datengeneratprozess wünschen, schauen Sie sich den ersten Artikel an, in dem wir eine detaillierte Vorgehensweise gemacht haben:

np.random.seed(10)

# Set parameters for information generator
start_date = "2021-01-01"
durations = 52 * 3
channels = ("television", "social", "search")
adstock_alphas = (0.50, 0.25, 0.05)
saturation_lamdas = (1.5, 2.5, 3.5)
betas = (350, 150, 50)
spend_scalars = (10, 15, 20)

df = dg.data_generator(start_date, durations, channels, spend_scalars, adstock_alphas, saturation_lamdas, betas)

# Scale betas utilizing most gross sales worth - that is so it's akin to the fitted beta from pymc (pymc does characteristic and goal scaling utilizing MaxAbsScaler from sklearn)
betas_scaled = (
((df("tv_sales") / df("gross sales").max()) / df("tv_saturated")).imply(),
((df("social_sales") / df("gross sales").max()) / df("social_saturated")).imply(),
((df("search_sales") / df("gross sales").max()) / df("search_saturated")).imply()
)

# Calculate contributions
contributions = np.asarray((
spherical((df("tv_sales").sum() / df("gross sales").sum()), 2),
spherical((df("social_sales").sum() / df("gross sales").sum()), 2),
spherical((df("search_sales").sum() / df("gross sales").sum()), 2),
spherical((df("demand").sum() / df("gross sales").sum()), 2)
))

df(("date", "demand", "demand_proxy", "tv_spend_raw", "social_spend_raw", "search_spend_raw", "gross sales"))

Benutzergenerierte Bild

3.2 Coaching des Modells

Wir werden das Modell jetzt aus dem ersten Artikel neu ausbauen. Wir werden die Trainingsdaten auf die gleiche Weise wie beim letzten Mal vorbereiten von:

  • Daten in Funktionen und Ziel aufteilen.
  • Erstellen von Indizes für Zug- und Auszeitscheiben.

Da der Schwerpunkt dieses Artikels jedoch nicht auf der Modellkalibrierung liegt, werden wir die Nachfrage eher als Kontrollvariable als Demand_proxy einbeziehen. Dies bedeutet, dass das Modell sehr intestine kalibriert ist – obwohl dies nicht sehr realistisch ist, werden wir einige gute Ergebnisse erzielen, um zu veranschaulichen, wie wir Budgets optimieren können.

# set date column
date_col = "date"

# set consequence column
y_col = "gross sales"

# set advertising variables
channel_cols = ("tv_spend_raw",
"social_spend_raw",
"search_spend_raw")

# set management variables
control_cols = ("demand")

# create arrays
X = df((date_col) + channel_cols + control_cols)
y = df(y_col)

# set take a look at (out-of-sample) size
test_len = 8

# create practice and take a look at indexs
train_idx = slice(0, len(df) - test_len)
out_of_time_idx = slice(len(df) - test_len, len(df))

mmm_default = MMM(
adstock=GeometricAdstock(l_max=8),
saturation=LogisticSaturation(),
date_column=date_col,
channel_columns=channel_cols,
control_columns=control_cols,
)

fit_kwargs = {
"tune": 1_000,
"chains": 4,
"attracts": 1_000,
"target_accept": 0.9,
}

mmm_default.match(X(train_idx), y(train_idx), **fit_kwargs)

3.3 Validieren des Modells

Bevor wir uns mit der Optimierung befassen, überprüfen wir unser Modell intestine. Zuerst überprüfen wir die wahren Beiträge:

channels = np.array(("television", "social", "search", "demand"))

true_contributions = pd.DataFrame({'Channels': channels, 'Contributions': contributions})
true_contributions= true_contributions.sort_values(by='Contributions', ascending=False).reset_index(drop=True)
true_contributions = true_contributions.model.bar(subset=('Contributions'), shade='lightblue')

true_contributions

Benutzergenerierte Bild

Wie erwartet übereinstimmt unser Modell sehr eng auf die wahren Beiträge:

mmm_default.plot_waterfall_components_decomposition(figsize=(10,6));
Benutzergenerierte Bild

3.4 Antwortkurven

Bevor wir uns mit der Budgetoptimierung befassen, schauen wir uns die Antwortkurven an. Es gibt zwei Möglichkeiten, die Antwortkurven in der zu betrachten Pymc-Advertising Paket:

  1. Direkte Antwortkurven
  2. Reaktionskurven für Kostenanteile

Beginnen wir mit den direkten Antwortkurven. In den direkten Antwortkurven erstellen wir einfach ein Streudiagramm von wöchentlichen Ausgaben gegen den wöchentlichen Beitrag für jeden Kanal.

Nachfolgend zeichnen wir die direkten Antwortkurven auf:

fig = mmm_default.plot_direct_contribution_curves(show_fit=True, xlim_max=1.2)
(ax.set(xlabel="spend") for ax in fig.axes);
Benutzergenerierte Bild

Die Kosten für die Kosten für die Kosten für die Kosten für die Kosten sind eine various Möglichkeit, die Wirksamkeit von Kanälen zu vergleichen. Wenn δ = 1,0, bleibt der Kanalausgaben auf dem gleichen Niveau wie die Trainingsdaten. Wenn Δ = 1,2, wird der Kanalausgaben um 20percenterhöht.

Im Folgenden zeichnen wir die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten für die Kosten: Antwort:

mmm_default.plot_channel_contributions_grid(begin=0, cease=1.5, num=12, figsize=(15, 7));
Benutzergenerierte Bild

Wir können auch die X-Achse ändern, um absolute Ausgabenwerte zu zeigen:

mmm_default.plot_channel_contributions_grid(begin=0, cease=1.5, num=12, absolute_xrange=True, figsize=(15, 7));
Benutzergenerierte Bild

Die Antwortkurven sind großartige Werkzeuge, um die Planung zukünftiger Marketingbudgets auf Kanalebene zu erstellen. Lassen Sie sie als nächstes in die Handlung setzen und einige Budgetoptimierungsszenarien ausführen!

3.5 Budgetoptimierung

Lassen Sie uns zunächst ein paar Parameter einstellen:

  • perc_change: Dies wird verwendet, um die Einschränkung um Min und Max für jeden Kanal zu setzen. Diese Einschränkung hilft uns, das Szenario realistisch zu halten, und bedeutet, dass wir die Reaktionskurven nicht zu weit außerhalb dessen extrapolieren, was das Modell im Coaching gesehen hat.
  • Budget_len: Dies ist die Länge des Haushaltsszenarios in Wochen.

Wir werden zunächst die gewünschte Länge des Price range -Szenarios verwenden, um die jüngste Datenperiode auszuwählen.

perc_change = 0.20
budget_len = 12
budget_idx = slice(len(df) - test_len, len(df))
recent_period = X(budget_idx)(channel_cols)

recent_period

Benutzergenerierte Bild

Anschließend verwenden wir diesen letzten Zeitraum, um allgemeine Budgetbeschränkungen und Kanalbeschränkungen auf wöchentlicher Ebene festzulegen:

# set general finances constraint (to the closest £1k)
finances = spherical(recent_period.sum(axis=0).sum() / budget_len, -3)

# file the present finances break up by channel
current_budget_split = spherical(recent_period.imply() / recent_period.imply().sum(), 2)

# set channel degree constraints
lower_bounds = spherical(recent_period.min(axis=0) * (1 - perc_change))
upper_bounds = spherical(recent_period.max(axis=0) * (1 + perc_change))

budget_bounds = {
channel: (lower_bounds(channel), upper_bounds(channel))
for channel in channel_cols
}

print(f'General finances constraint: {finances}')
print('Channel constraints:')
for channel, bounds in budget_bounds.objects():
print(f' {channel}: Decrease Certain = {bounds(0)}, Higher Certain = {bounds(1)}')

Benutzergenerierte Bild

Jetzt ist es Zeit, unser Szenario zu betreiben! Wir füttern die relevanten Daten und Parameter und erhalten die optimalen Ausgaben zurück. Wir vergleichen es mit der Übernahme des Gesamtbudgets und der Aufteilung des aktuellen Price range -Cut up -Proportionen (die wir als tatsächliche Ausgaben bezeichnet haben).

model_granularity = "weekly"

# run situation
allocation_strategy, optimization_result = mmm_default.optimize_budget(
finances=finances,
num_periods=budget_len,
budget_bounds=budget_bounds,
minimize_kwargs={
"technique": "SLSQP",
"choices": {"ftol": 1e-9, "maxiter": 5_000},
},
)

response = mmm_default.sample_response_distribution(
allocation_strategy=allocation_strategy,
time_granularity=model_granularity,
num_periods=budget_len,
noise_level=0.05,
)

# extract optimum spend
opt_spend = pd.Sequence(allocation_strategy, index=recent_period.imply().index).to_frame(identify="opt_spend")
opt_spend("avg_spend") = finances * current_budget_split

# plot precise vs optimum spend
fig, ax = plt.subplots(figsize=(9, 4))
opt_spend.plot(type='barh', ax=ax, shade=('blue', 'orange'))

plt.xlabel("Spend")
plt.ylabel("Channel")
plt.title("Precise vs Optimum Spend by Channel")
plt.legend(("Optimum Spend", "Precise Spend"))
plt.legend(("Optimum Spend", "Precise Spend"), loc='decrease proper', bbox_to_anchor=(1.5, 0.0))

plt.present()

Benutzergenerierte Bild

Wir können sehen, dass der Vorschlag das Price range von digitalen Kanälen in das Fernsehen übertragen. Aber wie wirkt sich auf den Umsatz aus?

Um den Beitrag der optimalen Ausgaben zu berechnen, müssen wir den neuen Ausgabenwert professional Kanal sowie alle anderen Variablen im Modell einfügen. Wir haben nur eine Nachfrage, daher ernähren wir den Mittelwert aus der jüngsten Periode dafür. Wir werden auch den Beitrag der durchschnittlichen Ausgaben auf die gleiche Weise berechnen.

# create dataframe with optimum spend
last_date = mmm_default.X("date").max()
new_dates = pd.date_range(begin=last_date, durations=1 + budget_len, freq="W-MON")(1:)
budget_scenario_opt = pd.DataFrame({"date": new_dates,})
budget_scenario_opt("tv_spend_raw") = opt_spend("opt_spend")("tv_spend_raw")
budget_scenario_opt("social_spend_raw") = opt_spend("opt_spend")("social_spend_raw")
budget_scenario_opt("search_spend_raw") = opt_spend("opt_spend")("search_spend_raw")
budget_scenario_opt("demand") = X(budget_idx)(control_cols).imply()(0)

# calculate general contribution
scenario_contrib_opt = mmm_default.sample_posterior_predictive(
X_pred=budget_scenario_opt, extend_idata=False
)

opt_contrib = scenario_contrib_opt.imply(dim="pattern").sum()("y").values

# create dataframe with avg spend
last_date = mmm_default.X("date").max()
new_dates = pd.date_range(begin=last_date, durations=1 + budget_len, freq="W-MON")(1:)
budget_scenario_avg = pd.DataFrame({"date": new_dates,})
budget_scenario_avg("tv_spend_raw") = opt_spend("avg_spend")("tv_spend_raw")
budget_scenario_avg("social_spend_raw") = opt_spend("avg_spend")("social_spend_raw")
budget_scenario_avg("search_spend_raw") = opt_spend("avg_spend")("search_spend_raw")
budget_scenario_avg("demand") = X(budget_idx)(control_cols).imply()(0)

# calculate general contribution
scenario_contrib_avg = mmm_default.sample_posterior_predictive(
X_pred=budget_scenario_avg , extend_idata=False
)

avg_contrib = scenario_contrib_avg.imply(dim="pattern").sum()("y").values

# calculate % improve in gross sales
print(f'% improve in gross sales: {spherical((opt_contrib / avg_contrib) - 1, 2)}')

Benutzergenerierte Bild

Die optimalen Ausgaben verleihen uns einen Umsatzsteigerung von 6%! Das ist beeindruckend, vor allem, da wir das Gesamtbudget festgelegt haben!

Heute haben wir gesehen, wie leistungsstarke Budgetoptimierung sein kann. Es kann Organisationen mit monatlicher/vierteljährlicher/jährlicher Haushaltsplanung und Prognose helfen. Wie immer kommt der Schlüssel zu guten Empfehlungen zurück, um ein robustes, intestine kalibriertes Modell zu haben.

[ad_2]

]]>
http://chatgpz.de/machine-learning/optimieren-von-budgets-mit-advertising-combine-modellen-in-python-von-ryan-osullivan-januar-2025/feed/ 0 6801
Eine Ableitung und Anwendung von eingeschränkten Boltzmann -Maschinen (2024 Nobelpreis) | Von Ryan d’Cunha | Januar 2025 http://chatgpz.de/machine-learning/eine-ableitung-und-anwendung-von-eingeschraenkten-boltzmann-maschinen-2024-nobelpreis-von-ryan-dcunha-januar-2025/ http://chatgpz.de/machine-learning/eine-ableitung-und-anwendung-von-eingeschraenkten-boltzmann-maschinen-2024-nobelpreis-von-ryan-dcunha-januar-2025/#respond Fri, 24 Jan 2025 04:26:26 +0000 http://chatgpz.de/machine-learning/eine-ableitung-und-anwendung-von-eingeschraenkten-boltzmann-maschinen-2024-nobelpreis-von-ryan-dcunha-januar-2025/ [ad_1]

Untersuchung von Geoffrey Hintons Nobelpreis-Gewinner und bauen Sie sie mit Pytorch von Grund auf neu auf

Ein Empfänger des Nobelpreises von 2024 in Physik battle Geoffrey Hinton für seine Beiträge im Bereich KI und maschinelles Lernen. Viele Leute wissen, dass er an neuronalen Netzwerken gearbeitet hat und wird als „Pate of Ai“ bezeichnet, aber nur wenige verstehen seine Werke. Insbesondere leitete er vor Jahrzehnten eingeschränkte Boltzmann -Maschinen (RBMS) Pionier.

Dieser Artikel wird eine Vorgehensweise von RBMs sein und hoffentlich eine gewisse Instinct hinter diesen komplexen mathematischen Maschinen bereitstellen. Ich werde nach dem Durchlaufen der Ableitungen einen Code zur Implementierung von RBMs in Pytorch bereitstellen.

RBMs sind eine Type des unbeaufsichtigten Lernens (nur die Eingaben werden zum Lernen verwendet- keine Ausgangsbezeichnungen werden verwendet). Dies bedeutet, dass wir automatisch aussagekräftige Funktionen in den Daten extrahieren können, ohne sich auf Ausgänge zu verlassen. Ein RBM ist ein Netzwerk mit zwei verschiedenen Arten von Neuronen mit binären Eingaben: sichtbar, Xund versteckt, H. Sichtbare Neuronen nehmen die Eingabedaten auf und versteckte Neuronen lernen, Merkmale/Muster zu erkennen.

RBM mit Eingabe X und versteckte Schicht y. Quelle: (1)

In technischeren Hinsicht sagen wir, dass ein RBM ein ungerichtes zweipartneres grafisches Modell mit stochastischen binären sichtbaren und versteckten Variablen ist. Das Hauptziel eines RBM ist es, die Energie der Gelenkkonfiguration zu minimieren E (x, h) oft mit kontrastivem Lernen (später diskutiert).

Eine Energiefunktion entspricht nicht physischer Energie, stammt jedoch aus Physik/Statistik. Stellen Sie sich das wie eine Wertungsfunktion vor. Eine Energiefunktion E Zuweist den Konfigurationen niedrigere Bewertungen (Energien) X Dass wir möchten, dass unser Modell bevorzugt, und höhere Ergebnisse für Konfigurationen, die es vermeiden soll. Die Energiefunktion ist etwas, das wir als Modelldesigner wählen können.

Für RBMs ist die Energiefunktion wie folgt (modelliert nach der Boltzmann -Verteilung):

RBM -Energiefunktion. Quelle: Autor

Die Energiefunktion besteht aus 3 Begriffen. Die erste ist die Wechselwirkung zwischen der verborgenen und sichtbaren Schicht mit Gewichten, W. Die zweite ist die Summe der Vorspannungsbedingungen für die sichtbaren Einheiten. Der dritte ist die Summe der Vorurteile für die verborgenen Einheiten.

Mit der Energiefunktion können wir die Wahrscheinlichkeit der gemeinsamen Konfiguration berechnen, die durch die Boltzmann -Verteilung angegeben ist. Mit dieser Wahrscheinlichkeitsfunktion können wir unsere Einheiten modellieren:

Wahrscheinlichkeit für die gemeinsame Konfiguration für RBMs. Quelle: Autor

Z ist die Partitionsfunktion (auch als Normalisierungskonstante bekannt). Es ist die Summe von e^(-e) über alle möglichen Konfigurationen von sichtbaren und verborgenen Einheiten. Die große Herausforderung bei Z besteht darin, dass es in der Regel rechnerisch unlösbar ist, genau zu berechnen, weil Sie über alle möglichen Konfigurationen von zusammengefasst werden müssen v Und H. Zum Beispiel mit binären Einheiten, wenn Sie haben M sichtbare Einheiten und N Versteckte Einheiten, Sie müssen über 2^summieren (M+N) Konfigurationen. Daher brauchen wir einen Weg, um eine Berechnung zu vermeiden Z.

Mit diesen definierten Funktionen und Verteilungen können wir einige Ableitungen für Inferenz durchgehen, bevor wir über Schulungen und Implementierung sprechen. Wir haben bereits die Berechnung der Unfähigkeit erwähnt Z in der gemeinsamen Wahrscheinlichkeitsverteilung. Um dies zu umgehen, können wir eine Gibbs -Probenahme verwenden. Die Gibbs -Probenahme ist ein Markov -Kettenmonte -Carlo -Algorithmus für die Probenahme aus einer bestimmten multivariaten Wahrscheinlichkeitsverteilung, wenn direkte Abtastung aus der Gelenkverteilung schwierig ist, aber die Probenahme aus der bedingten Verteilung ist praktischer (2). Daher brauchen wir bedingte Verteilungen.

Der Große an einem eingeschränkt Boltzmann gegen a vollständig verbunden Boltzmann ist die Tatsache, dass es keine Verbindungen innerhalb von Schichten gibt. Dies bedeutet angesichts der sichtbaren Schicht, alle versteckten Einheiten sind bedingt unabhängig und umgekehrt. Schauen wir uns an, was das vereinfacht wird, mit dem Sie beginnen können P(x | h):

Bedingte Verteilung P (h | x). Quelle: Autor

Wir können sehen, dass die bedingte Verteilung zu einer Sigmoidfunktion vereinfacht wird W. Es gibt eine weitaus strengere Berechnung, die ich in die enthalten habe Anhang Nachweis der ersten Zeile dieser Ableitung. Greifen Sie bei Interesse nach! Beobachten wir nun die bedingte Verteilung P(h | x):

Bedingte Verteilung P (x | H). Quelle: Autor

Wir können diese bedingte Verteilung sehen, die auch zu einer Sigmoidfunktion vereinfacht wird W. Aufgrund der eingeschränkten Kriterien in der RBM vereinfachen die bedingten Verteilungen während der Inferenz zu einfachen Berechnungen für Gibbs -Stichproben. Sobald wir verstehen, was genau der RBM zu lernen versucht, werden wir dies in Pytorch umsetzen.

Wie bei den meisten Tiefenlernen versuchen wir, die detrimental Log-Chance (NLL) zu minimieren, um unser Modell zu trainieren. Für die RBM:

NLL für RBM. Quelle: Autor

Das Ableitungen dieser Ausbeuten einnehmen:

Ableitung von NLL. Quelle: Autor

Der erste Time period auf der linken Seite der Gleichung wird als optimistic Section bezeichnet, da es das Modell dazu drängt, die Energie der realen Daten zu senken. Diese Begriff beinhaltet die Erwartung über versteckte Einheiten H Angesichts der tatsächlichen Trainingsdaten X. Eine optimistic Section ist leicht zu berechnen, da wir über die tatsächlichen Trainingsdaten Xᵗ verfügen und aufgrund der bedingten Unabhängigkeit die Erwartungen über H berechnen können.

Der zweite Time period wird als detrimental Section bezeichnet, da er die Energie der Konfigurationen erhöht, die das Modell derzeit für wahrscheinlich hält. Dieser Begriff beinhaltet die Erwartung über beide X Und H unter der aktuellen Verteilung des Modells. Es ist schwer zu berechnen, da wir aus der vollständigen Gelenkverteilung des Modells probieren müssen P(x, h) (Dies erfordert Markov -Ketten, die im Coaching wiederholt ineffizient sind). Die andere Various erfordert Pc Z was wir bereits als unmöglichkeit angesehen haben. Um dieses Drawback der Berechnung der negativen Section zu lösen, verwenden wir kontrastive Divergenz.

Die Schlüsselidee für kontrastive Divergenz besteht darin, verkürzte Gibbs -Probenahme zu verwenden, um nach Okay -Iterationen eine Punktschätzung zu erhalten. Wir können die detrimental Erwartungsphase durch diese Punktschätzung ersetzen.

Kontrastive Divergenz. Quelle: (3)

Typischerweise ok = 1, aber je größer ok ist, desto weniger verzerrt ist die Schätzung des Gradienten. Ich werde die Ableitung für die verschiedenen Partials in Bezug auf die detrimental Section (für Updates für Gewicht/Voreingenommenheit) nicht zeigen, aber sie kann durch Einnahme des Teilendeivats von abgeleitet werden E(x, h) in Bezug auf die Variablen. Es gibt ein Konzept einer anhaltenden kontrastiven Divergenz, bei der wir die Kette mit der negativen Stichprobe der letzten Iteration initialisieren, anstatt die Kette in Xᵗ zu initialisieren. Ich werde jedoch nicht in die Tiefe eingehen, da die normale kontrastive Divergenz ausreichend funktioniert.

Das Erstellen eines RBM von Grund auf beinhaltet die Kombination aller Konzepte, die wir in einer Klasse besprochen haben. Im Konstruktor __init__ initialisieren wir die Gewichte, den Vorspannungsbegriff für die sichtbare Schicht, den Vorspannungsbegriff für die versteckte Schicht und die Anzahl der Iterationen für kontrastive Divergenz. Alles, was wir brauchen, ist die Größe der Eingangsdaten, die Größe der versteckten Variablen und ok.

Wir müssen auch eine Bernoulli -Verteilung definieren, um abzuprobieren. Die Bernoulli -Verteilung wird geklemmt, um einen explodierenden Gradienten während des Trainings zu verhindern. Beide Verteilungen werden im Vorwärtspass verwendet (kontrastive Divergenz).

class RBM(nn.Module):
"""Restricted Boltzmann Machine template."""

def __init__(self, D: int, F: int, ok: int):
"""Creates an occasion RBM module.

Args:
D: Dimension of the enter information.
F: Dimension of the hidden variable.
ok: Variety of MCMC iterations for detrimental sampling.

The operate initializes the burden (W) and biases (c & b).
"""
tremendous().__init__()
self.W = nn.Parameter(torch.randn(F, D) * 1e-2) # Initialized from Regular(imply=0.0, variance=1e-4)
self.c = nn.Parameter(torch.zeros(D)) # Initialized as 0.0
self.b = nn.Parameter(torch.zeros(F)) # Initilaized as 0.0
self.ok = ok

def pattern(self, p):
"""Pattern from a bernoulli distribution outlined by a given parameter."""
p = torch.clamp(p, 0, 1)
return torch.bernoulli(p)

Die nächsten Methoden zum Aufbau der RBM -Klasse sind die bedingten Verteilungen. Wir haben diese beiden Bedingungen früher abgeleitet:

def P_h_x(self, x):
"""Steady conditional likelihood calculation"""
linear = torch.sigmoid(F.linear(x, self.W, self.b))
return linear

def P_x_h(self, h):
"""Steady seen unit activation"""
return self.c + torch.matmul(h, self.W)

Die endgültigen Methoden beinhalten die Implementierung des Ahead -Go und die Funktion der freien Energie. Die Energiefunktion stellt eine wirksame Energie für sichtbare Einheiten dar, nachdem alle möglichen Konfigurationen der versteckten Einheiten zusammengefasst wurden. Die Vorwärtsfunktion ist eine klassische kontrastive Divergenz für die Gibbs -Probenahme. Wir initialisieren x_negative, dann für Okay -Iterationen: Erhalten Sie H_K von p_h_x und x_negativ, pattern h_k aus einem bernoulli, holen Sie x_k aus p_x_h und h_k und erhalten dann ein neues x_negativ.

def free_energy(self, x):
"""Numerically steady free vitality calculation"""
seen = torch.sum(x * self.c, dim=1)
linear = F.linear(x, self.W, self.b)
hidden = torch.sum(torch.log(1 + torch.exp(linear)), dim=1)
return -visible - hidden

def ahead(self, x):
"""Contrastive divergence ahead move"""
x_negative = x.clone()

for _ in vary(self.ok):
h_k = self.P_h_x(x_negative)
h_k = self.pattern(h_k)
x_k = self.P_x_h(h_k)
x_negative = self.pattern(x_k)

return x_negative, x_k

Hoffentlich bildete dies eine Grundlage für die Theorie hinter RBMS sowie eine grundlegende Coding -Implementierungsklasse, mit der ein RBM geschult werden kann. Wenden Sie sich bei jedem Code oder weiteren Derwervien gerne nach weiteren Informationen!

Ableitung für insgesamt P(H | x) Das Produkt jeder einzelnen bedingten Verteilung ist:

Quelle: Autor

(1) Montufar, Guido. „Beschränkte Boltzmann -Maschinen: Einführung und Bewertung.“ Arxiv: 1806.07066v1 (Juni 2018).

(2) https://en.wikipedia.org/wiki/gibbs_sampling

(3) Hinton, Geoffrey. „Schulungsprodukte von Experten durch Minimierung der kontrastiven Abweichungen.“ Neuronale Berechnung (2002).

[ad_2]

]]>
http://chatgpz.de/machine-learning/eine-ableitung-und-anwendung-von-eingeschraenkten-boltzmann-maschinen-2024-nobelpreis-von-ryan-dcunha-januar-2025/feed/ 0 6736
Vergleich des Geschlechterverhältnisses: Neubetrachtung eines berühmten statistischen Issues aus dem 18. Jahrhundert | von Ryan Burn | August 2024 http://chatgpz.de/artificial-intelligence/vergleich-des-geschlechterverhaeltnisses-neubetrachtung-eines-beruehmten-statistischen-issues-aus-dem-18-jahrhundert-von-ryan-burn-august-2024/ http://chatgpz.de/artificial-intelligence/vergleich-des-geschlechterverhaeltnisses-neubetrachtung-eines-beruehmten-statistischen-issues-aus-dem-18-jahrhundert-von-ryan-burn-august-2024/#respond Sat, 10 Aug 2024 01:45:18 +0000 http://chatgpz.de/artificial-intelligence/vergleich-des-geschlechterverhaeltnisses-neubetrachtung-eines-beruehmten-statistischen-problems-aus-dem-18-jahrhundert-von-ryan-burn-august-2024/ [ad_1]

Was können wir über den Unterschied zwischen zwei Binomialverteilungswahrscheinlichkeiten sagen?

Paris und London des 18. Jahrhunderts (12)

Betrachten Sie zwei unabhängige Binomialverteilungen mit Erfolgswahrscheinlichkeiten p_1 und p_2. Wenn wir a_1 Erfolge, b_1 Misserfolge aus der ersten Verteilung und a_2 Erfolge, b_2 Misserfolge aus der zweiten Verteilung beobachten, was können wir über den Unterschied p_1 – p_2 sagen?

Unterschiede dieser Artwork in binomialen Modellen wurden erstmals 1778 von Laplace untersucht. Laplace stellte fest, dass das Verhältnis von in London geborenen Jungen zu in Paris geborenen Mädchen deutlich größer conflict als das Verhältnis von in Paris geborenen Jungen zu in London geborenen Mädchen. Er versuchte herauszufinden, ob dieser Unterschied signifikant conflict.

Mithilfe dessen, was man heute als Bayessche Inferenz bezeichnen würde, und einer gleichmäßigen Priori-Wahrscheinlichkeit berechnete Laplace die Posterior-Wahrscheinlichkeit, dass die Geburtenrate in London niedriger conflict als die Geburtenrate in Paris, und zwar als

Wo

[ad_2]

]]>
http://chatgpz.de/artificial-intelligence/vergleich-des-geschlechterverhaeltnisses-neubetrachtung-eines-beruehmten-statistischen-issues-aus-dem-18-jahrhundert-von-ryan-burn-august-2024/feed/ 0 3040
SMB-Advertising and marketing: Wir sprechen mit Ryan Burke, Director of AI bei Fixed Contact http://chatgpz.de/artificial-intelligence/smb-advertising-and-marketing-wir-sprechen-mit-ryan-burke-director-of-ai-bei-fixed-contact/ http://chatgpz.de/artificial-intelligence/smb-advertising-and-marketing-wir-sprechen-mit-ryan-burke-director-of-ai-bei-fixed-contact/#respond Thu, 08 Aug 2024 21:38:30 +0000 http://chatgpz.de/artificial-intelligence/smb-marketing-wir-sprechen-mit-ryan-burke-director-of-ai-bei-constant-contact/ [ad_1]

In der sich schnell entwickelnden Landschaft des digitalen Marketings stehen kleine Unternehmen oft an einem Scheideweg und müssen die Anforderungen der Unternehmensführung mit der Notwendigkeit eines effektiven Marketings in Einklang bringen. Angesichts dieser Herausforderung Dauernder Kontakt hat eine bahnbrechende KI-Lösung eingeführt, die speziell auf die Bedürfnisse kleiner und mittlerer Unternehmen (KMU) zugeschnitten ist. Ryan Burke, Director of AI bei Fixed Contact, steht an der Spitze dieser Innovation und bringt jahrzehntelange Erfahrung und Spitzentechnologie mit.

Ryan Burke wird Marketing campaign Builder vorstellen, ein KI-gestütztes Instrument, das die Artwork und Weise revolutionieren soll, wie KMU ihre Marketingkampagnen angehen. Diese bahnbrechende Lösung ist nicht nur eine weitere Ergänzung des Advertising and marketing-Toolkits, sondern ein umfassendes System, das Marketingbemühungen automatisiert und optimiert, sodass sich Geschäftsinhaber mehr auf das konzentrieren können, was sie am besten können – die Führung ihres Unternehmens.

Von der Erstellung überzeugender E-Mail-Texte bis hin zur Auswahl der effektivsten Kanäle für die Kontaktaufnahme nutzt Marketing campaign Builder die umfassende Erfahrung und hochentwickelte KI-Technologie von Fixed Contact, um in Sekundenschnelle maßgeschneiderte Marketingkampagnen zu liefern. Diese Lösung spart Zeit, verbessert die Kampagneneffektivität und gibt Kleinunternehmern, die sich von der Komplexität des digitalen Marketings überfordert fühlen, Vertrauen. Seien Sie dabei, wenn Ryan Burke die Feinheiten dieser innovativen KI-Lösung und ihr Potenzial zur Umgestaltung der Marketinglandschaft für KMUs näherbringt.

Einführung in die KI-Lösung:

Können Sie die neue KI-Lösung beschreiben, die Fixed Contact auf den Markt bringt, und was sie zu einem bahnbrechenden Instrument für kleine Unternehmen macht?

Die meisten kleinen Unternehmen sind nur aus der Not heraus Marketingexperten – sie haben oft keine Zeit für Advertising and marketing und vielen fehlt das Selbstvertrauen und das Wissen, um das Beste aus ihren Kampagnen herauszuholen. Sie brauchen Hilfe bei der Erstellung der richtigen Botschaften für ihre Kunden und beim Verständnis, wo sie diese am besten mit diesen Inhalten erreichen können. Hier kommt Marketing campaign Builder ins Spiel.

Marketing campaign Builder nutzt unsere KI-Plattform sowie Finest Practices aus quick 30 Jahren Erfahrung als Pionier im digitalen Advertising and marketing, um die Marketingbereiche zu automatisieren, in denen KMUs häufig stecken bleiben. In etwa 90 Sekunden erstellt es für Sie eine komplette Marketingkampagne mit überzeugendem Textual content für E-Mails, Social Media und Textnachrichten, gebrandeten E-Mail-Vorlagen und Empfehlungen zu den besten Orten, um Kunden zu erreichen. Dies spart KMUs Zeit und hilft ihnen, ihre Ziele schneller zu erreichen, sodass sie sich auf andere Bereiche ihres Geschäfts konzentrieren können.

Fixed Contact ist derzeit die einzige Marketingplattform, die kleinen und mittleren Unternehmen (KMU) eine derart umfassende automatisierte Generierung von Multi-Channel-Kampagnen bietet.

Zielgruppe:

Wer ist die primäre Zielgruppe dieser KI-Lösung und wie wurde sie an ihre spezifischen Marketinganforderungen angepasst?

Marketing campaign Builder wurde entwickelt, um kleinen Unternehmen und gemeinnützigen Organisationen zu helfen, die Leistung ihrer Kampagnen zu verbessern und gleichzeitig weniger Zeit für Advertising and marketing aufzuwenden. Unsere Untersuchungen zeigen, dass die größten Advertising and marketing-Herausforderungen für KMU darin bestehen, neue Kunden zu finden, herauszufinden, was funktioniert, und Ressourcenmangel. Tatsächlich gaben 56 Prozent der von uns befragten KMU an, dass sie weniger als eine Stunde professional Tag für Advertising and marketing zur Verfügung haben, und 73 Prozent waren sich unsicher, ob ihre Marketingstrategie effektiv ist.

Marketing campaign Builder verändert die Marketingfähigkeiten kleiner und mittelständischer Unternehmen durch eine schnelle und einfache Möglichkeit, ihr Unternehmen zu vermarkten. So können sie weniger Zeit mit Advertising and marketing verbringen und gleichzeitig ihre Taktiken erweitern und die Zuversicht gewinnen, dass sie beim Erreichen ihrer Ziele Fortschritte machen.

KI-Funktionen:

Können Sie die Fähigkeiten dieser KI-Technologie näher erläutern? Wie automatisiert sie konkret Marketingprozesse?

Marketing campaign Builder ist ein zielorientiertes Instrument. Wenn unsere Kunden es zum ersten Mal öffnen, erzählen sie uns ein wenig darüber, was sie mit ihrer Marketingkampagne erreichen möchten – ob es darum geht, ihre Liste zu erweitern, einen Verkauf zu fördern oder sogar für eine Veranstaltung zu werben. Marketing campaign Builder analysiert dann dieses Ziel und entwickelt in Sekundenschnelle einen empfohlenen Satz von Marketingtaktiken, mit denen der Kunde das gewünschte Ergebnis erzielen kann. Dazu gibt es detaillierte Empfehlungen für die besten Inhalte, Kanäle und Zeitpunkte für jede Kommunikation.

Glückliche Zukunft KI - Constant ContactGlückliche Zukunft KI - Constant Contact

Hinter den Kulissen nutzen wir unsere KI-Plattform und unsere Kundendatenplattform (CDP), um ihnen die ganze schwere Arbeit abzunehmen. Fixed Contact wurde vor quick 30 Jahren gegründet, daher wurden unsere KI-Modelle mit historischem Wissen und Daten aus echten digitalen Marketingkampagnen trainiert. Sie lernen, was für verschiedene Arten von Unternehmen am besten funktioniert, und geben dann Empfehlungen ab, die wahrscheinlich zum Erfolg des Kunden führen. Wir integrieren LLMs von OpenAI und anderen, um die Erfahrung der Arbeit mit dem KI-Modelle intuitiv und schnell auch für unsere Kunden.

Benutzererfahrung:

Wie stellt Fixed Contact sicher, dass diese KI-Lösung benutzerfreundlich ist, insbesondere für Kleinunternehmer mit begrenztem technischen Fachwissen?

Wir möchten, dass unsere Kunden erfolgreich sind, weil sie ein großartiges Produkt oder eine großartige Dienstleistung haben, und nicht wegen ihres Marketinggeschicks. Alles, was wir bauen, ist intuitiv, flexibel und leistungsstark, denn das ist es, was kleine Unternehmen brauchen.

Unsere Kunden kommen nicht zu uns, um sozusagen „KI zu kaufen“, und es ist ihnen auch nicht unbedingt wichtig, wie die Technologie im Hintergrund funktioniert. Aber sie wollen, dass Advertising and marketing schneller und leichter verdaulich ist, und sie erwarten, dass sie verstehen, was funktioniert und wo sie Anpassungen vornehmen müssen. Wir haben Marketing campaign Builder unter Berücksichtigung dieses Feedbacks entwickelt und eine geführte Erfahrung geschaffen, mit der sie in Sekundenschnelle Dinge erledigen können, die sonst Stunden oder sogar Tage dauern würden.

Wir empfehlen nicht nur den besten Kommunikationsmix, sondern möglicherweise auch Kanäle, die unsere Benutzer bisher nicht verwendet oder in Betracht gezogen haben, um ihnen dabei zu helfen, ihre Botschaft zu verstärken.

Integration mit vorhandenen Instruments:

Wie intestine lässt sich diese neue KI-Lösung in die bestehende Instrument-Suite von Fixed Contact integrieren?

Unsere Plattform basiert auf KI. Wir haben nutzte diese Technologiezusätzlich zur Marketingautomatisierung, seit Jahren sowohl in kundenorientierten als auch in Backend-Anwendungen wie Personalisierungstools und Spamschutz. Marketing campaign Builder baut einfach auf dieser Grundlage auf und bietet unseren Kunden eine neue Möglichkeit, mit den Options und Funktionen von Fixed Contact zu interagieren, die sie bereits täglich nutzen.

Die von Marketing campaign Builder erstellten Empfehlungen sind Entwickelt für einen reibungslosen Betrieb innerhalb des Workflows eines Kleinunternehmens in Fixed Contact. Jede E-Mail oder Textnachricht kann mit denselben Instruments bearbeitet werden, die unsere Kunden zum manuellen Verfassen von Nachrichten verwenden, und wir nutzen dieselben SMS-Funktionen und Occasion-Plattformen, die bereits in der Plattform vorhanden sind.

Ein Kunde kann all diese Dinge heute manuell in Fixed Contact erledigen, ohne die Hilfe von Marketing campaign Builder. Der Vorteil, mit Marketing campaign Builder zu beginnen, besteht darin, dass der Prozess deutlich schneller ist und seine Kampagnen persönlicher, kreativer und effektiver wirken.

Zukünftige KI-Entwicklungen:

Können Sie uns Einblicke in zukünftige KI-Entwicklungen oder zusätzliche Instruments geben, die Fixed Contact in Betracht zieht?

Wir haben eine klare Imaginative and prescient davon, wohin künstliche Intelligenz uns (und unsere Kunden) in Zukunft führen kann, und untersuchen bereits, wie wir ihren Einsatz erweitern können, um mehr Herausforderungen lösen mit denen KMUs konfrontiert sind. Sie können sich vorstellen, welche Anforderungen das sein könnten – von Suchmaschinenoptimierung über On-line-Werbestrategie bis hin zu Reputationsmanagement und allem, was dazwischen liegt.

Unsere Kunden sind für uns die Vorbilder für unsere Innovationskraft und daher werden wir auch weiterhin großen Wert darauf legen, Funktionen zu entwickeln, die ihnen dabei helfen, neue Kunden zu gewinnen und dafür zu sorgen, dass sie immer wieder zu uns kommen.

Tipps für kleine Unternehmen:

Welchen Rat würden Sie kleinen Unternehmen geben, die KI-Technologien für ihre Marketinganforderungen nutzen möchten?

Es klingt zwar kontraintuitiv, aber machen Sie sich keine Sorgen um die Technologie selbst. KI ist kein Werkzeug, sondern lediglich ein Mittel, mit dem Sie bessere Ergebnisse erzielen können – beispielsweise geistreichere Betreffzeilen verfassen oder wissen, welche Ihrer Kunden Textnachrichten E-Mails vorziehen.

Konzentrieren Sie sich stattdessen darauf, Bereiche Ihres Marketings zu identifizieren, in denen Sie zusätzliche Hilfe benötigen. Vielleicht fällt es Ihnen schwer, Texte für Ihren wöchentlichen E-newsletter zu schreiben, oder Sie haben das Gefühl, dass Ihre Kunden sich nicht so mit Ihren Inhalten beschäftigen, wie sie es sollten. Oder eröffnen Sie bald einen neuen Standort und müssen Interesse für eine große Eröffnung wecken? Das sind die Arten von Dingen, bei denen KI helfen kann, und so erklären wir es unseren Kunden.

Suchen Sie sich einen Accomplice wie Fixed Contact, der die Technologie in Ihrem Namen nutzt, um Instruments zu erstellen, mit denen Sie diese Hindernisse überwinden und sich wieder den Dingen widmen können, die Sie lieber tun.



[ad_2]

]]>
http://chatgpz.de/artificial-intelligence/smb-advertising-and-marketing-wir-sprechen-mit-ryan-burke-director-of-ai-bei-fixed-contact/feed/ 0 3002
Warum Clustering fehlschlägt. Und wie man es behebt | von Ryan Feather | Jul, 2024 http://chatgpz.de/artificial-intelligence/warum-clustering-fehlschlaegt-und-wie-man-es-behebt-von-ryan-feather-jul-2024/ http://chatgpz.de/artificial-intelligence/warum-clustering-fehlschlaegt-und-wie-man-es-behebt-von-ryan-feather-jul-2024/#respond Mon, 08 Jul 2024 11:56:18 +0000 http://chatgpz.de/artificial-intelligence/warum-clustering-fehlschlaegt-und-wie-man-es-behebt-von-ryan-feather-jul-2024/ [ad_1]

Und wie man es behebt

Sie hatten ein Downside mit der Dateninterpretation und haben es mit Clustering versucht. Und jetzt haben Sie ein Cluster-Interpretationsproblem! Es bestand der Verdacht, dass die Daten Muster enthalten könnten. Vernünftigerweise hofften Sie, dass das Hinzufügen einer Struktur durch unüberwachtes Lernen zu einigen Erkenntnissen führen würde. Cluster sind das Mittel der Wahl, um Strukturen zu finden. Und so haben Sie sich auf die Reise gemacht. Sie geben viel Geld für Laptop aus. Sie stecken viel Schweiß in das Herumspielen mit Cluster-Tuning-Parametern. Nur um sicherzugehen, probieren Sie ein paar Algorithmen aus. Aber am Ende des Tages haben Sie Regenbogendiagramme mit Cluster-Daten, die vielleicht eine Bedeutung haben – nur vielleicht – wenn Sie nur genau genug hinschauen. Sie gehen mit dem unbehaglichen Gefühl nach Hause, dass alles umsonst battle. Leider ist das viel zu oft der Fall. Aber warum sollte das so sein?

Einige echte Cluster. Bild von NASA und STScI gemeinfrei veröffentlicht.

Wenn ein Clustering-Projekt keinen Mehrwert bringt, hat das oft mehrere Ursachen: mangelndes Verständnis der Daten, zu wenig Aufmerksamkeit für das gewünschte Ergebnis und falsche Werkzeugwahl. Wir werden diese Punkte der Reihe nach durchgehen. Um die Diskussion anzuregen, ist es aufschlussreich, die Gründe für die Existenz von Clustering-Techniken zu verstehen. Zu diesem Zweck werden wir uns ansehen, was Clustering ist und einige der Probleme, die zur Entwicklung von Clustering-Techniken geführt haben.

[ad_2]

]]>
http://chatgpz.de/artificial-intelligence/warum-clustering-fehlschlaegt-und-wie-man-es-behebt-von-ryan-feather-jul-2024/feed/ 0 2097
Klassifizierungsverlustfunktionen: Instinct und Anwendungen | von Ryan D’Cunha | Juni 2024 http://chatgpz.de/machine-learning/klassifizierungsverlustfunktionen-instinct-und-anwendungen-von-ryan-dcunha-juni-2024/ http://chatgpz.de/machine-learning/klassifizierungsverlustfunktionen-instinct-und-anwendungen-von-ryan-dcunha-juni-2024/#respond Thu, 27 Jun 2024 07:45:14 +0000 http://chatgpz.de/machine-learning/klassifizierungsverlustfunktionen-intuition-und-anwendungen-von-ryan-dcunha-juni-2024/ [ad_1]

Eine einfachere Möglichkeit, Ableitungen von Verlustfunktionen für die Klassifizierung zu verstehen und wann/wie sie in PyTorch angewendet werden

Quelle: GPT4o generiert

Egal, ob Sie neu in der Erforschung neuronaler Netzwerke sind oder ein erfahrener Profi, dies sollte eine nützliche Lektüre sein, um mehr Instinct über Verlustfunktionen zu erlangen. Als jemand, der während des Modelltrainings viele verschiedene Verlustfunktionen testet, bin ich über kleine Particulars zwischen den Funktionen gestolpert. Ich habe Stunden damit verbracht, eine intuitive Darstellung von Verlustfunktionen aus Lehrbüchern, Forschungsarbeiten und Movies zu recherchieren. Ich wollte nicht nur die Ableitungen Das hat mir geholfen, die Konzepte zu verstehen, aber häufige Fallstricke und Anwendungsfälle für Einstufung in PyTorch.

Bevor wir beginnen, müssen wir einige grundlegende Begriffe definieren, die ich verwenden werde.

  • Trainingsdatensatz: {xᵢ, yᵢ}
  • Verlustfunktion: L(φ)
  • Ausgabe der Modellvorhersage f(xᵢ, φ) mit Parametern φ
  • Bedingte Wahrscheinlichkeit: Pr(y|x)
  • Parametrische Verteilung: Pr(y|ω) mit ω Darstellung von Netzwerkparametern für die Verteilung über j

Kehren wir zunächst zu den Grundlagen zurück. Eine allgemeine Annahme ist, dass neuronale Netze einen skalaren Output aus dem Modell berechnen f(xᵢ, φ). Die meisten neuronalen Netze sind heutzutage jedoch darauf trainiert, Parameter einer Verteilung vorherzusagen j. (im Gegensatz zu vorhergesagt den Wert von j).

In der Realität wird ein Netzwerk eine bedingte Wahrscheinlichkeitsverteilung ausgeben Pr(y|x) über mögliche Ausgänge j. Mit anderen Worten: Jeder Eingabedatenpunkt führt zu einer Wahrscheinlichkeitsverteilung, die für jede Ausgabe generiert wird. Das Netzwerk möchte die Parameter für die Wahrscheinlichkeitsverteilung lernen und diese Parameter und die Verteilung dann verwenden, um die Ausgabe vorherzusagen.

Die traditionelle Definition einer Verlustfunktion ist eine Funktion, die Ziel- und prognostizierte Ausgaben vergleicht. Aber wir haben gerade gesagt, dass eine Netzwerk-Rohausgabe eine Verteilung und keine Skalarausgabe ist. Wie ist das additionally möglich?

Wenn wir dies aus der Sichtweise betrachten, die wir gerade definiert haben, schiebt eine Verlustfunktion jeden ja eine höhere Wahrscheinlichkeit in der Verteilung haben Pr(yᵢ|xᵢ). Der entscheidende Punkt ist, dass unsere Verteilung verwendet wird, um die wahre Ausgabe basierend auf Parametern aus unserer Modellausgabe vorherzusagen. Anstatt unsere Eingabe zu verwenden xᵢ für die Verteilung, können wir uns eine parametrische Verteilung vorstellen Pr(y|ω) Wo ω stellt Wahrscheinlichkeitsverteilungsparameter dar. Wir berücksichtigen immer noch die Eingabe, aber es wird eine andere ωᵢ = f(xᵢ, φ) für jede xᵢ.

Notiz: Um ein verwirrendes Konzept zu klären: φ stellt die Modellparameter dar und ω stellt die Wahrscheinlichkeitsverteilungsparameter dar

GUm zur traditionellen Definition einer Verlustfunktion zurückzukehren, müssen wir eine Ausgabe erhalten, die wir vom Modell verwenden können. Aus unserer Wahrscheinlichkeitsverteilung scheint es logisch, φ das ergibt die größte Wahrscheinlichkeit für jeden xᵢ. Wir brauchen additionally die Gesamtheit φ das die größte Wahrscheinlichkeit über alle Trainingspunkte hinweg ergibt ICH (alle Herleitungen sind aus Understanding Deep Studying (1) adaptiert):

Maximierung von Parametern aus Wahrscheinlichkeitsverteilungen von Ausgabemodellen (1)

Wir multiplizieren die generierten Wahrscheinlichkeiten aus jeder Verteilung und erhalten φ das die maximale Wahrscheinlichkeit ergibt (genannt maximale Wahrscheinlichkeit). Dazu müssen wir annehmen, dass die Daten unabhängig und identisch verteilt sind. Doch nun stoßen wir auf ein Drawback: Was ist, wenn die Wahrscheinlichkeiten sehr klein sind? Unser Multiplikationsergebnis wird sich 0 nähern (ähnlich wie bei einem verschwindenden Gradientenproblem). Außerdem ist unser Programm möglicherweise nicht in der Lage, so kleine Zahlen zu verarbeiten.

Um dies zu beheben, führen wir eine logarithmische Funktion! Indem wir die Eigenschaften von Logarithmen nutzen, können wir unsere Wahrscheinlichkeiten addieren, anstatt sie zu multiplizieren. Wir wissen, dass der Logarithmus eine monoton zunehmende Funktion ist, sodass unsere ursprüngliche Ausgabe erhalten bleibt und mit dem Logarithmus skaliert wird.

Verwendung von Logarithmen zur Addition von Wahrscheinlichkeiten (1)

Das letzte, was wir brauchen, um unsere traditionelle unfavourable Log-Probability zu erhalten, ist die Minimierung der Ausgabe. Wir maximieren derzeit die Ausgabe, additionally multiplizieren wir einfach mit einer negativen Zahl und nehmen das minimale Argument (denken Sie an einige grafische Beispiele, um sich davon zu überzeugen):

Adverse Log-Probability (1)

Indem wir die Modellergebnisse einfach als Wahrscheinlichkeitsverteilung visualisieren, versuchen wir, φ das ergibt die maximale Wahrscheinlichkeit, und durch Anwenden eines Logarithmus haben wir einen negativen Log-Probability-Verlust abgeleitet! Dies kann auf viele Aufgaben angewendet werden, indem man eine logische Wahrscheinlichkeitsverteilung wählt. Gängige Klassifizierungsbeispiele werden unten gezeigt.

Wenn Sie sich fragen, wie eine skalare Ausgabe aus dem Modell generiert wird während Inferenzes ist einfach das Most der Verteilung:

Erzeugen eines Outputs aus der Inferenz (1)

Notiz: Dies ist lediglich eine Ableitung der negativen Log-Probability. In der Praxis wird höchstwahrscheinlich auch in der Verlustfunktion eine Regularisierung vorhanden sein.

Bis zu diesem Punkt haben wir die unfavourable Log-Probability abgeleitet. Das ist wichtig zu wissen, aber es ist in den meisten Lehrbüchern oder On-line-Ressourcen zu finden. Wenden wir dies nun auf die Klassifizierung an, um seine Anwendung zu verstehen.

Randnotiz: Wenn Sie daran interessiert sind, dies auf Regression angewendet zu sehen, bietet Understanding Deep Studying (1) großartige Beispiele mit univariater Regression und einer Gauß-Verteilung zur Ableitung des mittleren quadratischen Fehlers

Binäre Klassifizierung

Ziel der binären Klassifizierung ist die Zuordnung eines Eingangs X zu einer von zwei Klassenbezeichnungen j ∈ {0, 1}. Wir werden die Bernoulli-Verteilung als unsere bevorzugte Wahrscheinlichkeitsverteilung verwenden.

Mathematische Darstellung der Bernoulli-Verteilung. Bild vom Autor

Dies ist nur eine ausgefallene Artwork, die Wahrscheinlichkeit auszudrücken, dass die Ausgabe wahr ist, aber die Gleichung ist notwendig, um unsere Verlustfunktion abzuleiten. Wir brauchen das Modell f(x, φ) Ausgabe P zur Erzeugung der prognostizierten Ausgabewahrscheinlichkeit. Bevor wir jedoch P in Bernoulli muss es zwischen 0 und 1 liegen (es ist additionally eine Wahrscheinlichkeit). Die Funktion der Wahl hierfür ist eine Sigmoidfunktion: σ(z)

Quelle: https://en.wikipedia.org/wiki/Sigmoidfunktion

Ein Sigmoid komprimiert die Ausgabe P auf einen Wert zwischen 0 und 1. Daher lautet unsere Eingabe für Bernoulli p = σ(f(x, φ)). Damit ergibt sich unsere Wahrscheinlichkeitsverteilung:

Neue Wahrscheinlichkeitsverteilung mit Sigmoid und Bernoulli. Bild vom Autor

Wenn wir zur negativen Log-Probability zurückkehren, erhalten wir Folgendes:

Binäre Kreuzentropie. Bild vom Autor

Kommt Ihnen das bekannt vor? Dies ist die Verlustfunktion der binären Kreuzentropie (BCE)! Die wichtigste Instinct dabei ist, zu verstehen, warum ein Sigmoid verwendet wird. Wir haben eine skalare Ausgabe und diese muss auf einen Wert zwischen 0 und 1 skaliert werden. Es gibt andere Funktionen, die dies können, aber das Sigmoid wird am häufigsten verwendet.

BCE in PyTorch

Bei der Implementierung von BCE in PyTorch gibt es ein paar Tips, auf die Sie achten sollten. Es gibt zwei verschiedene BCE-Funktionen in PyTorch: BCELoss() Und BCEWithLogitsLoss(). Ein häufiger Fehler (den ich gemacht habe) ist das falsche Vertauschen der Anwendungsfälle.

BCELoss(): Diese Torch-Funktion gibt den Verlust MIT ANWENDUNG DES SIGMOIDS aus. Die Ausgabe ist ein Wahrscheinlichkeit.

BCEWithLogitsLoss(): Die Torch-Funktion gibt Logits aus, die die Rohausgaben des Modells. Es wird KEIN SIGMOID ANGEWENDET. Wenn Sie dies verwenden, müssen Sie ein torch.sigmoid() zum Ausgang.

Dies ist besonders wichtig für Switch Studying, da das Modell, auch wenn Sie wissen, dass es mit BCE trainiert wurde, unbedingt das richtige verwendet. Andernfalls wenden Sie versehentlich nach BCELoss() eine Sigmoidfunktion an, wodurch das Netzwerk nicht lernt …

Sobald eine Wahrscheinlichkeit mit einer der beiden Funktionen berechnet wurde, muss sie während der Inferenz interpretiert werden. Die Wahrscheinlichkeit ist die Vorhersage des Modells, wie wahrscheinlich es ist, dass die Wahrscheinlichkeit wahr ist (Klassenbezeichnung 1). Um die Abbruchwahrscheinlichkeit einer wahren Bezeichnung zu bestimmen, ist eine Schwellenwertbildung erforderlich. p = 0,5 wird häufig verwendet, aber es ist wichtig, verschiedene Schwellenwahrscheinlichkeiten zu testen und zu optimieren. Eine gute Idee ist es, ein Histogramm der Ausgabewahrscheinlichkeiten zu zeichnen, um die Zuverlässigkeit der Ausgaben zu sehen, bevor man sich für einen Schwellenwert entscheidet.

Mehrklassenklassifizierung

Ziel der Multiklassenklassifizierung ist die Zuordnung eines Eingangs X zu einem von Ok > 2 Klassenbezeichnungen j ∈ {1, 2, …, Ok}. Wir werden die kategorische Verteilung als unsere bevorzugte Wahrscheinlichkeitsverteilung verwenden.

Kategoriale Verteilung. Bild vom Autor

Dabei wird jeder Klasse für eine bestimmte Ausgabe lediglich eine Wahrscheinlichkeit zugewiesen, und die Summe aller Wahrscheinlichkeiten muss 1 ergeben. Wir benötigen das Modell f(x, φ) Ausgabe P zur Erzeugung der prognostizierten Ausgabewahrscheinlichkeit. Das Summenproblem tritt wie bei der binären Klassifizierung auf. Bevor wir eingeben können P in Bernoulli muss es eine Wahrscheinlichkeit zwischen 0 und 1 sein. Eine Sigmoidfunktion funktioniert nicht mehr, da sie jeden Klassenwert auf eine Wahrscheinlichkeit skaliert, aber es gibt keine Garantie, dass alle Wahrscheinlichkeiten 1 ergeben. Dies ist vielleicht nicht sofort ersichtlich, aber es wird ein Beispiel gezeigt:

Sigmoid erzeugt keine Wahrscheinlichkeitsverteilung bei der Multiklassenklassifizierung. Bild vom Autor

Wir brauchen eine Funktion, die beide Einschränkungen sicherstellen kann. Dafür wird ein Softmax gewählt. Ein Softmax ist eine Erweiterung eines Sigmoids, stellt aber sicher, dass die Summe aller Wahrscheinlichkeiten 1 ergibt.

Softmax-Funktion. Bild vom Autor

Dies bedeutet, dass die Wahrscheinlichkeitsverteilung ein Softmax ist, das auf die Modellausgabe angewendet wird. Die Wahrscheinlichkeit der Berechnung eines Labels okay: Pr(y = okay|x) = Sₖ(f(x, φ)).

Um die Verlustfunktion für die Mehrklassenklassifizierung abzuleiten, können wir den Softmax- und Modell-Output in den negativen Log-Probability-Verlust einsetzen:

Multiclass Cross Entropy. Bild vom Autor

Dies ist die Herleitung für Multiklassen-Kreuzentropie. Es ist wichtig, sich daran zu erinnern, dass der einzige Time period, der zur Verlustfunktion beiträgt, die Wahrscheinlichkeit der wahren Klasse ist. Wenn Sie Kreuzentropie gesehen haben, sind Sie eher mit einer Funktion vertraut, bei der p(x) Und q(x). Dies ist identisch mit der Gleichung für den Kreuzentropieverlust, in der p(x) = 1 für die wahre Klasse und 0 für alle anderen Klassen. q(x) ist der Softmax der Modellausgabe. Die andere Ableitung der Kreuzentropie ergibt sich aus der Verwendung von KL Divergence, und Sie können dieselbe Verlustfunktion erreichen, indem Sie einen Time period als Dirac-Delta-Funktion behandeln, bei der wahre Ausgaben existieren, und den anderen Time period als Modellausgabe mit Softmax. Es ist wichtig zu beachten, dass beide Wege zur gleichen Verlustfunktion führen.

Kreuzentropie in PyTorch

Anders als bei der binären Kreuzentropie gibt es in PyTorch nur eine Verlustfunktion für die Kreuzentropie. nn.KreuzEntropyLoss gibt die Modellausgabe mit bereits angewendetem Softmax zurück. Die Inferenz kann durchgeführt werden, indem die Softmax-Modellausgabe mit der größten Wahrscheinlichkeit verwendet wird (wobei die höchste Wahrscheinlichkeit wie erwartet verwendet wird).

Dies waren zwei intestine untersuchte Klassifizierungsbeispiele. Bei einer komplexeren Aufgabe kann es einige Zeit dauern, sich für eine Verlustfunktion und Wahrscheinlichkeitsverteilung zu entscheiden. Es gibt viele Diagramme, die Wahrscheinlichkeitsverteilungen mit beabsichtigten Aufgaben abgleichen, aber es gibt immer Raum zum Erkunden.

Für bestimmte Aufgaben kann es hilfreich sein, Verlustfunktionen zu kombinieren. Ein häufiger Anwendungsfall hierfür ist eine Klassifizierungsaufgabe, bei der es hilfreich sein kann, einen (binären) Kreuzentropieverlust mit einem modifizierten Cube-Koeffizientenverlust zu kombinieren. Meistens werden die Verlustfunktionen addiert und durch einige Hyperparameter skaliert, um den Beitrag jeder einzelnen Funktion zum Verlust zu steuern.

[ad_2]

]]>
http://chatgpz.de/machine-learning/klassifizierungsverlustfunktionen-instinct-und-anwendungen-von-ryan-dcunha-juni-2024/feed/ 0 1776
Umfassender Leitfaden zu Datasets und Dataloadern in PyTorch | von Ryan D’Cunha | Juni 2024 http://chatgpz.de/machine-learning/umfassender-leitfaden-zu-datasets-und-dataloadern-in-pytorch-von-ryan-dcunha-juni-2024/ http://chatgpz.de/machine-learning/umfassender-leitfaden-zu-datasets-und-dataloadern-in-pytorch-von-ryan-dcunha-juni-2024/#respond Sun, 23 Jun 2024 13:24:48 +0000 https://chatgpz.de/machine-learning/umfassender-leitfaden-zu-datasets-und-dataloadern-in-pytorch-von-ryan-dcunha-juni-2024/ [ad_1]

Die vollständige Anleitung zum Erstellen benutzerdefinierter Datensätze und Datenlader für verschiedene Modelle in PyTorch

Quelle: GPT4o generiert

Bevor Sie ein maschinelles Lernmodell erstellen können, müssen Sie Ihre Daten in einen Datensatz laden. Glücklicherweise verfügt PyTorch über viele Befehle, die bei diesem gesamten Prozess helfen (wenn Sie mit PyTorch nicht vertraut sind, empfehle ich Ihnen, die Grundlagen aufzufrischen. Hier).

PyTorch bietet eine gute Dokumentation, die bei diesem Prozess hilft, aber ich habe keine umfassende Dokumentation oder Tutorials zu benutzerdefinierten Datensätzen gefunden. Ich werde zunächst mit der Erstellung grundlegender vorgefertigter Datensätze beginnen und mich dann hocharbeiten, um Datensätze von Grund auf für verschiedene Modelle zu erstellen!

Bevor wir uns in den Code für verschiedene Anwendungsfälle vertiefen, sollten wir den Unterschied zwischen den beiden Begriffen verstehen. Im Allgemeinen erstellen Sie zuerst Ihren Datensatz und dann einen Datenlader. Ein Datensatz enthält die Merkmale und Beschriftungen von jedem Datenpunkt, der in das Modell eingespeist wird. Datenlader ist ein benutzerdefiniertes PyTorch-Iterable, das das Laden von Daten mit zusätzlichen Funktionen erleichtert.

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
batch_sampler=None, num_workers=0, collate_fn=None,
pin_memory=False, drop_last=False, timeout=0,
worker_init_fn=None, *, prefetch_factor=2,
persistent_workers=False)

Die häufigsten Argumente im Datenlader sind Batchgröße, Mischen (normalerweise nur für die Trainingsdaten), Anzahl_Arbeiter (zum Multi-Prozess-Laden der Daten) und Pin-Speicher (um die abgerufenen Datentensoren im fixierten Speicher abzulegen und eine schnellere Datenübertragung an CUDA-fähige GPUs zu ermöglichen).

Aufgrund von Multiprocessing-Komplikationen mit CUDA wird empfohlen, pin_memory = True festzulegen, anstatt num_workers anzugeben.

Falls Ihr Datensatz on-line oder lokal heruntergeladen wird, ist es äußerst einfach, den Datensatz zu erstellen. Ich denke, PyTorch hat gute Dokumentation Ich werde mich kurz fassen.

Wenn Sie wissen, dass der Datensatz entweder von PyTorch stammt oder PyTorch-kompatibel ist, rufen Sie einfach die erforderlichen Importe und den Datensatz Ihrer Wahl auf:

from torch.utils.information import Dataset
from torchvision import datasets
from torchvision.transforms imports ToTensor

information = torchvision.datasets.CIFAR10('path', prepare=True, remodel=ToTensor())

Jeder Datensatz hat eindeutige Argumente, die ihm übergeben werden müssen (gefunden Hier). Im Allgemeinen handelt es sich dabei um den Pfad, unter dem der Datensatz gespeichert ist, einen Booleschen Wert, der angibt, ob er heruntergeladen werden muss oder nicht (praktischerweise „Obtain“ genannt), ob es sich um Coaching oder Check handelt und ob Transformationen angewendet werden müssen.

Ich habe am Ende des letzten Abschnitts erwähnt, dass Transformationen auf einen Datensatz angewendet werden können, aber was ist eigentlich eine Transformation?

A verwandeln ist eine Methode zur Manipulation von Daten zur Vorverarbeitung eines Bildes. Transformationen haben viele verschiedene Facetten. Die häufigste Transformation ist ToTensor()konvertiert den Datensatz in Tensoren (wird als Eingabe in jedes Modell benötigt). Andere in PyTorch integrierte Transformationen (torchvision.transforms) umfassen das Spiegeln, Drehen, Zuschneiden, Normalisieren und Verschieben von Bildern. Diese werden normalerweise verwendet, damit das Modell besser verallgemeinern kann und nicht zu stark an die Trainingsdaten angepasst wird. Datenerweiterungen können auch verwendet werden, um die Größe des Datensatzes bei Bedarf künstlich zu erhöhen.

Beachten Sie, dass die meisten Torchvision-Transformationen nur Pillow-Bild- oder Tensorformate akzeptieren (nicht Numpy). Zum Konvertieren verwenden Sie einfach

Um von Numpy zu konvertieren, erstellen Sie entweder einen Fackel-Tensor oder verwenden Sie Folgendes:

From PIL import Picture
# assume arr is a numpy array
# you might have to normalize and solid arr to np.uint8 relying on format
img = Picture.fromarray(arr)

Transformationen können gleichzeitig angewendet werden mit torchvision.transforms.compose. Sie können so viele Transformationen kombinieren, wie für den Datensatz erforderlich sind. Ein Beispiel wird unten angezeigt:

import torchvision.transforms.Compose

dataset_transform = transforms.Compose((
transforms.RandomResizedCrop(256),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
))

Denken Sie daran, die gespeicherte Transformation als Argument an den Datensatz zu übergeben, damit sie im Datenlader angewendet werden kann.

Wenn Sie Ihr eigenes Modell entwickeln, benötigen Sie in den meisten Fällen einen benutzerdefinierten Datensatz. Ein häufiger Anwendungsfall wäre Transferlernen, um Ihren eigenen Datensatz auf ein vorab trainiertes Modell anzuwenden.

Eine PyTorch-Dataset-Klasse besteht aus drei erforderlichen Teilen: Initialisierung, LängeUnd Abrufen eines Components.

__drin__: Um den Datensatz zu initialisieren, geben Sie die Rohdaten und die beschrifteten Daten ein. Am besten geben Sie die Rohbilddaten und die beschrifteten Daten separat ein.

__Länge__: Gibt die Länge des Datensatzes zurück. Vor dem Erstellen des Datensatzes sollte überprüft werden, ob die Rohdaten und die beschrifteten Daten die gleiche Größe haben.

__getitem__: Hier erfolgt die gesamte Datenverarbeitung, um einen bestimmten Index (idx) der Roh- und beschrifteten Daten zurückzugeben. Wenn Transformationen angewendet werden müssen, müssen die Daten in einen Tensor konvertiert und transformiert werden. Wenn die Initialisierung einen Pfad zum Datensatz enthielt, muss der Pfad geöffnet und auf die Daten zugegriffen/sie vorverarbeitet werden, bevor sie zurückgegeben werden können.

Beispieldatensatz für ein semantisches Segmentierungsmodell:

from torch.utils.information import Dataset
from torchvision import transforms

class ExampleDataset(Dataset):
"""Instance dataset"""

def __init__(self, raw_img, data_mask, remodel=None):
self.raw_img = raw_img
self.data_mask = data_mask
self.remodel = remodel

def __len__(self):
return len(self.raw_img)

def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()

picture = self.raw_img(idx)
masks = self.data_mask(idx)

pattern = {'picture': picture, 'masks': masks}

if self.remodel:
pattern = self.remodel(pattern)

return pattern

[ad_2]

]]>
http://chatgpz.de/machine-learning/umfassender-leitfaden-zu-datasets-und-dataloadern-in-pytorch-von-ryan-dcunha-juni-2024/feed/ 0 1676
Validierung der kausalen Auswirkungen der synthetischen Kontrollmethode | von Ryan O’Sullivan | Juni 2024 http://chatgpz.de/machine-learning/validierung-der-kausalen-auswirkungen-der-synthetischen-kontrollmethode-von-ryan-osullivan-juni-2024/ http://chatgpz.de/machine-learning/validierung-der-kausalen-auswirkungen-der-synthetischen-kontrollmethode-von-ryan-osullivan-juni-2024/#respond Sun, 09 Jun 2024 04:26:01 +0000 http://chatgpz.de/machine-learning/validierung-der-kausalen-auswirkungen-der-synthetischen-kontrollmethode-von-ryan-osullivan-juni-2024/ [ad_1]

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

[ad_2]

]]>
http://chatgpz.de/machine-learning/validierung-der-kausalen-auswirkungen-der-synthetischen-kontrollmethode-von-ryan-osullivan-juni-2024/feed/ 0 1273