التعزيز التدريجي: XGBoost وLightGBM وCatBoost
“تصحيحات صغيرة متتالية تتفوق على تخمين واحد كبير — ملاحقة البواقي بالتسلسل”
من Gradient Boosting الأساسي إلى XGBoost وLightGBM وCatBoost. تحسين من الرتبة الثانية وتجزئة بالمدرج ونمو من الأوراق وأنماط Optuna HPO.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
مجموعة تعزيز
التنبؤ النهائي = مجموع M متعلم ضعيف، مرجَّح بـγ — كل شجرة تصحح أخطاء السابقة
شبه البواقي
التدرج السلبي للخسارة — ما يجب على الشجرة التالية تعلمه لتقليل الخطأ
نقاط شجرة XGBoost
مكسب تقسيم (G = مجموع المشتقات الأولى، H = مجموع المشتقات الثانية) — تعظيم هذا يختار أفضل تقسيم
مكسب التقسيم
تحسين الهدف من تقسيم ورقة إلى اثنتين — يُستخدم للتشذيب ومعيار التوقف
▶محاكاة تفاعلية
⬡هندسة النموذج
لماذا يهيمن تعزيز التدرج على البيانات الجدولية
منذ عام 2014، فازت أساليب تعزيز التدرج (XGBoost, LightGBM, CatBoost) بغالبية مسابقات Kaggle على البيانات المنظمة. إنها أفضل خوارزمية للتعلم الآلي الجدولي: تتعامل مع الأنواع المختلطة أصلياً، لا تتطلب تحجيماً، تلتقط التفاعلات غير الخطية المعقدة، وتأتي مع تنظيم مدمج.
الفكرة الأساسية: تعلم الأخطاء
افترض أن نموذجك الحالي يتنبأ بأسعار المنازل ويُخطئ بـ50,000 درس في المنزل أ. بدلاً من إعادة التدريب من الصفر، درّب شجرة صغيرة جديدة للتنبؤ بتلك الـ50,000 تحديداً. أضفها إلى نموذجك. الآن أنت تُخطئ بأقل. كرر. كل شجرة جديدة تستهدف أخطاء البقايا لجميع الأشجار السابقة مجتمعة.
'التدرج' في تعزيز التدرج يشير إلى الانحدار التدرجي الدالي، ليس الانحدار التدرجي المعاملي. نُحسّن في فضاء الدوال، ليس الأوزان.
تعزيز التدرج كانحدار تدرجي في فضاء الدوال
في الخطوة m، نُلائم شجرة hₘ على التدرج السلبي للخسارة بالنسبة للتنبؤ الحالي F_{m-1}(x). لخسارة MSE ، التدرج السلبي هو بالضبط البقية r = y − F(x). لخسائر أخرى (log loss، MAE)، نحصل على 'شبه بواقٍ' مختلفة — ومن هنا عمومية الإطار.
XGBoost: تحسين الرتبة الثانية
GBM الأصلي لفريدمان يستخدم فقط تدرجات الرتبة الأولى (البواقي). XGBoost يستخدم كلاً من الرتبة الأولى (G) والثانية (H) من توسيع تايلور للخسارة، مما يمنحه معلومات انحناء أفضل — كطريقة نيوتن مقابل الانحدار التدرجي.
XGBoost مقابل LightGBM مقابل CatBoost
Three major frameworks, each with distinct architectural innovations:
XGBoost: نمو على مستوى الطبقة + تحسين الرتبة الثانية. أبطأ لكن ناضج. الأفضل لمجموعات البيانات الصغيرة/المتوسطة.
LightGBM: نمو على مستوى الأوراق + التجزئة بالمدرّج. أسرع 10-20× في التدريب. الأفضل لمجموعات البيانات الكبيرة.
CatBoost: boost مرتب لتجنب تسرب الهدف. معالجة أصلية للفئوية. الأفضل مع كثير من الميزات الفئوية.
قاعدة عامة: ابدأ بـLightGBM. استخدم CatBoost مع فئويات ثقيلة. XGBoost لمجموعات البيانات الصغيرة حيث السرعة لا تهم.
نمو LightGBM من الأوراق
تهيئة F₀(x) = log(p/(1-p)) للتصنيف الثنائي
لـm من 1 إلى M:
حساب شبه البواقي rᵢ = -∂L/∂F(xᵢ)|_{F=F_{m-1}}
إيجاد أفضل ورقة للتقسيم (عالمياً، ليس مستوى بمستوى)
حساب قيم الأوراق: γⱼ = ΣᵢGᵢ / (ΣᵢHᵢ + λ)
التحديث: F_m(x) = F_{m-1}(x) + ν · γ_{ورقة(x)}
إضافة توقف مبكر إذا توقف تحسن خسارة التحقق
LightGBM في الإنتاج مع Optuna
import lightgbm as lgb import optuna import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split class="tok-comment"># ── Sample data ──────────────────────────────────────────────────────── X, y = make_classification(n_samples=class="tok-num">1000, n_features=class="tok-num">20, n_informative=class="tok-num">10, random_state=class="tok-num">42) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42) dtrain = lgb.Dataset(X_train, label=y_train) def objective(trial): params = { class="tok-str">'objective': class="tok-str">'binary', class="tok-str">'metric': class="tok-str">'auc', class="tok-str">'learning_rate': trial.suggest_float(class="tok-str">'lr', class="tok-num">0.01, class="tok-num">0.3, log=True), class="tok-str">'num_leaves': trial.suggest_int(class="tok-str">'num_leaves', class="tok-num">20, class="tok-num">300), class="tok-str">'max_depth': trial.suggest_int(class="tok-str">'max_depth', class="tok-num">3, class="tok-num">12), class="tok-str">'min_data_in_leaf': trial.suggest_int(class="tok-str">'min_child', class="tok-num">10, class="tok-num">100), class="tok-str">'feature_fraction': trial.suggest_float(class="tok-str">'feat_frac', class="tok-num">0.4, class="tok-num">1.0), class="tok-str">'bagging_fraction': trial.suggest_float(class="tok-str">'bag_frac', class="tok-num">0.4, class="tok-num">1.0), class="tok-str">'lambda_l1': trial.suggest_float(class="tok-str">'l1', class="tok-num">1e-8, class="tok-num">10.0, log=True), class="tok-str">'lambda_l2': trial.suggest_float(class="tok-str">'l2', class="tok-num">1e-8, class="tok-num">10.0, log=True), class="tok-str">'verbose': -class="tok-num">1, } cv_result = lgb.cv( params, dtrain, nfold=class="tok-num">5, num_boost_round=class="tok-num">500, early_stopping_rounds=class="tok-num">50, stratified=True ) return max(cv_result[class="tok-str">'valid auc-mean']) study = optuna.create_study(direction=class="tok-str">'maximize') study.optimize(objective, n_trials=class="tok-num">100)
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.