Pemodelan regresi untuk daftar audiens

Anda dapat membuat prediksi menggunakan model regresi logistik atau linear yang sudah ada dengan bobot yang diketahui tanpa menggunakan ML.PREDICT, bahkan tanpa akses ke model itu sendiri. Untuk melakukannya, Anda harus menggunakan solusi untuk menggunakan privasi diferensial (DP) model regresi di dalam kueri aktivasi audiens di Ads Data Hub.

Contoh langkah demi langkah ini akan mengajari Anda cara melakukan simulasi inferensi untuk model regresi logistik linier dan biner aktual, lalu membandingkan hasil dengan nilai ML.PREDICT untuk menunjukkan akurasi hasil simulasi. Langkah ini juga akan menunjukkan contoh praktis tentang cara membuat daftar audiens dengan model logistik biner, yang akan digunakan dalam menerapkan model konversi hingga aktivasi audiens.

Ringkasan contoh:

  1. Membuat data
  2. Melatih model
  3. Mendapatkan bobot dan titik potong
  4. Simulasikan prediksi
  5. Membandingkan hasil

Contoh langkah demi langkah

1. Membuat data

Buat tabel dengan data simulasi untuk melatih model. Tandai pecahan dari baris untuk set holdback.

Regresi linear

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

Regresi logistik biner

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. Melatih model

Latih model regresi dari set pelatihan.

Regresi linear

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

Perhatikan bahwa kita telah menambahkan noise yang cukup ke data simulasi untuk mendapatkan model dengan R2 = 0,9009.

Pengukuran Nilai
Rata-rata error absolut 0,7359
Rataan kuadrat galat 0,8432
Rataan kuadrat error log 0,0810
Error absolut median 0,6239
R kuadrat 0,9009

Regresi logistik biner

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

Contoh hasil. Perhatikan akurasi 0,9260.

Pengukuran Nilai
Kelas positif 1
Kelas negatif 0
Presisi 0,0810
Recall 0,9315
Akurasi 0,9260
Skor F1 0,9328

Nilai yang dicetak tebal dalam matriks konfusi ini menunjukkan seberapa sering model tersebut diklasifikasikan setiap label dengan benar dan nilai non-tebal menunjukkan seberapa sering model salah diklasifikasikan setiap label.

Label benar Label 1 yang diprediksi Label 2 yang diprediksi
1 93% 7%
0 8% 92%

3. Mendapatkan bobot dan mencegat

Dapatkan bobot dan titik potong untuk model:

Regresi linear

SELECT
  *
FROM
  ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
bobot 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
ANTAR -4,1428754911504306

Regresi logistik biner

SELECT
  *
FROM
  ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
bobot 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
ANTAR -17,922169920

4. Simulasikan prediksi

Regresi linear

Gunakan perkalian titik dari nilai fitur dengan bobot, lalu tambahkan atribut mencegat, untuk membuat prediksi dengan menggunakan SQL standar tanpa menggunakan ML.PREDICT. Kueri ini membandingkan prediksi yang menggunakan teknik ini dengan mereka yang menggunakan ML.PREDICT. Perhatikan bagaimana baris SQL tebal melakukan fungsi titik perkalian nilai fitur untuk baris dengan bobot model, lalu tambahkan perpotongan tersebut.

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

Regresi logistik biner

Untuk regresi logistik biner, teknik untuk menyimulasikan prediksi adalah sangat mirip dengan regresi linier, dengan penambahan penerapan parameter sigmoid fungsi pada langkah terakhir dengan batas yang diinginkan.

Gunakan perkalian titik dari nilai fitur dengan bobot, lalu tambahkan atribut mencegat, untuk membuat prediksi menggunakan SQL standar tanpa menggunakan ML.PREDICT. Kemudian gunakan fungsi sigmoid dengan ambang batas 0,5 pada hasil untuk memprediksi antara 0 atau 1. Kueri ini membandingkan prediksi yang menggunakan teknik ini dengan prediksi menggunakan 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

Blok kode SQL yang dicetak tebal pada kueri di atas menjalankan produk titik nilai fitur untuk setiap baris dengan bobot model dan perpotongan untuk mendapatkan prediksi regresi linear:

IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)

Kemudian menerapkan fungsi sigmoid Y = 1 / (1+e^-z) ke perkalian titik dan mencegat, menggunakan SQL standar:

IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)

Terakhir, hasil fungsi sigmoid dibandingkan dengan nilai ambang batas dari 0,5 untuk mendapatkan prediksi regresi logistik biner sebesar 0, jika kurang dari 0,5, atau 1, jika tidak. Perhatikan bahwa Anda dapat menggunakan nilai minimum nilai antara 0 dan 1.

IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)

Teknik ini juga dapat diperluas ke regresi logistik multikelas. Di sana yang dipakai, bobot model akan berupa matriks nxn, bukan vektor, dan bobot akan menjadi vektor, bukan skalar. Anda akan melipatgandakan fitur vektor nilai dengan matriks bobot dan tambahkan vektor perpotongan. Tujuan vektor yang dihasilkan akan memiliki skor untuk setiap label, dan Anda dapat memilih label dengan skor tertinggi untuk prediksi Anda. Jika Anda ingin mengembalikan probabilitas, Anda akan menerapkan fungsi sigmoid ke setiap elemen .

5. Membandingkan hasil

Regresi linear

Hasil sampel hampir identik, kecuali untuk kesalahan pembulatan kecil.

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

Regresi logistik biner

Perbandingan inferensi simulasi dengan hasil aktual dari ML.PREDICT sempurna - bukan satu pun kontradiksi dalam penahanan baris 10 ribu atur. Ada beberapa baris dengan ML.PREDICT dan simulasi inferensi keduanya tidak setuju dengan label yang sebenarnya, dan hal ini diharapkan karena akurasi model adalah sekitar 93%, dan ada nilai-nilai kecil tapi bukan nol di sel di luar diagonal dari matriks konfusi.

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

Membuat daftar aktivasi audiens dengan ML

Kasus penggunaan yang umum adalah membuat logistik biner pribadi diferensial model regresi untuk memprediksi konversi, lalu menerapkan inferensi pada model ini saat membuat daftar audiens. Asumsikan bahwa model logistik biner dibuat pada contoh di atas adalah pemodelan konversi dan setiap baris dalam pelatihan dan evaluasi mewakili pengguna berbeda.

Kueri berikut menunjukkan cara membuat daftar audiens dengan pengguna yang yang diprediksi model akan mengonversi:

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;