أساسيات تعلم الآلة2001متوسط10 دقيقة قراءة

الغابات العشوائية

Random Forests

Breiman, L. — Machine Learning

المشكلة

شجرة القرار الواحدة سهلة الفهم لكنها غير مستقرة: أي تغيير بسيط في بيانات قد يُنتج شجرة مختلفة تماماً، وهذا يعني تبايناً مرتفعاً. الأشجار العميقة تحفظ الضجيج وتُفرط في الملاءمة، والضحلة لا تلتقط أنماطاً كافية، والتقليم يُحسّن الوضع لكنه لا يحلّ المشكلة جذرياً. التجميع بالتمهيد يُقلّل عبر حساب متوسط عدد كبير من الأشجار، لكن حين تُهيمن سمة واحدة قوية تبدأ جميع الأشجار بالانقسام عليها — فتصبح متشابهة ويضعف أثر التجميع في تقليل التباين.

الإسهام

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

الأثر

أصبحت الغابات العشوائية الخيار الأول الذي يلجأ إليه الممارسون في كل المجالات التطبيقية تقريباً — علم الجينوم، والاستشعار عن بُعد، والمالية، والطب، والبيئة. لا تحتاج تقريباً لضبط المعاملات الفائقة، وتتعامل مع أنواع بيانات مختلطة، وتعمل بكفاءة في الأبعاد العالية، وتوفّر مقاييس أهمية السمات بشكل مدمج. لا تزال أقوى خط أساس ، وقد ألهمت مباشرةً خوارزمية XGBoost التي استبدلت التجميع بالتمهيد بالتعزيز التدريجي مع الإبقاء على إطار تجميع الأشجار.

تخيّل أنك تُحكّم مسابقة طبخ. حَكَمٌ واحد قد يكون متحيّزاً — ربما يكره الكُزبرة أو يُبالغ في تقدير الشكل على حساب الطعم. لكن تخيّل الآن لجنة من مئة حَكَم، كلٌّ منهم يتذوّق مجموعة عشوائية من الأطباق ويُقيّم بناءً على معايير مختلفة (النكهة، القوام، التقديم…). لا أحد منهم يرى الصورة كاملة، لكن تصويت الأغلبية يكون عادلاً ومتيناً بشكل مدهش.

تعمل بالمبدأ ذاته: مئات من ، كل شجرة تتدرّب على شريحة مختلفة من البيانات وتنظر في حفنة عشوائية فقط من عند كل انقسام. كل شجرة بمفردها ضعيفة ومحدودة الرؤية، لكن حين تتصوّت معاً يكون ناتجها من أكثر موثوقيةً في مجال تعلّم الآلة.

المشكلة: شجرة واحدة لا تكفي

شجرة القرار (CART) فكرة بسيطة وقوية: نقسم البيانات بشكل متكرر بحسب السِّمة والعتبة التي تفصل الفئات بأفضل شكل، فنحصل على مخطط تدفّقي يسهل على أي شخص قراءته. لكن المشكلة الجوهرية في الأشجار هي التباين المرتفع: غيّر بضع نقاط في بيانات التدريب وقد تحصل على شجرة مختلفة كلياً. هذا عدم الاستقرار هو ما يجعل الاعتماد على شجرة واحدة أمراً محفوفاً بالمخاطر.

الأشجار العميقة تحفظ الضجيج ()، والضحلة تُفوّت الأنماط (). يُخفّف المشكلة لكنه لا يعالج جذرها. السؤال الذي طرحه بريمان: هل نستطيع الاستفادة من قوة الأشجار مع كبح تباينها؟

افتح في المختبر
انقر «أعد المعاينة» لسحب عيّنة تمهيدية جديدة ولاحظ كيف تتغيّر بنية الشجرة تغيّراً جذرياً رغم أن البيانات هي نفسها.
تستيقظ التجربة عند وصولك…

من التجميع بالتمهيد إلى الغابات العشوائية: طبقتان من العشوائية

