ML Learning Hub
الانحدارمبتدئ

أشجار القرار والغابة العشوائية

20 سؤالاً تكرارياً: تقسيم الواقع إلى مناطق أكثر نقاءً

كيف تُقسّم أشجار القرار البيانات (جيني والإنتروبيا) والتقليم، ثم الغابة العشوائية كمجموعة مُجمَّعة — تخفيض التباين وأهمية الميزات وتقييم OOB.

40 min
14 مخططات
7 المفاهيم المغطاة

المتطلبات الأساسية

Model Evaluation
Information Theory

المفاهيم المغطاة

Gini ImpurityEntropyInformation GainPruningBaggingFeature ImportanceOOB Score

الصيغ الرئيسية

شائبة جيني

احتمال التصنيف الخاطئ لعينة عشوائية. صفر = نقاء تام

مكسب المعلومات

تخفيض الإنتروبيا الناتج عن تقسيم — اختيار التقسيم الذي يُعظّم هذا المكسب

الإنتروبيا

مقياس الفوضى / عدم القدرة على التنبؤ في عقدة — صفر إذا نقية، أقصى إذا موحدة

خطأ OOB

تقدير تحقق مجاني من العينات الغائبة عن كل bootstrap — لا حاجة لمجموعة تحقق منفصلة

محاكاة تفاعلية

Loading visualization…
Loading visualization…

هندسة النموذج

Loading visualization…
Loading visualization…
🎯

النموذج الأبسط والأقوى

motivation

أشجار القرار تحاكي التفكير البشري: 'إذا كان العمر > 40 والتدخين والكوليسترول > 200 → خطر مرتفع'. إنها قابلة للتفسير، لا تتطلب تحجيم الميزات، تتعامل مع الأنواع المختلطة، وتلتقط العلاقات غير الخطية. بمفردها تُفرط في الملاءمة — لكن كلبنة بناء للغابة العشوائية وXGBoost وLightGBM، إنها أهم بنية نموذج في التعلم الآلي الجدولي.

💡

التقسيم الثنائي التكراري

intuition

تُقسّم شجرة القرار فضاء الميزات إلى مناطق مستطيلة. في كل خطوة تسأل: 'أي حد أحادي للميزة يفصل الفئات بشكل أفضل؟' تقيس 'الأفضل' باستخدام الشوائب (جيني أو إنتروبيا). تتكرر العملية على كل منطقة فرعية حتى الوصول إلى معيار التوقف.

شجرة قرار بعمق 20 مع انقسامات ثنائية يمكنها تمثيل 2²⁰ ≈ مليون منطقة مختلفة. هذا سبب إفراطها الكارثي في الملاءمة على البيانات الخام.

جيني مقابل الإنتروبيا: معايير التقسيم

math

كلاهما يقيس الشوائب — الأقل أفضل. جيني أسرع في الحساب (بدون لوغاريتم). الإنتروبيا أكثر حساسية قليلاً لاحتمالات الفئات القريبة من 0.5. عملياً، ينتجان أشجاراً متقاربة.

جيني للتصنيف الثنائي
🔬

لماذا تعمل الغابة العشوائية: تحليل التحيز والتباين

deepdive

شجرة عميقة واحدة لها تحيز منخفض لكن تباين كارثياً مرتفع — تحفظ ضوضاء التدريب. الغابة العشوائية تستغل حيلتين: (1) أخذ عينات bootstrap يُنمّي كل شجرة على مجموعة فرعية عشوائية مختلفة. (2) المجموعات الفرعية العشوائية للميزات (√p ميزة لكل انقسام) تزيل الارتباط بين الأشجار. معدل المقدّرات غير المترابطة ذات التباين المرتفع يقلل التباين دون زيادة التحيز.

'العشوائي' في الغابة العشوائية يشير إلى اختيار الميزات العشوائي في كل انقسام، ليس فقط bootstrap. هذه هي رؤية بريمان الرئيسية من عام 2001.

⚙️

خوارزمية تدريب الغابة العشوائية

algorithm
1

لكل t من 1 إلى T (عدد الأشجار):

أخذ عينة bootstrap Dₜ من بيانات التدريب (n عينة مع الإرجاع)

نمو شجرة القرار hₜ على Dₜ:

في كل عقدة، اختيار m = √p ميزة عشوائياً

إيجاد أفضل انقسام من بين تلك الميزات m (أدنى جيني/إنتروبيا)

توسيع حتى الوصول لـmax_depth أو min_samples_leaf

7

التنبؤ النهائي: تصويت الأغلبية (تصنيف) أو المتوسط (انحدار)

8

تقدير OOB: لكل عينة، تنبؤ بالأشجار التي لم تشاهدها فقط

</>

نمط الإنتاج

code
python33 lines
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)
⚠️

مزالق الغابة العشوائية

pitfall
1

أهمية ميزات MDI متحيزة نحو الميزات ذات الكثافة العالية. استخدم أهمية التبديل أو SHAP بدلاً منها.

2

الذاكرة: 500 شجرة عميقة قد تستخدم 2-10 جيجابايت. اضبط max_depth=15-20 في الإنتاج.

3

بطء الاستدلال: التنبؤ عبر 500 شجرة بالتسلسل بطيء. فكر في n_estimators=100 للخدمة.

4

عدم توازن الفئات: استخدم class_weight='balanced' أو bootstrap طبقي.

?اختبار المعرفة

يتم حفظ التقدم في متصفحك — لا حاجة لحساب.

تحتاج مهندس ذكاء اصطناعي أو عالم بيانات؟

أبني نماذج تعلم آلي مخصصة، ووكلاء ذكاء اصطناعي، ورؤية حاسوب، وأتمتة — من الفكرة إلى الإنتاج.