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:
- Membuat data
- Melatih model
- Mendapatkan bobot dan titik potong
- Simulasikan prediksi
- 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;