רגרסיה לינארית ולוגיסטית הם מודלים של למידת מכונה שמאפשרים ליצור תחזיות משמעותיות מנתוני פרסום.
- רגרסיה לינארית יוצרת פונקציה כדי להתאים קו לנתונים, כך שהמרחק בין נקודות הנתונים והקו מינימלי. לאחר מכן ניתן להשתמש במודל הזה לחיזוי ערך מספרי על סמך קלט, כמו חיזוי ערך חיי המשתמש על סמך רכישות, אינטראקציות קודמות וכו'.
- רגרסיה לוגיסטית משמשת לבעיות של סיווג חזוי. המודל יכול לכלול 2 סוגים, בהתאם למספר המשתנים שסיפקתם:
- רגרסיה לוגיסטית בינארית עם תשובות "כן/לא" שאלות, כמו הסבירות שאירוע המרה יתרחש.
- רגרסיה לוגיסטית מרובת קטגוריות משמשת לחיזוי ערכים אפשריים מרובים, למשל קביעה אם הלקוח הוא 'ערך נמוך', 'ערך בינוני' או 'ערך גבוה'.
רגרסיה לינארית ולוגיסטית לומדת מנתוני האימון (במקרה הזה, נתוני הפרסום שלכם), ומספקת לכם מודל חיזוי לקבלת החלטות לגבי פרסום. באופן כללי, ככל שתוסיפו יותר נתונים ותוודאו שהנתונים שאתם מספקים באיכות גבוהה, המודל ישתפר. שני המודלים פועלים טוב יותר כשהם מקבלים נתוני אימון מרוכזים היטב.
פרטיות דיפרנציאלית
רגרסיה לינארית ולוגיסטית מתבססת גם על פרטיות דיפרנציאלית. זו מערכת שונה של בדיקות לאימות הפרטיות שבה משתמשים בפעולות אחרות ב-Ads Data Hub. פרטיות דיפרנציאלית מבטיחה את הפרטיות של משתמשי הקצה, על ידי החדרת רעש לתוצאות שלכם במהלך תהליך האימון. רמת ה"רעש" הזו נשארת נמוכה מספיק כדי שהתוצאות הסופיות עדיין יהיו מועילות, אבל רמה גבוהה מספיק כך שלא ניתן יהיה לזהות את משתמשי הקצה. בנוסף, רמת ה"רעש" לא נקבעה, כך שבתוצאות החיפוש יש רמת רעש לא עקבית במטרה לשמור על הפרטיות של משתמשי הקצה.
הגבלת שאילתות
כשמשתמשים בברירת המחדל EPSILON_PER_MODEL
, אפשר ליצור עד 100 שאילתות של בניית מודלים של רגרסיה ליניארית ולוגיסטית לכל 'יום נתונים'. יום הנתונים מתייחס לאירועים שנוצרו ביום נתון. האירועים האלה תואמים לתאריכי ההתחלה והסיום שאתם מספקים בזמן הרצת השאילתה, ולתאריכי ההתחלה והסיום שמשמשים ליצירת טבלאות שהשאילתה משתמשת בהן – כמו טבלאות זמניות לאימון. כלומר, אפשר להשתמש בנתונים מיום אחד ב-100 מודלים לכל היותר. אם תבחר לציין ערך של EPSILON_PER_MODEL גדול מברירת המחדל, תוכל ליצור פחות מודלים, אבל האיכות שלהם תהיה גבוהה יותר. אם בוחרים ערכים קטנים יותר של EPSILON_PER_MODEL, אפשר לאמן יותר מודלים אבל האיכות שלהם תהיה נמוכה יותר.
איך זה עובד
תהליך העבודה כולל את השלבים הבסיסיים הבאים:
- הכנת נתוני אימון.
- יוצרים מודל.
- לקבל תובנות מהמודל.
הכנת נתוני אימון
כפי שצוין למעלה, שימוש במערכי נתונים גדולים ואיכותיים בדרך כלל יוביל לתוצאות טובות יותר. בנוסף, מאחר שנתוני הקלט מותאמים לעומס (scaling) באמצעות התאמה מינימלית-מקסימלית, נתונים באשכולות מועטים או נתונים עם חריגים משמעותיים יכולים להשפיע לרעה על המודל על ידי הזזת הממוצע.
כברירת מחדל, מערכת Ads Data Hub בוחרת באקראי 18% מנתוני האימון לשימוש לאימות. אפשר לשלוט באחוז הנתונים שמשמשים לאימות באמצעות האפשרות data_split_eval_fraction
.
יצירת מודל
לציין פרמטרים ונתוני קלט לאימון המודל.
שיטות מומלצות
אחד הגורמים החשובים ביותר באיכות המודל הוא הגודל של ערכת האימון. עם זאת, היחסים בין הגודל או האיכות משתנים בהתאם לבעיה ולגורמים שמפורטים בהמשך. נשמח לשמוע על החוויה שלך.
- הבחנו בדיוק > 0.70 למודלים של רגרסיה לוגיסטית שבנויים מערכות אימון שיש בהן לפחות 100,000 משתמשים.
- ראינו r-square > 0.70 למודלים של רגרסיה ליניארית שבנויים מערכות אימון עם 800,000 משתמשים לפחות.
יש גורמים אחרים שעלולים לפגוע באיכות של המודל.
- מודלים לוגיסטיים שבהם כיתה אחת מיוצגת בצורה הרבה יותר גבוהה מהאחרות. באופן ספציפי, אם לתווית אחת יש מעט משתמשים בקבוצות אימונים, שימוש רב בערכות אימון עם תוויות אחרות לא בהכרח יעזור לדיוק של המודל בתווית הקטנה. לדוגמה, 20,000 & 1,000 משתמשים בערכות אימון בשתי תוויות פחות מ-10,000. 2,000.
- נתוני תכונות שלא מספקים אות חזק עבור התוויות.
- נתונים גולמיים שדורשים הנדסת פיצ'רים מקיפה יותר. לדוגמה, בחלק מהשדות עשוי להיות מספר גדול מאוד של ערכים אפשריים. אחת הדרכים לשפר את הנתונים מהסוג הזה היא להפוך את הערכים לתכונה עם מספר קטן יותר של קטגוריות או קטגוריות.
מקבלים תובנות
תוכלו להפעיל לפונקציות כדי להעריך את ביצועי המודל שלכם בנתוני אימות, לבחון תכונות ומידע על איטרציות של אימון (כמו המשקולות הבסיסיות ששימשו את המודל במהלך החיזוי) ולחזות נתונים שלא נצפו.
יצירת הצהרה לגבי 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 עוצמה (cardinality) של תכונות אימון, משתמשים באסטרטגיה
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 של התקציב עבור כל יום נתונים בטווח התאריכים שצוין כשהרצת השאילתה. שימוש בערך ברירת המחדל של ln(3)/10 יאפשר ליצור כ-100 מודלים. אם תשתמשו בערך גבוה יותר, תוכלו ליצור פחות מודלים אבל הם יהיו באיכות גבוהה יותר. אם תשתמשו בערך קטן יותר, תוכלו ליצור יותר מודלים באיכות נמוכה יותר.
ארגומנטים
float64_value
יכול להיות כל מספר נקודה צפה (floating-point) חיובי של 64 ביט שקטן מ-ln(3), שהוא בערך 1.0986. ברירת המחדל היא len(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.
- צריך לתת לעמודה אחת בערכת האימון את השם 'תווית'. בשלב הזה אין תמיכה בכמה תוויות.
- עמודת התווית לא יכולה להכיל ערכי 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
כדי להמחיש איך יוצרים מודל.
אימון של נתונים בשיטת בחירה פנימית (לינארית)
הדוגמה הבאה משתמשת במשקל לידה, מגדר, שבועות היריון, גיל האם וגזע האם כדי לחזות את משקל הלידה של ילד.
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
, גם ללא גישה למודל עצמו. שפת תרגום
כדי לקבל מידע נוסף, אפשר לעיין במאמר בניית מודלים של רגרסיה ליצירת קהלים.
Codelab.