كان (Bagging) أول حلول بريمان عام 1996: نسحب عدة (نأخذ N صفاً مع الإعادة)، ونبني شجرة كاملة على كل عيّنة، ثم نحسب متوسط التنبؤات (في ) أو نأخذ تصويت الأغلبية (في التصنيف). حساب المتوسط يُقلّل التباين دون زيادة — بشرط ألّا تكون أخطاء الأشجار مترابطة بشكل كبير.

لكن المشكلة تظهر حين تكون سمة واحدة شديدة القدرة التنبؤية: كل شجرة ستنقسم عليها أولاً، فتُصبح الأشجار متشابهة. وحساب متوسط تنبؤات مترابطة لا يُقلّل التباين بالقدر الذي يُقلّله متوسط تنبؤات مستقلة. وهنا تأتي المعادلة التي تُوضّح المشكلة.

تباين متوسط B تنبؤ متماثل التوزيع (لكن قد يكون مترابطاً) يُعطى بالصيغة:

Var ⁣(Xˉ)=ρˉσ2+1ρˉBσ2\text{Var}\!\left(\bar{X}\right) = \bar{\rho}\,\sigma^2 + \frac{1 - \bar{\rho}}{B}\,\sigma^2
تباين متوسط التجميعρ̄ = متوسط الارتباط الثنائي بين الأشجار · σ² = تباين الشجرة الواحدة · B = عدد الأشجار. حين يكون ρ̄ مرتفعاً يُهيمن الحدّ الأول ولا تُفيد إضافة أشجار جديدة كثيراً. المفتاح إذن هو تقليل ρ̄.

الغابات العشوائية تحلّ هذه المشكلة بإضافة طبقة ثانية من العشوائية: عند كل انقسام لا تنظر الشجرة إلا في مجموعة عشوائية من m سمة (من أصل p سمة متاحة). بهذه الطريقة لا تستطيع أي سمة مهيمنة أن تحتلّ قمة كل شجرة، وهذا ما يُحقّق بينها. النتيجة: ρ̄ ينخفض، الحدّ الأول في المعادلة يتقلّص، و تُحقّق تبايناً أقلّ بكثير.

الأمر أشبه بلجنة توظيف: لو طرح كل مُحاوِر الأسئلة نفسها فسيخرجون بالرأي ذاته. لكن أجبر كل واحد منهم على الاختيار من مجموعة عشوائية من الأسئلة وستحصل على تقييمات مستقلة فعلاً.

افتح في المختبر
قارن بين التجميع بالتمهيد (كل السمات) والغابة العشوائية (مجموعة عشوائية من السمات). لاحظ كيف تختلف أشجار الغابة عن بعضها أكثر — ارتباط أقلّ.
تستيقظ التجربة عند وصولك…

الخوارزمية: كيف تنمو الغابة العشوائية

خوارزمية الغابة العشوائية أنيقة في بساطتها. لكل شجرة من B شجرة نكرّر الخطوات التالية:

  • المعاينة التمهيدية: نسحب N عيّنة مع الإعادة من مجموعة التدريب. نحو ⅓ البيانات تبقى خارج العيّنة — وهي ما يُعرف بعيّنات خارج الحقيبة ().
  • النمو: عند كل ، نختار عشوائياً m سمة (من أصل p)، ونبحث عن أفضل ضمن تلك الـ m فقط. نستمرّ في النمو حتى تصبح العقد نقية أو تبلغ حجماً أدنى. بلا تقليم.
  • التنبؤ: في التصنيف تُدلي كل شجرة بصوت واحد والنتيجة هي تصويت الأغلبية. في الانحدار نأخذ المتوسط.

الوحيد المؤثر فعلاً هو m — عدد السمات المرشّحة لكل انقسام. القاعدة العملية هي m=pm = \lfloor\sqrt{p}\rfloor للتصنيف وm=p/3m = \lfloor p/3 \rfloor للانحدار. وقد أظهر بريمان أن الأداء لا يتأثر كثيراً بهذا الاختيار.

