شما می توانید با استفاده از یک مدل رگرسیون خطی یا لجستیک موجود با وزن های شناخته شده بدون استفاده از 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
توجه داشته باشید که به اندازه کافی نویز به داده های شبیه سازی شده اضافه کرده ایم تا مدلی با 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 |
---|---|
feature_1 | 1.8263055528635743 |
ویژگی_2 | 1.8143804404490813 |
ویژگی_3 | 1.8601204874033492 |
ویژگی_4 | 1.8507603439031859 |
ویژگی_5 | 1.7899764387123640 |
ویژگی_6 | 1.8645246630251291 |
feature_7 | 1.8698005281925356 |
feature_8 | 1.7904637080330201 |
ویژگی_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 |
ویژگی_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 |
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 و 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;