בניית מודל רגרסיה ב-Ads Data Hub

רגרסיה ליניארית ורגרסיה לוגיסטית הן מודלים של למידת מכונה שמאפשרים ליצור תחזיות משמעותיות מנתוני פרסום.

  • רגרסיה לינארית יוצרת פונקציה שמתאימה קו לנתונים כך שהמרחק בין נקודות הנתונים לקו יהיה מינימלי. לאחר מכן אפשר להשתמש במודל הזה כדי לחזות ערך מספרי על סמך נתוני קלט, למשל חיזוי ערך חיי המשתמש על סמך רכישות, אינטראקציות קודמות וכו'.
  • רגרסיה לוגיסטית משמשת לבעיות של סיווג חזוי. המודל יכול להיות אחד משני סוגים, בהתאם למספר המשתנים שסיפקתם:
    • רגרסיה לוגיסטית בינארית עונה על שאלות מסוג 'כן/לא', כמו מה הסבירות שאירוע המרה יתרחש.
    • רגרסיה לוגיסטית מרובת-שכבות משמשת לחיזוי של כמה ערכים אפשריים, למשל לקביעת אם לקוח הוא 'בעל ערך נמוך', 'בעל ערך בינוני' או 'בעל ערך גבוה'.

רגרסיה לינארית ורגרסיה לוגיסטית לומדות מנתוני אימון (במקרה הזה, נתוני הפרסום שלכם), ומספקות מודל חיזוי לקבלת החלטות בנושא פרסום. באופן כללי, ככל שתספקו יותר נתונים ותדאגו שהנתונים שתספקו יהיו באיכות גבוהה, כך הדיוק של המודל ישתפר. הביצועים של שני המודלים משתפרים כשנותנים להם נתוני אימון שמקובצים בצורה הדוקה.

פרטיות דיפרנציאלית

ברגרסיה לינארית וברגרסיה לוגיסטית נעשה שימוש בפרטיות דיפרנציאלית, שהיא מערכת שונה של בדיקות פרטיות מזו שבה נעשה שימוש בפעולות אחרות ב-Ads Data Hub. כדי לשמור על פרטיות משתמשי הקצה, פרטיות דיפרנציאלית מחדירה רעש לתוצאות במהלך תהליך האימון. רמת הרעש הזו נשארת נמוכה מספיק כדי שהתוצאות הסופיות עדיין יהיו שימושיות, אבל גבוהה מספיק כדי שלא ניתן יהיה לזהות את משתמשי הקצה. בנוסף, רמת הרעש היא לא ודאית, כך שלתוצאות יש רמת רעש לא עקבית, שמבטיחה עוד יותר את הפרטיות של משתמשי הקצה.

הגבלת שאילתות

כשמשתמשים בברירת המחדל EPSILON_PER_MODEL, מוגבלים ל-100 שאילתות לבניית מודלים של רגרסיה לינארית ורגרסיה לוגיסטית לכל 'יום נתונים'. 'יום נתונים' מתייחס לאירועים שנוצרו ביום נתון. האירועים האלה תואמים לתאריכי ההתחלה והסיום שסיפקתם כשהרצתם את השאילתה, ולתאריכי ההתחלה והסיום ששימשו ליצירת הטבלאות שבהן השאילתה משתמשת – כמו טבלאות זמניות ששימשו לאימון. כלומר, אי אפשר להשתמש בנתונים מיום אחד ביותר מ-100 מודלים. אם תבחרו לציין ערך של EPSILON_PER_MODEL גבוה מברירת המחדל, תוכלו ליצור פחות מודלים, אבל האיכות שלהם תהיה גבוהה יותר. אם בוחרים ערכים קטנים יותר של EPSILON_PER_MODEL, אפשר לאמן יותר מודלים, אבל האיכות שלהם תהיה נמוכה יותר.

איך זה עובד

תהליך העבודה כולל את השלבים הבאים:

  1. מכינים את נתוני האימון.
  2. יוצרים מודל.
  3. איסוף תובנות מהמודל.

הכנת נתוני אימון

כפי שצוין למעלה, שימוש בקבוצות נתונים גדולות יותר באיכות גבוהה בדרך כלל מוביל לתוצאות טובות יותר. בנוסף, מאחר שנתוני הקלט מותאמים באמצעות התאמה לפי מינימום-מקסימום, נתונים שמקובצים בצורה דלילה או נתונים עם חריגים משמעותיים עלולים להשפיע לרעה על המודל על ידי שינוי הממוצע.

