התכונות שלך חשובות? זה לא אומר שהם טובים - KDnuggets

התכונות שלך חשובות? זה לא אומר שהם טובים - KDnuggets

צומת המקור: 2893531

התכונות שלך חשובות? זה לא אומר שהם טובים
[תמונה לפי מחבר]

 

המושג "חשיבות תכונה" נמצא בשימוש נרחב בלמידת מכונה כסוג הבסיסי ביותר של הסבר מודל. לדוגמה, הוא משמש ב-Recursive Feature Elimination (RFE), כדי לבטל באופן איטרטיבי את התכונה הפחות חשובה של המודל.

עם זאת, יש תפיסה מוטעית לגבי זה.

העובדה שתכונה חשובה אינה מעידה על כך שהיא מועילה לדגם!

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

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

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

  • תרומת חיזוי: איזה חלק מהתחזיות נובע מהתכונה; זה שווה ערך לחשיבות התכונה.
  • תרומה שגיאה: איזה חלק משגיאות החיזוי נובע מנוכחות התכונה במודל.

במאמר זה נראה כיצד לחשב כמויות אלו וכיצד להשתמש בהן כדי לקבל תובנות חשובות לגבי מודל חזוי (ולשיפורו).

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

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

לפיכך, יש לנו את האמת הבסיסית, את חיזוי המודל ואת השגיאה המתקבלת:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
אמת יסוד, חיזוי מודל ושגיאה מוחלטת (באלפי דולרים). [תמונה לפי מחבר]

 

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

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

 

התכונות שלך חשובות? זה לא אומר שהם טובים
ערכי SHAP עבור התחזיות של המודל שלנו (באלפי $). [תמונה לפי מחבר]

 

המאפיין העיקרי של ערכי SHAP הוא שהם תוספים. משמעות הדבר היא כי - על ידי נטילת הסכום של כל שורה - נשיג את החיזוי של המודל שלנו עבור אותו אדם. לדוגמה, אם ניקח את השורה השנייה: 72k $ +3k $ -22k $ = 53k $, שזו בדיוק התחזית של המודל עבור הפרט השני.

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

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

prediction_contribution = shap_values.abs().mean()

בדוגמה שלנו, זו התוצאה:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תרומת חיזוי. [תמונה לפי מחבר]

 

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

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

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

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

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

זו התוצאה:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תחזיות שנשיג אם נסיר את התכונה המתאימה. [תמונה לפי מחבר]

 

זה אומר שאם לא הייתה לנו את התכונה עבודה, אז המודל חוזה 20k $ עבור הפרט הראשון, -19k $ עבור השני, ו-8k $ עבור השלישי. במקום זאת, אם לא הייתה לנו את התכונה גיל, המודל חוזה 73k $ עבור הפרט הראשון, 50k $ עבור השני, וכן הלאה.

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

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

התוצאה היא כדלקמן:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
שגיאות מוחלטות שנקבל אם נסיר את התכונה המתאימה. [תמונה לפי מחבר]

 

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

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

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

שהוא:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
הבדל בין השגיאות של הדגם לבין השגיאות שהיו לנו ללא התכונה. [תמונה לפי מחבר]

 

אם המספר הזה הוא:

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

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

error_contribution = error_diff.mean()

זו התוצאה:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תרומה שגיאה. [תמונה לפי מחבר]

 

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

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

בואו ננסה להשתמש במושגים האלה על מערך נתונים אמיתי.

להלן, אשתמש במערך נתונים שנלקח ממנו Pycaret (ספריית Python מתחת רישיון MIT). מערך הנתונים נקרא "זהב" והוא מכיל סדרות זמן של נתונים פיננסיים.

 

התכונות שלך חשובות? זה לא אומר שהם טובים
מדגם מערך נתונים. כל התכונות מבוטאות באחוזים, כך ש-4.07 פירושו תשואה של -4.07%. [תמונה לפי מחבר]

 

התכונות מורכבות מהתשואות של נכסים פיננסיים בהתאמה 22, 14, 7 ו-1 ימים לפני רגע התצפית ("T-22", "T-14", "T-7", "T-1"). להלן הרשימה הממצה של כל הנכסים הפיננסיים המשמשים כמאפיינים חזויים:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
רשימת הנכסים הזמינים. כל נכס נצפה בזמן -22, -14, -7 ו-1. [תמונה לפי מחבר]

 

בסך הכל, יש לנו 120 תכונות.

המטרה היא לחזות את מחיר הזהב (החזר) 22 ימים קדימה בזמן ("Gold_T+22"). בואו נסתכל על משתנה היעד.

 

