مدل سازی رگرسیون برای لیست مخاطبان

شما می توانید با استفاده از یک مدل رگرسیون خطی یا لجستیک موجود با وزن های شناخته شده بدون استفاده از ML.PREDICT پیش بینی کنید، حتی بدون دسترسی به خود مدل. برای انجام این کار، باید از راه‌حلی برای استفاده از مدل‌های رگرسیون خصوصی متفاوت (DP) در جستارهای فعال‌سازی مخاطب در Ads Data Hub استفاده کنید.

این مثال گام به گام به شما می آموزد که چگونه استنتاج شبیه سازی شده را برای مدل های رگرسیون لجستیک خطی و باینری واقعی انجام دهید، سپس نتایج را با نتایج ML.PREDICT مقایسه کنید تا دقت نتایج شبیه سازی شده را نشان دهید. همچنین یک مثال عملی از نحوه ایجاد یک لیست مخاطب با یک مدل لجستیک باینری را نشان می دهد که در اعمال یک مدل تبدیل برای فعال سازی مخاطب استفاده می شود.

مروری بر مثال:

  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

توجه داشته باشید که به اندازه کافی نویز به داده های شبیه سازی شده اضافه کرده ایم تا مدلی با R 2 = 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
ویژگی_1 1.8263055528635743
ویژگی_2 1.8143804404490813
ویژگی_3 1.8601204874033492
ویژگی_4 1.8507603439031859
ویژگی_5 1.7899764387123640
ویژگی_6 1.8645246630251291
feature_7 1.8698005281925356
ویژگی_8 1.7904637080330201
ویژگی_9 1.8036887855406274
feature_10 1.8117115890624449
رهگیری -4.1428754911504306

رگرسیون لجستیک باینری

SELECT
  *
FROM
  ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
وزن category_weights.category
ویژگی_1 3.823533928
ویژگی_2 3.734812819
ویژگی_3 3.842239823
ویژگی_4 3.785488823
ویژگی_5 3.737386716
ویژگی_6 3.567663961
feature_7 3.819643052
feature_8 3.734673763
ویژگی_9 3.839301406
feature_10 3.787306994
رهگیری -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 و 1 استفاده کنید.

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

این تکنیک ممکن است به رگرسیون لجستیک چند کلاسه نیز تعمیم یابد. در آن صورت، وزن های مدل به جای بردار، یک ماتریس nxn خواهند بود، و وزن ها به جای یک عدد اسکالر، بردار خواهند بود. شما می توانید بردار مقادیر ویژگی را در ماتریس وزن ضرب کنید و بردار قطع را اضافه کنید. بردار به دست آمده برای هر برچسب امتیازی دارد و شما می توانید برچسبی را با بالاترین امتیاز برای پیش بینی خود انتخاب کنید. اگر می‌خواهید یک آرایه احتمال را برگردانید، تابع سیگموئید را برای هر عنصر آرایه اعمال می‌کنید.

5. نتایج را مقایسه کنید

رگرسیون خطی

نتایج نمونه تقریباً یکسان هستند، به جز یک خطای کوچک گرد کردن.

برچسب_واقعی 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 کامل است - هیچ تناقضی در مجموعه بازدارنده ردیف 10k وجود ندارد. چند ردیف وجود دارد که هر دو ML.PREDICT و استنتاج شبیه سازی شده هر دو با برچسب واقعی مخالف هستند، و این انتظار می رود زیرا دقت مدل حدود 93٪ است و مقادیر کوچک اما غیر صفر در سلول های خارج از مورب وجود دارد. ماتریس سردرگمی

برچسب_واقعی ml_predicted_label sql_predicted_label شبیه سازی_دقیق است
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 ایجاد کنید

یک مورد استفاده معمولی ایجاد یک مدل رگرسیون لجستیک باینری خصوصی متفاوت برای پیش‌بینی تبدیل‌ها، سپس اعمال استنتاج بر روی این مدل در حین ایجاد فهرست مخاطبان است. فرض کنید که مدل لجستیک باینری ایجاد شده در مثال بالا، تبدیل‌های مدل‌سازی است و هر ردیف در مجموعه‌های آموزش و ارزیابی یک کاربر مجزا را نشان می‌دهد.

پرس و جوی زیر نشان می دهد که چگونه می توان یک لیست مخاطبین با آن دسته از کاربرانی که مدل پیش بینی می کند تبدیل کنند، ایجاد کرد:

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;