הנושאים שמוסברים במאמר:
- שיטות מומלצות לכל מודלי הנתונים הטבלאיים
- שיטות מומלצות לשימוש במודלים של טבלאות של AutoML
- שיטות מומלצות לשימוש במודלים של תחזיות בטבלה
- שיטות מומלצות לפורמט נתונים
שיטות מומלצות לכל המודלים של נתונים טבלאיים
השיטות המומלצות הבאות רלוונטיות גם אם יוצרים מודל AutoML וגם אם יוצרים מודל שאומן בהתאמה אישית ומשתמש בנתונים טבלאיים.
מניעת זליגת מידע
דליפת נתונים מתרחשת כשנתוני האימון כוללים מידע חיזוי שלא זמין כשמבקשים הסקה. דליפת נתונים עלולה לגרום למודל להציג מדדי הערכה מצוינים, אבל הביצועים שלו יהיו נמוכים בנתונים אמיתיים.
לדוגמה, נניח שאתם רוצים לדעת כמה גלידה החנות שלכם תמכור מחר. אי אפשר לכלול את הטמפרטורה של היום שרוצים לחזות בנתוני האימון, כי הטמפרטורה לא ידועה (היום עוד לא הגיע). עם זאת, אפשר להשתמש בטמפרטורה החזויה מהיום הקודם, שאפשר לכלול בבקשת ההיקש.
דליפת נתונים יכולה להתרחש גם כשמשתמשים באותם נתונים בכמה פיצולים של נתונים. אם משתמשים בנתונים של סדרות זמן, חשוב לוודא שנתונים מאותו תאריך משמשים רק באחד משלושת פיצולי הנתונים.
איך להימנע מ-training-serving skew
הטיה בין אימון להצגה מתרחשת כשיוצרים את נתוני האימון באופן שונה מזה שבו יוצרים את הנתונים שמשמשים לבקשת מסקנות.
לדוגמה, אם משתמשים בערך ממוצע, ולצורך אימון מחשבים את הממוצע על פני 10 ימים, אבל כשמבקשים הסקה, מחשבים את הממוצע על פני החודש האחרון.
באופן כללי, כדי למנוע הטיה בין נתוני האימון לבין נתוני ההצגה (הנתונים שמשמשים ליצירת מסקנות), כדאי לבדוק אם יש הבדל בין האופן שבו אתם יוצרים את נתוני האימון לבין האופן שבו אתם יוצרים את נתוני ההצגה.
הטיה בין אימון להצגה והתפלגות נתונים
הטיה בין אימון להצגת מודל יכולה להתרחש גם על סמך חלוקת הנתונים בפילוח של נתוני האימון, האימות והבדיקה. לרוב יש הבדל בין התפלגות הנתונים שהמודל רואה כשהוא מופעל בסביבת ייצור לבין התפלגות הנתונים של מערך הנתונים שעליו המודל מתאמן. לדוגמה, בסביבת הייצור, יכול להיות שמודל יופעל על אוכלוסיית משתמשים שונה לחלוטין מזו שהוצגה במהלך האימון, או שהמודל ישמש להסקת מסקנות 30 ימים אחרי שנתוני האימון הסופיים תועדו.
כדי לקבל את התוצאות הטובות ביותר, חשוב לוודא שהחלוקה של פיצולי הנתונים שמשמשים ליצירת המודל משקפת בצורה מדויקת את ההבדל בין נתוני האימון לבין הנתונים שאתם מסיקים לגביהם מסקנות בסביבת הייצור. Vertex AI יכול להפיק מסקנות לא מונוטוניות, ואם הנתונים של הייצור נדגמים מתוך התפלגות שונה מאוד מהתפלגות נתוני האימון, המסקנות הלא מונוטוניות לא מאוד מהימנות.
בנוסף, ההבדל בין נתוני הייצור לבין נתוני האימון צריך לבוא לידי ביטוי בהבדל בין פיצול נתוני האימות לבין פיצול נתוני האימון, ובין פיצול נתוני הבדיקה לבין פיצול נתוני האימות.
לדוגמה, אם אתם מתכננים להסיק מסקנות לגבי ערך חיי המשתמש (LTV) ב-30 הימים הבאים, ודאו שהנתונים בחלוקת נתוני האימות הם מ-30 ימים אחרי הנתונים בחלוקת נתוני האימון, ושהנתונים בחלוקת נתוני הבדיקה הם מ-30 ימים אחרי חלוקת נתוני האימות.
באופן דומה, אם רוצים שהמודל יותאם כדי להסיק מסקנות כלליות לגבי משתמשים חדשים, צריך לוודא שנתונים ממשתמש ספציפי כלולים רק בחלק אחד של נתוני האימון. לדוגמה, כל השורות שקשורות ל-user1 נמצאות בפיצול של נתוני האימון, כל השורות שקשורות ל-user2 נמצאות בפיצול של נתוני האימות, וכל השורות שקשורות ל-user3 נמצאות בפיצול של נתוני הבדיקה.
הוספת אות זמן
במודלים של סיווג ורגרסיה, אם סביר שהדפוס הבסיסי בנתונים ישתנה לאורך זמן (הוא לא מפוזר באופן אקראי לאורך זמן), צריך לספק את המידע הזה ל-Vertex AI. יש כמה דרכים לספק אות זמן:
אם לכל שורת נתונים יש חותמת זמן, צריך לוודא שהעמודה הזו כלולה, שסוג ההמרה שלה הוא
Timestampושהיא מוגדרת כעמודה Time כשמאמנים את המודל. הסדר הזה משמש לפיצול הנתונים, כשהנתונים העדכניים ביותר הם נתוני הבדיקה והנתונים המוקדמים ביותר הם נתוני האימון. מידע נוסףאם בעמודת הזמן אין הרבה ערכים שונים, כדאי לבצע פיצול ידני במקום להשתמש בעמודת הזמן כדי לפצל את הנתונים. אחרת, יכול להיות שלא תקבלו מספיק שורות בכל מערך נתונים, מה שיכול לגרום לכשל באימון.
אם פרטי הזמן לא מופיעים בעמודה אחת, אפשר להשתמש בפיצול נתונים ידני כדי להשתמש בנתונים העדכניים ביותר כנתוני הבדיקה, ובנתונים המוקדמים ביותר כנתוני האימון.
הוספת מידע מפורש במקומות שנדרש
בחלק מהפרימיטיבים של הנתונים, אפשר לשפר את איכות המודל באמצעות תכנון תכונות.
לדוגמה, אם הנתונים כוללים קווי אורך ורוחב, המערכת מתייחסת לעמודות האלה כאל עמודות מספריות, ללא חישובים מיוחדים. אם המיקום או המרחק מספקים אות לבעיה, צריך לתכנן תכונה שמספקת את המידע הזה באופן מפורש.
חלק מסוגי הנתונים שעשויים לדרוש הנדסת פיצ'רים (feature engineering):
- קו אורך/קו רוחב
- כתובות URL
- כתובות IP
- כתובות אימייל
- מספרי טלפון
- קודים גיאוגרפיים אחרים (לדוגמה, מיקודים)
הכללת נתונים מחושבים או נתונים מצטברים בשורה
Vertex AI משתמש רק בנתוני הקלט בשורה אחת כדי לחזות את ערך היעד של אותה שורה. אם חישבתם או צברתם נתונים משורות או ממקורות אחרים, שיכולים לעזור לכם לקבוע את הערך החזוי של שורה, כדאי לכלול את הנתונים האלה בשורת המקור. חשוב לוודא שהעמודה החדשה לא גורמת לדליפת נתונים או להטיה בין נתוני האימון לנתוני ההצגה.
לדוגמה, אם רוצים לחזות את הביקוש למוצר בשבוע הבא, אפשר לשפר את איכות ההסקה על ידי הכללת עמודות עם הערכים הבאים:
- המספר הכולל של פריטים במלאי מאותה קטגוריה של המוצר.
- המחיר הממוצע של פריטים במלאי מאותה קטגוריה של המוצר.
- מספר הימים לפני חג ידוע שבו מתבצעת הבקשה להסקת מסקנות.
דוגמה נוספת: אם רוצים לחזות אם משתמש ספציפי יקנה מוצר, כדאי לכלול עמודות עם הערכים הבאים כדי לשפר את איכות ההסקה:
- שיעור ההמרה או שיעור הקליקים ההיסטוריים הממוצעים של המשתמש הספציפי.
- מספר המוצרים שנמצאים כרגע בעגלת הקניות של המשתמש.
הימנעות מהטיה
חשוב לוודא שנתוני האימון מייצגים את כלל הנתונים הפוטנציאליים שאתם מסיקים לגביהם מסקנות. לדוגמה, אם יש לכם לקוחות שגרים בכל העולם, אל תשתמשו בנתוני אימון ממדינה אחת בלבד.
שיטות מומלצות לשימוש במודלים של AutoML בפורמט טבלאי
השיטות המומלצות הבאות מתייחסות ליצירת נתוני אימון בפורמט טבלאי עבור מודלים טבלאיים של AutoML.
ייצוג נכון של ערכי null
אם מייבאים מ-CSV, צריך להשתמש במחרוזות ריקות כדי לייצג ערכי null. מ-BigQuery, משתמשים בערך NULL.
אם הנתונים שלכם כוללים תווים מיוחדים או מספרים שמייצגים ערכים ריקים (null), כולל אפס, המערכת תפרש את הערכים האלה בצורה שגויה, ואיכות המודל תרד.
מומלץ להימנע ככל האפשר מערכים חסרים
בודקים אם חסרים ערכים בנתונים ומתקנים אותם אם אפשר. אחרת, אפשר להשאיר את הערך ריק, והוא ייחשב כערך null.
שימוש ברווחים כדי להפריד בין הטקסט
Vertex AI מבצע טוקניזציה של מחרוזות טקסט ויכול להפיק אותות אימון ממילים ספציפיות. הוא משתמש ברווחים כדי להפריד בין מילים. מילים שמופרדות על ידי תווים אחרים נחשבות לישות אחת.
לדוגמה, אם תספקו את הטקסט 'אדום/ירוק/כחול', הוא לא יפורק לטוקנים 'אדום', 'ירוק' ו'כחול'. אם המילים הבודדות האלה עשויות להיות חשובות לאימון המודל, צריך להמיר את הטקסט ל-"red green blue" לפני שכוללים אותו בנתוני האימון.
חשוב לוודא שהתכונות הקטגוריות מדויקות ונקיות
חוסר עקביות בנתונים עלול לגרום לפיצול שגוי של קטגוריות. לדוגמה, אם הנתונים כוללים את הערכים Brown ו-brown, Vertex AI משתמש בערכים האלה כקטגוריות נפרדות, למרות שאולי התכוונתם שהם יהיו זהים. טעויות איות יכולות להשפיע באופן דומה. לפני שיוצרים את נתוני האימון, חשוב להסיר את אי-ההתאמות האלה מהנתונים הקטגוריים.
שימוש זהיר במיוחד בכיתות לא מאוזנות במודלים של סיווג
אם יש לכם כיתות לא מאוזנות (בעיה בסיווג עם תוצאה אחת או יותר שמופיעה לעיתים רחוקות), כדאי לעיין בטיפים הבאים.
ציון מספיק נתוני אימון עבור המחלקה המיעוטית
אם יש מעט מדי שורות נתונים לסיווג מסוים, איכות המודל נפגעת. אם אפשר, כדאי לספק לפחות 100 שורות נתונים לכל סוג אחסון.
כדאי להשתמש בחלוקה ידנית
Vertex AI בוחר את השורות למערך הנתונים של הבדיקה באופן אקראי (אבל דטרמיניסטי). במקרה של כיתות לא מאוזנות, יכול להיות שבמערך נתוני הבדיקה יהיה מספר קטן של נתונים מהכיתה המיעוטית, או אפילו לא יהיו נתונים כאלה בכלל, מה שיגרום לכישלון של האימון.
אם יש לכם מחלקות לא מאוזנות, כדאי להקצות פיצול ידני כדי לוודא שמספיק שורות עם התוצאות של המיעוט נכללות בכל פיצול.
מספקים מספיק נתוני אימון
אם לא מספקים מספיק נתונים לאימון, יכול להיות שהמודל שיתקבל לא יפעל בצורה טובה. ככל שמשתמשים ביותר עמודות לאימון המודל, צריך לספק יותר נתונים.
מערך הנתונים חייב לכלול תמיד לפחות 1,000 שורות.
בטבלה הבאה מפורטות כמה המלצות לגבי כמות נתוני האימון שצריך לספק, בהתאם למטרה שלכם.
| מטרה | הכמות המינימלית המומלצת של נתוני אימון |
|---|---|
| סיווג | לפחות פי 10 יותר שורות ממספר העמודות. |
| תחזיות | לפחות 10 סדרות זמן לכל עמודה שמשמשת לאימון המודל. |
| רגרסיה | לפחות פי 50 יותר שורות ממספר העמודות. |
להשאיר את כל שאר פעולות העיבוד המקדים וההמרות ל-Vertex AI
אלא אם צוין אחרת, כדאי להשתמש ב-Vertex AI כדי לבצע את הנדסת התכונות בשבילכם כשמאמנים מודל AutoML. השימוש ב-AutoML הכי יעיל כשיש לו גישה לנתונים הבסיסיים שלכם. רשימה של כל הטרנספורמציות ש-AutoML מבצע לפי סוג הטרנספורמציה זמינה במאמר בנושא טרנספורמציות ב-Vertex AI.
שיטות מומלצות למודלים של תחזיות בטבלאות
יש כמה דברים חשובים שצריך לזכור לגבי נתוני אימון של מודלים לחיזוי.
שיקולים לבחירת רמת הפירוט של הנתונים
כשמאמנים מודל חיזוי, מציינים את רמת הפירוט של הנתונים, או את מרווח הזמן בין השורות של נתוני האימון. התדירות יכולה להיות שעתית, יומית, שבועית, חודשית או שנתית. בנוסף, אפשר להגדיר את התזכורת לכל 1, 5, 10, 15 או 30 דקות.
רמת הפירוט של הנתונים צריכה להיות עקבית בנתוני האימון ובכל נתוני ההסקה של אצווה. אם מציינים גרנולריות יומית, ויש יומיים בין שתי שורות של נתוני אימון, מערכת Vertex AI מתייחסת ליום שביניהן כנתונים חסרים, מה שעלול לפגוע בביצועי המודל. אם יש כמה שורות באותה סדרת זמן עם אותה חותמת זמן (כפי שנקבע על ידי רמת הפירוט), הן נחשבות לשגיאת אימות בזמן האימון.
בדרך כלל, רמת הפירוט של הנתונים נקבעת לפי שיטות איסוף הנתונים.
איך מוצאים ערך טוב לחלון ההקשר
אם אתם צופים שיהיו לכם הרבה נתונים של הסקה שלא מתייחסים לעבר (הפעלות במצב התחלתי), כדאי להתחיל בהגדרה של חלון ההקשר ל-0. אחרת, חלון הקשר בגודל שבין גודל אופק החיזוי לבין פי 10 מגודל אופק החיזוי אמור לפעול בצורה טובה.
כדי למצוא ערך טוב לנתונים, אפשר לנסות את השלבים הבאים:
באיטרציה הראשונה של האימון, מגדירים את חלון ההקשר ואת אופק התחזית לאותו ערך, ומגדירים את תקציב האימון ל-6 שעות לפחות.
מאמנים את המודל שוב, עם אותו תקציב אימון, אבל מגדילים פי שניים את גודל חלון ההקשר, כך שהוא יהיה גדול פי שניים מאופק התחזית.
אם מדדי ההערכה של המודל השני מראים שיפור משמעותי, מאמנים את המודל שוב ומגדילים את חלון ההקשר פי 5 מגודל אופק התחזית. כדאי להגדיל את תקציב האימון באופן יחסי (אם אימנתם במשך 10 שעות בשלב הראשון, הגדילו את תקציב האימון ל-50 שעות).
ממשיכים להגדיל את חלון ההקשר עד שלא רואים יותר שיפור במדדי ההערכה או עד שמרוצים מהתוצאות. צריך לחזור לערך הנמוך ביותר של חלון ההקשר שהניב תוצאות מקובלות.
להגדלת חלון ההקשר יש את ההשפעות הבאות:
הגדלת זמן האימון
חלון הקשר הגדול יותר מאפשר למודל להשתמש ביותר נקודות נתונים באימון, ולכן זמן האימון מתארך.
הגדלת כמות ההיסטוריה הנדרשת לנתוני הסקה
נתוני ההסקה צריכים לספק כמה שיותר נקודות נתונים היסטוריות, בהתאם לערך של חלון ההקשר.
שיטות מומלצות לפורמט נתונים
אפשר ליצור את נתוני האימון בפורמט רחב או צר. במודלים של רגרסיה וסיווג, פורמט רחב נמצא בשימוש נרחב ויכול להיות קל יותר להרכבה ולבדיקה. במודלים של תחזיות, שימוש בפורמט צר יכול לעזור לכם להימנע מהגדרת קישורים לא מכוונים בין הנתונים לבין היעד (דליפת נתונים).
כשיוצרים נתוני אימון לאימון מודל תחזית, כל שורה צריכה לייצג תצפית אחת בסדרת זמן אחת. צריכה להיות לכם עמודה שמייצגת את המזהה של סדרת הזמן (איך סדרות הזמן נבדלות זו מזו), ועמודה שמייצגת את הערך שאתם רוצים לחזות (היעד שלכם). לאחר מכן, כל ערך אחר בשורה שמשמש לאימון המודל צריך להיות נוכח בזמן שאתם מבקשים הסקה עבור היעד שלכם.
הנה דוגמה (פשוטה ומקוצרת) לנתוני אימון:
| תאריך | Widget_1_Demand | Widget_2_Demand | Widget_3_Demand | מבצע | אזור |
|---|---|---|---|---|---|
| 01/01/2019 | 112 | 241 | 0 | 0 | CA |
| 01/02/2019 | 141 | 219 | 0 | 1 | CA |
| 01/03/2019 | 149 | 244 | 0 | 0 | CA |
| 01/01/2019 | 52 | 0 | 43 | 0 | IL |
| 01/02/2019 | 81 | 0 | 26 | 1 | IL |
| 01/03/2019 | 89 | 0 | 86 | 0 | IL |
בטבלה הזו, בפורמט רחב, מוצגים נתונים עסקיים לפי תאריך, אבל אי אפשר להשתמש בה במודל תחזיות בצורה הנוכחית שלה. אין עמודת יעד יחידה, אין עמודת מזהה של סדרת זמן, ולכל תאריך נתון, לא תדעו את הביקוש לווידג'טים האחרים בזמן ההסקה.
אפשר להמיר את הטבלה הזו לפורמט הזה:
| תאריך | מוצר | Region_CA_Demand | Region_IL_Demand | מבצע |
|---|---|---|---|---|
| 01/01/2019 | Widget_1 | 112 | 52 | 0 |
| 01/02/2019 | Widget_1 | 141 | 81 | 1 |
| 01/03/2019 | Widget_1 | 149 | 89 | 0 |
| 01/01/2019 | Widget_2 | 241 | 0 | 0 |
| 01/02/2019 | Widget_2 | 219 | 0 | 1 |
| 01/03/2019 | Widget_2 | 244 | 0 | 0 |
| 01/01/2019 | Widget_3 | 0 | 43 | 0 |
| 01/02/2019 | Widget_3 | 0 | 26 | 1 |
| 01/03/2019 | Widget_3 | 0 | 86 | 0 |
עכשיו יש לנו עמודה פוטנציאלית של מזהי סדרות עיתיות, Product (מוצר). עם זאת, אפשר להשתמש בפורמט הזה רק כדי לחזות את אחד האזורים, וצריך לדעת את הנתונים של האזור השני בזמן ההסקה.
הפתרון הוא להמיר לפורמט צר, כך שכל שורה מייצגת תצפית אחת. כל נתון שלא תלוי בסדרת הזמן חוזר על עצמו בכל שורה:
| תאריך | ביקוש | מזהה | מבצע |
|---|---|---|---|
| 01/01/2019 | 112 | Widget_1_CA | 0 |
| 01/02/2019 | 141 | Widget_1_CA | 1 |
| 01/03/2019 | 149 | Widget_1_CA | 0 |
| 01/01/2019 | 52 | Widget_1_IL | 0 |
| 01/02/2019 | 81 | Widget_1_IL | 1 |
| 01/03/2019 | 89 | Widget_1_IL | 0 |
| 01/01/2019 | 241 | Widget_2_CA | 0 |
| 01/02/2019 | 219 | Widget_2_CA | 1 |
| 01/03/2019 | 244 | Widget_2_CA | 0 |
| 01/01/2019 | 0 | Widget_2_IL | 0 |
| 01/02/2019 | 0 | Widget_2_IL | 1 |
| 01/03/2019 | 0 | Widget_2_IL | 0 |
| 01/01/2019 | 0 | Widget_3_CA | 0 |
| 01/02/2019 | 0 | Widget_3_CA | 1 |
| 01/03/2019 | 0 | Widget_3_CA | 0 |
| 01/01/2019 | 43 | Widget_3_IL | 0 |
| 01/02/2019 | 26 | Widget_3_IL | 1 |
| 01/03/2019 | 86 | Widget_3_IL | 0 |
עכשיו יש לנו מזהה (ID) של סדרת זמן, עמודת יעד (ביקוש) ועמודת זמן (תאריך). בנוסף, כל שורה מבוססת על תצפית אחת, שאפשר להשתמש בה כדי לחזות את ערך היעד. העמודה Promo משמשת כמאפיין לאימון המודל.
בפועל, יהיו לכם הרבה יותר שורות והרבה יותר עמודות מאשר בדוגמאות האלה. אבל אתם צריכים לפעול לפי ההנחיות שבהמשך כדי לבנות את הנתונים בצורה שתמנע דליפת נתונים.