الوحدة 3 · الدرس 2

الـ random forests (الغابات العشوائية)

12 دقيقة قراية
قراية

الـ decision tree (شجرة القرار) الواحدة قوية بس هشّة. درّبها على بيانات مختلفة شوية وهتاخد شجرة مختلفة خالص. الحساسية دي — اللي اسمها الـ high variance (التباين العالي) — هي نقطة الضعف الأساسية في الأشجار المنفردة. والـ random forests (الغابات العشوائية) بتحل المشكلة دي بفكرة بسيطة وحلوة: ابني أشجار كتير، كل واحدة مختلفة شوية، وسيبهم يصوّتوا.

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

الـ decision tree العميقة هتحفظ الـ training set تقريبًا كلها. ولو اديتها نفس المهمة ببيانات متعدّلة شوية، هتطلّع هيكل مختلف جدًا. الـ model عنده bias (تحيز) واطي (يقدر يناسب patterns معقّدة) بس variance عالي (حسّاس جدًا للنقط اللي بيشوفها).

والأرقام بتحكي الحكاية: شجرة عميقة من غير pruning ممكن تجيب 100% accuracy على بيانات التدريب و60% بس على بيانات الاختبار. والفجوة بين الرقمين دول هي مشكلة الـ variance.

الفكرة الأساسية: لو عندك N model مستقلين، كل واحد بيغلط غلطات عشوائية، فمتوسط الـ predictions بتاعتهم الـ variance بتاعه أصغر N مرة من أي model لوحده. الغلطات بتلغي بعضها.

فكرة الـ ensemble: حكمة الجماعة

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

ده الـ ensemble learning (التعلم التجميعي). والـ random forests بتطبّق نفس المبدأ على الـ decision trees. كل شجرة estimator لوحدها مش كامل بس مستقل. والـ prediction الجماعي بتاعهم أوثق من أي شجرة لوحدها.

الـ random forests بتشتغل إزاي

الخطوة 1: الـ bootstrap sampling (التجميع التكثيفي)

كل شجرة في الغابة بتتدرّب على dataset مختلفة — بس إحنا مش بنجمع بيانات جديدة. بدل كده، بناخد عيّنة من الـ training set الموجودة بالسحب مع الإرجاع. ودي اسمها bootstrap sample.

لو عندك 1,000 مثال تدريب، كل شجرة بتشوف سحبة عشوائية من 1,000 مثال — بس شوية منهم بيظهروا مرتين، وشوية تلات مرات، وحوالي 37% مبيظهروش خالص. أشجار مختلفة بتشوف نسخ مختلفة من البيانات، فبتضطر تتعلّم بشكل مختلف.

والتقنية دي — إنك تدرّب models كتير على bootstrap samples وتدمجهم — اسمها الـ bagging (التجميع التكثيفي). قدّمها ليو بريمان سنة 1994.

الخطوة 2: اختيار features عشوائية

الـ bagging لوحده بيخلّي الأشجار مختلفة من ناحية العينات اللي بتشوفها. بس لو كل الـ features متاحة عند كل split، الأشجار اللي اتدرّبت على بيانات متداخلة هتطلع شبه بعض — خصوصًا قرب الـ root، اللي فيه feature واحدة مسيطرة بتميل تتختار الأول.

فالـ random forests بتزوّد مصدر عشوائية تاني: عند كل split في كل شجرة، بنبص بس على subset عشوائية من الـ features. وحجم الـ subset المعتاد ماشي على قاعدة تقريبية:

حجم الـ subset من الـ features
m = \begin{cases}\sqrt{p} & \text{classification}\\p/3 & \text{regression}\end{cases}
وp هو العدد الكلي للـ features. مسائل الـ classification بتستخدم الجذر التربيعي؛ والـ regression بيستخدم التلت.

ولما تجبر كل split إنه يبص بس على subset من الـ features، الأشجار بتبقى مش مترابطة — بتميل تستخدم features مختلفة في splits مختلفة، فغلطاتها بتبقى مستقلة أكتر وأقرب إنها تلغي بعضها.

الخطوة 3: تصويت الأغلبية (أو المتوسط)

أول ما كل الأشجار تتدرّب، التنبؤ بسيط. كل شجرة بتصنّف الـ input لوحدها. في الـ classification، الغابة بتاخد تصويت الأغلبية — الفئة اللي أغلب الأشجار اتنبأت بيها. وفي الـ regression، بتاخد المتوسط على كل الأشجار.

