מדריך: איך לשפר את הXGBOOST שלכם בלי לעשות כלום!
במערכות לומדות, כמעט ואין ארוחות חינם.
בהרבה מקרים אין ארוחות בכלל כי הן לא מגיעות לפרודשן אבל זה סיפור אחר
היום נדבר על המקרים הבודדים שהם לגמרי כן ארוחת חינם!
מדריך: איך לשפר את הXGBoost שלכם בלי לעשות כלום!
אחד הפרמטרים שנמצאים בחבילות הפופולריות לGradient Boosting מפעיל את האלגוריתם DART: Dropouts meet Multiple Additive Regression Trees [1] הפעילו אותו ובסבירות מאד גבוהה המודל שלכם ישתפר משמעותית.
אבל מה זה בכלל?
ואיך אפשר להשתמש בידע הזה כדי לשפר את המודל אפילו עוד יותר?
מה זה Gradient Boosting Machines?
שיפור 1: האלגוריתם Multiple Additive Regression Trees (MART)
הרעיון הבסיסי מאחורי כל הGBMים הוא להוסיף מודלים (עצים) חלשים ולמשקל אותם לפי הביצועים שלהם. קל להניח שכל העצים שנוסיף יהיו בקורלציה לשאר, לעצים המוקדמים באנסמבל יותר יש השפעה רבה יותר על ההתנהגות הכללית של המודל וכל העצים מאומנים עם אותו המידע.
וזה יותר בעיות אוברפיטינג ובייאס.
כדי להתגבר על הבעיות, קיבלנו את אלגוריתם MART משלב את העצים שנלמדו עד כה ולומד מעליהם את העץ חדש.
זה נעשה על ידי בניית מודל אדיטיבי כולל והוספת עץ אחד בכל פעם.
שיפור 2: XGBoost
התרומה העיקרית של XGBoost (EXtreme Gradient Boosting Machine) על פני MART המקורי היא הוספת רגולריזציה בזמן בנית האנסמבל.
𝐿 ( 𝑥 , 𝑦 , 𝑓 ) = ∑ ℓ ( 𝑦_ 𝑖 , 𝑓 ( 𝑥 _𝑖 ) ) + ∑Ω(𝑓_𝑘)
כש
𝑓 ( 𝑥 ) = ∑ 𝑓 𝑘 ( 𝑥 )
והסכום השני סוכם את הרגולריזציה "Ω" ובמקרה של XGBoost:
Ω( 𝑓 ) = 𝛾𝑇 + 0.5 𝜆 ∑𝑤^2_𝑗
כשבXGBoost מדובר על:
• γ הוא ההיפרפרמטר min_split_loss
• λ הוא ההיפרפרמטר reg_lambda
• T – n_leaves – מספר העלים בעץ
• w_j הוא משקל העלה
איך עובד בבוסטינג בGBM?
האלגוריתם Gradient Boosting Machine:
-
אתחל וקטור הפלט F_0 לקבוע ŷ.
-
בכל שלב של האיטרציה, m = 1, 2, 3, …, M
• אמן עץ רגרסיה, h_m , עם הקלט (x_i, y_i, F_{m-1}(x_i)) , עבור i = 1, 2, …, n .
• עדכן את וקטור הפלט עם חיזוי העץ החדש F_m(x) = F_{m-1}(x) + \nu h_m(x) , עבור x = x_1, x_2, …, x_n .
-
פלט F_M(x) – החזוי הסופי.
שיפור 3: DART – Dropouts Multiple Additive Regression Trees:
לMART יש בעית אוברפיטינג. (כמו שקל לשים לב כשעובדים עם XGBoost – בהרבה מקרים הוא פשוט "טוב מידי"), הסיבה לכך היא שעצים שנוספו באיטרציות מאוחרות יותר נוטים להשפיע על חיזוי של מקרים בודדים בלבד ולתרום תרומה זניחה לשאר המקרים (כי האנסמבל כולו כבר למד להסתדר איתם והעצים לומדים את הפרש הפרדיקציה בכל איטרציה).
בתמונה המצורפת (מהמאמר) ניתן לראות איך נבנים העצים:
• גודל הצמתים בעצים הוא פרופורציונלי לאחוז הדגימות שהגיעו לצומת זה.
• השינוי בצבע העלים מייצג את טווח הערכים כשירוק מייצג את הקיצון החיובי, צהוב עבור אפס, ואדום עבור הקיצון השלילי.
הטריק: "Shrinkage": הטריק שהציג המאמר על מנת להתגבר על הבעיות של MART הוא הפחתתת התרומה של כל עץ חדש בערך קבוע – מקדם ה"Shrinkage".
אלגוריתם DART
מה זה הDART הזה?
זה Dropout לעצים. התאמה של הDropout מרשתות נוירונים רק ל-GBM.
ב-רשתות הDropout מאפס אקראית אקטיבציות של של קישורים בין השכבות במהלך האימון. אז עבור GBMs: כל אחד מהעצים הקיימים באנסמבל לא נלקח בחשבון באיטרציה הנוכחית בהסתברות p.
כן, זה כל כך פשוט.
בזמן הפרדיקציה, p נקבע ל-0 , וכל העצים משמשים לחיזוי.
איך DART עובד?
• בכל איטרציה נוסף עץ חדש.
• עבור עץ h_m:
◦ וקטור חיזוי הפלט מתעדכן באופן הבא: F_m(x) = F_{m-1}(x) + h_m(x)
◦כש h_m מוגדר ל -0 בהסתברות p.
מה האינטואיציה מאחורי כל זה?
השימוש בDropout ב-GBM נותן למודל את תכונות הבאות:
• עוזר להפחית את הקורלציה בין העצים על ידי הפיכת F_m(x) לבלתי תלוי בכמה שהגרלנו החוצה.
• מפחית את הבייאס של העצים בכך שהוא גורם להם להתאמן על מקרים "חדשים" (כי האנסמבל חלש יותר ו"מפספס" מקרים ש"נפתרו" בעבר)
איך להשתמש בכל הטוב הזה?
האלגוריתם כבר ממומש כמעט בכל חבילות הGBMים העדכניות (ואם לא, כנראה שקל למצוא אותו באינטרנט).
כדי להשתמש ב-DART ב-LGBM לדוגמה,
הגדירו את הפרמטרים הבאים:
• היפרפרמטר: boosting_type ל- Dart
• היפרפרמטר: drop_rate לאחוז העצים הקודמים שיש להשמיט במהלך כל איטרציה
• היפרפרמטר: max_drop למספר המרבי של עצים שישמטו במהלך איטרציה אחת
• היפרפרמטר: skip_drop הסתברות כלשהי לא לבצע DART באיטרציה הנוכחית (לקחת את כל העצים בחשבון)
• היפרפרמטר: xgboost_dart_mode לשימוש במצב xgboost (ההבדל עדיין לא מובן לחלוטין – כנראה שXGBoost וLGBM מממשים שונה את האלגוריתם)
• היפרפרמטר: uniform_drop כדי לבצע Dropout מתפלג יוניפורמי בין העצים
• היפרפרמטר: drop_seed הוא הRandom seed
מה לגבי שאר ההיפרפרמטרים בזמן השימוש ב-DART, אפשר להשתמש בהם כדי לשפר את המודל עוד יותר?
כשמשתמשים ב-DART, חשוב לכייל את הפרמטרים הבאים כדי להוציא את מירב הביצועים מהמודל:
• היפרפרמטר: max_depth עומק העץ – פרמטר חשוב מאד.
• היפרפרמטר: min_data_in_leaf מונע מהמודל ללמוד יחסים ספציפיים מידי לפי המדגם המסוים שנבחר עבור בניית אותו העץ.
• היפרפרמטר: num_leaves בדרך כלל בטווח 2^max_depth או 1- לעצים ללא הגבלה.
• היפרפרמטר: max_bin משמש לשליטה באוברפיטינג שכן בינים גדולים יותר מחליקים את הלמידה.
• היפרפרמטר: lambda_l1 , lambda_l2 שולטים ברגולריזציה של L1 ו- L2 ועוזרים להימנע מאוברפיטינג.
• היפרפרמטר: min_gain_to_split שולט בלוס המינימלי הנדרש ליצירת חלוקה נוספת של צומת בעץ.
• היפרפרמטר: feature_fraction שולט בכמות העמודות הנבחרות עבור בניית כל עץ.
• היפרפרמטר: bagging_fraction שולט בכמות השורות הנבחרות עבור בניית כל עץ.
• היפרפרמטר: learning_rate – לא צריך להוסיף. חשוב מאד.
[1] – מאמר: https://arxiv.org/pdf/1505.01866.pdf