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