ML.PREDICT
का इस्तेमाल किए बिना, पहले से मौजूद लीनियर या लॉजिस्टिक रिग्रेशन मॉडल का इस्तेमाल करके अनुमान लगाया जा सकता है. इसके लिए, मॉडल का ऐक्सेस भी ज़रूरी नहीं है. ऐसा करने के लिए, आपको Ads Data Hub में ऑडियंस ऐक्टिवेशन क्वेरी में, अलग-अलग निजता (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 |
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 |
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. अनुमान को सिम्युलेट करना
लीनियर रिग्रेशन
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
बाइनरी लॉजिस्टिक रिग्रेशन
बायनेरी लॉजिस्टिक रिग्रेशन के लिए, अनुमानों को सिम्युलेट करने की तकनीक, लीनियर रिग्रेशन से काफ़ी मिलती-जुलती है. इसमें, आखिरी चरण में पसंदीदा थ्रेशोल्ड के साथ सिग्मॉइड फ़ंक्शन लागू किया जाता है.
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)
आखिर में, सिग्मॉइड फ़ंक्शन के नतीजे की तुलना 0.5 की थ्रेशोल्ड वैल्यू से की जाती है, ताकि बाइनरी लॉजिस्टिक रिग्रेशन का अनुमान लगाया जा सके. अगर यह 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;