התכונות שלך חשובות? זה לא אומר שהם טובים
היסטוגרמה של המשתנה. [תמונה לפי מחבר]

 

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

  1. פצל את מערך הנתונים המלא באופן אקראי: 33% מהשורות במערך הנתונים של ההדרכה, עוד 33% במערך הנתונים של האימות, ו-33% הנותרים במערך הנתונים של הבדיקה.
  2. אמן LightGBM Regressor על מערך ההדרכה.
  3. בצע תחזיות לגבי מערכי נתונים של אימון, אימות ובדיקה, באמצעות המודל שהוכשר בשלב הקודם.
  4. חישוב ערכי SHAP של מערכי אימון, אימות ובדיקה, באמצעות "shap" של ספריית Python.
  5. מחשב את תרומת החיזוי ואת תרומת השגיאה של כל תכונה בכל מערך נתונים (הדרכה, אימות ובדיקה), באמצעות הקוד שראינו בפסקה הקודמת.

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

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תרומת חיזוי לעומת תרומת שגיאה (במערך הנתונים של ההדרכה). [תמונה לפי מחבר]

 

יש מתאם שלילי מאוד בין תרומת חיזוי ותרומת שגיאה במערך האימונים.

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

אבל זה לא מוסיף הרבה לידע שלנו, נכון?

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

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תרומת חיזוי לעומת תרומת שגיאה (במערך הנתונים של אימות). [תמונה לפי מחבר]

 

מהעלילה הזו נוכל לחלץ מידע הרבה יותר מעניין.

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

כמו כן, שימו לב ש"Gold_T-22" (החזרת הזהב 22 ימים לפני תקופת התצפית) עובד ממש טוב בהשוואה לחשיבות שהמודל מייחס לו. זה אומר ש תכונה זו כנראה לא מתאימה. ופיסת מידע זו מעניינת במיוחד מכיוון שהזהב הוא הנכס שאנו מנסים לחזות ("Gold_T+22").

מצד שני, התכונות שיש להן תרומת שגיאה מעל 0 מחמירות את התחזיות שלנו. לדוגמה, "US Bond ETF_T-1" משנה בממוצע את חיזוי המודל ב-0.092% (תרומת חיזוי), אך הוא מוביל את המודל לבצע חיזוי בממוצע של 0.013% (תרומה שגיאה) גרועה יותר ממה שהיה היה ללא תכונה זו. .

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

בואו נראה לאילו תכונות יש את תרומת השגיאה הגדולה ביותר.

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תכונות ממוינות לפי הקטנת תרומת שגיאה. [תמונה לפי מחבר]

 

ועכשיו התכונות עם תרומת השגיאה הנמוכה ביותר:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
תכונות ממוינות לפי הגדלת תרומת השגיאה. [תמונה לפי מחבר]

 

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

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

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

שיטות ביטול תכונה רקורסיבית (RFE) מבוססות על הסרה של תכונות לא חשובות. זה שווה ערך להסרת התכונות עם תרומת חיזוי קטנה תחילה.

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

כדי לבדוק אם האינטואיציה שלנו מאומתת, הבה נשווה את שתי הגישות:

  • RFE מסורתי: הסרת תכונות חסרות תועלת תחילה (תרומת החיזוי הנמוכה ביותר).
  • RFE שלנו: הסרת תכונות מזיקות ראשון (תרומת השגיאה הגבוהה ביותר).

בוא נראה את התוצאות על ערכת האימות:

 

התכונות שלך חשובות? זה לא אומר שהם טובים
ממוצע שגיאה מוחלטת של שתי האסטרטגיות בערכת האימות. [תמונה לפי מחבר]

 

האיטרציה הטובה ביותר עבור כל שיטה הוגדרה בעיגול: זה הדגם עם 19 תכונות עבור RFE המסורתי (קו כחול) והדגם עם 17 תכונות עבור RFE שלנו (קו כתום).

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

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

אז בואו נראה את אותה השוואה על סט המבחן.

 

התכונות שלך חשובות? זה לא אומר שהם טובים
ממוצע שגיאה מוחלטת של שתי האסטרטגיות במערך המבחן. [תמונה לפי מחבר]

 

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

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

  • תרומת RFE-חיזוי (19 תכונות). MAE על סט מבחן: 2.04.
  • תרומת RFE-שגיאה (17 תכונות). MAE בסט מבחן: 1.94.

אז ה-MAE הטוב ביותר בשיטה שלנו הוא טוב יותר ב-5% בהשוואה ל-RFE המסורתי!

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

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

ניסינו אותם גם על מערך נתונים פיננסי אמיתי (שבו המשימה היא לחזות את מחיר הזהב) והוכחנו שביטול תכונה רקורסיבי המבוסס על תרומת שגיאות מוביל לשגיאה מוחלטת ממוצעת טובה יותר ב-5% בהשוואה ל-RFE מסורתי המבוסס על תרומת חיזוי.

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

תודה שקראת!

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

 
מְקוֹרִי. פורסם מחדש באישור.
 

בול זמן:

עוד מ KDnuggets