الأشجار والغابات والتعزيز
درس 5 من 8
5الأشجار والغابات والتعزيز
الصورة الكبيرةعلى البيانات الجدولية، وهي أغلب بيانات الشركات، ما زالت الأشجار المعزّزة تهزم الشبكات العصبية غالبًا. هذا الدرس يبني الفهم من شجرة واحدة إلى غابة إلى تعزيز، ويقيس كل خطوة.
ماذا تشاهد في الرسم: طلب توصيل يمرّ على سؤالين فقط حتى يصل إلى ورقة: أبعد من 15 كم، والجو ممطر، فالتوقّع «متأخر». هذا كل ما تفعله شجرة القرار: أسئلة نعم أو لا مرتّبة، كل سؤال يقسم البيانات إلى نصفين أنقى.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
شجرة القرار مثل لعبة «عشرين سؤالًا»: هل الدخل أكبر من كذا؟ نعم. هل العمر أقل من كذا؟ لا. حتى تصل إلى جواب. والغابة مئات الأشجار تصوّت معًا فتخطئ أقل. والتعزيز أشجار متتالية، كل واحدة تصحح أخطاء التي قبلها.
الشجرة تقسم السمات بعتبات تقلل عدم النقاء Gini أو الإنتروبيا، وتفرط في التعلّم إن تُركت تتعمق. الغابة العشوائية Random Forest تجمع أشجارًا على عينات وسمات عشوائية. والتعزيز بالميل XGBoost وLightGBM يبني الأشجار على البواقي، وهو الأقوى عادةً على البيانات الجدولية.
قبل أن تبدأ
📏المقاييس
تعرف الفرق بين الدقة على التدريب والدقة على الاختبار، ولماذا الثانية هي التي تهمّ.
✂️تقسيم البيانات
تفصل الاختبار قبل أي تجربة، فكل رقم في هذا الدرس مقاس على بيانات لم يرها النموذج.
الفكرة الجوهرية
على الجداول ما زالت الأشجار المعزّزة تتفوّق غالبًا. تبدأ هنا بشجرة واحدة وكيف تحفظ، ثم تجمع أشجارًا كثيرة، ثم تقيس أربعة نماذج، ثم تقرأ ما تستخدمه الغابة.
1العمق يتحكّم في الحفظ
شجرة القرار تسأل سلسلة أسئلة عن عمود وحدّ حتى تصل إلى ورقة فيها الجواب. كلما سمحت لها بأسئلة أكثر، اقتربت من حفظ كل صف.
انظر إلى الرسم: مع العمق يصعد التدريب إلى 100%، والاختبار يكاد لا يتحرّك.
شجرة بلا حدّ للعمق تستمر في السؤال حتى تصنّف كل صف تدريب صحيحًا، أي تحفظ البيانات. لاحظ الفرق بين التدريب والاختبار.
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
X, y = load_breast_cancer(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
for depth in [1, 3, None]:
tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(X_tr, y_tr)
print(f"max_depth={str(depth):4} train={tree.score(X_tr, y_tr):.3f} test={tree.score(X_te, y_te):.3f} leaves={tree.get_n_leaves()}")
بلا حدّ: تدريب 100% واختبار 90.6%. الشجرة حفظت كل صف تدريب بست عشرة ورقة. الفجوة بين الرقمين هي الإفراط في التكيّف (Overfitting)، وستراها في كل نموذج حتى نهاية المسار.
max_depth أو min_samples_leaf. ستحفظ بيانات التدريب، وترى رقمًا مثاليًا لا يتكرّر على بيانات جديدة.2أشجار كثيرة: الغابة والتعزيز
أخطاء الأشجار المختلفة لا تتطابق. لذلك يلغي التصويت جزءًا كبيرًا من التقلّب، ويبقى النمط الذي تتّفق عليه أغلبها.
شجرة واحدة متقلّبة: غيّر بضعة صفوف وتتغيّر كلها. الغابة العشوائية تدرّب مئات الأشجار، كل واحدة على عيّنة عشوائية من الصفوف والأعمدة، ثم تأخذ التصويت. التعزيز يدرّب أشجارًا صغيرة بالتتابع، كل شجرة تصحّح أخطاء ما قبلها.
انظر إلى الرسم: في التعزيز لا تبدأ كل شجرة من الصفر. هي تتعلّم ما فات المجموع قبلها، ثم تُضاف إليه بوزن صغير.
3أربعة نماذج على جدول توصيل
التأخير هنا تصنعه حدود وتفاعلات: مسافة طويلة مع وقت الذروة، أو مطر مع مسافة أطول. انظر إلى الرسم: كل خطوة من شجرة إلى غابة إلى تعزيز تضيف دقة.
بيانات توصيل مصطنعة: التأخير يحدث إذا كانت المسافة فوق 15 كم في وقت الذروة، أو إذا كانت فوق 22 كم مع مطر، مع 5% ضجيج. هذه القاعدة تفاعلات وحدود، وهو ما يصعب على النموذج الخطي.
import numpy as np
from sklearn.ensemble import HistGradientBoostingClassifier, RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
rng = np.random.default_rng(0)
n = 3000
distance_km = rng.uniform(1, 30, n)
hour = rng.integers(0, 24, n)
rain = rng.integers(0, 2, n)
rush = ((hour >= 7) & (hour <= 9)) | ((hour >= 16) & (hour <= 19))
late = ((distance_km > 15) & rush) | ((rain == 1) & (distance_km > 22))
late = late ^ (rng.random(n) < 0.05)
X = np.column_stack([distance_km, hour, rain])
models = {
"logistic": LogisticRegression(max_iter=1000),
"one tree": DecisionTreeClassifier(random_state=0),
"forest": RandomForestClassifier(n_estimators=100, random_state=0),
"boosting": HistGradientBoostingClassifier(random_state=0),
}
print(f"late share: {late.mean():.2f}")
for name, model in models.items():
scores = cross_val_score(model, X, late, cv=5)
print(f"{name:9} {scores.mean():.3f}")
الانحدار اللوجستي 83.2%، وهو بالكاد أفضل من خط الأساس 73% (نسبة غير المتأخر)، لأن الساعة ليست علاقة خطية: الذروة في الصباح والمساء، لا «كلما زادت الساعة زاد التأخير». الشجرة 89.4%، والغابة 93.0%، والتعزيز 94.8%، وهذا قريب جدًّا من السقف 95% الذي يفرضه الضجيج.
الأشجار لا تحتاج توحيد المدخلات، ولا تهتمّ كثيرًا بالقيم الشاذة، وتلتقط التفاعلات وحدها. هذه بالضبط حاجات الجداول.
4أي الأعمدة تستخدمها الغابة
الغابة تخبرك أي الأعمدة استخدمتها أكثر. هذا مفيد للاستكشاف، لكنه منحاز إلى الأعمدة ذات القيم المختلفة الكثيرة، ولا يعني سببًا.
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
data = load_breast_cancer()
forest = RandomForestClassifier(n_estimators=200, random_state=0).fit(data.data, data.target)
ranked = sorted(zip(forest.feature_importances_, data.feature_names), reverse=True)[:4]
for score, name in ranked:
print(f"{score:.3f} {name}")
الأعمدة الأربعة الأولى كلها مقاييس لحجم الورم وشكله، وثلاثة منها (المحيط ونصف القطر والمساحة) تقيس نفس الشيء تقريبًا. هذا تحذير عملي: عندما تتشابه الأعمدة تتقاسم الأهمية بينها، فقد يبدو كل واحد منها متوسط الأهمية رغم أن المفهوم الذي تمثّله هو الأهم.
كيف يعمل، خطوة بخطوة: كيف تختار الشجرة سؤالها التالي
تجرّب الشجرة كل عمود وكل نقطة قطع ممكنة، مثل «المسافة > 10» و«المسافة > 15».
لكل قطع تحسب مدى نقاء النصفين: نصف كله «متأخر» أنقى من نصف مختلط.
تختار القطع الذي يعطي أنقى نصفين، وتكرّر نفس الشيء داخل كل نصف.
تتوقّف عند عمق محدّد أو حين يصير النصف صغيرًا جدًّا، وما في الورقة هو التوقّع.
مثال محلول
شجرة القرار تسأل أسئلة نعم أو لا عن المدخلات حتى تصل إلى جواب، مثل لعبة «عشرين سؤالًا». كل سؤال يختار العمود والحدّ اللذين يفصلان الفئات أفضل فصل.
HistGradientBoostingClassifier بإعداداته الافتراضية في ثوانٍ.
early_stopping. إن لم يتفوّق التعزيز بوضوح على الغابة، فالغابة أسهل في الصيانة.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| شجرة أعمق دائمًا أدق. | أدق على التدريب فقط. بلا حدّ للعمق تحفظ الشجرة كل صف، وتسقط على البيانات الجديدة. |
| الشبكات العصبية تتفوّق على كل شيء. | على الجداول، التعزيز بالميل يتفوّق غالبًا، وهو أسرع وأسهل ضبطًا. |
| أهمية السمة تعني أنها السبب. | تعني أن الشجرة استخدمتها كثيرًا، لا أنها تسبّب النتيجة. عمودان مترابطان يتقاسمان الأهمية بشكل عشوائي. |
جرّب بنفسك
شجرة قرار حصلت على 100% في التدريب و78% في الاختبار. ما أول إجراء؟
الفجوة الكبيرة علامة حفظ. تقييد الشجرة يجبرها على قواعد أعم، والغابة تقلّل التقلّب بالتصويت. التوحيد لا يغيّر شيئًا في الأشجار لأنها تقارن قيمًا بحدود، والترتيب لا يتغيّر بالتوحيد.
أي من هذه المسائل تتوقّع أن تتفوّق فيها شبكة عصبية على التعزيز بالميل؟
الصور بيانات غير مهيكلة: البكسل وحده لا معنى له، والمعنى في الأنماط المكانية بين آلاف البكسلات، وهذا ما صُمّمت له الشبكات الالتفافية. الثلاث الأخرى جداول بأعمدة لها معانٍ، وفيها يتفوّق التعزيز عادة.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا تُدرَّب كل شجرة في الغابة العشوائية على عيّنة عشوائية من الأعمدة أيضًا، لا من الصفوف فقط؟
لأنه لو كان هناك عمود قوي جدًّا، لبدأت كل الأشجار به وصارت متشابهة، فتتطابق أخطاؤها ولا يفيد التصويت. حجب بعض الأعمدة عن كل شجرة يجبرها على إيجاد طرق مختلفة، فتختلف أخطاؤها، ويلغي التصويت جزءًا أكبر منها.
لماذا تقلّ فجوة التدريب والاختبار في الغابة العشوائية مقارنة بشجرة واحدة؟
لأن كل شجرة ترى عيّنة مختلفة وأعمدة مختلفة، فتختلف أخطاؤها، والتصويت يلغي جزءًا كبيرًا منها.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي2
مقالات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.