כברירת מחדל, מערכת 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

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

(אופציונלי) מידת הרגיליזציה ברמה 2 שהופעלה. ברגולריזציה מסוג L2, המשקלים נותנים עונש ביחס לשורש הריבועי של סכום הריבועים של המשקלים. יכול להיות כל מספר לא שלילי, ברירת המחדל היא אפס.

data_split_eval_fraction

(אופציונלי) הערך חייב להיות בין 0 .01 ל-0 .99, וערך ברירת המחדל הוא 0 .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 מציין שכל חזרה (iteration) חייבת להפחית את האובדן ב-1% כדי שהאימון ימשיך.

ארגומנטים

הערך של float64_value יכול להיות כל מספר נקודה צפה (floating-point) של 64 ביט. ברירת המחדל היא 0.1 (10%).

ls_init_learn_rate

(אופציונלי) מגדיר את שיעור הלמידה הראשוני שבו LEARN_RATE_STRATEGY='LINE_SEARCH' משתמש. אפשר להשתמש באפשרות הזו רק אם מציינים את LINE_SEARCH.

אם הערך של LEARN_RATE במודל נראה ככפול בכל חזרה (iteration), כפי שמצוין ב-ML.TRAINING_INFO, נסו להגדיר את LS_INIT_LEARN_RATE לשיעור הלמידה הכפול האחרון. שיעור הלמידה הראשוני האופטימלי שונה בכל מודל. שיעור למידה ראשוני טוב במודל אחד עשוי להיות שיעור למידה ראשוני לא טוב במודל אחר.

ארגומנטים

הערך של float64_value יכול להיות כל מספר נקודה צפה (floating-point) של 64 ביט.

epsilon_per_model

(אופציונלי) מציינים את סכום תקציב הפרטיות שישמש לאימון המודל הזה. כל לקוח של נתוני מודעות מקבל תקציב פרטיות של 10.0 לכל יום נתונים. מודל שהוכשרה בהצלחה ינצל את הסכום EPSILON_PER_MODEL מהתקציב בכל יום נתונים בטווח התאריכים שצוין בזמן הרצת השאילתה. שימוש בערך ברירת המחדל ln(3)/10 יאפשר ליצור כ-100 מודלים. אם משתמשים בערך גבוה יותר, אפשר ליצור פחות מודלים, אבל האיכות שלהם תהיה גבוהה יותר. אם משתמשים בערך קטן יותר, אפשר ליצור יותר מודלים באיכות נמוכה יותר.

ארגומנטים

הערך של float64_value יכול להיות כל מספר חיובי של 64 ביט בנקודה צפה, שקטן מ-ln(3), שהוא בערך 1.0986. ברירת המחדל היא ln(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

(אופציונלי) שינוי הגודל של כל אחת מעמודות המאפיינים numerical_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'. בשלב זה אין תמיכה בכמה תוויות.
  • העמודה label לא יכולה להכיל ערכים null. אם עמודת התווית מכילה ערכים NULL, השאילתה נכשלת.
  • אסור שהעמודות של המאפיינים יתקבלו מהעמודה user_id.
  • כל שורה צריכה לייצג משתמש ייחודי אחד בלבד. שורה אחת לא יכולה לייצג נתונים מכמה משתמשים. זה יכול לקרות עם צירופים מסוימים, למשל צירוף CROSS.
  • לא ניתן לכלול משתמש בשתי שורות נפרדות.
  • מטעמי פרטיות, אפשר להשתמש רק באפשרויות שמתוארות בקטע 'תחביר'. אפשרויות אחרות שעשויות להופיע במסמכי העזרה של השאילתה 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 כדי להדגים איך יוצרים מודל.

נתוני אימון ב-inner-select (לינארי)

בדוגמה הבאה נעשה שימוש במשקל הלידה, במגדר, בשבועות ההיריון, בגיל האם ובגזע האם כדי לחזות את משקל הלידה של תינוק.

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

הפעלת קהלים

אפשר לבצע תחזיות באמצעות מודל רגרסיה ליניארי קיים – עם משקלים ידועים – בלי להשתמש ב-ML.PREDICT, גם בלי גישה למודל עצמו. למידע נוסף, אפשר לעיין בקודלאב בנושא בניית מודל רגרסיה להפעלת קהל.