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

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

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

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

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

רגרסיה לינארית ולוגיסטית משתמשת בפרטיות דיפרנציאלית, שהיא מערכת שונה של בדיקות פרטיות מזו שמשמשת בפעולות אחרות ב-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 מחליף את המודל הקיים.

תחביר של יצירת 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