افتح في المختبر
شاهد الغابة وهي تنمو شجرةً تلو الأخرى. كل شجرة تُبنى على عيّنة تمهيدية مختلفة وتنظر في سمات عشوائية عند كل انقسام.
تستيقظ التجربة عند وصولك…

تحقق مجاني: فكرة العيّنات خارج الحقيبة

كل عيّنة تمهيدية تشمل نحو 63.2% من بيانات التدريب (لأن السحب بالإعادة يُكرّر بعض الصفوف). أما الـ 36.8% المتبقية — وتُسمى عيّنات خارج الحقيبة (OOB) — فهي بيانات لم تَرَها تلك الشجرة أثناء التدريب. لتقدير خطأ التعميم: نأخذ كل مثال تدريبي ونجمع تنبؤات الأشجار التي لم يدخل في عيّنتها التمهيدية، ثم نحسب المتوسط أو نأخذ تصويت الأغلبية. هذا يعطينا تقديراً غير منحاز لخطأ الاختبار دون الحاجة إلى مجموعة تحقق منفصلة.

أظهر بريمان أن خطأ OOB يُقارب في دقّته ، لكنه يأتي مجاناً تماماً — بلا تشغيلات تدريب إضافية. بالنسبة للممارسين كان هذا تحوّلاً كبيراً: أصبح بالإمكان ضبط m و وتقييم التعميم من تشغيل تدريب واحد.

افتح في المختبر
كل صفّ يمثّل مثالاً تدريبياً. الخلايا الخضراء تعني أن الشجرة تدرّبت عليه، والفارغة تعني أنه خارج الحقيبة لتلك الشجرة. تنبؤ OOB يعتمد فقط على أشجار الخلايا الفارغة.
تستيقظ التجربة عند وصولك…

أيّ السمات مهمّة؟ مقياسان للإجابة

الغابات العشوائية لا تكتفي بالتنبؤ — بل تكشف ما الذي يقود التنبؤ. قدّم بريمان مقياسين متكاملين لأهمية السمات:

متوسط انخفاض الشائبة (MDI / أهمية جيني): لكل سمة، نجمع مقدار الانخفاض الكلي في (أو التباين في الانحدار) عبر كل الانقسامات التي استخدمت تلك السمة في جميع الأشجار. السمات التي تُنتج انقسامات أنقى تحصل على درجات أعلى. هذا المقياس سريع الحساب لكنه قد ينحاز لصالح السمات ذات القيم العديدة.

أهمية التبديل (متوسط انخفاض الدقة): بعد التدريب، نأخذ عيّنات OOB ونخلط قيم سمة واحدة عشوائياً ثم نُعيد التنبؤ. الانخفاض في يقيس مدى اعتماد الغابة على تلك السمة. إذا لم تتغيّر الدقة فالسمة ليست مهمة. هذا المقياس لا يرتبط بنوع وهو أكثر موثوقية لكنه أبطأ في الحساب.

يمكن التفكير في MDI كسؤال: «كم مرة لجأت الغابة إلى هذه السمة؟» بينما أهمية التبديل تسأل: «ما حجم الضرر لو خلطنا قيم هذه السمة عشوائياً؟»

افتح في المختبر
بدّل بين أهمية جيني وأهمية التبديل. لاحظ كيف قد يختلف ترتيب السمات، خاصةً حين تكون السمات مترابطة أو كثيرة القيم.
تستيقظ التجربة عند وصولك…

لماذا لا تُفرط في الملاءمة؟

من أكثر نتائج الورقة إثارةً للدهشة: الغابات العشوائية لا تُعاني من الإفراط في الملاءمة مهما أضفنا من أشجار. كل شجرة بمفردها تُفرط في الملاءمة بشدة — تنمو لأقصى عمق بلا تقليم. لكن المجموعة التجميعية تتقارب. أثبت بريمان باستخدام قانون الأعداد الكبيرة القوي أن خطأ التعميم للغابة يتقارب شبه مؤكد إلى حدّ معيّن:

