Puoi fare previsioni utilizzando un modello di regressione lineare o logistica esistente con ponderazioni note senza utilizzare ML.PREDICT
, anche senza accesso al modello stesso. A questo scopo, devi utilizzare una soluzione alternativa per l'utilizzo di modelli di regressione con privacy differenziata (DP) nelle query di attivazione di segmenti di pubblico in Ads Data Hub.
Questo esempio dettagliato ti insegnerà come eseguire l'inferenza simulata per i modelli di regressione logistica lineare e binaria effettiva e a confrontare i risultati con quelli di ML.PREDICT
per mostrare l'accuratezza dei risultati simulati.
Inoltre, mostrerà in pratica come creare un elenco del segmento di pubblico con un modello logistico binario, che verrà utilizzato per applicare un modello di conversione all'attivazione di segmenti di pubblico.
Panoramica dell'esempio;
- Genera i dati
- Addestra il modello
- Trova le ponderazioni e l'intercetta
- Simula la previsione
- Confronta i risultati
Esempio dettagliato
1. Genera i dati
Crea una tabella con dati simulati per l'addestramento del modello. Contrassegna una frazione delle righe per l'insieme di isolamento.
Regressione lineare
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
Regressione logistica binaria
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. Addestra il modello
Addestra un modello di regressione dal set di addestramento.
Regressione lineare
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
Tieni presente che abbiamo aggiunto una quantità sufficiente di rumore ai dati simulati per generare un modello con R2 = 0,9009.
Misurazione | Valore |
---|---|
Errore assoluto medio | 0,7359 |
Errore quadratico medio | 0,8432 |
Errore logaritmico quadratico medio | 0,0810 |
Errore medio assoluto | 0,6239 |
R al quadrato | 0,9009 |
Regressione logistica binaria
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
Risultati di esempio. Prendi nota dell'accuratezza di 0,9260.
Misurazione | Valore |
---|---|
Classe positiva | 1 |
Classe negativa | 0 |
Precisione | 0,0810 |
Richiamo | 0,9315 |
Accuratezza | 0,9260 |
Punteggio F1 | 0,9328 |
I valori in grassetto di questa matrice di confusione indicano la frequenza con cui il modello ha classificato correttamente ogni etichetta, mentre i valori non in grassetto indicano la frequenza con cui il modello ha classificato erroneamente ogni etichetta.
Etichetta effettiva | Etichetta prevista 1 | Etichetta prevista 2 |
---|---|---|
1 | 93% | 7% |
0 | 8% | 92% |
3. Trova le ponderazioni e l'intercetta
Trova le ponderazioni e l'intercetta per il modello:
Regressione lineare
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
ponderazione | 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 |
INTERCETTA | -4,1428754911504306 |
Regressione logistica binaria
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
ponderazione | 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 |
INTERCETTA | -17,922169920 |
4. Simula la previsione
Regressione lineare
Utilizza il prodotto scalare dei valori delle caratteristiche con le ponderazioni e aggiungi l'intercetta per eseguire la previsione mediante SQL standard senza utilizzare ML.PREDICT
. Questa query confronta le previsioni che utilizzano questa tecnica con quelle che utilizzano ML.PREDICT
. Osserva come le righe SQL in grassetto stanno eseguendo il prodotto scalare dei valori delle caratteristiche per la riga con le ponderazioni del modello, poi aggiungendo l'intercetta.
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
Regressione logistica binaria
Per la regressione logistica binaria, la tecnica per simulare le previsioni è molto simile alla regressione lineare, con l'aggiunta dell'applicazione della funzione sigmoide nell'ultimo passaggio con la soglia desiderata.
Utilizza il prodotto scalare dei valori delle caratteristiche con le ponderazioni e aggiungi l'intercetta per eseguire la previsione mediante SQL standard senza utilizzare ML.PREDICT
.
Poi usa la funzione sigmoide con una soglia di 0,5 nel risultato per prevedere 0 o 1. Questa query confronta le previsioni che utilizzano questa tecnica con quelle che utilizzano ML.PREDICT
.
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
Il blocco di codice SQL in grassetto nella query precedente esegue il prodotto scalare dei valori delle caratteristiche per ogni riga con le ponderazioni del modello e aggiunge l'intercetta per ottenere la previsione di regressione lineare:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Poi applica la funzione sigmoide Y = 1 / (1+e^-z)
al prodotto scalare e l'intercetta tramite l'SQL standard:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Infine, il risultato della funzione sigmoide viene confrontato con il valore di soglia di 0,5 per ottenere la previsione di regressione logistica binaria di 0, se è minore di 0,5 o di 1, in caso contrario. Tieni presente che puoi utilizzare qualsiasi valore di soglia compreso tra 0 e 1.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Questa tecnica può anche essere estesa alla regressione logistica multiclasse. In questo caso, le ponderazioni del modello saranno una matrice nxn, anziché un vettore, e le ponderazioni sarebbero un vettore anziché uno scalare. Puoi moltiplicare il vettore di valori delle caratteristiche per la matrice delle ponderazioni e aggiungere il vettore dell'intercetta. Il vettore risultante avrà un punteggio per ogni etichetta e potresti scegliere l'etichetta con il punteggio più alto per la previsione. Se vuoi restituire un array di probabilità, devi applicare la funzione sigmoide a ciascun elemento dell'array.
5. Confronta i risultati
Regressione lineare
I risultati di esempio sono quasi identici, tranne per un piccolo errore di arrotondamento.
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 |
Regressione logistica binaria
Il confronto dell'inferenza simulata con i risultati effettivi di ML.PREDICT
è perfetto, non una sola contraddizione nell'insieme di isolamento di 10.000 righe. Sono presenti alcune righe in cui sia ML.PREDICT
che l'inferenza simulata sono in disaccordo con l'etichetta effettiva e questo è previsto in quanto l'accuratezza del modello è di circa il 93% e sono presenti valori piccoli, ma diversi da zero, nelle celle fuori dalla diagonale della matrice di confusione.
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 |
Crea un elenco per l'attivazione di segmenti di pubblico con il machine learning
Un caso d'uso tipico è creare un modello di regressione logistica binaria con privacy differenziata (DP) per prevedere le conversioni e applicare un'inferenza su questo modello durante la creazione di un elenco del segmento di pubblico. Supponiamo che il modello di logistica binario creato nell'esempio precedente stia modellando le conversioni e che ogni riga negli insiemi di addestramento e valutazione rappresenti un utente distinto.
La seguente query mostra come creare un elenco del segmento di pubblico con gli utenti che, secondo le previsioni del modello, genereranno una conversione:
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;