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 perlu menggunakan solusi untuk menggunakan model regresi
Differential Privacy (DP) di dalam kueri aktivasi audiens di Ads Data Hub.
Contoh langkah demi langkah ini akan mengajarkan cara melakukan inferensi simulasi
untuk model regresi logistik biner dan linear yang sebenarnya, lalu membandingkan
hasilnya dengan ML.PREDICT
untuk menunjukkan akurasi hasil simulasi.
Bagian ini juga akan menunjukkan contoh praktis tentang cara membuat daftar audiens
dengan model logistik biner, yang akan digunakan dalam menerapkan model konversi
ke aktivasi audiens.
Ringkasan contoh:
- Membuat data
- Melatih model
- Mendapatkan bobot dan intersepsi
- Menyimulasikan prediksi
- Membandingkan hasil
Contoh langkah demi langkah
1. Membuat data
Buat tabel dengan data simulasi untuk melatih model. Menandai sebagian baris untuk kumpulan penangguhan.
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
Melatih 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 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 intersep
Dapatkan bobot dan intersep 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 |
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. Menyimulasikan prediksi
Regresi linear
Gunakan produk titik nilai fitur dengan bobot, dan tambahkan
intersep, untuk membuat prediksi menggunakan SQL standar tanpa menggunakan
ML.PREDICT
. Kueri ini membandingkan prediksi yang menggunakan teknik ini dengan
prediksi yang menggunakan ML.PREDICT
. Perhatikan bagaimana baris SQL tebal melakukan produk titik
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 tambahan 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 yang 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 yang dicetak tebal dalam kueri di atas melakukan perkalian titik 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 perkalian 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 nilai minimum 0,5 untuk mendapatkan prediksi regresi logistik biner 0, jika nilainya 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 multi-kelas. Dalam hal tersebut, bobot model akan berupa matriks nxn, bukan vektor, dan bobot akan berupa 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 harus menerapkan fungsi sigmoid ke setiap elemen array.
5. Membandingkan hasil
Regresi linear
Hasil sampel hampir sama, kecuali untuk error 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
sempurna - tidak ada satu pun kontradiksi dalam set holdback
baris 10 ribu. Ada beberapa baris yang ML.PREDICT
dan inferensi simulasi
tidak sesuai dengan label sebenarnya, dan hal itu diharapkan karena akurasi model
adalah sekitar 93%, dan ada nilai kecil tetapi bukan nol di 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 yang umum adalah membuat model regresi logistik biner dengan Differentially Private 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 berkonversi:
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;