PE=PX,Y ⁣(PΘ(h(X,Θ)=Y)maxjYPΘ(h(X,Θ)=j)<0)PE^* = P_{X,Y}\!\left(P_\Theta(h(X,\Theta)=Y) - \max_{j \ne Y} P_\Theta(h(X,\Theta)=j) < 0\right)
الحد الأعلى لخطأ التعميمPE* = خطأ التعميم · h(X,Θ) = تنبؤ شجرة عشوائية بمعامل عشوائي Θ · كلما B → ∞ يتقارب خطأ الغابة نحو PE* ولا يتجاوزه. إضافة أشجار جديدة تزيد الاستقرار ولا تُسيء الأداء أبداً.

ثم وضع بريمان حداً أعلى لهذا الخطأ باستخدام كمّيتين واضحتين:

  • (s): دقة الشجرة الفردية في المتوسط.
  • (ρ̄): مدى تشابه تنبؤات الأشجار المختلفة.

الحدّ هو PEρˉ(1s2)/s2PE^* \le \bar{\rho}\,(1 - s^2) / s^2. الغابة الجيدة تُعظّم القوة وتُقلّل الارتباط. المعامل m يتحكّم في هذه الموازنة: قيمة m أصغر تعني ارتباطاً أقلّ لكن أشجاراً فردية أضعف. النقطة المُثلى عادةً قرب p\sqrt{p}.

افتح في المختبر
حرّك شريط m لترى كيف يؤثّر عدد السمات المرشّحة لكل انقسام على التوازن بين قوة الشجرة والارتباط بين الأشجار، وأثر ذلك على خطأ الغابة.
تستيقظ التجربة عند وصولك…

الفكرة ذاتها في الكود

غابة عشوائية من الصفر — الحلقة الجوهريةpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np
from collections import Counter

def bootstrap_sample(X, y):
    """اسحب N عيّنة مع الإعادة. أعد مؤشرات العيّنة ومؤشرات OOB."""
    n = len(y)
    idxs = np.random.choice(n, n, replace=True)
    oob = list(set(range(n)) - set(idxs))
    return X[idxs], y[idxs], oob

def best_split(X, y, feature_indices):
    """أوجد أفضل (سمة، عتبة) من بين المجموعة المختارة."""
    best_gini, best_feat, best_thr = float('inf'), None, None
    for f in feature_indices:
        thresholds = np.unique(X[:, f])
        for t in thresholds:
            left = y[X[:, f] <= t]
            right = y[X[:, f] > t]
            g = (len(left) * gini(left) + len(right) * gini(right)) / len(y)
            if g < best_gini:
                best_gini, best_feat, best_thr = g, f, t
    return best_feat, best_thr

def gini(y):
    """شائبة جيني: 1 - Σ(pᵢ²)"""
    counts = np.bincount(y)
    probs = counts / counts.sum()
    return 1 - (probs ** 2).sum()

def random_forest(X, y, n_trees=100, m=None):
    """دَرِّب غابة عشوائية. m = عدد السمات لكل انقسام (افتراضياً √p)."""
    n, p = X.shape
    if m is None:
        m = int(np.sqrt(p))
    trees = []
    oob_preds = {i: [] for i in range(n)}

    for _ in range(n_trees):
        X_boot, y_boot, oob_idxs = bootstrap_sample(X, y)
        tree = grow_tree(X_boot, y_boot, m, p)  # بناء شجرة CART تكرارياً
        trees.append(tree)
        # تنبؤات العيّنات خارج الحقيبة — تحقق متقاطع مجاني
        for i in oob_idxs:
            oob_preds[i].append(predict_tree(tree, X[i]))

    # تقدير خطأ OOB
    oob_error = np.mean([
        Counter(preds).most_common(1)[0][0] != y[i]
        for i, preds in oob_preds.items() if preds
    ])
    return trees, oob_error

