נתונים קטגוריים: אוצר מילים וקידוד חד-פעמי

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

שם התכונה מספר הקטגוריות קטגוריות לדוגמה
snowed_today 2 True, ‏ False
skill_level 3 מתחילים, משתמשים מתקדמים, מומחים
season 4 חורף, אביב, קיץ, סתיו
day_of_week 7 שני, שלישי, רביעי
כוכב לכת 8 כוכב חמה, נוגה, כדור הארץ

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

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

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

תרגול: בדיקת ההבנה

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

מספרי מדדים

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

איור 2. לכל צבע משויך ערך מספר שלם ייחודי. לדוגמה, 'אדום' משויך למספר השלם 0, 'כתום' משויך למספר השלם 1 וכן הלאה.
איור 2. תכונות שנוספו לאינדקס.

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

קידוד One-hot

השלב הבא ביצירת אוצר מילים הוא להמיר כל מספר אינדקס לקידוד one-hot שלו. בקידוד one-hot:

  • כל קטגוריה מיוצגת על ידי וקטור (מערך) של N אלמנטים, כאשר N הוא מספר הקטגוריות. לדוגמה, אם ל-car_color יש שמונה קטגוריות אפשריות, אז וקטור ה-one-hot שמייצג אותו יכלול שמונה רכיבים.
  • בדיוק אחד מהאלמנטים בוקטור one-hot מקבל את הערך 1.0, וכל שאר הרכיבים מקבלים את הערך 0.0.

לדוגמה, בטבלה הבאה מוצגת הקידוד של one-hot לכל ערך ב-car_color:

תכונה אדום Orange כחול צהוב ירוק שחור סגול חום
'אדום' 1 0 0 0 0 0 0 0
"Orange" 0 1 0 0 0 0 0 0
'כחול' 0 0 1 0 0 0 0 0
'צהוב' 0 0 0 1 0 0 0 0
'ירוק' 0 0 0 0 1 0 0 0
'Black' 0 0 0 0 0 1 0 0
'Purple' 0 0 0 0 0 0 1 0
'חום' 0 0 0 0 0 0 0 1

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

באיור הבא מוצגות הטרנספורמציות השונות שמייצגות את אוצר המילים:

איור 3.  תרשים של התהליך מקצה לקצה למיפוי קטגוריות לוקטורים של מאפיינים. בתרשים, מאפייני הקלט הם 'צהוב',
      'כתום', 'כחול' ו 'כחול' בפעם השנייה.  המערכת משתמשת במילון מאוחסן ('אדום' הוא 0, 'כתום' הוא 1, 'כחול' הוא 2, 'צהוב' הוא 3 וכן הלאה) כדי למפות את ערך הקלט למזהה. לכן, המערכת ממפה את הערכים 'צהוב', 'כתום', 'כחול' ו 'כחול' ל-3, 1, 2 ו-2. לאחר מכן המערכת ממירה את הערכים האלה לווקטור מאפיינים מסוג one-hot. לדוגמה, במערכת עם שמונה צבעים אפשריים, הערך 3 הופך ל-0, 0, 0, 1, 0, 0, 0, 0.
איור 3. התהליך מקצה לקצה למיפוי קטגוריות לוקטורים של מאפיינים.

ייצוג דליל

מאפיין שהערכים שלו הם בעיקר אפס (או ריקים) נקרא מאפיין דל. הרבה תכונות קטגוריות, כמו car_color, הן בדרך כלל תכונות דלילות. ייצוג דל פירושו שמאחסנים את המיקום של הערך 1.0 בווקטור דל. לדוגמה, הווקטור החד-חם של "Blue" הוא:

[0, 0, 1, 0, 0, 0, 0, 0]

מכיוון ש-1 נמצא במיקום 2 (כשמתחילים את הספירה ב-0), הייצוג הדליל של וקטור ה-one-hot הקודם הוא:

2

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

חריגים בנתונים קטגוריים

בדומה לנתונים מספריים, גם נתונים קטגוריאליים מכילים ערכים חריגים. נניח ש-car_color מכיל לא רק את הצבעים הפופולריים, אלא גם כמה צבעים חריגים שמשמשים לעיתים רחוקות, כמו "Mauve" או "Avocado". במקום להקצות לכל אחד מהצבעים החריגים האלה קטגוריה נפרדת, אפשר לקבץ אותם בקטגוריה אחת כללית שנקראת out-of-vocabulary (OOV). במילים אחרות, כל הצבעים של ערכים חריגים מקובצים לקטגוריה אחת של ערכים חריגים. המערכת לומדת משקל יחיד לקטגוריה הזו של חריגים.

קידוד של מאפיינים קטגוריאליים בממדים גבוהים

למאפיינים קטגוריאליים מסוימים יש מספר רב של מאפיינים, כמו אלה שמפורטים בטבלה הבאה:

שם התכונה מספר הקטגוריות קטגוריות לדוגמה
words_in_english כ-500,000 "happy",‏ "walking"
US_postal_codes כ-42,000 ‎"02114", "90301"‎
last_names_in_Germany ~850,000 "Schmidt",‏ "Schneider"

כשמספר הקטגוריות גבוה, בדרך כלל לא כדאי להשתמש בקידוד one-hot. בדרך כלל, הטמעות, שמפורטות במודול נפרד בנושא הטמעות, הן בחירה טובה יותר. הטמעות (embeddings) מפחיתות באופן משמעותי את מספר המאפיינים, וכך תורמות למודלים בשתי דרכים חשובות:

  • בדרך כלל, אימון המודל מתבצע מהר יותר.
  • בדרך כלל, המודל שנוצר מסיק תחזיות מהר יותר. כלומר, זמן האחזור של המודל נמוך יותר.

גיבוב (נקרא גם טריק הגיבוב) הוא דרך פחות נפוצה לצמצום מספר המאפיינים.

בקצרה, גיבוב ממפה קטגוריה (למשל, צבע) למספר שלם קטן – מספר הקטגוריה שתישמר בקטגוריה הזו.

באופן מפורט, מיישמים אלגוריתם גיבוב באופן הבא:

  1. מגדירים את מספר הקטגוריות בווקטור הקטגוריות כ-N, כאשר N קטן ממספר הקטגוריות שנותרו. לדוגמה שרירותית, נניח ש-N = 100.
  2. בוחרים פונקציית גיבוב. (לרוב, בוחרים גם את טווח ערכי הגיבוב).
  3. מעבירים כל קטגוריה (למשל, צבע מסוים) דרך פונקציית הגיבוב הזו, ויוצרים ערך גיבוב, למשל 89237.
  4. מקצים לכל קטגוריה מספר אינדקס של ערך הגיבוב של הפלט modulo N. במקרה הזה, שבו N הוא 100 וערך ה-hash הוא 89237, התוצאה של modulo היא 37 כי 89237 % 100 הוא 37.
  5. יוצרים קידוד one-hot לכל קטגוריה באמצעות מספרי האינדקס החדשים האלה.

פרטים נוספים על גיבוב נתונים מופיעים בקטע רנדומיזציה במודול מערכות למידת מכונה בסביבת ייצור.