คุณทําการคาดการณ์ได้โดยใช้โมเดลการถดถอยเชิงเส้นหรือเชิงลอจิสติกที่มีอยู่ซึ่งมีน้ำหนักที่ทราบโดยไม่ต้องใช้ ML.PREDICT
และแม้จะไม่มีสิทธิ์เข้าถึงโมเดลก็ตาม ในการดําเนินการดังกล่าว คุณต้องใช้วิธีแก้ปัญหาสําหรับการใช้โมเดลการถดถอยแบบ Differentially Private (DP) ภายในการค้นหาการเปิดใช้งานกลุ่มเป้าหมายใน Ads Data Hub
ตัวอย่างแบบทีละขั้นตอนนี้จะสอนวิธีทําการอนุมานแบบจําลองสําหรับโมเดลการถดถอยเชิงเส้นและโลจิสติกแบบไบนารีจริง จากนั้นเปรียบเทียบผลลัพธ์กับของ ML.PREDICT
เพื่อแสดงความแม่นยําของผลลัพธ์ที่จําลอง
รวมถึงจะสาธิตตัวอย่างที่ใช้งานได้จริงเกี่ยวกับวิธีสร้างรายการกลุ่มเป้าหมายด้วยโมเดลโลจิสติกแบบไบนารี ซึ่งจะใช้ในการใช้รูปแบบ Conversion กับการเปิดใช้งานกลุ่มเป้าหมาย
ภาพรวมของตัวอย่าง
- สร้างข้อมูล
- ฝึกโมเดล
- รับน้ำหนักและค่าคงที่
- จำลองการคาดการณ์
- เปรียบเทียบผลลัพธ์
ตัวอย่างแบบทีละขั้นตอน
1. สร้างข้อมูล
สร้างตารางที่มีข้อมูลจําลองสําหรับการฝึกโมเดล ทําเครื่องหมายเศษส่วนของแถวสําหรับชุดการคงไว้ชั่วคราว
การถดถอยเชิงเส้น
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
การถดถอยแบบโลจิสติกแบบไบนารี
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. ฝึกโมเดล
ฝึกโมเดลการถดถอยจากชุดข้อมูลการฝึก
การถดถอยเชิงเส้น
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
โปรดทราบว่าเราได้เพิ่มข้อมูลรบกวนลงในข้อมูลที่จําลองมากพอเพื่อให้ได้โมเดลที่มีค่า R2 = 0.9009
การวัดผล | ค่า |
---|---|
ค่าเฉลี่ยความผิดพลาดสัมบูรณ์ | 0.7359 |
ความคลาดเคลื่อนเฉลี่ยกำลังสอง | 0.8432 |
ค่าเฉลี่ยความผิดพลาดของบันทึกกำลังสอง | 0.0810 |
ค่ามัธยฐานความผิดพลาดสัมบูรณ์ | 0.6239 |
ค่า R ยกกำลังสอง | 0.9009 |
การถดถอยแบบโลจิสติกแบบไบนารี
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
ตัวอย่างผลลัพธ์ โปรดสังเกตความแม่นยำ 0.9260
การวัดผล | ค่า |
---|---|
คลาสที่เป็นบวก | 1 |
คลาสที่เป็นลบ | 0 |
ความแม่นยำ | 0.0810 |
การจดจำ | 0.9315 |
ความแม่นยำ | 0.9260 |
คะแนน F1 | 0.9328 |
ค่าที่เป็นตัวหนาในเมทริกซ์ความสับสนนี้แสดงความถี่ที่โมเดลจัดหมวดหมู่ป้ายกำกับแต่ละรายการอย่างถูกต้อง และค่าที่ไม่เป็นตัวหนาแสดงความถี่ที่โมเดลจัดหมวดหมู่ป้ายกำกับแต่ละรายการไม่ถูกต้อง
ป้ายกำกับจริง | ป้ายกำกับที่คาดการณ์ 1 | ป้ายกำกับที่คาดการณ์ 2 |
---|---|---|
1 | 93% | 7% |
0 | 8% | 92% |
3. รับน้ำหนักและค่าคงที่
รับน้ำหนักและค่าคงที่ของโมเดล
การถดถอยเชิงเส้น
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
น้ำหนัก | 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 |
การถดถอยแบบโลจิสติกแบบไบนารี
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
น้ำหนัก | 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. จำลองการคาดการณ์
การถดถอยเชิงเส้น
ใช้ผลคูณจุดของค่าฟีเจอร์กับน้ำหนัก แล้วเพิ่มค่าคงที่เพื่อทำการคาดการณ์โดยใช้ SQL มาตรฐานโดยไม่ต้องใช้ ML.PREDICT
การค้นหานี้จะเปรียบเทียบการคาดการณ์โดยใช้เทคนิคนี้กับการคาดการณ์ที่ใช้ ML.PREDICT
โปรดสังเกตว่าบรรทัด SQL ตัวหนาทําการคูณจุดของค่าฟีเจอร์สําหรับแถวที่มีน้ำหนักโมเดล แล้วเพิ่มค่าคงที่
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
การถดถอยแบบโลจิสติกแบบไบนารี
สําหรับการถดถอยเชิงสถิติแบบโลจิสติกแบบ 2 ค่า เทคนิคการจําลองการคาดการณ์จะคล้ายกับวิธีการถดถอยเชิงเส้นมาก เพียงแต่เพิ่มการใช้ฟังก์ชัน Sigmoid ในขั้นตอนสุดท้ายด้วยเกณฑ์ที่ต้องการ
ใช้ผลคูณจุดของค่าฟีเจอร์กับน้ำหนัก แล้วเพิ่มค่าคงที่เพื่อทำการคาดการณ์โดยใช้ SQL มาตรฐานโดยไม่ต้องใช้ ML.PREDICT
จากนั้นใช้ฟังก์ชัน Sigmoid ที่มีเกณฑ์ 0.5 ในผลลัพธ์เพื่อคาดการณ์ว่าค่าจะเป็น 0 หรือ 1 การค้นหานี้จะเปรียบเทียบการคาดการณ์โดยใช้เทคนิคนี้กับการคาดการณ์ที่ใช้ 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
บล็อกโค้ด SQL ตัวหนาในการค้นหาข้างต้นจะทําการคูณจุดของค่าฟีเจอร์สําหรับแต่ละแถวด้วยน้ำหนักของโมเดล และเพิ่มค่าตัดขวางเพื่อรับการคาดการณ์การถดถอยเชิงเส้น
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
จากนั้นนําฟังก์ชัน Sigmoid Y = 1 / (1+e^-z)
ไปใช้กับผลคูณจุด และตัดยอดโดยใช้ SQL มาตรฐาน
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
สุดท้าย ระบบจะเปรียบเทียบผลลัพธ์ของฟังก์ชัน Sigmoid กับค่าเกณฑ์ 0.5 เพื่อหาการคาดการณ์การถดถอยเชิงเส้นโลจิสติกแบบ 2 ค่า ซึ่งจะเป็น 0 หากค่าน้อยกว่า 0.5 หรือ 1 หากไม่ใช่ โปรดทราบว่าคุณใช้เกณฑ์ค่าใดก็ได้ระหว่าง 0 ถึง 1
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
เทคนิคนี้ยังอาจขยายไปใช้กับโลจิสติกส์รีเกรชันหลายคลาสได้ด้วย ในกรณีนี้ น้ำหนักของโมเดลจะเป็นเมทริกซ์ nxn ไม่ใช่เวกเตอร์ และน้ำหนักจะเป็นเวกเตอร์ ไม่ใช่สเกลาร์ คุณจะคูณเวกเตอร์ค่าของฟีเจอร์ด้วยเมทริกซ์น้ำหนัก แล้วเพิ่มเวกเตอร์การตีความ เวกเตอร์ที่ได้จะมีคะแนนสำหรับแต่ละป้ายกำกับ และคุณเลือกป้ายกำกับที่มีคะแนนสูงสุดสำหรับการคาดการณ์ได้ หากต้องการแสดงผลอาร์เรย์ความน่าจะเป็น คุณต้องใช้ฟังก์ชัน Sigmoid กับองค์ประกอบแต่ละรายการของอาร์เรย์
5. เปรียบเทียบผลลัพธ์
การถดถอยเชิงเส้น
ผลลัพธ์ตัวอย่างเกือบจะเหมือนกัน ยกเว้นข้อผิดพลาดในการปัดเศษเล็กน้อย
actual_label | ml_predicted_label | sql_predicted_label | diff_is_negligible |
---|---|---|---|
6 | 5.2062349420751834 | 5.2062349420751826 | จริง |
0 | 0.40318472770048075 | 0.403184727700479 | จริง |
3 | 3.0703766078249597 | 3.0703766078249597 | จริง |
7 | 7.0588171538562 | 7.0588171538562 | จริง |
6 | 6.7802375930646 | 6.7802375930646 | จริง |
6 | 5.1088569571339368 | 5.1088569571339377 | จริง |
4 | 4.051839078116874 | 4.051839078116874 | จริง |
4 | 5.1810254680219243 | 5.1810254680219234 | จริง |
6 | 6.1440349466401223 | 6.1440349466401205 | จริง |
1 | 2.0842399472783519 | 2.0842399472783519 | จริง |
2 | 2.1911209811886847 | 2.1911209811886838 | จริง |
3 | 3.0236086790006622 | 3.0236086790006613 | จริง |
2 | 2.573083132964213 | 2.5730831329642125 | จริง |
7 | 5.68662973136732 | 5.6866297313673186 | จริง |
9 | 8.1860026312677938 | 8.1860026312677938 | จริง |
การถดถอยแบบโลจิสติกแบบไบนารี
การเปรียบเทียบการอนุมานแบบจําลองกับผลลัพธ์จริงของ ML.PREDICT
นั้นสมบูรณ์แบบ ไม่มีความขัดแย้งแม้แต่รายการเดียวในชุดข้อมูลการกันไว้ 10,000 แถว มี 2-3 แถวที่ทั้ง ML.PREDICT
และการอนุมานแบบจําลองไม่ตรงกับป้ายกำกับจริง ซึ่งเป็นสิ่งที่คาดไว้เนื่องจากความแม่นยําของโมเดลอยู่ที่ประมาณ 93% และมีค่าเล็กๆ น้อยๆ แต่ไม่เท่ากับ 0 ในเซลล์นอกเส้นทแยงมุมของเมทริกซ์ความสับสน
actual_label | ml_predicted_label | sql_predicted_label | simulation_is_accurate |
---|---|---|---|
0 | 1 | 1 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 0 | 0 | จริง |
0 | 1 | 1 | จริง |
0 | 0 | 0 | จริง |
สร้างรายการการเปิดใช้งานกลุ่มเป้าหมายด้วย ML
กรณีการใช้งานทั่วไปคือการสร้างโมเดลการถดถอยเชิงโลจิสติกแบบ 2 ค่าที่มีการปกปิดข้อมูลส่วนเกินเพื่อคาดการณ์ Conversion จากนั้นนําการอนุมานไปใช้กับโมเดลนี้ขณะสร้างรายการกลุ่มเป้าหมาย สมมติว่าโมเดลโลจิสติกแบบไบนารีที่สร้างในตัวอย่างด้านบนเป็นการประมาณ Conversion และแต่ละแถวในชุดการฝึกและชุดการประเมินแสดงถึงผู้ใช้ที่แตกต่างกัน
คําค้นหาต่อไปนี้แสดงวิธีสร้างรายการกลุ่มเป้าหมายที่มีผู้ใช้ที่โมเดลคาดการณ์ว่าจะทำ Conversion
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;