شما میتوانید با استفاده از یک مدل رگرسیون خطی یا لجستیک موجود با وزنهای شناختهشده و بدون استفاده از ML.PREDICT ، حتی بدون دسترسی به خود مدل، پیشبینیهایی انجام دهید. برای انجام این کار، باید از یک راه حل برای استفاده از مدلهای رگرسیون خصوصی تفاضلی (DP) در داخل کوئریهای فعالسازی مخاطب در Ads Data Hub استفاده کنید.
این مثال گام به گام به شما آموزش میدهد که چگونه استنتاج شبیهسازی شده را برای مدلهای رگرسیون لجستیک خطی و دودویی واقعی انجام دهید، سپس نتایج را با نتایج ML.PREDICT مقایسه کنید تا دقت نتایج شبیهسازی شده را نشان دهید. همچنین یک مثال عملی از نحوه ایجاد لیست مخاطبان با یک مدل لجستیک دودویی را نشان میدهد که در اعمال یک مدل تبدیل به فعالسازی مخاطبان استفاده میشود.
مرور کلی مثال:
- تولید داده
- مدل را آموزش دهید
- وزنها و تقاطع را بدست آورید
- Simulate the prediction
- مقایسه نتایج
مثال گام به گام
۱. تولید داده
یک جدول با دادههای شبیهسازی شده برای آموزش مدل ایجاد کنید. کسری از ردیفها را برای مجموعه وقفه علامت بزنید.
رگرسیون خطی
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`
۲. مدل را آموزش دهید
یک مدل رگرسیون را از مجموعه آموزشی آموزش دهید.
رگرسیون خطی
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 بدست آوریم.
| اندازهگیری | ارزش |
|---|---|
| میانگین خطای مطلق | ۰.۷۳۵۹ |
| میانگین مربعات خطا | ۰.۸۴۳۲ |
| میانگین مربعات خطای لگاریتمی | ۰.۰۸۱۰ |
| خطای مطلق میانه | ۰.۶۲۳۹ |
| مربع R | ۰.۹۰۰۹ |
رگرسیون لجستیک دودویی
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 توجه کنید.
| اندازهگیری | ارزش |
|---|---|
| کلاس مثبت | ۱ |
| کلاس منفی | 0 |
| دقت | ۰.۰۸۱۰ |
| به یاد بیاورید | ۰.۹۳۱۵ |
| دقت | ۰.۹۲۶۰ |
| امتیاز F1 | ۰.۹۳۲۸ |
مقادیر پررنگ در این ماتریس درهمریختگی نشان میدهند که مدل چند بار هر برچسب را به درستی طبقهبندی کرده است و مقادیر غیر پررنگ نشان میدهند که مدل چند بار هر برچسب را به اشتباه طبقهبندی کرده است.
| برچسب واقعی | برچسب پیشبینیشده ۱ | برچسب پیشبینیشده ۲ |
|---|---|---|
| ۱ | ۹۳٪ | ۷٪ |
| 0 | ۸٪ | ۹۲٪ |
۳. وزنها و تقاطع را دریافت کنید
وزنها و عرض از مبدا را برای مدل دریافت کنید:
رگرسیون خطی
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
| وزن | وزنهای دسته بندی.رده |
|---|---|
| ویژگی_1 | ۱.۸۲۶۳۰۵۵۵۲۸۶۳۵۷۴۳ |
| ویژگی_2 | ۱.۸۱۴۳۸۰۴۴۰۴۴۹۰۸۱۳ |
| ویژگی_3 | ۱.۸۶۰۱۲۰۴۸۷۴۰۳۳۴۹۲ |
| ویژگی_4 | ۱.۸۵۰۷۶۰۳۴۳۹۰۳۱۸۵۹ |
| ویژگی_5 | ۱.۷۸۹۹۷۶۴۳۸۷۱۲۳۶۴۰ |
| ویژگی_6 | ۱.۸۶۴۵۲۴۶۶۳۰۲۵۱۲۹۱ |
| ویژگی_7 | ۱.۸۶۹۸۰۰۵۲۸۱۹۲۵۳۵۶ |
| ویژگی_8 | ۱.۷۹۰۴۶۳۷۰۸۰۳۳۰۲۰۱ |
| ویژگی_9 | ۱.۸۰۳۶۸۸۷۸۵۵۴۰۶۲۷۴ |
| ویژگی_10 | 1.8117115890624449 |
| رهگیری | -4.1428754911504306 |
رگرسیون لجستیک دودویی
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
| وزن | وزنهای دسته بندی.رده |
|---|---|
| ویژگی_1 | ۳.۸۲۳۵۳۳۹۲۸ |
| ویژگی_2 | ۳.۷۳۴۸۱۲۸۱۹ |
| ویژگی_3 | ۳.۸۴۲۲۳۹۸۲۳ |
| ویژگی_4 | ۳.۷۸۵۴۸۸۸۲۳ |
| ویژگی_5 | ۳.۷۳۷۳۸۶۷۱۶ |
| ویژگی_6 | ۳.۵۶۷۶۶۳۹۶۱ |
| ویژگی_7 | ۳.۸۱۹۶۴۳۰۵۲ |
| ویژگی_8 | ۳.۷۳۴۶۷۳۷۶۳ |
| ویژگی_9 | ۳.۸۳۹۳۰۱۴۰۶ |
| ویژگی_10 | ۳.۷۸۷۳۰۶۹۹۴ |
| رهگیری | -17.922169920 |
۴. پیشبینی را شبیهسازی کنید
رگرسیون خطی
از ضرب داخلی مقادیر ویژگیها با وزنها استفاده کنید و عرض از مبدا را اضافه کنید تا پیشبینی را با استفاده از 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)
سپس با استفاده از SQL استاندارد، تابع سیگموئید Y = 1 / (1+e^-z) را بر روی ضرب نقطهای و عرض از مبدا اعمال میکند:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
در نهایت، نتیجه تابع سیگموئید با مقدار آستانه ۰.۵ مقایسه میشود تا پیشبینی رگرسیون لجستیک دودویی یا ۰ باشد، اگر کمتر از ۰.۵ باشد، یا ۱ باشد، اگر کمتر از ۰.۵ نباشد. توجه داشته باشید که میتوانید از هر مقدار آستانهای بین ۰ و ۱ استفاده کنید.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
این تکنیک همچنین میتواند به رگرسیون لجستیک چندکلاسه تعمیم داده شود. در این صورت، وزنهای مدل به جای یک بردار، یک ماتریس nxn خواهند بود و وزنها به جای یک اسکالر، یک بردار خواهند بود. شما باید بردار مقادیر ویژگی را در ماتریس وزنها ضرب کنید و بردار عرض از مبدا را با آن جمع کنید. بردار حاصل برای هر برچسب یک امتیاز خواهد داشت و میتوانید برچسبی را که بالاترین امتیاز را برای پیشبینی شما دارد انتخاب کنید. اگر میخواهید یک آرایه احتمال را برگردانید، باید تابع سیگموئید را برای هر عنصر آرایه اعمال کنید.
۵. نتایج را مقایسه کنید
رگرسیون خطی
نتایج نمونه تقریباً یکسان است، به جز یک خطای کوچک در گرد کردن اعداد.
| برچسب_واقعی | ml_predicted_label | برچسب_پیشبینی_شده_sql | تفاوت_ناچیز_است |
|---|---|---|---|
| ۶ | ۵.۲۰۶۲۳۴۹۴۲۰۷۵۱۸۳۴ | ۵.۲۰۶۲۳۴۹۴۲۰۷۵۱۸۲۶ | درست |
| 0 | ۰.۴۰۳۱۸۴۷۲۷۷۰۰۴۸۰۷۵ | ۰.۴۰۳۱۸۴۷۲۷۷۰۰۴۷۹ | درست |
| ۳ | ۳.۰۷۰۳۷۶۶۰۷۸۲۴۹۵۹۷ | ۳.۰۷۰۳۷۶۶۰۷۸۲۴۹۵۹۷ | درست |
| ۷ | ۷.۰۵۸۸۱۷۱۵۳۸۵۶۲ | ۷.۰۵۸۸۱۷۱۵۳۸۵۶۲ | درست |
| ۶ | ۶.۷۸۰۲۳۷۵۹۳۰۶۴۶ | ۶.۷۸۰۲۳۷۵۹۳۰۶۴۶ | درست |
| ۶ | ۵.۱۰۸۸۵۶۹۵۷۱۳۳۹۳۶۸ | ۵.۱۰۸۸۵۶۹۵۷۱۳۳۹۳۷۷ | درست |
| ۴ | ۴.۰۵۱۸۳۹۰۷۸۱۱۶۸۷۴ | ۴.۰۵۱۸۳۹۰۷۸۱۱۶۸۷۴ | درست |
| ۴ | ۵.۱۸۱۰۲۵۴۶۸۰۲۱۹۲۴۳ | 5.1810254680219234 | درست |
| ۶ | ۶.۱۴۴۰۳۴۹۴۶۶۴۰۱۲۲۳ | ۶.۱۴۴۰۳۴۹۴۶۶۴۰۱۲۰۵ | درست |
| ۱ | ۲.۰۸۴۲۳۹۹۴۷۲۷۸۳۵۱۹ | ۲.۰۸۴۲۳۹۹۴۷۲۷۸۳۵۱۹ | درست |
| ۲ | ۲.۱۹۱۱۲۰۹۸۱۱۸۸۶۸۴۷ | ۲.۱۹۱۱۲۰۹۸۱۱۸۸۶۸۳۸ | درست |
| ۳ | ۳.۰۲۳۶۰۸۶۷۹۰۰۰۰۶۶۲۲ | ۳.۰۲۳۶۰۸۶۷۹۰۰۰۰۶۶۱۳ | درست |
| ۲ | ۲.۵۷۳۰۸۳۱۳۲۹۶۴۲۱۳ | ۲.۵۷۳۰۸۳۱۳۲۹۶۴۲۱۲۵ | درست |
| ۷ | ۵.۶۸۶۶۲۹۷۳۱۳۶۷۳۲ | ۵.۶۸۶۶۲۹۷۳۱۳۶۷۳۱۸۶ | درست |
| ۹ | ۸.۱۸۶۰۰۲۶۳۱۲۶۷۷۹۳۸ | ۸.۱۸۶۰۰۲۶۳۱۲۶۷۷۹۳۸ | درست |
رگرسیون لجستیک دودویی
مقایسه استنتاج شبیهسازیشده با نتایج واقعی ML.PREDICT بینقص است - حتی یک تناقض هم در مجموعه 10 هزارتایی سطرهای عقبمانده وجود ندارد. چند سطر وجود دارد که هم ML.PREDICT و هم استنتاج شبیهسازیشده هر دو با برچسب واقعی مخالف هستند و این قابل انتظار است زیرا دقت مدل حدود 93٪ است و مقادیر کوچک اما غیر صفر در سلولهای خارج از قطر ماتریس درهمریختگی وجود دارد.
| برچسب_واقعی | ml_predicted_label | برچسب_پیشبینی_شده_sql | simulation_is_accurate |
|---|---|---|---|
| 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 | درست |
| 0 | ۱ | ۱ | درست |
| 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;