مثال: أربع أشجار بتصوّت [آه، آه، لأ، آه] ← الغابة بتتنبأ بآه (3 من 4). وكل ما تزوّد أشجار، التصويت بيبقى أثبت وأوثق.

الـ out-of-bag error: validation ببلاش

افتكر إن ~37% من أمثلة التدريب مش بتستخدمها أي شجرة بعينها. ودي اسمها عينات الـ out-of-bag (خارج الحقيبة) (OOB) للشجرة دي. ونقدر نستخدمها كـ validation set — نقيّم كل مثال تدريب بالأشجار اللي مشافتهوش في التدريب بس.

ولما تجمع الـ predictions دي بتاخد تقدير الـ OOB error — تقدير مش منحاز للـ generalization error، تقريبًا ببلاش، من غير ما تحتاج validation set منفصلة أو cross-validation. ودي من الحاجات الحلوة عمليًا في الـ random forests.

الـ feature importance

أثر جانبي مفيد لتدريب الـ random forests هو إنك ترتّب كل feature مهمة قد إيه. والمقياس المعتاد هو الـ mean decrease in impurity (متوسط انخفاض الشوائب) (MDI):

الـ feature importance
\text{FI}(j) = \frac{1}{N_T}\sum_{t=1}^{N_T}\sum_{\text{splits on }j}\Delta\text{Gini}
الـ FI(j) بتقيس الـ feature j بتقلّل الـ Gini impurity قد إيه في المتوسط، متجمّعة على كل الـ splits اللي بتستخدم الـ feature j في كل الـ N_T شجرة.

الـ features اللي بتظهر بدري في الأشجار (قريب من الـ root) وبتعمل مكاسب نضافة كبيرة بتاخد درجات importance عالية. والدرجات النهائية متعايرة بحيث مجموعها يساوي 1.

وده بيدّيك ترتيب ببلاش للمتغيرات الأهم للتنبؤ — مفيد للـ feature selection، وتفسير الـ model، وفهم مجال مشكلتك.

أهم الـ hyperparameters

الـ random forests سهل تظبطها بشكل ملفت — بتشتغل كويس بالإعدادات الافتراضية ومش حسّاسة لأغلب الـ hyperparameters (المعاملات الفائقة).

n_estimators
عدد الأشجار. أكتر دايمًا أحسن بس الفايدة بتقل. 100–500 مدى بداية كويس.
max_features
الـ features لكل split. الافتراضي: √p (classification)، p/3 (regression). بيتحكم في ترابط الأشجار.
max_depth
أقصى depth لكل شجرة. الافتراضي None (نمو كامل). الأشجار الأقل عمقًا بتقلّل الـ variance بس بتزوّد الـ bias.
min_samples_split
أقل عدد عينات مطلوب عشان internal node تتقسم. القيم الأعلى بتشتغل كـ regularization.
bootstrap
نستخدم الـ bootstrap sampling ولا لأ (True افتراضيًا). لو خليته False كل شجرة بتستخدم الـ dataset كلها.
oob_score
لو True، بيحسب ويخزّن تقدير الـ OOB error. validation ببلاش من غير بيانات زيادة.

ليه بتنجح: نظرة الـ bias والـ variance

الـ bias-variance trade-off بيشرح الـ random forests بوضوح. الـ decision tree العميقة عندها bias واطي — تقدر تقرّب أي function تقريبًا — بس variance عالي — بتتغيّر جامد مع بيانات التدريب.

لما تاخد متوسط N model مستقلين، الـ bias بيفضل زي ما هو بس الـ variance بينزل بمعامل N. المشكلة إن الأشجار مش مستقلة تمامًا — مبنية من بيانات متداخلة وبتشترك في الـ features. والترابط بين الأشجار بيحدّ من تقليل الـ variance.

واختيار الـ features العشوائي هو الابتكار الأساسي اللي بيقلّل ترابط الأشجار. لما تجبر كل شجرة تستخدم مجموعات features مختلفة، الأشجار بتبقى مستقلة أكتر، وتقليل الـ variance بيقرّب من الحد النظري 1/N.

تطبيقات من الواقع

الـ random forests غالبًا أول model تجرّبه على مسائل البيانات المتنظّمة/الجدولية. بتتعامل مع القيم الناقصة، وأنواع الـ features المختلطة، والـ inputs اللي أبعادها كتير بكفاءة، ونادرًا ما بتعمل overfitting وحش.

أهم النقط