רגרסיה לינארית ולוגיסטית הם מודלים של למידת מכונה שמאפשרים ליצור תחזיות משמעותיות מנתוני הפרסום.
- רגרסיה לינארית יוצרת פונקציה שמתאימה של קו לנתונים, כך שהמרחק בין נקודות הנתונים לקו מזעור. לאחר מכן אפשר להשתמש במודל הזה כדי לחזות ערך מספרי על סמך קלט, כמו חיזוי ערך חיי המשתמש על סמך רכישות, אינטראקציות קודמות וכו'.
- רגרסיה לוגיסטית משמשת לבעיות סיווג חזויות. המודל יכול להיות אחד מ-2 סוגים, בהתאם למספר המשתנים שאתם מספקים:
- רגרסיה לוגיסטית בינארית עונה על שאלות מסוג "כן/לא", למשל הסבירות שאירוע המרה יתרחש.
- רגרסיה לוגיסטית מרובת-סיווגים משמשת לחיזוי ערכים אפשריים מרובים, כגון קביעה אם לקוח הוא "ערך נמוך", "ערך בינוני" או "ערך גבוה".
רגרסיה לינארית ולוגיסטית לומדת מנתוני אימון (במקרה זה, נתוני הפרסום שלכם), ומספקת לכם מודל חיזוי לקבלת החלטות בנוגע לפרסום. באופן כללי, ככל שתספקו יותר נתונים ותוודאו שהנתונים באיכות גבוהה, ישפרו את דיוק המודל. הביצועים של שני המודלים משתפרים כשנתונים לגבי אימון נצברים היטב.
פרטיות דיפרנציאלית
רגרסיה לינארית ולוגיסטית משתמשת בפרטיות דיפרנציאלית, שהיא מערכת שונה של בדיקות פרטיות מזו שמשמשת בפעולות אחרות ב-Ads Data Hub. פרטיות דיפרנציאלית מבטיחה את הפרטיות של משתמשי הקצה על ידי החדרת רעש לתוצאות שלכם בתהליך האימון. רמת הרעש הזו נשארת נמוכה מספיק כדי שהתוצאות הסופיות עדיין יהיו מועילות, אבל מספיק גבוהה כדי שלא ניתן יהיה לזהות את משתמשי הקצה. בנוסף, רמת הרעש היא לא דטרמיניסטית, כך שבתוצאות יש רמת רעש לא עקבית, תוך שמירה על הפרטיות של משתמשי הקצה.
הגבלת שאילתות
כשמשתמשים בברירת המחדל EPSILON_PER_MODEL
, אפשר לקבל עד 100 שאילתות של בניית מודלים של רגרסיה לינארית ולוגיסטית לכל 'יום נתונים'. יום הנתונים מתייחס לאירועים שנוצרו ביום נתון. האירועים האלה תואמים לתאריכי ההתחלה והסיום שאתם מציינים בזמן הרצת השאילתה, ולתאריכי ההתחלה והסיום ששימשו ליצירת טבלאות שהשאילתה משתמשת בהן – כמו טבלאות זמניות שמשמשות לאימון. המשמעות היא שאפשר להשתמש בנתונים מיום אחד ב-100 מודלים לכל היותר. אם תבחר לציין ערך של EPSILON_PER_MODEL גדול יותר מברירת המחדל, תוכל ליצור פחות דגמים, אבל הם יהיו איכותיים יותר. ואם תבחר ערכים קטנים יותר של EPSILON_PER_MODEL, תוכל לאמן יותר מודלים, אבל הם יהיו באיכות נמוכה יותר.
איך זה עובד
תהליך העבודה כולל את השלבים החיוניים הבאים:
- להכין את נתוני האימון.
- יוצרים מודל.
- לקבל תובנות מהמודל.
הכנת נתוני האימון
כפי שצוין למעלה, שימוש במערכי נתונים גדולים ואיכותיים יותר בדרך כלל מניב תוצאות טובות יותר. בנוסף, מאחר שנתוני הקלט מותאמים לקנה מידה מינימלי באמצעות קנה מידה מינימלי, נתונים באשכולות דליל או נתונים עם חריגות משמעותיות יכולים להשפיע לרעה על המודל על ידי שינוי הממוצע.
כברירת מחדל, מערכת Ads Data Hub בוחרת באקראי 18% מנתוני האימון לשימוש באימות. אפשר לשלוט באחוז הנתונים שמשמשים לאימות באמצעות האפשרות data_split_eval_fraction
.
יצירת מודל
הגדרת פרמטרים ונתוני קלט לאימון המודל.
שיטות מומלצות
אחד הגורמים החשובים ביותר באיכות המודל הוא הגודל של ערכת האימון. עם זאת, אי-השווי בין הגודל והאיכות ישתנה בהתאם לבעיה ולגורמים המפורטים בהמשך. נשמח לשמוע על החוויה שלך.
- במודלים של רגרסיה לוגיסטיים, שהניבו קבוצות אימון עם 100,000 משתמשים לפחות, רמת הדיוק של המודלים גבוהה מ-0.70.
- ראינו ש-r-squared גדול מ-0.70 במודלים של רגרסיה לינארית, שנבנו מערכות אימון עם 800,000 משתמשים לפחות.
יש גורמים אחרים שיכולים לפגוע באיכות של המודל.
- מודלים לוגיסטיים שבהם יש ייצוג הרבה יותר גבוה של סוג אחד מהסיווגים האחרים. באופן ספציפי, אם לתווית אחת יש מעט משתמשים במערכי אימון, סביר להניח שהרבה משתמשים במערכי אימון עם תוויות אחרות לא יועילו מאוד לדיוק של המודל בתווית הקטנה. לדוגמה, הערך של 20,000 ו-1,000 משתמשים בקבוצות אימון בשתי תוויות יהיה נמוך יותר מ-10,000 ו-2,000.
- נתונים של תכונות שלא מעניקים אות משמעותי לתוויות.
- נתונים גולמיים שדורשים הנדסת תכונות מקיפה יותר. לדוגמה, בשדות מסוימים עשוי להיות מספר גדול מאוד של ערכים אפשריים. דרך אחת לשפר נתונים מהסוג הזה היא להפוך את הערכים לתכונה עם מספר קטן יותר של קטגוריות, או קטגוריות.
מקבלים תובנות
אפשר לקרוא לפונקציות כדי להעריך את ביצועי המודל על נתוני אימות, לבחון תכונות ומידע על איטרציות לאימון (למשל, המשקולות הבסיסיות שבהן נעשה שימוש במודל במהלך החיזוי) ולחזות נתונים שלא נצפו.
הצהרה על CREATE MODEL
ההצהרה CREATE MODEL
יוצרת מודל עם השם ומערך הנתונים שציינתם. אם שם המודל כבר קיים, CREATE MODEL
מחליף את המודל הקיים.
תחביר של יצירת MODEL
CREATE MODEL
model_name
OPTIONS
(
// model_option_list:
// Required parameter.
MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}
// Optional tuning parameters.
[, L1_REG = float64_value ]
[, L2_REG = float64_value ]
[, DATA_SPLIT_EVAL_FRACTION = float64_value ]
[, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
'NORMAL_EQUATION' } ]
[, MAX_ITERATIONS = int64_value ]
[, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
[, LEARN_RATE = float64_value ]
[, EARLY_STOP = { TRUE | FALSE } ]
[, MIN_REL_PROGRESS = float64_value ]
[, LS_INIT_LEARN_RATE = float64_value ]
[, EPSILON_PER_MODEL = float64_value ]
[, AUTOMATIC_IMPUT_SCALING = bool_value ]
[, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
[, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
[, QUANTILE_BUCKETIZED_COLS = [
STRUCT(string_value AS col_name, int64_value AS num_buckets),
STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement
model_name
שם אלפאנומרי, כולל קווים תחתונים ומקפים. אי אפשר לכלול נקודות. אם שם המודל שסיפקת כבר קיים, המודל הישן יוחלף.
query_statement
ההגדרה קובעת את שאילתת ה-SQL הרגילה שמשמשת ליצירת נתוני האימון. אם רוצים ליצור כמה מודלים ולהשתמש באותם נתוני אימון, אפשר ליצור טבלה זמנית עם נתוני האימון ולציין אותם כאן. הטקטיקה הזו מונעת שגיאות אפשריות בבדיקת הבדלים עקב מחיקה או ספאם מאוחר.
model_option_list
model_type
(חובה) האפשרות היחידה הנדרשת. יכול להיות 'adh_linear_regression
' או 'adh_logistic_regression
'
l1_reg
(אופציונלי) כמות הרגולזציה של L1 שהוחלה. רגולזציה של L1 פוגעת במשקל באופן יחסי לסכום הערכים המוחלטים של המשקולות. יכול להיות כל מספר שאינו שלילי, ברירת המחדל היא אפס.
l2_reg
(אופציונלי) כמות הרגולטור של L2 שהוחלה. רגולזציה של L2 פוגעת במשקל באופן יחסי לשורש הריבועי של סכום הריבועים של המשקולות. יכול להיות כל מספר שאינו שלילי, ברירת המחדל היא אפס.
data_split_eval_fraction
(אופציונלי) חייב להיות בין .01 לבין .99, כשברירת המחדל היא .18 קובעת את חלק הנתונים שמסתיים בערכת ההערכה. המצב הזה משפיע על הדיוק של המודל על ידי צמצום מספר השורות שבסוף המודל, אבל גם מספר המודלים שמשתמש יכול להריץ. הנה תרשים של הקשר הזה בהנחה שלכל מודל במערך נתונים נתון יש את אותו שבר:
שבר אימות | שאילתות מותרות |
---|---|
0.01 | 7 |
0.1 | 8 |
0.15 | 8 |
0.18 | 9 |
0.2 | 9 |
0.3 | 10 |
0.5 | 14 |
0.9 | 50 |
optimize_strategy
(אופציונלי) האסטרטגיה לאימון מודלים של רגרסיה ליניארית.
ארגומנטים
אסטרטגיית האימון נקבעת על ידי 'AUTO_STRATEGY
' באופן הבא:
- אם מציינים
l1_reg
אוwarm_start
, המערכת משתמשת בשיטהbatch_gradient_descent
. - אם העוצמה הכוללת של תכונות אימון גדולה מ-10,000, המערכת משתמשת בשיטה
batch_gradient_descent
. - אם קיימת בעיית התאמת יתר (מספר הדוגמאות לאימון קטן מ-10 • העוצמה הכוללת), המערכת משתמשת באסטרטגיה
batch_gradient_descent
. - בכל שאר המקרים, נעשה שימוש בשיטה
NORMAL_EQUATION
.
הפונקציה 'BATCH_GRADIENT_DESCENT
' (לוגיסטית בלבד) מאמנת את המודל באמצעות שיטת הירידה ההדרגתית באצווה, כדי לבצע אופטימיזציה של פונקציית האובדן באמצעות פונקציית ההדרגתיות.
הפונקציה 'NORMAL_EQUATION
' (לינארית בלבד) מחשבת ישירות את הפתרון הריבועי הנמוך ביותר של בעיית הרגרסיה הליניארית בעזרת הנוסחה האנליטית. לא ניתן להשתמש במשוואה רגילה במקרים הבאים:
l1_reg
צוין.warm_start
צוין.- העוצמה הכוללת של תכונות אימון היא יותר מ-10,000.
- ערך ברירת המחדל הוא '
AUTO_STRATEGY
'.
max_iterations
(אופציונלי) מספר החזרות או השלבים באימון. השאילתה הזו יוצרת עץ אחד לכל חזרה, ולכן זהו גם מספר העצים. חייב להיות מספר שלם הגדול מ-1. ברירת המחדל היא 20.
learn_rate_strategy
(אופציונלי, לוגיסטי בלבד) השיטה להגדרת שיעור הלמידה במהלך האימון.
ארגומנטים
הפונקציה 'LINE_SEARCH
' משתמשת בשיטת חיפוש השורות כדי לחשב את קצב הלמידה. שיעור הלמידה הראשונית של חיפוש השורות הוא הערך שצוין עבור LS_INIT_LEARN_RATE
.
- חיפוש השורות מאט את האימון ומגדיל את מספר הבייטים שעובדו, אבל לרוב הוא מתכנס גם עם קצב למידה ראשוני גדול יותר.
הפונקציה 'CONSTANT
' מגדירה את קצב הלמידה לערך שצוין עבור LEARN_RATE
.
ערך ברירת המחדל הוא 'LINE_SEARCH
'.
learn_rate
(אופציונלי, לוגיסטי בלבד) קצב הלמידה בירידה הדרגתית כאשר LEARN_RATE_STRATEGY
מוגדר לערך CONSTANT
. אם LEARN_RATE_STRATEGY
מוגדר לערך 'LINE_SEARCH
', תוחזר שגיאה.
ארגומנטים
float64_value
יכול להיות כל מספר נקודה צפה (floating-point) של 64 ביט. ערך ברירת המחדל הוא 0.1 (10%).
early_stop
(אופציונלי) אם האימון צריך להפסיק אחרי האיטרציה הראשונה שבה השיפור באובדן היחסי קטן מהערך שצוין עבור MIN_REL_PROGRESS
.
ארגומנטים
TRUE
כדי לציין 'כן', FALSE
את הערך 'לא'. ברירת המחדל היא TRUE
.
min_rel_progress
(אופציונלי) השיפור המינימלי בהפסד יחסי שנדרש כדי להמשיך באימון כשהערך של EARLY_STOP
מוגדר כ-True. לדוגמה, הערך 0.01 מציין שכל איטרציה חייבת להפחית את ההפסד בשיעור של 1% כדי שהאימון ימשיך.
ארגומנטים
float64_value
יכול להיות כל מספר נקודה צפה (floating-point) של 64 ביט. ערך ברירת המחדל הוא 0.1 (10%).
ls_init_learn_rate
(אופציונלי) מגדירה את קצב הלמידה הראשוני שבו נעשה שימוש ב-LEARN_RATE_STRATEGY='LINE_SEARCH'
. ניתן להשתמש באפשרות הזו רק אם צוין LINE_SEARCH
.
אם נראה שה-LEARN_RATE
של המודל מכפיל כל איטרציה כפי שמצוין ב-ML.TRAINING_INFO
, כדאי לנסות להגדיר את LS_INIT_LEARN_RATE
לשיעור הלמידה האחרון שהוכפל. קצב הלמידה הראשוני האופטימלי שונה בכל מודל. שיעור למידה ראשוני טוב במודל אחד לא יהיה שיעור למידה ראשוני טוב במודל אחר.
ארגומנטים
float64_value
יכול להיות כל מספר נקודה צפה (floating-point) של 64 ביט.
epsilon_per_model
(אופציונלי) מציין את סכום התקציב בנושא פרטיות שישמש לאימון המודל הזה. כל לקוח של נתוני מודעות מקבל תקציב פרטיות של 10.0 ליום נתונים. מודל שאומן בהצלחה יוציא EPSILON_PER_MODEL מהתקציב לכל יום נתונים בטווח התאריכים שצוין בעת הרצת השאילתה. שימוש בערך ברירת המחדל של dl(3)/10 יאפשר יצירה של כ-100 מודלים. אם תשתמשו בערך גבוה יותר, תוכלו ליצור פחות דגמים, אבל הם יהיו באיכות גבוהה יותר. אם תשתמשו בערך קטן יותר, תוכלו ליצור עוד דגמים באיכות נמוכה יותר.
ארגומנטים
float64_value
יכול להיות כל מספר נקודה צפה (floating) חיובי של 64 ביט הקטן מ-Len(3), כלומר בערך 1.0986. ברירת המחדל היא none(3)/10.
automatic_input_scaling
(אופציונלי) כאשר TRUE
, בכל העמודות של התכונות המספריות min_max_scaling
יחולו באופן אוטומטי, כאילו שמות העמודות צוינו באופן מפורש באפשרות min_max_scaled_cols
, פרט לעמודות שצוינו במפורש באפשרויות standard_scaled_cols
או quantile_bucketized_cols
.
ארגומנטים
bool_value
הוא BOOL
, ערך ברירת המחדל הוא TRUE
.
min_max_scaled_cols
(אופציונלי) משנה את קנה המידה של כל אחת מעמודות התכונה Number_expression שצוינו בטווח של 0 עד 1, עם מכסה של MIN
ו-MAX
בכל השורות.
אותן MIN
ו-MAX
משמשות באופן אוטומטי לחיזוי. אם נתוני החיזוי מחוץ לטווח של MIN
ו-MAX
, הם מוגבלים ל-0 או ל-1.
ארגומנטים
מערך של string_value
, שבו כל string_value
הוא מחרוזת שמייצגת את שם העמודה שיש לשנות.
standard_scaled_cols
(אופציונלי) סטנדרטי של עמודות התכונות שצוינו numerical_expression
בכל השורות.
הערכים STDDEV
ו-MEAN
שמחושבים כדי לתקן את הביטוי משמשים באופן אוטומטי לחיזוי.
ארגומנטים
מערך של string_value
, שבו כל string_value
הוא STRING
שמייצג את שם העמודה לשינוי.
quantile_bucketized_cols
יוצרת קטגוריות של עמודות התכונה המספריות הרציפות שצוינו ב-STRING
, עם שם הקטגוריה כערך בהתבסס על כמויות.
אותן האחוזות משמשות באופן אוטומטי בחיזוי.
ארגומנטים
המערך STRUCT(string_value AS col_name, int64_value AS num_buckets)
, שבו כל string_value הוא STRING
שמייצג את שם העמודה המספרי הרציף שצריך להמיר, וכל int64_value
הוא מספר הקטגוריות שלפיהם צריך לפצל את הערכים המספריים.
אימות
- לכל יום נתונים בטווח התאריכים שצוין עבור שאילתה זו חייב להיות תקציב פרטיות מספיק, כלומר יותר מ-EPSILON_PER_MODEL, אחרת השאילתה תיכשל.
- הפרמטרים האופציונליים לכוונון, אם צוינו, יאומתו עבור הטווחים המוצגים למעלה.
- יש לציין במפורש רק את הפרמטר model_type הדרוש היחיד.
- צריך לתת לעמודה אחת בקבוצת האימון את השם 'label'. כרגע אין תמיכה במספר תוויות.
- עמודת התווית לא יכולה להכיל ערכי NULL. אם עמודת התווית מכילה ערכי NULL, השאילתה תיכשל.
- ייתכן שאף אחת מעמודות התכונה לא תיגזר מה-user_id.
- כל שורה צריכה לייצג משתמש ייחודי אחד בדיוק. שורה אחת לא יכולה לייצג נתונים של משתמש אחד. מצב כזה יכול לקרות בתגובה לפעולות איחוד מסוימות, למשל CROSS join.
- המשתמש לא יכול להופיע בשתי שורות נפרדות.
- מטעמי פרטיות, ניתן להשתמש רק באפשרויות המתוארות בקטע התחביר. אפשרויות אחרות שעשויות להופיע במסמכי התיעוד של השאילתה BQML CREATE MODEL לא נתמכות בשלב הזה.
פונקציות הערכה
ML.EVALUATE
כדי להעריך את מדדי המודל, צריך להשתמש בפונקציה ML.EVALUATE
. אפשר להשתמש בפונקציה ML.EVALUATE
עם מודלים של רגרסיה לינארית או רגרסיה לוגיסטית.
SELECT
*
FROM ML.EVALUATE(MODEL `linear_model_test`);
ML.ROC_CURVE
הפונקציה ML.ROC_CURVE
מאפשרת להעריך מדדים ספציפיים לרגרסיה לוגיסטית. הפונקציה ML.ROC_CURVE
נותנת הערכה רק למודלים של רגרסיה לוגיסטית.
SELECT
*
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);
פונקציות חיזוי
ML.PREDICT
אפשר להשתמש בפונקציה ML.PREDICT
כדי לחזות תוצאות באמצעות המודל. תוצאות שהתקבלו באמצעות ML.PREDICT
כפופות לאותן בדיקות פרטיות שמתבצעות בתוצאות אחרות ב-Ads Data Hub. מידע נוסף על בדיקות לאימות הפרטיות
רגרסיה לינארית
/* This example outputs the average value for labels that the model predicted */
SELECT
AVG(predicted_label) AS average_predicted_label
FROM
ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);
רגרסיה לוגיסטית
/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
label,
predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
COUNT(*) AS num /* a tally of users */
FROM
ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;
פונקציות של בדיקת מודלים ופיצ'רים
ML.TRAINING_INFO
הפונקציה ML.TRAINING_INFO
מאפשרת לראות מידע על איטרציות אימון של מודל.
SELECT
*
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);
ML.FEATURE_INFO
הפונקציה ML.FEATURE_INFO
מאפשרת לראות מידע על תכונות הקלט שמשמשות לאימון מודל
SELECT
*
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);
ML.WEIGHTS
הפונקציה ML.WEIGHTS
מאפשרת לראות את המשקולות הבסיסיות ששימשו את המודל במהלך החיזוי.
SELECT
*
FROM ML.WEIGHTS(MODEL `linear_model_test`);
דוגמאות
יצירת מודל
בכל הדוגמאות הבאות אנחנו משתמשים בטבלה לדוגמה של natality
כדי להדגים איך יוצרים מודל.
נתונים לאימון בבחירה פנימית (לינארית)
הדוגמה הבאה משתמשת במשקל לידה, מגדר, שבועות היריון, גיל האם וגזע האם כדי לחזות את משקל הלידה של ילד.
CREATE MODEL `natality_model`
OPTIONS
(model_type='adh_linear_regression') AS
SELECT
weight_pounds as label,
is_male,
gestation_weeks,
mother_age,
CAST(mother_race AS string) AS mother_race
FROM
`bigquery-public-data.samples.natality`
WHERE
weight_pounds IS NOT NULL
נתונים לאימון בחירה פנימית (לוגיסטיקה)
בדוגמה הבאה משתמשים במשקל לידה, במגדר, בשבוע היריון, בגיל האם ובגזע האם כדי לחזות את המגדר של ילד.
CREATE MODEL `natality_model`
OPTIONS
(model_type='adh_logistic_regression') AS
SELECT
weight_pounds,
is_male as label,
gestation_weeks,
mother_age,
CAST(mother_race AS string) AS mother_race
FROM
`bigquery-public-data.samples.natality`
WHERE
weight_pounds IS NOT NULL