גידול צומח של החלטות

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

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

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

לדוגמה, במערך הנתונים של פינגווינים פאלמר (שמשמשים לדוגמאות לקודים בהמשך הקורס), לרוב הפינגווינים אדלי וצ'ינסטראפ יש אורך חשבון של יותר מ-16 מ"מ, ואילו לרוב הפינגווינים הג'נטויים יש חשבון קטן יותר. לכן, התנאי bill_length_mm ≥ 16 יוצר תחזיות כמעט מושלמות לגבי פינגוויני הגנטו, אבל לא יכול להבחין בין Adelies ל-Chinstraps. האלגוריתם כנראה יבחר את התנאי הזה.

תנאי אחד מוביל לשני עלים. התנאי הוא 'bill_length_mm >= 16'.
אם כן, העלה הוא 'Adelie או Chinstrap'.  אם לא, העלה הוא 'גנטו'.

איור 7. השלב הראשון בגידול עץ.

 

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

כך נראה האלגוריתם:

def train_decision_tree(training_examples):
  root = create_root() # Create a decision tree with a single empty root.
  grow_tree(root, training_examples) # Grow the root node.
  return root

def grow_tree(node, examples):
  condition = find_best_condition(examples) # Find the best condition.

  if condition is None:
    # No satisfying conditions were found, therefore the grow of the branch stops.
    set_leaf_prediction(node, examples)
    return

  # Create two childrens for the node.
  positive_child, negative_child = split_node(node, condition)

  # List the training examples used by each children.
  negative_examples = [example for example in examples if not condition(example)]
  positive_examples = [example for example in examples if condition(example)]

  # Continue the growth of the children.
  grow_tree(negative_child, negative_examples)
  grow_tree(positive_child, positive_examples)

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

שלב 1: יצירת מקור נתונים (root):

צומת עם סימן שאלה.

שלב 2: הגדלת צומת מס' 1. נמצא התנאי 'x1 ≥ 1'. נוצרים שני צומתי צאצא:

צומת בסיס שמוביל לשני צמתים לא מוגדרים.

שלב 3: הגדלת צומת 2. לא נמצאו תנאים מתאימים. אז הופכים את הצומת לעלה:

צומת בסיס שמוביל לשני צמתים לא מוגדרים.

שלב 4: הגדלת צומת מס' 3. נמצא התנאי 'x2 ≥ 0.5'. נוצרים שני צמתים צאצאים.

צומת שורש, תנאי ושלושה עלים.

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

קוד YDF
ב-YDF, עצי ההחלטות גדלים באמצעות האלגוריתם "חמדן וכובש" שמתואר כברירת מחדל. לחלופין, אפשר להפעיל צמיחה גלובלית באמצעות הפרמטר growing_strategy="BEST_FIRST_GLOBAL". פרטים נוספים זמינים במסמכי התיעוד.

מספר התנאים האפשריים לצומת נתון יכול להיות עצום, בדרך כלל אינסופי, בהתאם למספר ולסוג של תכונות הקלט. לדוגמה, בהינתן תנאי הסף $\mathrm{feature}_i \geq t$, השילוב של כל ערכי הסף האפשריים עבור $t \in \mathbb{R}$ הוא אינסופי.

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

התוצאה שהמפצל מקצה תלוי במשימה. לדוגמה:

  • בדרך כלל משמשים לסיווג מידע ו-Gini (שניהם מכוסים מאוחר יותר).
  • 'השגיאה הממוצעת בריבוע' משמשת בדרך כלל לרגרסיה.

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

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

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

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