Transformer Temporal Fusion: חיזוי סדרות זמן עם למידה עמוקה - הדרכה מלאה

צור תחזיות מדויקות וניתנות לפירוש

נוצר עם DALLE [1]

לפי [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 דברים:

  1. צור מסגרת נתונים של פנדה עם נתוני סדרות הזמן שלנו.
  2. עטפו את מסגרת הנתונים שלנו לתוך א TimeSeriesDataset למשל.
  3. תעבור את שלנו TimeSeriesDataset מופע ל TemporalFusionTransformer.

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

בואו ניצור מערך אימון מינימלי כדי להראות איך TimeSeriesDataset עבודות:

עלינו לעצב את הנתונים שלנו בצורה הבאה: כל תיבה צבעונית מייצגת סדרת זמן שונה, המיוצגת על ידי שלה group ערך.

איור 1: מסגרת הנתונים sample_data pandas

העמודה החשובה ביותר של מסגרת הנתונים שלנו היא 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()

בואו נתווה את החודש הראשון של כל סדרת זמן:

איור 2: החודש הראשון מכל 5 סדרות הזמן/צרכנים.

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

כמו כן, שימו לב ששיטות חיזוי אחרות של סדרות זמן כמו ארימה חייב לעמוד בכמה דרישות (לדוגמה, סדרת הזמן חייבת להיות נייחת תחילה.) עם 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 בסך הכל).

איור 3: תחזיות על נתוני אימות עבור MT_002
איור 4: תחזיות על נתוני אימות עבור MT_004
איור 5: תחזיות על נתוני אימות עבור MT_005
איור 6: תחזיות על נתוני אימות עבור MT_006
איור 7: תחזיות על נתוני אימות עבור MT_008

התוצאות מרשימות למדי.

את העתיד Transformer Temporal Fusion המודל הצליח לתפוס את ההתנהגות של כל 5 סדרות הזמן, הן מבחינת עונתיות והן מבחינת גודל!

כמו כן, שימו לב כי:

  • לא ביצענו שום כוונון היפרפרמטר.
  • לא יישמנו שום טכניקה מהודרת להנדסת תכונות.

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

תחזיות עלילה עבור סדרת זמן מסוימת

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

איור 7: תחזית יום קדימה עבור MT_004 על ערכת האימונים

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:

איור 7: תחזית יום קדימה עבור MT_002

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

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

Transformer Temporal Fusion מספק שלושה סוגים של פרשנות:

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

אם אתה רוצה ללמוד לעומק על פעולתו הפנימית של תשומת לב מרובה ראשים ניתנת לפירוש ו רשת בחירה משתנים, בדוק את המאמר הקודם שלי.

פרשנות עונתית

TFT בוחן את משקלי הקשב כדי להבין את הדפוסים הזמניים לאורך שלבי זמן עבר.

הקווים האפורים בכל העלילות הקודמות מייצגים את ציוני הקשב. תסתכל שוב על העלילות האלה - אתה שם לב למשהו? איור 8 מראה את הממצאים של איור 7 וגם אחראי על ציוני הקשב:

איור 8: תחזית יום קדימה עבור MT_001 עם עונתיות מוצגות

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

אם נעשה ממוצע של עקומות הקשב על פני כל שלבי הזמן וסדרות הזמן (לא רק 5 אלה שהשתמשנו בהם במדריך זה), נקבל את הצורה בעלת המראה הסימטרי ב איור 9 מנייר ה-TFT:

איור 9: תבניות זמניות עבור מערך נתונים של חשמל (מָקוֹר)

שאלה: מה זה טוב? האם איננו יכולים פשוט להעריך דפוסי עונתיות עם שיטות כגון עלילות ACF, פירוק אותות זמן וכו'?

תשובה: נָכוֹן. עם זאת, ללימוד משקלי הקשב של TFT יש יתרונות נוספים:

  1. אנחנו יכולים לאשר שהמודל שלנו לוכד את הדינמיקה העונתית הנראית לעין של הרצפים שלנו.
  2. המודל שלנו עשוי גם לחשוף דפוסים נסתרים מכיוון שמשקולות הקשב של חלונות הקלט הנוכחיים לוקחים בחשבון את כל הקלטות העבר.
  3. עלילת משקלי הקשב אינה זהה לעלילה של מתאם אוטומטי: עלילת המתאם האוטומטית מתייחסת לרצף מסוים, בעוד שקלולי הקשב כאן מתמקדים בהשפעה של כל צעד זמן על ידי הסתכלות על פני כל משתני המשתנים וסדרות הזמן.

פרשנות מבחינה תכונה

אל האני רשת בחירה משתנים רכיב של TFT יכול בקלות להעריך את חשיבות תכונה:

איור 10: כולל חשיבות על נתוני אימות

In איור 10, אנו מבחינים בדברים הבאים:

  • אל האני hour ו day_of_week בעלי ציונים חזקים, הן כתצפיות מהעבר והן כמשתנים שותפים עתידיים. המדד במאמר המקורי חולק את אותה מסקנה.
  • אל האני power_usage הוא ללא ספק המשתנה המשתנה המשפיע ביותר שנצפה.
  • אל האני consumer_id זה לא מאוד משמעותי כאן כי אנחנו משתמשים רק ב-5 צרכנים. במאמר TFT, שבו המחברים משתמשים בכל 370 הצרכנים, המשתנה הזה משמעותי יותר.

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

זיהוי אירוע קיצוני

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

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

האם זה איזה רעש אקראי או דפוס מתמשך נסתר שבורח מהדגם שלנו?

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

לחלק מהתכונות לא כל הערכים שלהן קיימים במערך האימות, ולכן אנו מציגים רק את hour ו consumer_id:

איור 11: תחזיות לעומת אמת (ממוצע מנורמל) לפי שעה
איור 12: תחזיות לעומת בפועל (ממוצעים מנורמלים) ב-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

<!–

->

בול זמן:

עוד מ יועצי בלוקצ'יין