আপনি ML.PREDICT ব্যবহার না করেই, এমনকি সরাসরি মডেলটিতে অ্যাক্সেস না থাকলেও, জানা ওয়েটসহ একটি বিদ্যমান লিনিয়ার বা লজিস্টিক রিগ্রেশন মডেল ব্যবহার করে প্রেডিকশন করতে পারেন। এটি করার জন্য, আপনাকে Ads Data Hub-এর অডিয়েন্স অ্যাক্টিভেশন কোয়েরির মধ্যে ডিফারেনশিয়ালি প্রাইভেট (DP) রিগ্রেশন মডেল ব্যবহার করার একটি ওয়ার্কঅ্যারাউন্ড পদ্ধতি অবলম্বন করতে হবে।
এই ধাপে ধাপে দেওয়া উদাহরণটি আপনাকে শেখাবে কীভাবে প্রকৃত লিনিয়ার এবং বাইনারি লজিস্টিক রিগ্রেশন মডেলের জন্য সিমুলেটেড ইনফারেন্স সম্পাদন করতে হয় এবং তারপর সিমুলেটেড ফলাফলের নির্ভুলতা দেখানোর জন্য ML.PREDICT এর ফলাফলের সাথে তার তুলনা করতে হয়। এটি একটি বাইনারি লজিস্টিক মডেল ব্যবহার করে কীভাবে একটি অডিয়েন্স তালিকা তৈরি করতে হয় তার একটি বাস্তব উদাহরণও প্রদর্শন করবে, যা অডিয়েন্স অ্যাক্টিভেশনে একটি কনভার্সন মডেল প্রয়োগ করার জন্য ব্যবহৃত হবে।
উদাহরণটির সংক্ষিপ্ত বিবরণ:
- ডেটা তৈরি করুন
- মডেলটিকে প্রশিক্ষণ দিন
- ওজনগুলো নিন এবং বাধা দিন।
- পূর্বাভাস অনুকরণ করুন
- ফলাফল তুলনা করুন
ধাপে ধাপে উদাহরণ
১. ডেটা তৈরি করুন
মডেলটি প্রশিক্ষণের জন্য সিমুলেটেড ডেটা দিয়ে একটি টেবিল তৈরি করুন। হোল্ডব্যাক সেটের জন্য সারিগুলোর একটি অংশ চিহ্নিত করুন।
রৈখিক রিগ্রেশন
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
উল্লেখ্য যে, আমরা সিমুলেটেড ডেটাতে যথেষ্ট নয়েজ যোগ করেছি যার ফলে 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
নমুনা ফলাফল। এর নির্ভুলতা ০.৯২৬০ লক্ষ্য করুন।
| পরিমাপ | মূল্য |
|---|---|
| ইতিবাচক শ্রেণী | ১ |
| নেতিবাচক শ্রেণী | ০ |
| নির্ভুলতা | ০.০৮১০ |
| স্মরণ করুন | ০.৯৩১৫ |
| নির্ভুলতা | ০.৯২৬০ |
| এফ১ স্কোর | ০.৯৩২৮ |
The bold values in this confusion matrix show how often the model classified each label correctly and the non-bold values show how often the model misclassified each label.
| আসল লেবেল | পূর্বাভাসিত লেবেল ১ | পূর্বাভাসিত লেবেল ২ |
|---|---|---|
| ১ | ৯৩% | ৭% |
| ০ | ৮% | ৯২% |
৩. ওজন নিন এবং আটকান
মডেলটির ওয়েট এবং ইন্টারসেপ্ট বের করুন:
রৈখিক রিগ্রেশন
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
| ওজন | category_weights.category |
|---|---|
| বৈশিষ্ট্য_১ | ১.৮২৬৩০৫৫৫২৮৬৩৫৭৪৩ |
| বৈশিষ্ট্য_২ | ১.৮১৪৩৮০৪৪০৪৪৯০৮১৩ |
| বৈশিষ্ট্য_৩ | ১.৮৬০১২০৪৮৭৪০৩৩৪৯২ |
| বৈশিষ্ট্য_৪ | ১.৮৫০৭৬০৩৪৩৯০৩১৮৫৯ |
| বৈশিষ্ট্য_৫ | ১.৭৮৯৯৭৬৪৩৮৭১২৩৬৪০ |
| বৈশিষ্ট্য_৬ | ১.৮৬৪৫২৪৬৬৩০২৫১২৯১ |
| বৈশিষ্ট্য_৭ | ১.৮৬৯৮০০৫২৮১৯২৫৩৫৬ |
| বৈশিষ্ট্য_৮ | ১.৭৯০৪৬৩৭০৮০৩৩০২০১ |
| বৈশিষ্ট্য_৯ | ১.৮০৩৬৮৮৭৮৫৫৪০৬২৭৪ |
| বৈশিষ্ট্য_১০ | ১.৮১১৭১১৫৮৯০৬২৪৪৪৯ |
| INTERCEPT | -৪.১৪২৮৭৫৪৯১১৫০৪৩০৬ |
বাইনারি লজিস্টিক রিগ্রেশন
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
| ওজন | category_weights.category |
|---|---|
| বৈশিষ্ট্য_১ | ৩.৮২৩৫৩৩9২৮ |
| বৈশিষ্ট্য_২ | ৩.৭৩৪৮১২৮১৯ |
| বৈশিষ্ট্য_৩ | ৩.৮৪২২৩৯৮২৩ |
| বৈশিষ্ট্য_৪ | ৩.৭৮৫৪৮৮৮২৩ |
| বৈশিষ্ট্য_৫ | ৩.৭৩৭৩৮৬৭১৬ |
| বৈশিষ্ট্য_৬ | ৩.৫৬৭৬৬৩৯৬১ |
| বৈশিষ্ট্য_৭ | ৩.৮১৯৬৪৩০৫২ |
| বৈশিষ্ট্য_৮ | ৩.৭৩৪৬৭৩৭৬৩ |
| বৈশিষ্ট্য_৯ | ৩.৮৩৯৩০১৪০৬ |
| feature_10 | ৩.৭৮৭৩০৬৯৯৪ |
| বাধা | -১৭.৯২২১৬৯৯২০ |
৪. পূর্বাভাসটি অনুকরণ করুন
রৈখিক রিগ্রেশন
ML.PREDICT ব্যবহার না করে সাধারণ SQL ব্যবহার করে প্রেডিকশন করার জন্য, ফিচার ভ্যালুগুলোর সাথে ওয়েটগুলোর ডট প্রোডাক্ট ব্যবহার করুন এবং ইন্টারসেপ্ট যোগ করুন। এই কোয়েরিটি এই পদ্ধতিতে করা প্রেডিকশনগুলোকে 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
বাইনারি লজিস্টিক রিগ্রেশন
বাইনারি লজিস্টিক রিগ্রেশনের ক্ষেত্রে, প্রেডিকশন সিমুলেট করার কৌশলটি লিনিয়ার রিগ্রেশনের মতোই, তবে এক্ষেত্রে শেষ ধাপে কাঙ্ক্ষিত থ্রেশহোল্ড সহ সিগময়েড ফাংশন প্রয়োগ করতে হয়।
ML.PREDICT ব্যবহার না করে সাধারণ SQL ব্যবহার করে প্রেডিকশন করার জন্য, ফিচার ভ্যালুগুলোর সাথে ওয়েটগুলোর ডট প্রোডাক্ট ব্যবহার করুন এবং ইন্টারসেপ্ট যোগ করুন। এরপর, ফলাফলের উপর ০.৫ এর থ্রেশহোল্ড সহ সিগময়েড ফাংশন ব্যবহার করে ০ অথবা ১ প্রেডিক্ট করুন। এই কোয়েরিটি এই পদ্ধতিতে করা প্রেডিকশনগুলোকে 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_predicted_label | diff_is_neligible |
|---|---|---|---|
| ৬ | ৫.২০৬২৩৪৯৪২০৭৫১৮৩৪ | ৫.২০৬২৩৪৯৪২০৭৫১৮২৬ | সত্য |
| ০ | ০.৪০৩১৮৪৭২৭৭০০৪৮০৭৫ | ০.৪০৩১৮৪৭২৭৭০০৪৭৯ | সত্য |
| ৩ | ৩.০৭০৩৭৬৬০৭৮২৪৯৫৯৭ | ৩.০৭০৩৭৬৬০৭৮২৪৯৫৯৭ | সত্য |
| ৭ | ৭.০৫৮৮১৭১৫৩৮৫৬২ | ৭.০৫৮৮১৭১৫৩৮৫৬২ | সত্য |
| ৬ | 6.7802375930646 | ৬.৭৮০২৩৭৫৯৩০৬৪৬ | সত্য |
| ৬ | ৫.১০৮৮৫৬৯৫৭১৩৩৯৩৬৮ | ৫.১০৮৮৫৬৯৫৭১৩৩৯৩৭৭ | সত্য |
| ৪ | ৪.০৫১৮৩৯০৭৮১১৬৮৭৪ | ৪.০৫১৮৩৯০৭৮১১৬৮৭৪ | সত্য |
| ৪ | ৫.১৮১০২৫৪৬৮০২১৯২৪৩ | ৫.১৮১০২৫৪৬৮০২১৯২৩৪ | সত্য |
| ৬ | ৬.১৪৪০৩৪৯৪৬৬৪০১২২৩ | ৬.১৪৪০৩৪৯৪৬৬৪০১২০৫ | সত্য |
| ১ | ২.০৮৪২৩৯৯৪৭২৭৮৩৫১৯ | ২.০৮৪২৩৯৯৪৭২৭৮৩৫১৯ | সত্য |
| ২ | ২.১৯১১২০৯৮১১৮৮৬৮৪৭ | ২.১৯১১২০৯৮১১৮৮৬৮৩৮ | সত্য |
| ৩ | ৩.০২৩৬০৮৬৭৯০০০০৬৬২২ | ৩.০২৩৬০৮৬৭৯০০০০৬৬১৩ | সত্য |
| ২ | ২.৫৭৩০৮৩১৩২৯৬৪২১৩ | ২.৫৭৩০৮৩১৩২৯৬৪২১২৫ | সত্য |
| ৭ | ৫.৬৮৬৬২৯৭৩১৩৬৭৩২ | ৫.৬৮৬৬২৯৭৩১৩৬৭৩১৮৬ | true |
| ৯ | ৮.১৮৬০০২৬৩১২৬৭৭৯৩৮ | ৮.১৮৬০০২৬৩১২৬৭৭৯৩৮ | সত্য |
বাইনারি লজিস্টিক রিগ্রেশন
ML.PREDICT এর প্রকৃত ফলাফলের সাথে সিমুলেটেড ইনফারেন্সের তুলনা নিখুঁত — ১০ হাজার সারির হোল্ডব্যাক সেটে একটিও অমিল নেই। কয়েকটি সারি আছে যেখানে ML.PREDICT এবং সিমুলেটেড ইনফারেন্স উভয়ই প্রকৃত লেবেলের সাথে একমত নয়, এবং এটি প্রত্যাশিত, কারণ মডেলের নির্ভুলতা প্রায় ৯৩%, এবং কনফিউশন ম্যাট্রিক্সের অফ-ডায়াগোনাল সেলগুলোতে ক্ষুদ্র কিন্তু অশূন্য মান রয়েছে।
| আসল_লেবেল | ml_predicted_label | sql_predicted_label | সিমুলেশনটি সঠিক |
|---|---|---|---|
| ০ | ১ | ১ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ০ | ০ | সত্য |
| ০ | ১ | ১ | সত্য |
| ০ | ০ | ০ | সত্য |
এমএল ব্যবহার করে একটি অডিয়েন্স অ্যাক্টিভেশন তালিকা তৈরি করুন
এর একটি সাধারণ ব্যবহার হলো, কনভার্সন পূর্বাভাস দেওয়ার জন্য একটি ডিফারেনশিয়ালি প্রাইভেট বাইনারি লজিস্টিক রিগ্রেশন মডেল তৈরি করা এবং তারপর একটি অডিয়েন্স তালিকা তৈরির সময় এই মডেলটির উপর ইনফারেন্স প্রয়োগ করা। ধরে নিন যে উপরের উদাহরণে তৈরি করা বাইনারি লজিস্টিক মডেলটি কনভার্সন মডেলিং করছে এবং ট্রেনিং ও ইভ্যালুয়েশন সেটের প্রতিটি সারি একজন স্বতন্ত্র ব্যবহারকারীকে প্রতিনিধিত্ব করে।
নিম্নলিখিত কোয়েরিটি দেখায় কিভাবে সেইসব ব্যবহারকারীদের নিয়ে একটি অডিয়েন্স তালিকা তৈরি করতে হয়, যাদের সম্পর্কে মডেলের পূর্বাভাস অনুযায়ী তারা রূপান্তরিত হবে:
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;