יצירת עץ החלטות

ביחידה הזו משתמשים ב-YDF (Yggdrasil יער החלטות) אימון הספרייה ופירוש של עץ החלטות.

היחידה הזו מבוססת על 🧭 YDF מתחילים של המדריך.

מוקדמות

לפני לחקור את מערך הנתונים, צריך לבצע את הפעולות הבאות:

  1. יצירת Colab חדש notebook.
  2. מתקינים את ספריית YDF על ידי הצבת שורת הקוד הבאה והפעלה שלה ב-notebook החדש של Colab:
    !pip install ydf -U
    
  3. מייבאים את הספריות הבאות:
    import ydf
    import numpy as np
    import pandas as pd
    

מערך הנתונים של Palmer Penguins

ה-Colab הזה משתמש מערך הנתונים של Palmer Penguins, שמכיל מידות של שלוש מיני פינגווינים:

  • רצועת סנטר
  • ג'נטו
  • Adelie

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

שלושה פינגווינים שונים
של מינים שונים.

איור 16. שלושה מינים שונים של פינגווינים. תמונה מאת @allisonhorst

 

הקוד הבא מפעיל את הפונקציה פנדות כדי לטעון את מערך הנתונים של Palmer Penguins לזיכרון:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

הטבלה הבאה מעצבת את 3 הדוגמאות הראשונות בפינגוויני פאלמר מערך נתונים:

טבלה 3. שלוש הדוגמאות הראשונות בפינגוויני פאלמר

מינים אי bill_length_mm bill_depth_mm flipper_length_mm body_mass_g סקס שנה
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 זכר 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 נקבה 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 נקבה 2007

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

תא הקוד הבא מפצל את מערך הנתונים לערכת אימון ובדיקה set:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

אימון של עצי החלטות באמצעות היפר-פרמטרים שמוגדרים כברירת מחדל

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

model = ydf.CartLearner(label=label).train(train_dataset)

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

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

model.plot_tree()

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

עץ החלטות שעבר אימון כברירת מחדל
היפר-פרמטרים.

איור 17. עץ החלטות שאומן באמצעות היפר-פרמטרים שמוגדרים כברירת מחדל.

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

התנאי הראשון בודק את הערך של bill_depth_mm. בטבלאות 4 ו-5 רואים את את הסבירות של מינים שונים בהתאם לתוצאה של התנאי הראשון.

טבלה 4. הסבירות למינים שונים אם bill_depth_mm ≥ 42.3

זן סבירות
אדלי (אדום) 8%
ג'נטו (כחול) 58%
רצועת סנטר (ירוק) 36%

 

טבלה 5. הסבירות למינים שונים אם bill_depth_mm < 42.3

זן סבירות
אדלי (אדום) 97%
ג'נטו (כחול) 2%
רצועת סנטר (ירוק) 0%

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

אם bill_depth_mm ≥ 42.3 מוגדר כ-True, ממשיכים לבדוק אם flipper_length_mm ≥ 207.5 יכול להפריד באופן כמעט מושלם Gentoos ו-Gentoos+Adelie.

הקוד הבא מספק אימון ובדיקה של הדיוק של המודל:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

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

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

שיפור ההיפר-פרמטרים של המודל

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

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

  2. לבצע אופטימיזציה של ההיפר-פרמטר באמצעות התצפיות והתובנות. מדריך לשיפור המודלים יכול להיות שימושי.

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

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

עץ ההחלטות שמוצג למעלה הוא קטן, והעלה עם 61 דוגמה מכיל כמה לייבלים של Adelie ו-Chinstrap. למה האלגוריתם לא חילק את העלה הזה עוד? ישנן שתי סיבות אפשריות:

  • מספר הדגימות המינימלי לכל עלה (min_examples=5 כברירת מחדל) עשוי להכיל הגעת.
  • יכול להיות שהעץ חולק ולאחר מכן נחתך כדי למנוע התאמה יתר.

מפחיתים את מספר הדוגמאות ל-1 ובודקים את התוצאות:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

עץ החלטות שאומן
min_examples=1.

איור 18. עץ החלטות שאומן באמצעות min_examples=1.

 

צומת העלה, שמכיל 61 דוגמאות, חולק למספר גדול יותר פעמים.

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

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

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

הקודם של יער החלטה

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

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

הדיוק של יער אקראי טוב יותר מהעץ הפשוט שלנו. אתם בדפים הבאים תוכלו ללמוד למה.

שימוש והגבלה

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

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