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

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

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

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

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

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

פעילות גופנית: בדקו את האינטואיציה

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

מספרי אינדקס

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

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

בדיקת האינטואיציה

האם המודל צריך להתאמן ישירות על מספרי האינדקס המוצגים באיור 2?
כן
אם המודל עבר אימון על מספרי האינדקס, הוא תתייחסו לכל אחד בצורה שגויה כערך מספרי "Black" (מספר אינדקס 5) להיות בעל משמעות גדולה פי 5 למודל מאשר "Orange" (מספר אינדקס 1).
לא
לא צריך לאמן את המודל לפי מספרי האינדקס. אם היה זה מספר, המודל שלך היה מתייחס לכל מספר אינדקס ואת הערך "Black" (מספר אינדקס 5) בתור פי 5 יותר משמעות למודל מאשר "Orange" (מספר אינדקס 1).

קידוד חם

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

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

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

תכונה אדום Orange כחול צהוב ירוק שחור סגול חום
"אדום" 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 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 0 0 0 0 0 1

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

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

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

ייצוג מועט

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

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

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

2

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

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

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

קידוד של תכונות קטגוריות במידות גבוהות

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

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

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

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

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