צור תחזיות מדויקות וניתנות לפירוש
לפי [2], Transformer Temporal Fusion עולה על כל המודלים הבולטים של Deep Learning עבור חיזוי סדרות זמן.
כולל מובלט עץ מגביר שיפוע מודל לנתוני סדרות זמן טבלאיות.
אבל מה כן Transformer Temporal Fusion (TFT)[3] ולמה זה כל כך מעניין?
במאמר זה, אנו מסבירים בקצרה את החידושים של Transformer Temporal Fusion ולבנות עליו פרויקט מקצה לקצה חיזוי ביקוש לאנרגיה. באופן ספציפי, נעסוק ב:
- כיצד להכין את הנתונים שלנו לפורמט TFT.
- כיצד לבנות, לאמן ולהעריך את מודל ה-TFT.
- כיצד לקבל תחזיות על נתוני אימות ותחזיות מחוץ לדגימה.
- כיצד לחשב חשיבות תכונה, דפוסי עונתיות, ו חוסן אירועים קיצוניים באמצעות הדגם המובנה תשומת לב ניתנת לפירוש מנגנון.
בואו נצלול פנימה!
לניתוח מעמיק של ארכיטקטורת Temporal Fusion Transformer, בדוק את הקודם שלי מאמר.
Tאמפורלית Fשימוש Tפוסק (TFT) הוא מודל מבוסס שנאי הממנף תשומת לב עצמית כדי ללכוד את הדינמיקה הטמפורלית המורכבת של רצפי זמן מרובים.
TFT תומך:
- סדרות זמן מרובות: אנו יכולים להכשיר מודל TFT על אלפי סדרות זמן חד-משתניות או רב-משתניות.
- חיזוי רב אופקים: המודל מוציא תחזיות רב-שלביות של משתנה יעד אחד או יותר - כולל מרווחי חיזוי.
- תכונות הטרוגניות: TFT תומך בסוגים רבים של תכונות, כולל משתנים אקסוגניים סטטיים ומשתנים זמן.
- תחזיות ניתנות לפירוש: ניתן לפרש את התחזיות במונחים של חשיבות משתנה ועונתיות.
אחת מהתכונות הללו היא ייחודית ל Transformer Temporal Fusion. נסקור זאת בסעיף הבא.
בין דגמי סדרת הזמן הבולטים של DL (למשל, DeepAR[4]), TFT בולט מכיוון שהוא תומך בסוגים שונים של תכונות. אלו הם:
- משתנה בזמן ידוע
- משתנה בזמן לא ידוע
- משתנה בזמן ממשי
- משתנה בזמן קטגורית
לדוגמה, דמיינו שיש לנו א מקרה חיזוי מכירות:
נניח שעלינו לחזות את המכירות של 3 מוצרים. ה num sales
הוא משתנה היעד. ה CPI index
או number of visitors
יש לו משתנה בזמן לא ידוע תכונות מכיוון שהן ידועות רק עד לזמן החיזוי. למרות זאת, holidays
ו special days
יש לו ידוע משתנה בזמן אירועים
אל האני product id
is קטגוריה משתנה בזמן (סטטי). תכונה. תכונות אחרות שהן מספריות ולא תלויות זמן כגון yearly_revenue
ניתן לסווג כ משתנה בזמן אמיתי.
לפני המעבר לפרויקט שלנו, נציג תחילה מיני-מדריך כיצד להמיר את הנתונים שלך ל- פורמט של סדרות זמן מורחבות.
הערה: כל התמונות והדמויות במאמר זה נוצרו על ידי המחבר.
עבור הדרכה זו, אנו משתמשים ב- TemporalFusionTransformer
דגם מה חיזוי PyTorch הספרייה ו- PyTorch Lightning:
pip להתקין לפיד pytorch-lightning pytorch_forecasting
כל התהליך כולל 3 דברים:
- צור מסגרת נתונים של פנדה עם נתוני סדרות הזמן שלנו.
- עטפו את מסגרת הנתונים שלנו לתוך א TimeSeriesDataset למשל.
- תעבור את שלנו TimeSeriesDataset מופע ל
TemporalFusionTransformer.
אל האני TimeSeriesDataset שימושי מאוד מכיוון שהוא עוזר לנו לציין אם התכונות משתנות בזמן או סטטיות. בנוסף, זה הפורמט היחיד ש TemporalFusionTransformer
מקבל.
בואו ניצור מערך אימון מינימלי כדי להראות איך TimeSeriesDataset עבודות:
עלינו לעצב את הנתונים שלנו בצורה הבאה: כל תיבה צבעונית מייצגת סדרת זמן שונה, המיוצגת על ידי שלה group
ערך.
העמודה החשובה ביותר של מסגרת הנתונים שלנו היא time_idx
- הוא קובע את רצף הדגימות. אם אין תצפיות חסרות, הערכים צריכים לעלות ב- +1 עבור כל סדרת זמן.
לאחר מכן, אנו עוטפים את מסגרת הנתונים שלנו לתוך א TimeSeriesDataset למשל:
כל הטיעונים מובנים מאליהם: ה max_encoder_length
מגדיר את תקופת המבט לאחור ו max_prediction_length
מציין כמה נקודות נתונים יחזו. במקרה שלנו, אנו מסתכלים אחורה 3 שלבי זמן בעבר כדי להוציא 2 תחזיות.
אל האני TimeSeriesDataset מופע משמש כעת כמטען נתונים. בואו נדפיס אצווה ונבדוק איך הנתונים שלנו יועברו ל-TFT:
אצווה זו מכילה את ערכי האימון [0,1]
מסדרת הזמן הראשונה (group 0
) וערכי הבדיקה[2,3,4]
. אם תפעיל מחדש את הקוד הזה, תקבל ערכים שונים מכיוון שהנתונים מערבבים כברירת מחדל.
הפרויקט שלנו ישתמש ב- דיאגרמות עומס חשמל20112014 [5] מערך נתונים מ-UCI. ניתן להוריד את המחברת עבור דוגמה זו כאן:
מערך נתונים זה מכיל את צריכת החשמל (ב-KWs) של 370 לקוחות/צרכנים בתדירות של 15 דקות. הנתונים מתפרשים על פני 4 שנים (2011–2014).
חלק מהצרכנים נוצרו לאחר 2011, כך שצריכת החשמל שלהם בהתחלה היא אפס.
אנו עושים עיבוד מקדים של נתונים לפי [3]:
- צבר את משתנה היעד שלנו
power_usage
לפי שעה. - מצא את התאריך המוקדם ביותר עבור כל סדרת זמן שבה ההספק אינו אפס.
- צור תכונות חדשות:
month
,day
,hour
וday_of_week
. - בחר את כל הימים שבין
2014–01–01
ו2014–09–07
.
בואו נתחיל:
הורד נתונים
wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!לִפְתוֹחַ LD2011_2014.txt.zip
עיבוד נתונים מראש
כל עמודה מייצגת צרכן. הכי ראשוני power_usage
הערכים הם 0.
לאחר מכן, אנו נצברים לנתונים לפי שעה. בשל גודלו ומורכבותו של הדגם, אנו מאמנים את הדגם שלנו על 5 צרכנים בלבד (לבעלי ערכים שאינם אפס).
כעת, אנו מכינים את מערך הנתונים שלנו עבור TimeSeriesDataset פוּרמָט. שימו לב שכל עמודה מייצגת סדרת זמן שונה. לפיכך, אנו 'ממיסים' את מסגרת הנתונים שלנו, כך שכל סדרות הזמן מוערמות אנכית במקום אופקית. תוך כדי כך אנו יוצרים את התכונות החדשות שלנו.
מסגרת הנתונים הסופית המעובדת מראש נקראת time_df
. בואו נדפיס את תוכנו:
אל האני time_df
נמצא כעת בפורמט המתאים עבור TimeSeriesDataset. כפי שניחשתם עד עכשיו, מכיוון שהפירוט הוא שעתי, ה- hours_from_start
המשתנה יהיה ה מדד הזמן.
ניתוח נתונים חקרני
הבחירה של 5 צרכנים/סדרות זמן אינה אקראית. ה power usage
של כל סדרת זמן יש מאפיינים שונים, כגון הערך הממוצע:
time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()
בואו נתווה את החודש הראשון של כל סדרת זמן:
אין מגמה בולטת, אבל לכל סדרת זמן יש עונתיות ומשרעת מעט שונה. אנחנו יכולים להמשיך להתנסות ולבדוק נייחות, פירוק אותות וכן הלאה, אבל במקרה שלנו, אנחנו מתמקדים רק בהיבט של בניית המודל.
כמו כן, שימו לב ששיטות חיזוי אחרות של סדרות זמן כמו ארימה חייב לעמוד בכמה דרישות (לדוגמה, סדרת הזמן חייבת להיות נייחת תחילה.) עם TFT, אנו יכולים להשאיר את הנתונים שלנו כפי שהם.
צור DataLoaders
בשלב זה, אנו עוברים את שלנו time_df
אל ה TimeSeriesDataSet פורמט שהוא מאוד שימושי כי:
- זה חוסך מאיתנו לכתוב את ה-Dataloader שלנו.
- אנו יכולים לציין כיצד TFT יטפל בתכונות של מערך הנתונים.
- אנחנו יכולים לנרמל את מערך הנתונים שלנו בקלות. במקרה שלנו, נורמליזציה היא חובה מכיוון שכל רצפי הזמן שונים בגודלם. לפיכך, אנו משתמשים ב- GroupNormalizer לנרמל כל סדרת זמן בנפרד.
המודל שלנו משתמש בחלון מבט לאחור של שבוע אחד (7*24) כדי לחזות את צריכת החשמל של 24 השעות הבאות.
כמו כן, שימו לב כי hours_from_start
הוא גם מדד הזמן וגם תכונה משתנה בזמן. ה power_usage
הוא משתנה היעד שלנו. למען ההדגמה, ערכת האימות שלנו היא היום האחרון:
מודל בסיס
בשלב הבא, השלב שכמעט כולם שוכחים: מודל בסיסי. במיוחד בחיזוי סדרות זמן, תופתעו לגלות באיזו תדירות מנבא נאיבי עולה על אפילו מודל מהודר יותר!
כקו בסיס נאיבי, אנו חוזים את עקומת צריכת החשמל של היום הקודם:
הכשרת דגם Temporal Fusion Transformer
אנחנו יכולים לאמן את מודל ה-TFT שלנו באמצעות המוכר מאמן ממשק מבית PyTorch Lightning.
שימו לב לדברים הבאים:
- אנו משתמשים עצירה מוקדמת התקשרות חוזרת כדי לעקוב אחר אובדן האימות.
- אנו משתמשים לוח מחוונים כדי לרשום את מדדי ההדרכה והאימות שלנו.
- המודל שלנו משתמש הפסד כמותי - סוג מיוחד של אובדן שעוזר לנו להוציא את מרווחי החיזוי. למידע נוסף על פונקציית אובדן כמות, בדוק מאמר זה.
- אנו משתמשים ב-4 ראשי תשומת לב, כמו הנייר המקורי.
כעת אנו מוכנים לבנות ולהכשיר את המודל שלנו:
זהו זה! לאחר 6 עידנים, EarlyStopping נכנס פנימה ומפסיק את האימונים.
טען ושמור את הדגם הטוב ביותר
אל תשכח לשמור את הדגם שלך. למרות שאנו יכולים לחמוץ אותו, האפשרות הבטוחה ביותר היא לשמור את התקופה הטובה ביותר ישירות:
!zip -r model.zip lightning_logs/lightning_logs/version_1/*
כדי לטעון שוב את הדגם, פתח את הרוכסן model.zip ובצע את הפעולות הבאות - רק זכור את נתיב הדגם הטוב ביותר:
בדוק את Tensorboard
תסתכל מקרוב על עקומות אימון ואימות עם Tensorboard:
הערכת מודל
קבל תחזיות על ערכת האימות וחשב את הממוצע P50 (חציון כמותי) את:
ל-2 סדרות הזמן האחרונות יש הפסד קצת יותר גבוה מכיוון שגם הגודל היחסי שלהן גבוה.
תכנן תחזיות על נתוני אימות
אם נעבור את mode=raw
על לנבא() בשיטה, אנו מקבלים מידע נוסף, כולל תחזיות עבור כל שבעת הקוונטילים. יש לנו גם גישה לערכי הקשב (עוד על כך בהמשך).
תסתכל מקרוב על raw_predictions
מִשְׁתַנֶה:
אנו משתמשים plot_prediction() ליצור את המגרשים שלנו. כמובן, אתה יכול ליצור עלילה מותאמת אישית משלך - ה plot_prediction() יש יתרון נוסף של הוספת ערכי הקשב.
הערה: המודל שלנו חוזה את 24 נקודות הנתונים הבאות במכה אחת. זה לא תרחיש חיזוי מתגלגל שבו מודל מנבא א יחיד ערך כל פעם ו'תפר' את כל התחזיות ביחד.
אנו יוצרים חלקה אחת לכל צרכן (5 בסך הכל).
התוצאות מרשימות למדי.
את העתיד Transformer Temporal Fusion המודל הצליח לתפוס את ההתנהגות של כל 5 סדרות הזמן, הן מבחינת עונתיות והן מבחינת גודל!
כמו כן, שימו לב כי:
- לא ביצענו שום כוונון היפרפרמטר.
- לא יישמנו שום טכניקה מהודרת להנדסת תכונות.
בסעיף הבא, אנו מראים כיצד לשפר את המודל שלנו עם אופטימיזציה של היפרפרמטרים.
תחזיות עלילה עבור סדרת זמן מסוימת
בעבר, אנו מתווים תחזיות על נתוני האימות באמצעות ה idx
ארגומנט, שחוזר על פני כל סדרות הזמן במערך הנתונים שלנו. אנחנו יכולים להיות ספציפיים יותר ולספק תחזיות על סדרת זמן מסוימת:
In איור 7, אנחנו מתכננים את היום שלפניו MT_004 צרכן עבור מדד זמן=26512.
זכור, העמודה שלנו לאינדקס זמן hours_from_start
מתחיל מ-26304 ונוכל לקבל תחזיות מ-26388 ואילך (כי קבענו מוקדם יותר min_encoder_length=max_encoder_length // 2
אשר שווה 26304 + 168//2=26388
תחזיות מחוץ לדגימה
בואו ניצור תחזיות מחוץ לדגימה, מעבר לנקודת הנתונים הסופית של נתוני אימות - כלומר 2014–09–07 23:00:00
כל שעלינו לעשות הוא ליצור מסגרת נתונים חדשה המכילה:
- מספר
N
=max_encoder_length
תאריכים קודמים, המשמשים כחלון המבט לאחור - ה נתוני מקודד בטרמינולוגיה של TFT. - התאריכים העתידיים של גודל
max_prediction_length
עבורו אנו רוצים לחשב את התחזיות שלנו - ה נתוני מפענח.
אנחנו יכולים ליצור תחזיות עבור כל 5 סדרות הזמן שלנו, או רק אחת. איור 7 מציג את התחזיות מחוץ לדגימה לצרכן MT_002:
חיזוי מדויק הוא דבר אחד, אבל גם להסבר יש חשיבות רבה בימינו.
וזה אפילו יותר גרוע עבור דגמי Deep Learning, הנחשבים לקופסאות שחורות. שיטות כגון ליים ו מעצב יכול לספק הסבר (במידה מסוימת) אבל לא עובד טוב עבור סדרות זמן. בנוסף, הן שיטות פוסט-הוק חיצוניות ואינן קשורות למודל מסוים.
Transformer Temporal Fusion מספק שלושה סוגים של פרשנות:
- מבחינת עונתיות: TFT ממנפת את הרומן שלו תשומת לב מרובה ראשים ניתנת לפירוש מנגנון לחישוב החשיבות של צעדי זמן עבר.
- מבחינה תכונה: TFT ממנפת את זה רשת בחירה משתנים מודול לחישוב החשיבות של כל תכונה.
- חוסן אירועים קיצוניים: אנו יכולים לחקור כיצד סדרות זמן מתנהגות במהלך אירועים נדירים
אם אתה רוצה ללמוד לעומק על פעולתו הפנימית של תשומת לב מרובה ראשים ניתנת לפירוש ו רשת בחירה משתנים, בדוק את המאמר הקודם שלי.
פרשנות עונתית
TFT בוחן את משקלי הקשב כדי להבין את הדפוסים הזמניים לאורך שלבי זמן עבר.
הקווים האפורים בכל העלילות הקודמות מייצגים את ציוני הקשב. תסתכל שוב על העלילות האלה - אתה שם לב למשהו? איור 8 מראה את הממצאים של איור 7 וגם אחראי על ציוני הקשב:
ציוני הקשב חושפים את מידת ההשפעה של שלבי הזמן הללו כאשר המודל מוציא את התחזית שלו. הפסגות הקטנות משקפות את העונתיות היומית, בעוד שהפסגה הגבוהה לקראת הסוף מרמזת כנראה על העונתיות השבועית.
אם נעשה ממוצע של עקומות הקשב על פני כל שלבי הזמן וסדרות הזמן (לא רק 5 אלה שהשתמשנו בהם במדריך זה), נקבל את הצורה בעלת המראה הסימטרי ב איור 9 מנייר ה-TFT:
שאלה: מה זה טוב? האם איננו יכולים פשוט להעריך דפוסי עונתיות עם שיטות כגון עלילות ACF, פירוק אותות זמן וכו'?
תשובה: נָכוֹן. עם זאת, ללימוד משקלי הקשב של TFT יש יתרונות נוספים:
- אנחנו יכולים לאשר שהמודל שלנו לוכד את הדינמיקה העונתית הנראית לעין של הרצפים שלנו.
- המודל שלנו עשוי גם לחשוף דפוסים נסתרים מכיוון שמשקולות הקשב של חלונות הקלט הנוכחיים לוקחים בחשבון את כל הקלטות העבר.
- עלילת משקלי הקשב אינה זהה לעלילה של מתאם אוטומטי: עלילת המתאם האוטומטית מתייחסת לרצף מסוים, בעוד שקלולי הקשב כאן מתמקדים בהשפעה של כל צעד זמן על ידי הסתכלות על פני כל משתני המשתנים וסדרות הזמן.
פרשנות מבחינה תכונה
אל האני רשת בחירה משתנים רכיב של TFT יכול בקלות להעריך את חשיבות תכונה:
In איור 10, אנו מבחינים בדברים הבאים:
- אל האני
hour
וday_of_week
בעלי ציונים חזקים, הן כתצפיות מהעבר והן כמשתנים שותפים עתידיים. המדד במאמר המקורי חולק את אותה מסקנה. - אל האני
power_usage
הוא ללא ספק המשתנה המשתנה המשפיע ביותר שנצפה. - אל האני
consumer_id
זה לא מאוד משמעותי כאן כי אנחנו משתמשים רק ב-5 צרכנים. במאמר TFT, שבו המחברים משתמשים בכל 370 הצרכנים, המשתנה הזה משמעותי יותר.
הערה: אם המשתנה הסטטי לקיבוץ אינו חשוב, סביר מאוד להניח שניתן לעצב את מערך הנתונים שלך באותה מידה על ידי מודל הפצה יחיד (כמו ARIMA).
זיהוי אירוע קיצוני
סדרות זמן ידועות לשמצה בכך שהן רגישות לשינויים פתאומיים בתכונות שלהן במהלך אירועים נדירים (המכונה גם זעזועים).
גרוע מכך, האירועים הללו חמקמקים מאוד. תארו לעצמכם אם משתנה היעד שלכם הופך לתנודתי לתקופה קצרה מכיוון שמשתנה משנה משנה התנהגות בשקט:
האם זה איזה רעש אקראי או דפוס מתמשך נסתר שבורח מהדגם שלנו?
עם TFT, אנו יכולים לנתח את החוסן של כל תכונה בודדת על פני טווח הערכים שלה. למרבה הצער, מערך הנתונים הנוכחי אינו מציג תנודתיות או אירועים נדירים - סביר יותר שימצאו אותם בנתונים פיננסיים, מכירות וכן הלאה. ובכל זאת, נראה כיצד לחשב אותם:
לחלק מהתכונות לא כל הערכים שלהן קיימים במערך האימות, ולכן אנו מציגים רק את hour
ו consumer_id
:
בשני האיורים, התוצאות מעודדות. ב איור 12, אנו שמים לב לצרכן הזה MT_004 ביצועים מעט נמוכים בהשוואה לצרכנים אחרים. נוכל לאמת זאת אם ננרמל את אובדן ה-P50 של כל צרכן עם צריכת החשמל הממוצעת שלו שחישבנו בעבר.
הפסים האפורים מציינים את ההתפלגות של כל משתנה. דבר אחד שאני תמיד עושה הוא למצוא לאילו ערכים יש תדירות נמוכה. לאחר מכן, אני בודק כיצד המודל מתפקד באזורים אלה. לפיכך, אתה יכול לזהות בקלות אם הדגם שלך לוכד התנהגות של אירועים נדירים.
באופן כללי, אתה יכול להשתמש בתכונת TFT זו כדי לחקור את המודל שלך לאיתור חולשות ולהמשיך לחקירה נוספת.
אנחנו יכולים להשתמש בצורה חלקה Transformer Temporal Fusion עם אופטונה כדי לבצע כוונון היפרפרמטר:
הבעיה היא שמכיוון ש-TFT הוא דגם מבוסס שנאי, תזדקק למשאבי חומרה משמעותיים!
Transformer Temporal Fusion הוא ללא ספק אבן דרך עבור קהילת Time-Series.
לא רק שהמודל משיג תוצאות SOTA, אלא גם מספק מסגרת לפרשנות של תחזיות. הדגם זמין גם ב- חצים ספריית python, המבוססת על ספריית PyTorch Forecasting.
לבסוף, אם אתה סקרן ללמוד על הארכיטקטורה של Transformer Temporal Fusion בפירוט, בדוק את מאמר נלווה על הנייר המקורי.
Temporal Fusion Transformer: חיזוי סדרות זמן עם למידה עמוקה - הדרכה מלאה פורסם מחדש ממקור https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 דרך https://towardsdatascience.com/feed
<!–
->