โมเดลการถดถอยสําหรับรายการกลุ่มเป้าหมาย

คุณสามารถทำการคาดการณ์โดยใช้โมเดลการถดถอยเชิงเส้นหรือการถดถอยแบบโลจิสติกที่มีอยู่ พร้อมน้ำหนักที่ทราบโดยไม่ต้องใช้ ML.PREDICT แม้ว่าจะไม่มีสิทธิ์เข้าถึงโมเดลก็ตาม โดยคุณจะต้องใช้วิธีแก้ปัญหาชั่วคราวในการใช้โมเดลการถดถอยแบบส่วนตัวเชิงอนุพันธ์ (DP) ภายในคําค้นหาการเปิดใช้งานกลุ่มเป้าหมายใน Ads Data Hub

ตัวอย่างแบบทีละขั้นนี้จะสอนวิธีทำการอนุมานจำลอง สำหรับโมเดลการถดถอยเชิงเส้นและ​การถดถอยแบบโลจิสติก​แบบไบนารีจริง จากนั้นเปรียบเทียบ ผลลัพธ์กับผลลัพธ์ของ ML.PREDICT เพื่อแสดงความแม่นยำของผลลัพธ์จำลอง นอกจากนี้ยังจะแสดงตัวอย่างในทางปฏิบัติของวิธีสร้างรายการกลุ่มเป้าหมาย ด้วยโมเดลลอจิสติกไบนารี ซึ่งจะใช้ในการใช้โมเดล Conversion กับการเปิดใช้งานกลุ่มเป้าหมาย

ภาพรวมของตัวอย่าง

  1. สร้างข้อมูล
  2. ฝึกโมเดล
  3. รับน้ำหนักและสกัดกั้น
  4. จำลองการคาดการณ์
  5. เปรียบเทียบผลลัพธ์

ตัวอย่างทีละขั้นตอน

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

การถดถอยแบบโลจิสติกไบนารี

สําหรับการถดถอยแบบโลจิสติกแบบไบนารี เทคนิคในการจำลองการคาดการณ์จะคล้ายกับการถดถอยเชิงเส้นมาก โดยมีการเพิ่มฟังก์ชันซิกมอยด์ในขั้นตอนสุดท้ายที่มีเกณฑ์ที่ต้องการ

ใช้ผลคูณของค่าฟีเจอร์กับค่าถ่วงน้ำหนัก แล้วบวกค่าตัดแกนเพื่อทำการคาดการณ์โดยใช้ 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)

จากนั้นจะใช้ฟังก์ชันซิคมอยด์ Y = 1 / (1+e^-z) กับผลคูณจุด และค่าสกัดกั้นโดยใช้ SQL มาตรฐาน

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

สุดท้ายนี้ ระบบจะเปรียบเทียบผลลัพธ์ของฟังก์ชันซิกมอยด์กับค่าเกณฑ์ที่ 0.5 เพื่อให้ได้การคาดการณ์การถดถอยแบบโลจิสติกแบบไบนารีเป็น 0 หากค่าน้อยกว่า 0.5 หรือ 1 หากค่าไม่น้อยกว่า 0.5 โปรดทราบว่าคุณใช้ค่าเกณฑ์ใดก็ได้ระหว่าง 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 แถว มีบางแถวที่ทั้ง 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

กรณีการใช้งานทั่วไปคือการสร้างโมเดลการถดถอยโลจิสติกแบบไบนารีที่รักษาความเป็นส่วนตัวแบบแตกต่างเพื่อคาดการณ์ 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;