انتقل إلى المحتوى الرئيسي

الوحدة 6 — الغابات العشوائية والتجميع bootstrap

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

Bagging: حكمة الجماهير مطبَّقةً على النماذج

يرتكز bagging (bootstrap aggregating) على خطوتين:

  1. Bootstrap: اسحب، مع الإرجاع، عيّناتٍ عدّة بحجم مجموعة البيانات الأصلية نفسه. كلّ إعادة سحبٍ ترى صفوفاً مكرّرة وأخرى غائبة — فتختلف قليلاً.
  2. التجميع: درّب شجرةً لكلّ إعادة سحب، ثمّ ادمج — تصويت بالأغلبية في التصنيف، ومتوسّط في الانحدار.

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

زيادة الغابة: عشوَنة المتغيّرات أيضاً

تبقى الأشجار المدرَّبة على عيّنات bootstrap متشابهةً أكثر ممّا ينبغي: إن كان متغيّرٌ مُهيمِناً، وضعته جميعاً في الجذر فترابطت أخطاؤها — فيفقد المتوسّط قوّته. تضيف الغابة العشوائية مستوىً ثانياً من العشوائية: عند كلّ عقدة، لا يجوز استعمال إلّا مجموعةٍ فرعية عشوائية من المتغيّرات (عادةً d\sqrt{d}) للانقسام.

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

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(
n_estimators=300, # عدد الأشجار
max_features="sqrt", # المتغيّرات المسحوبة عند كلّ عقدة
n_jobs=-1, # تدريب متوازٍ
random_state=42,
).fit(X_train, y_train)

راحةٌ ثمينة: تعمل الغابة على نحوٍ رائع بلا ضبطٍ يُذكَر. يكفي أن تكون n_estimators كبيرة بما فيه الكفاية (يبلغ الأداء هضبةً ولا يتدهور قطّ بإضافة الأشجار — يكلّف زمن حسابٍ فحسب).

Out-of-bag: تحقّق مجّاني

من أناقة bootstrap: كلّ شجرةٍ لم ترَ نحو ثُلث الصفوف (تلك غير المسحوبة). تعمل هذه النقاط out-of-bag مجموعةَ اختبار شخصية لكلّ شجرة، ويعطي تجميعها تقديراً نزيهاً للأداء دون مسّ مجموعة الاختبار أو تشغيل تحقّق متقاطع:

RandomForestClassifier(n_estimators=300, oob_score=True).fit(X_train, y_train).oob_score_

أهمّية المتغيّرات على مستوى الغابة

تُجمّع الغابة أهمّيات أشجارها (الوحدة 5) في مقياسٍ أكثر استقراراً لمساهمة كلّ متغيّر — من أكثر الأدوات استعمالاً لشرح النموذج. لكن حذارِ: تتوزّع الأهمّيات على المتغيّرات المترابطة، وأهمّيةُ عدم النقاء تُحابي المتغيّرات عالية التعدّد. لقراءةٍ نقدية، أهمّية التبديل (خلط قيم متغيّر واحد وقياس هبوط الأداء) أوثق.

ما تتخلّى عنه الغابة

شجرة واحدة كانت مقروءة؛ وثلاثمئة ليست كذلك. تقايض الغابة شفافية الوحدة 5 بـالمتانة — والأهمّيات والتبديل يُعوّضان جزئياً. وحدّها الآخر: يتطلّب التنبّؤ استجواب كلّ الأشجار، وهو مُكلِف تحت قيود الزمن الحقيقي. والتعزيز، في الوحدة التالية، غالباً ما يفعل أفضل بعدُ على البيانات الجدولية.

الخلاصة

  • Bagging = bootstrap + تجميع: متوسّط أشجارٍ كثيرة عالية التباين يقسم التباين بلا رفع الانحياز.
  • تضيف الغابة السحب العشوائي للمتغيّرات عند كلّ عقدة، فتفكّ ترابط الأشجار — مفتاح فاعليتها.
  • تُقدّم نتيجة out-of-bag تحقّقاً نزيهاً مجّاناً، بلا تحقّق متقاطع.
  • شبه خاليةٍ من الضبط ومتينةٍ، تفقد الغابة قابلية قراءة الشجرة الوحيدة؛ والأهمّيات (ويُفضَّل بـالتبديل) تُعوّض.

الوحدة التالية: تعزيز التدرّج — بناء الأشجار لا على التوازي بل على التتابع، كلٌّ تُصحّح أخطاء سابقاتها.