Anda dapat membuat prediksi menggunakan model regresi linear atau logistik yang ada
dengan bobot yang diketahui tanpa menggunakan ML.PREDICT, bahkan tanpa akses ke model
itu sendiri. Untuk melakukannya, Anda harus menggunakan solusi sementara untuk menggunakan model regresi dengan privasi diferensial (DP) di dalam kueri aktivasi audiens di Ads Data Hub.
Contoh langkah demi langkah ini akan mengajarkan cara melakukan inferensi yang disimulasikan untuk model regresi logistik biner dan linear yang sebenarnya, lalu membandingkan hasilnya dengan ML.PREDICT untuk menunjukkan akurasi hasil yang disimulasikan.
Codelab ini juga akan menunjukkan contoh praktis cara membuat daftar audiens dengan model logistik biner, yang akan digunakan dalam menerapkan model konversi ke aktivasi audiens.
Ringkasan contoh:
- Buat data
- Melatih model
- Mendapatkan bobot dan mencegat
- Simulasikan prediksi
- Membandingkan hasil
Contoh langkah demi langkah
1. Buat data
Buat tabel dengan data simulasi untuk melatih model. Tandai sebagian baris untuk set penahanan.
Regresi linier
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 linier
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 kami telah menambahkan derau 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 tebal dalam matriks konfusi ini menunjukkan seberapa sering model mengklasifikasikan setiap label dengan benar dan nilai tidak tebal menunjukkan seberapa sering model salah mengklasifikasikan setiap label.
| Label benar | Label yang diprediksi 1 | Label yang diprediksi 2 |
|---|---|---|
| 1 | 93% | 7% |
| 0 | 8% | 92% |
3. Mendapatkan bobot dan mencegat
Dapatkan bobot dan intersep untuk model:
Regresi linier
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 |
| INTERCEPT | -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 |
| INTERCEPT | -17,922169920 |
4. Simulasikan prediksi
Regresi linier
Gunakan produk titik nilai fitur dengan bobot, dan tambahkan
intersep, untuk membuat prediksi menggunakan SQL standar tanpa menggunakan
ML.PREDICT. Kueri ini membandingkan prediksi menggunakan teknik ini dengan
prediksi yang menggunakan ML.PREDICT. Perhatikan bagaimana baris SQL tebal melakukan produk
titik dari nilai fitur untuk baris dengan bobot model, lalu menambahkan
intersep.
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 sangat mirip dengan regresi linear, dengan penambahan penerapan fungsi sigmoid pada langkah terakhir dengan nilai minimum yang diinginkan.
Gunakan produk titik nilai fitur dengan bobot, dan tambahkan intersep, untuk membuat prediksi menggunakan SQL standar tanpa menggunakan ML.PREDICT.
Kemudian, gunakan fungsi sigmoid dengan nilai minimum 0,5 pada hasil untuk memprediksi
0 atau 1. Kueri ini membandingkan prediksi menggunakan teknik ini dengan prediksi yang 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 dengan huruf tebal dalam kueri di atas melakukan produk titik dari nilai fitur untuk setiap baris dengan bobot model dan menambahkan intersep untuk mendapatkan prediksi regresi linear:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Kemudian, fungsi sigmoid Y = 1 / (1+e^-z) diterapkan ke produk titik
dan intersep, menggunakan SQL standar:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Terakhir, hasil fungsi sigmoid dibandingkan dengan nilai batas 0,5 untuk mendapatkan prediksi regresi logistik biner 0, jika kurang dari 0,5, atau 1, jika tidak. Perhatikan bahwa Anda dapat menggunakan nilai batas 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. Dalam kasus tersebut, bobot model akan menjadi matriks nxn, bukan vektor, dan bobot akan menjadi vektor, bukan skalar. Anda akan mengalikan vektor nilai fitur dengan matriks bobot dan menambahkan vektor intersep. Vektor yang dihasilkan akan memiliki skor untuk setiap label, dan Anda dapat memilih label dengan skor tertinggi untuk prediksi Anda. Jika ingin menampilkan array probabilitas, Anda akan menerapkan fungsi sigmoid ke setiap elemen array.
5. Membandingkan hasil
Regresi linier
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 sebenarnya dari
ML.PREDICT sangat sempurna - tidak ada satu pun kontradiksi dalam set penahanan 10 ribu baris. Ada beberapa baris tempat ML.PREDICT dan inferensi simulasi
tidak sesuai dengan label sebenarnya, dan hal ini sudah diperkirakan karena akurasi model
sekitar 93%, dan ada nilai kecil tetapi bukan nol dalam sel di luar diagonal
matriks kebingungan.
| 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 umum adalah membuat model regresi logistik biner yang berbeda secara privat untuk memprediksi konversi, lalu menerapkan inferensi pada model ini saat membuat daftar audiens. Asumsikan bahwa model logistik biner yang dibuat dalam contoh di atas memodelkan konversi dan setiap baris dalam set pelatihan dan evaluasi mewakili pengguna yang berbeda.
Kueri berikut menunjukkan cara membuat daftar audiens dengan pengguna yang diprediksi model akan melakukan konversi:
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;