من منظور الانحياز والتباين: أين تقع الغابات العشوائية؟

حين ننظر إلى الغابات العشوائية من خلال تتّضح منطقية كل خيار في تصميمها:

  • الأشجار الفردية ذات انحياز منخفض (تستطيع رسم حدود قرار معقدة) لكن تباينها مرتفع (تتغيّر جذرياً مع بيانات مختلفة).
  • التجميع بالتمهيد يحسب متوسط أشجار كثيرة فيُقلّل التباين دون المساس بالانحياز، لكن الأشجار المترابطة تحدّ من هذا التقليل.
  • الاختيار العشوائي للسمات يكسر الارتباط بين الأشجار فيدفع التباين للانخفاض أكثر. صحيح أنه يرفع الانحياز قليلاً (لأن كل شجرة ترى سمات أقل)، لكن المكسب في تقليل التباين يفوق ذلك بكثير.

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

افتح في المختبر
حرّك الشريط من شجرة واحدة إلى 200. لاحظ كيف ينخفض التباين بسرعة بينما يبقى الانحياز شبه ثابت — وهذا هو السلوك المميّز للغابة العشوائية.
تستيقظ التجربة عند وصولك…

لماذا كان لها هذا الأثر

الغابات العشوائية غالباً أول خوارزمية يلجأ إليها عالم البيانات حين يواجه بيانات جدولية جديدة — وكثيراً ما تكون آخر ما يحتاجه. تتصدّر مجالات عديدة من المعلوماتية الحيوية (انتقاء الجينات) إلى البيئة (توزيع الأنواع) إلى المالية (التسجيل الائتماني). أثبت بريمان أن فكرة بسيطة — فكّ ارتباط الأشجار المُجمّعة — تستطيع مجاراة أساليب أعقد بكثير أو التفوّق عليها.

فكرة تجميع الأشجار مهّدت الطريق أيضاً أمام XGBoost و للأشجار، الذي استبدل التجميع المتوازي بالتعزيز المتتابع مع الإبقاء على الفكرة الجوهرية: عدد كبير من الأشجار الضعيفة يُدمج بحكمة ليتفوّق على أي نموذج معقد بمفرده.

  1. 1984

    CART

    نَشَر بريمان وفريدمان وأولشن وستون كتاب أشجار التصنيف والانحدار، الذي أرسى الأساس لجميع الأساليب المبنية على الأشجار.

  2. 1996

    التجميع بالتمهيد

    قدّم بريمان أسلوب التجميع بالتمهيد — حساب متوسط عدة أشجار لتقليل التباين. كان هذا الأسلوب المُمهّد المباشر للغابات العشوائية.

  3. 2001

    الغابات العشوائية

    الاختيار العشوائي للسمات عند كل انقسام يكسر التشابه بين الأشجار ويُحسّن أداء التجميع بالتمهيد جذرياً. قُدّمت أيضاً مقاييس أهمية السمات وتقدير خطأ OOB.

  4. 2006

    الأشجار شديدة العشوائية

    دفع غيرتس وزملاؤه العشوائية خطوة أبعد — عتبات عشوائية وليس فقط سمات عشوائية — مع قبول زيادة طفيفة في الانحياز مقابل تباين أقلّ.

  5. 2016

    إكس جي بوست تهيمن على Kaggle

    أدخلت XGBoost التعزيز التدريجي على تجميع الأشجار — تصحيح متتابع بدل حساب المتوسط المتوازي — وفازت بمعظم مسابقات البيانات الجدولية.

  6. 2024

    البيانات الجدولية تصمد

    رغم تقدّم التعلّم العميق، لا تزال تجميعات الأشجار (الغابات العشوائية وXGBoost وLightGBM) الأفضل أداءً على البيانات الجدولية المُهيكلة، وتتفوّق باستمرار على الشبكات العصبية.

المرجعBreiman, L.. Random Forests. Machine Learning, 2001.

مصطلحات هذه الورقة