يمكنك التنبؤ باستخدام نموذج الانحدار الخطي أو اللوجستي الحالي
ذات الأوزان المعروفة بدون استخدام ML.PREDICT
، حتى بدون الوصول إلى النموذج
نفسها. ولإجراء ذلك، عليك استخدام حل بديل لاستخدام الخيار "خاص التفاضلي"
نماذج الانحدار (DP) ضمن طلبات تفعيل الجمهور في Ads Data Hub.
سيعلّمك هذا المثال المفصّل كيفية تنفيذ الاستنتاج المحاكي.
لنماذج الانحدار اللوجستي الخطي والثنائي الفعلي، ثم مقارنة
نتائج البحث بقيمة ML.PREDICT
لإظهار دقة النتائج التي تمّت محاكاتها.
ستوضح أيضًا مثالاً عمليًا على كيفية إنشاء قائمة مستخدمين
من خلال نموذج لوجستي ثنائي سيتم استخدامه في تطبيق أحد نماذج الإحالات الناجحة
لتفعيل شرائح الجمهور
نظرة عامة على المثال:
- إنشاء البيانات
- تدريب النموذج
- الحصول على الوزن ونقطة التقاطع
- محاكاة عبارة التوقّع
- مقارنة النتائج
مثال خطوة بخطوة
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 |
اعتراض | -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 |
اعتراض | -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;