Definizione del modello di regressione per gli elenchi dei segmenti di pubblico

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;

  1. Genera i dati
  2. Addestra il modello
  3. Trova le ponderazioni e l'intercetta
  4. Simula la previsione
  5. 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;