وضع نماذج للانحدار لقوائم المستخدمين

يمكنك إجراء توقّعات باستخدام نموذج انحدار خطي أو لوجستي حالي بأوزان معروفة بدون استخدام ML.PREDICT، حتى بدون الوصول إلى النموذج نفسه. ولإجراء ذلك، عليك استخدام حلّ بديل لاستخدام نماذج الانحدار المتعلّقة بالخصوصية التفاضلية (DP) داخل طلبات بحث تفعيل شرائح الجمهور في "مركز بيانات الإعلانات".

سيعلّمك هذا المثال المفصّل كيفية إجراء الاستنتاج المحاكي لنمذجَي الانحدار الخطي والانحدار اللوجستي الثنائي الفعليين، ثم مقارنة النتائج بنتائج 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

يُرجى العِلم أنّنا أضفنا قدرًا كافيًا من التشويش إلى البيانات المحاكية للحصول على نموذج يضمّ R2 = 0.9009.

القياس القيمة
متوسّط الخطأ المطلق 0.7359
الخطأ التربيعي المتوسّط 0.8432
متوسّط الخطأ التربيعي للسجلّ 0.0810
متوسّط الخطأ المطلق 0.6239
مُعامل التحديد 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. بعد ذلك، استخدِم الدالة السينية مع حدّ أدنى يبلغ 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- مقارنة النتائج

الانحدار الخطّي

نتائج العيّنة متطابقة تقريبًا، باستثناء خطأ بسيط في التقريب.

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 آلاف صف. هناك بضعة صفوف لا يتفق فيها كلّ من ML.PREDICT والاستنتاج المحاكي مع التصنيف الفعلي، وهذا أمر متوقّع لأنّ دقة النموذج تبلغ حوالي %93، وهناك قيم صغيرة ولكنّها غير صفرية في الخلايا غير القطرية لمصفّحة الارتباك.

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 صحيح

إنشاء قائمة تنشيط جمهور باستخدام الذكاء الاصطناعي

ومن حالات الاستخدام الشائعة إنشاء نموذج انحدار لاجوسيتي ثنائي بخصوصية مختلفة لتنبؤ الإحالات الناجحة، ثم تطبيق الاستنتاج على هذا النموذج أثناء إنشاء قائمة جمهور. لنفترض أنّ النموذج اللوجستي الثنائي الذي تم إنشاؤه في المثال أعلاه ينشئ نماذج للإحالات الناجحة وأنّ كل صف في مجموعتَي التدريب والتقييم يمثّل مستخدمًا مختلفًا.

يوضّح الطلب التالي كيفية إنشاء قائمة جمهور تتضمّن المستخدمين الذين يتوقع النموذج أن يُجروا إحالات ناجحة:

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;