أساسيات تعلم الآلة2001متوسط10 دقيقة قراءة
الغابات العشوائية
Random Forests
Breiman, L. — Machine Learning
المشكلة
شجرة القرار الواحدة سهلة الفهم لكنها غير مستقرة: أي تغيير بسيط في بيانات قد يُنتج شجرة مختلفة تماماً، وهذا يعني تبايناً مرتفعاً. الأشجار العميقة تحفظ الضجيج وتُفرط في الملاءمة، والضحلة لا تلتقط أنماطاً كافية، والتقليم يُحسّن الوضع لكنه لا يحلّ المشكلة جذرياً. التجميع بالتمهيد يُقلّل عبر حساب متوسط عدد كبير من الأشجار، لكن حين تُهيمن سمة واحدة قوية تبدأ جميع الأشجار بالانقسام عليها — فتصبح متشابهة ويضعف أثر التجميع في تقليل التباين.
الإسهام
تُضيف الغابات العشوائية طبقة ثانية من العشوائية فوق التجميع بالتمهيد: عند كل نقطة انقسام، لا تنظر الشجرة إلا في مجموعة عشوائية صغيرة من السمات عددها m (عادةً √p في ). هذا يكسر التشابه بين الأشجار فيصبح متوسط تنبؤاتها أقل تبايناً بفارق كبير. كذلك قدّمت الورقة تقدير الخطأ بالعيّنات خارج الحقيبة (OOB) — وهو بمثابة تحقق متقاطع مجاني يستغلّ ثلث البيانات التي لم تشارك في تدريب كل شجرة — ومقياسين : (أهمية جيني) . خطأ يتقارب كلما أضفنا أشجاراً، ولذلك لا تعاني الغابات العشوائية من الإفراط في الملاءمة مهما زاد عدد الأشجار.
الأثر
أصبحت الغابات العشوائية الخيار الأول الذي يلجأ إليه الممارسون في كل المجالات التطبيقية تقريباً — علم الجينوم، والاستشعار عن بُعد، والمالية، والطب، والبيئة. لا تحتاج تقريباً لضبط المعاملات الفائقة، وتتعامل مع أنواع بيانات مختلطة، وتعمل بكفاءة في الأبعاد العالية، وتوفّر مقاييس أهمية السمات بشكل مدمج. لا تزال أقوى خط أساس ، وقد ألهمت مباشرةً خوارزمية XGBoost التي استبدلت التجميع بالتمهيد بالتعزيز التدريجي مع الإبقاء على إطار تجميع الأشجار.
تخيّل أنك تُحكّم مسابقة طبخ. حَكَمٌ واحد قد يكون متحيّزاً — ربما يكره الكُزبرة أو يُبالغ في تقدير الشكل على حساب الطعم. لكن تخيّل الآن لجنة من مئة حَكَم، كلٌّ منهم يتذوّق مجموعة عشوائية من الأطباق ويُقيّم بناءً على معايير مختلفة (النكهة، القوام، التقديم…). لا أحد منهم يرى الصورة كاملة، لكن تصويت الأغلبية يكون عادلاً ومتيناً بشكل مدهش.
تعمل بالمبدأ ذاته: مئات من ، كل شجرة تتدرّب على شريحة مختلفة من البيانات وتنظر في حفنة عشوائية فقط من عند كل انقسام. كل شجرة بمفردها ضعيفة ومحدودة الرؤية، لكن حين تتصوّت معاً يكون ناتجها من أكثر موثوقيةً في مجال تعلّم الآلة.
المشكلة: شجرة واحدة لا تكفي
شجرة القرار (CART) فكرة بسيطة وقوية: نقسم البيانات بشكل متكرر بحسب السِّمة والعتبة التي تفصل الفئات بأفضل شكل، فنحصل على مخطط تدفّقي يسهل على أي شخص قراءته. لكن المشكلة الجوهرية في الأشجار هي التباين المرتفع: غيّر بضع نقاط في بيانات التدريب وقد تحصل على شجرة مختلفة كلياً. هذا عدم الاستقرار هو ما يجعل الاعتماد على شجرة واحدة أمراً محفوفاً بالمخاطر.
الأشجار العميقة تحفظ الضجيج ()، والضحلة تُفوّت الأنماط (). يُخفّف المشكلة لكنه لا يعالج جذرها. السؤال الذي طرحه بريمان: هل نستطيع الاستفادة من قوة الأشجار مع كبح تباينها؟
من التجميع بالتمهيد إلى الغابات العشوائية: طبقتان من العشوائية
كان (Bagging) أول حلول بريمان عام 1996: نسحب عدة (نأخذ N صفاً مع الإعادة)، ونبني شجرة كاملة على كل عيّنة، ثم نحسب متوسط التنبؤات (في ) أو نأخذ تصويت الأغلبية (في التصنيف). حساب المتوسط يُقلّل التباين دون زيادة — بشرط ألّا تكون أخطاء الأشجار مترابطة بشكل كبير.
لكن المشكلة تظهر حين تكون سمة واحدة شديدة القدرة التنبؤية: كل شجرة ستنقسم عليها أولاً، فتُصبح الأشجار متشابهة. وحساب متوسط تنبؤات مترابطة لا يُقلّل التباين بالقدر الذي يُقلّله متوسط تنبؤات مستقلة. وهنا تأتي المعادلة التي تُوضّح المشكلة.
تباين متوسط B تنبؤ متماثل التوزيع (لكن قد يكون مترابطاً) يُعطى بالصيغة:
الغابات العشوائية تحلّ هذه المشكلة بإضافة طبقة ثانية من العشوائية: عند كل انقسام لا تنظر الشجرة إلا في مجموعة عشوائية من m سمة (من أصل p سمة متاحة). بهذه الطريقة لا تستطيع أي سمة مهيمنة أن تحتلّ قمة كل شجرة، وهذا ما يُحقّق بينها. النتيجة: ρ̄ ينخفض، الحدّ الأول في المعادلة يتقلّص، و تُحقّق تبايناً أقلّ بكثير.
الأمر أشبه بلجنة توظيف: لو طرح كل مُحاوِر الأسئلة نفسها فسيخرجون بالرأي ذاته. لكن أجبر كل واحد منهم على الاختيار من مجموعة عشوائية من الأسئلة وستحصل على تقييمات مستقلة فعلاً.
الخوارزمية: كيف تنمو الغابة العشوائية
خوارزمية الغابة العشوائية أنيقة في بساطتها. لكل شجرة من B شجرة نكرّر الخطوات التالية:
- المعاينة التمهيدية: نسحب N عيّنة مع الإعادة من مجموعة التدريب. نحو ⅓ البيانات تبقى خارج العيّنة — وهي ما يُعرف بعيّنات خارج الحقيبة ().
- النمو: عند كل ، نختار عشوائياً m سمة (من أصل p)، ونبحث عن أفضل ضمن تلك الـ m فقط. نستمرّ في النمو حتى تصبح العقد نقية أو تبلغ حجماً أدنى. بلا تقليم.
- التنبؤ: في التصنيف تُدلي كل شجرة بصوت واحد والنتيجة هي تصويت الأغلبية. في الانحدار نأخذ المتوسط.
الوحيد المؤثر فعلاً هو m — عدد السمات المرشّحة لكل انقسام. القاعدة العملية هي للتصنيف و للانحدار. وقد أظهر بريمان أن الأداء لا يتأثر كثيراً بهذا الاختيار.
تحقق مجاني: فكرة العيّنات خارج الحقيبة
كل عيّنة تمهيدية تشمل نحو 63.2% من بيانات التدريب (لأن السحب بالإعادة يُكرّر بعض الصفوف). أما الـ 36.8% المتبقية — وتُسمى عيّنات خارج الحقيبة (OOB) — فهي بيانات لم تَرَها تلك الشجرة أثناء التدريب. لتقدير خطأ التعميم: نأخذ كل مثال تدريبي ونجمع تنبؤات الأشجار التي لم يدخل في عيّنتها التمهيدية، ثم نحسب المتوسط أو نأخذ تصويت الأغلبية. هذا يعطينا تقديراً غير منحاز لخطأ الاختبار دون الحاجة إلى مجموعة تحقق منفصلة.
أظهر بريمان أن خطأ OOB يُقارب في دقّته ، لكنه يأتي مجاناً تماماً — بلا تشغيلات تدريب إضافية. بالنسبة للممارسين كان هذا تحوّلاً كبيراً: أصبح بالإمكان ضبط m و وتقييم التعميم من تشغيل تدريب واحد.
أيّ السمات مهمّة؟ مقياسان للإجابة
الغابات العشوائية لا تكتفي بالتنبؤ — بل تكشف ما الذي يقود التنبؤ. قدّم بريمان مقياسين متكاملين لأهمية السمات:
متوسط انخفاض الشائبة (MDI / أهمية جيني): لكل سمة، نجمع مقدار الانخفاض الكلي في (أو التباين في الانحدار) عبر كل الانقسامات التي استخدمت تلك السمة في جميع الأشجار. السمات التي تُنتج انقسامات أنقى تحصل على درجات أعلى. هذا المقياس سريع الحساب لكنه قد ينحاز لصالح السمات ذات القيم العديدة.
أهمية التبديل (متوسط انخفاض الدقة): بعد التدريب، نأخذ عيّنات OOB ونخلط قيم سمة واحدة عشوائياً ثم نُعيد التنبؤ. الانخفاض في يقيس مدى اعتماد الغابة على تلك السمة. إذا لم تتغيّر الدقة فالسمة ليست مهمة. هذا المقياس لا يرتبط بنوع وهو أكثر موثوقية لكنه أبطأ في الحساب.
يمكن التفكير في MDI كسؤال: «كم مرة لجأت الغابة إلى هذه السمة؟» بينما أهمية التبديل تسأل: «ما حجم الضرر لو خلطنا قيم هذه السمة عشوائياً؟»
لماذا لا تُفرط في الملاءمة؟
من أكثر نتائج الورقة إثارةً للدهشة: الغابات العشوائية لا تُعاني من الإفراط في الملاءمة مهما أضفنا من أشجار. كل شجرة بمفردها تُفرط في الملاءمة بشدة — تنمو لأقصى عمق بلا تقليم. لكن المجموعة التجميعية تتقارب. أثبت بريمان باستخدام قانون الأعداد الكبيرة القوي أن خطأ التعميم للغابة يتقارب شبه مؤكد إلى حدّ معيّن:
ثم وضع بريمان حداً أعلى لهذا الخطأ باستخدام كمّيتين واضحتين:
- (s): دقة الشجرة الفردية في المتوسط.
- (ρ̄): مدى تشابه تنبؤات الأشجار المختلفة.
الحدّ هو . الغابة الجيدة تُعظّم القوة وتُقلّل الارتباط. المعامل m يتحكّم في هذه الموازنة: قيمة m أصغر تعني ارتباطاً أقلّ لكن أشجاراً فردية أضعف. النقطة المُثلى عادةً قرب .
الفكرة ذاتها في الكود
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
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من منظور الانحياز والتباين: أين تقع الغابات العشوائية؟
حين ننظر إلى الغابات العشوائية من خلال تتّضح منطقية كل خيار في تصميمها:
- الأشجار الفردية ذات انحياز منخفض (تستطيع رسم حدود قرار معقدة) لكن تباينها مرتفع (تتغيّر جذرياً مع بيانات مختلفة).
- التجميع بالتمهيد يحسب متوسط أشجار كثيرة فيُقلّل التباين دون المساس بالانحياز، لكن الأشجار المترابطة تحدّ من هذا التقليل.
- الاختيار العشوائي للسمات يكسر الارتباط بين الأشجار فيدفع التباين للانخفاض أكثر. صحيح أنه يرفع الانحياز قليلاً (لأن كل شجرة ترى سمات أقل)، لكن المكسب في تقليل التباين يفوق ذلك بكثير.
المحصّلة: تُحقّق الغابات العشوائية دقة قريبة من أفضل ما يمكن (انحياز منخفض) مع استقرار أكبر بكثير (تباين منخفض). إنها تشغل نقطة مُثلى لا تبلغها الأشجار الفردية ولا حتى الأشجار المُجمّعة بالتمهيد.
لماذا كان لها هذا الأثر
الغابات العشوائية غالباً أول خوارزمية يلجأ إليها عالم البيانات حين يواجه بيانات جدولية جديدة — وكثيراً ما تكون آخر ما يحتاجه. تتصدّر مجالات عديدة من المعلوماتية الحيوية (انتقاء الجينات) إلى البيئة (توزيع الأنواع) إلى المالية (التسجيل الائتماني). أثبت بريمان أن فكرة بسيطة — فكّ ارتباط الأشجار المُجمّعة — تستطيع مجاراة أساليب أعقد بكثير أو التفوّق عليها.
فكرة تجميع الأشجار مهّدت الطريق أيضاً أمام XGBoost و للأشجار، الذي استبدل التجميع المتوازي بالتعزيز المتتابع مع الإبقاء على الفكرة الجوهرية: عدد كبير من الأشجار الضعيفة يُدمج بحكمة ليتفوّق على أي نموذج معقد بمفرده.
1984
CART
نَشَر بريمان وفريدمان وأولشن وستون كتاب أشجار التصنيف والانحدار، الذي أرسى الأساس لجميع الأساليب المبنية على الأشجار.
1996
التجميع بالتمهيد
قدّم بريمان أسلوب التجميع بالتمهيد — حساب متوسط عدة أشجار لتقليل التباين. كان هذا الأسلوب المُمهّد المباشر للغابات العشوائية.
2001
الغابات العشوائية
الاختيار العشوائي للسمات عند كل انقسام يكسر التشابه بين الأشجار ويُحسّن أداء التجميع بالتمهيد جذرياً. قُدّمت أيضاً مقاييس أهمية السمات وتقدير خطأ OOB.
2006
الأشجار شديدة العشوائية
دفع غيرتس وزملاؤه العشوائية خطوة أبعد — عتبات عشوائية وليس فقط سمات عشوائية — مع قبول زيادة طفيفة في الانحياز مقابل تباين أقلّ.
2016
إكس جي بوست تهيمن على Kaggle
أدخلت XGBoost التعزيز التدريجي على تجميع الأشجار — تصحيح متتابع بدل حساب المتوسط المتوازي — وفازت بمعظم مسابقات البيانات الجدولية.
2024
البيانات الجدولية تصمد
رغم تقدّم التعلّم العميق، لا تزال تجميعات الأشجار (الغابات العشوائية وXGBoost وLightGBM) الأفضل أداءً على البيانات الجدولية المُهيكلة، وتتفوّق باستمرار على الشبكات العصبية.
المرجعBreiman, L.. Random Forests. Machine Learning, 2001.
مصطلحات هذه الورقة
- الغابة العشوائية خوارزميةRandom Forest
- التجميع المتوازي للعينات العشوائيةBagging
- المعاينة التمهيديةBootstrap Sampling
- النماذج التجميعية الهجينةEnsemble
- شجرة القرار الإحصائيةDecision Tree
- العيّنات غير المُستخدَمةOut-of-Bag (OOB)
- أهمية السماتFeature Importance
- أهمية التبديلPermutation Importance
- متوسط انخفاض الشائبةMean Decrease Impurity (MDI)
- شائبة جينيGini Impurity
- فكّ الارتباطDecorrelation
- قوة الشجرةTree Strength