Mithilfe eines vorhandenen linearen oder logistischen Regressionsmodells mit bekannten Gewichten sind Vorhersagen möglich, ohne dass ML.PREDICT
verwendet werden muss und ohne dass Zugriff auf das Modell selbst erforderlich ist. Dazu benötigen Sie eine Behelfslösung für die Verwendung von Regressionsmodellen, die den Anforderungen des differenzierten Datenschutzes (Differential Privacy, DP) entsprechen, in Zielgruppenaktivierungsabfragen in Ads Data Hub.
In dieser detaillierten Anleitung erfahren Sie, wie Sie eine simulierte Inferenz für reale lineare und binäre logistische Regressionsmodelle ausführen und dann die Ergebnisse mit denen von ML.PREDICT
vergleichen, um die Genauigkeit (Accuracy) der simulierten Ergebnisse zu überprüfen.
Außerdem wird anhand eines praktischen Beispiels gezeigt, wie Sie eine Zielgruppenliste mit einem binären logistischen Modell erstellen, das zum Anwenden eines Conversion-Modells auf die Zielgruppenaktivierung verwendet wird.
Das Beispiel im Überblick:
- Daten generieren
- Modell trainieren
- Gewichte und Achsenabschnitt erhalten
- Vorhersage simulieren
- Ergebnisse vergleichen
Detaillierte Anleitung
1. Daten generieren
Erstellen Sie eine Tabelle mit simulierten Daten zum Trainieren des Modells. Markieren Sie einen Teil der Zeilen für das Holdback.
Lineare Regression
CREATE OR REPLACE TABLE DATASET_NAME.LIN_REG_TRAINING_SET AS
WITH
A AS (
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(1, 100000)) AS row_number),
B AS (
SELECT
row_number,
RAND() AS rand_label,
RAND() AS rand_feature_1,
RAND() AS rand_feature_2,
RAND() AS rand_feature_3,
RAND() AS rand_feature_4,
RAND() AS rand_feature_5,
RAND() AS rand_feature_6,
RAND() AS rand_feature_7,
RAND() AS rand_feature_8,
RAND() AS rand_feature_9,
RAND() AS rand_feature_10
FROM
A),
C AS (
SELECT
rand_label AS label,
*
FROM
B),
D AS (
SELECT
row_number,
CAST(round(10 * label) AS INT64) AS label,
(rand_label + rand_feature_1) / 2 AS feature_1,
(rand_label + rand_feature_2) / 2 AS feature_2,
(rand_label + rand_feature_3) / 2 AS feature_3,
(rand_label + rand_feature_4) / 2 AS feature_4,
(rand_label + rand_feature_5) / 2 AS feature_5,
(rand_label + rand_feature_6) / 2 AS feature_6,
(rand_label + rand_feature_7) / 2 AS feature_7,
(rand_label + rand_feature_8) / 2 AS feature_8,
(rand_label + rand_feature_9) / 2 AS feature_9,
(rand_label + rand_feature_10) / 2 AS feature_10
FROM
C)
SELECT
label,
feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10,
RAND() < 0.1 AS holdback -- Ten percent will be true.
FROM
D
Binäre logistische Regression
SELECT
CASE
WHEN label < 5 THEN 0
WHEN label >= 5 THEN 1
END
AS label,
* EXCEPT (label)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
2. Modell trainieren
Trainieren Sie ein Regressionsmodell mit den Trainingsdaten.
Lineare Regression
CREATE OR REPLACE MODEL `DATASET_NAME.LIN_REG_MODEL` OPTIONS (model_type="linear_reg") AS
SELECT
* except (holdback)
FROM
`DATASET_NAME.LIN_REG_TRAINING_SET`
WHERE
NOT holdback
Die simulierten Daten wurden ausreichend verzerrt, um ein Modell mit R2 = 0,9009 zu erhalten.
Messung | Wert |
---|---|
Mittlere absolute Abweichung | 0,7359 |
Mittlere quadratische Abweichung | 0,8432 |
Quadratischer Mittelwert der logarithmischen Abweichung | 0,0810 |
Medianwert der absoluten Abweichung | 0,6239 |
R-Quadrat | 0,9009 |
Binäre logistische Regression
CREATE OR REPLACE MODEL `DATASET_NAME.BIN_LOG_REG_MODEL` OPTIONS (model_type="logistic_reg") AS
SELECT
* EXCEPT (holdback)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
NOT holdback
Die Beispielergebnisse weisen eine Accuracy von 0,9260 auf.
Messung | Wert |
---|---|
Positive Klasse | 1 |
Negative Klasse | 0 |
Precision | 0,0810 |
Recall | 0,9315 |
Accuracy | 0,9260 |
F1-Wert | 0,9328 |
Die fett gedruckten Werte in dieser Wahrheitsmatrix geben an, wie oft das Modell jedes Label korrekt klassifiziert hat. Die Werte, die nicht fett formatiert sind, geben an, wie oft das Modell jedes Label falsch klassifiziert hat.
Tatsächliches Label | Vorhergesagtes Label 1 | Vorhergesagtes Label 2 |
---|---|---|
1 | 93 % | 7 % |
0 | 8 % | 92 % |
3. Gewichte und Achsenabschnitt erhalten
So erhalten Sie die Gewichte und den Achsenabschnitt (Intercept) für das Modell:
Lineare Regression
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
weight | category_weights.category |
---|---|
feature_1 | 1.8263055528635743 |
feature_2 | 1.8143804404490813 |
feature_3 | 1.8601204874033492 |
feature_4 | 1.8507603439031859 |
feature_5 | 1.7899764387123640 |
feature_6 | 1.8645246630251291 |
feature_7 | 1.8698005281925356 |
feature_8 | 1.7904637080330201 |
feature_9 | 1.8036887855406274 |
feature_10 | 1.8117115890624449 |
INTERCEPT | -4.1428754911504306 |
Binäre logistische Regression
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
weight | category_weights.category |
---|---|
feature_1 | 3.823533928 |
feature_2 | 3.734812819 |
feature_3 | 3.842239823 |
feature_4 | 3.785488823 |
feature_5 | 3.737386716 |
feature_6 | 3.567663961 |
feature_7 | 3.819643052 |
feature_8 | 3.734673763 |
feature_9 | 3.839301406 |
feature_10 | 3.787306994 |
INTERCEPT | -17.922169920 |
4. Vorhersage simulieren
Lineare Regression
Verwenden Sie das Skalarprodukt der Featurewerte mit den Gewichten und addieren Sie den Achsenabschnitt, um die Vorhersage mithilfe von Standard-SQL ohne ML.PREDICT
zu erstellen. Bei dieser Abfrage werden die Vorhersagen, für die dieses Verfahren verwendet wird, mit denen mit ML.PREDICT
verglichen. Beachten Sie, wie die fett gedruckten SQL-Zeilen das Skalarprodukt der Featurewerte für die Zeile mit den Modellgewichten berechnen und dann den Achsenabschnitt addieren.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[1.8263055528635743,
1.8143804404490813,
1.8601204874033492,
1.8507603439031859,
1.789976438712364,
1.8645246630251291,
1.8698005281925356,
1.7904637080330201,
1.8036887855406274,
1.8117115890624449] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.LIN_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.LIN_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
SUM(element1 * element2) - 4.1428754911504306
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ABS(ml_predicted_label - sql_predicted_label) < 0.00000000001 AS diff_is_negligible
FROM
P
Binäre logistische Regression
Das Verfahren zur Simulation der Vorhersagen bei der binären logistischen Regression ähnelt stark dem der linearen Regression, zusätzlich wird im letzten Schritt jedoch die Sigmoidfunktion mit dem gewünschten Grenzwert angewendet.
Verwenden Sie das Skalarprodukt der Featurewerte mit den Gewichten und addieren Sie den Achsenabschnitt, um die Vorhersage mithilfe von Standard-SQL ohne ML.PREDICT
zu erstellen.
Verwenden Sie dann die Sigmoidfunktion mit einem Schwellenwert von 0,5 für das Ergebnis, um entweder 0 oder 1 vorherzusagen. Bei dieser Abfrage werden die Vorhersagen, für die dieses Verfahren verwendet wird, mit denen mit ML.PREDICT
verglichen.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ml_predicted_label = sql_predicted_label AS simulation_is_accurate
FROM
P
Der fett gedruckte SQL-Codeblock in der Abfrage oben berechnet das Skalarprodukt der Featurewerte für jede Zeile mit den Gewichten des Modells und addiert den Achsenabschnitt, um die Vorhersage der linearen Regression zu erhalten:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Dann wird die Sigmoidfunktion Y = 1 / (1+e^-z)
mithilfe von Standard-SQL auf das Skalarprodukt und den Achsenabschnitt angewendet:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Zum Schluss wird das Ergebnis der Sigmoidfunktion mit dem Grenzwert von 0,5 verglichen, um eine Vorhersage für die binäre logistische Regression zu erhalten, die bei einem Wert von weniger als 0,5 gleich 0 und bei einem anderen Wert gleich 1 ist. Sie können einen beliebigen Grenzwert zwischen 0 und 1 verwenden.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Dieses Verfahren kann auch für die logistische Regression mit mehreren Klassen verwendet werden. In diesem Fall sind die Gewichte des Modells keine Vektoren, sondern eine nxn-Matrix, und die Gewichte sind Vektoren und keine Skalare. Sie würden den Vektor der Featurewerte mit der Gewichtsmatrix multiplizieren und den Vektor für den Achsenabschnitt addieren. Der resultierende Vektor würde für jedes Label einen Wert enthalten und Sie könnten das Label mit dem höchsten Wert für Ihre Vorhersage auswählen. Wenn ein Wahrscheinlichkeitsarray zurückgegeben werden soll, wird die Sigmoidfunktion auf jedes Element des Arrays angewendet.
5. Ergebnisse vergleichen
Lineare Regression
Bis auf einen kleinen Rundungsfehler sind die Beispielergebnisse fast identisch.
actual_label | ml_predicted_label | sql_predicted_label | diff_is_negligible |
---|---|---|---|
6 | 5.2062349420751834 | 5.2062349420751826 | true |
0 | 0.40318472770048075 | 0.403184727700479 | true |
3 | 3.0703766078249597 | 3.0703766078249597 | true |
7 | 7.0588171538562 | 7.0588171538562 | true |
6 | 6.7802375930646 | 6.7802375930646 | true |
6 | 5.1088569571339368 | 5.1088569571339377 | true |
4 | 4.051839078116874 | 4.051839078116874 | true |
4 | 5.1810254680219243 | 5.1810254680219234 | true |
6 | 6.1440349466401223 | 6.1440349466401205 | true |
1 | 2.0842399472783519 | 2.0842399472783519 | true |
2 | 2.1911209811886847 | 2.1911209811886838 | true |
3 | 3.0236086790006622 | 3.0236086790006613 | true |
2 | 2.573083132964213 | 2.5730831329642125 | true |
7 | 5.68662973136732 | 5.6866297313673186 | true |
9 | 8.1860026312677938 | 8.1860026312677938 | true |
Binäre logistische Regression
Der Vergleich der simulierten Inferenz mit den tatsächlichen Ergebnissen von ML.PREDICT
ist perfekt – kein einziger Widerspruch in den 10.000 Holdback-Zeilen. Es gibt einige Zeilen, in denen sowohl ML.PREDICT
als auch die simulierte Inferenz nicht mit dem tatsächlichen Label übereinstimmen. Dies ist zu erwarten, da die Modellgenauigkeit etwa 93 % beträgt und es in den Zellen außerhalb der Hauptdiagonalen der Wahrheitsmatrix kleine Werte gibt, die nicht 0 sind.
actual_label | ml_predicted_label | sql_predicted_label | simulation_is_accurate |
---|---|---|---|
0 | 1 | 1 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 0 | 0 | true |
0 | 1 | 1 | true |
0 | 0 | 0 | true |
Zielgruppenaktivierungslisten mit ML erstellen
Ein typischer Anwendungsfall wäre die Erstellung eines binären logistischen Regressionsmodells zur Vorhersage von Conversions, das den Anforderungen des differenzierten Datenschutzes entspricht. Die Vorhersagen des Modells werden dann beim Erstellen einer Zielgruppenlisten verwendet. Nehmen wir an, dass das binäre logistische Modell, das im Beispiel oben erstellt wurde, Conversions vorhersagt und dass jede Zeile in den Trainings- und Auswertungsdaten einen bestimmten Nutzer repräsentiert.
In der folgenden Abfrage sehen Sie, wie Sie eine Zielgruppenliste mit den Nutzern erstellen, die laut dem Modell eine Conversion ausführen werden:
WITH
T AS (
SELECT
*,
label AS actual_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
holdback),
P AS (
SELECT
*,
(
SELECT
IF
((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) predicted_label,
features,
weights
FROM
T),
SELECT
user_id
FROM
P
WHERE
predicted_label = 1;