أشجار القرار والغابة العشوائية
“20 سؤالاً تكرارياً: تقسيم الواقع إلى مناطق أكثر نقاءً”
كيف تُقسّم أشجار القرار البيانات (جيني والإنتروبيا) والتقليم، ثم الغابة العشوائية كمجموعة مُجمَّعة — تخفيض التباين وأهمية الميزات وتقييم OOB.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
شائبة جيني
احتمال التصنيف الخاطئ لعينة عشوائية. صفر = نقاء تام
مكسب المعلومات
تخفيض الإنتروبيا الناتج عن تقسيم — اختيار التقسيم الذي يُعظّم هذا المكسب
الإنتروبيا
مقياس الفوضى / عدم القدرة على التنبؤ في عقدة — صفر إذا نقية، أقصى إذا موحدة
خطأ OOB
تقدير تحقق مجاني من العينات الغائبة عن كل bootstrap — لا حاجة لمجموعة تحقق منفصلة
▶محاكاة تفاعلية
⬡هندسة النموذج
النموذج الأبسط والأقوى
أشجار القرار تحاكي التفكير البشري: 'إذا كان العمر > 40 والتدخين والكوليسترول > 200 → خطر مرتفع'. إنها قابلة للتفسير، لا تتطلب تحجيم الميزات، تتعامل مع الأنواع المختلطة، وتلتقط العلاقات غير الخطية. بمفردها تُفرط في الملاءمة — لكن كلبنة بناء للغابة العشوائية وXGBoost وLightGBM، إنها أهم بنية نموذج في التعلم الآلي الجدولي.
التقسيم الثنائي التكراري
تُقسّم شجرة القرار فضاء الميزات إلى مناطق مستطيلة. في كل خطوة تسأل: 'أي حد أحادي للميزة يفصل الفئات بشكل أفضل؟' تقيس 'الأفضل' باستخدام الشوائب (جيني أو إنتروبيا). تتكرر العملية على كل منطقة فرعية حتى الوصول إلى معيار التوقف.
شجرة قرار بعمق 20 مع انقسامات ثنائية يمكنها تمثيل 2²⁰ ≈ مليون منطقة مختلفة. هذا سبب إفراطها الكارثي في الملاءمة على البيانات الخام.
جيني مقابل الإنتروبيا: معايير التقسيم
كلاهما يقيس الشوائب — الأقل أفضل. جيني أسرع في الحساب (بدون لوغاريتم). الإنتروبيا أكثر حساسية قليلاً لاحتمالات الفئات القريبة من 0.5. عملياً، ينتجان أشجاراً متقاربة.
لماذا تعمل الغابة العشوائية: تحليل التحيز والتباين
شجرة عميقة واحدة لها تحيز منخفض لكن تباين كارثياً مرتفع — تحفظ ضوضاء التدريب. الغابة العشوائية تستغل حيلتين: (1) أخذ عينات bootstrap يُنمّي كل شجرة على مجموعة فرعية عشوائية مختلفة. (2) المجموعات الفرعية العشوائية للميزات (√p ميزة لكل انقسام) تزيل الارتباط بين الأشجار. معدل المقدّرات غير المترابطة ذات التباين المرتفع يقلل التباين دون زيادة التحيز.
'العشوائي' في الغابة العشوائية يشير إلى اختيار الميزات العشوائي في كل انقسام، ليس فقط bootstrap. هذه هي رؤية بريمان الرئيسية من عام 2001.
خوارزمية تدريب الغابة العشوائية
لكل t من 1 إلى T (عدد الأشجار):
أخذ عينة bootstrap Dₜ من بيانات التدريب (n عينة مع الإرجاع)
نمو شجرة القرار hₜ على Dₜ:
في كل عقدة، اختيار m = √p ميزة عشوائياً
إيجاد أفضل انقسام من بين تلك الميزات m (أدنى جيني/إنتروبيا)
توسيع حتى الوصول لـmax_depth أو min_samples_leaf
التنبؤ النهائي: تصويت الأغلبية (تصنيف) أو المتوسط (انحدار)
تقدير OOB: لكل عينة، تنبؤ بالأشجار التي لم تشاهدها فقط
نمط الإنتاج
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score, train_test_split from sklearn.datasets import make_classification import pandas as pd import shap class="tok-comment"># ── Sample data ──────────────────────────────────────────────────────── X_raw, y = make_classification(n_samples=class="tok-num">500, n_features=class="tok-num">10, n_informative=class="tok-num">5, random_state=class="tok-num">42) feature_names = [fclass="tok-str">"feature_{i}" for i in range(X_raw.shape[class="tok-num">1])] X_train, X_test, y_train, y_test = train_test_split( X_raw, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42) class="tok-comment"># Train rf = RandomForestClassifier( n_estimators=class="tok-num">500, max_features=class="tok-str">'sqrt', class="tok-comment"># Random feature subsets max_depth=None, class="tok-comment"># Fully grown (pruned by min_samples_leaf) min_samples_leaf=class="tok-num">1, oob_score=True, class="tok-comment"># Free validation estimate random_state=class="tok-num">42, n_jobs=-class="tok-num">1 ) rf.fit(X_train, y_train) print(fclass="tok-str">"OOB Score: {rf.oob_score_:.4f}") class="tok-comment"># Feature importance (Mean Decrease in Impurity) importances = pd.Series(rf.feature_importances_, index=feature_names) importances.nlargest(class="tok-num">20).sort_values().plot(kind=class="tok-str">'barh') class="tok-comment"># SHAP for correct feature importance explainer = shap.TreeExplainer(rf) shap_values = explainer.shap_values(X_test)
مزالق الغابة العشوائية
أهمية ميزات MDI متحيزة نحو الميزات ذات الكثافة العالية. استخدم أهمية التبديل أو SHAP بدلاً منها.
الذاكرة: 500 شجرة عميقة قد تستخدم 2-10 جيجابايت. اضبط max_depth=15-20 في الإنتاج.
بطء الاستدلال: التنبؤ عبر 500 شجرة بالتسلسل بطيء. فكر في n_estimators=100 للخدمة.
عدم توازن الفئات: استخدم class_weight='balanced' أو bootstrap طبقي.
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.