ضبط عمق أشجار القرار لمنع فرط التكيّف في نماذج التصنيف

مقدمة

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

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

كيف يرتبط عمق الشجرة بفرط التكيّف؟

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

لنفترض نموذجاً يصنف رسائل البريد إلى «مزعجة» و«غير مزعجة». قد تتعلم شجرة بعمق 2 قواعد عامة مفيدة، مثل وجود كلمات معينة أو نسبة مرتفعة من الروابط. لكن شجرة بعمق 18 قد تتعلم قاعدة شديدة الخصوصية من نوع: «إذا احتوت الرسالة على كلمة معينة، وكان طول العنوان ضمن مجال ضيق، وأُرسلت في ساعة بعينها، ومن نطاق بريد نادر، فهي مزعجة». قد تصف هذه القاعدة عدداً محدوداً من رسائل التدريب بدقة عالية، لكنها لا تعكس بالضرورة نمطاً مستقراً في البريد الوارد مستقبلاً.

هذه الظاهرة هي فرط التكيّف: يتعلم النموذج الإشارة الحقيقية والضوضاء معاً. ومن علاماتها الشائعة وجود فجوة واسعة بين أداء التدريب وأداء التحقق أو الاختبار. فدقة تدريب تبلغ 100% ليست دليلاً تلقائياً على جودة النموذج؛ بل قد تكون إنذاراً بأن الشجرة حفظت البيانات. غالباً ما ترتفع دقة التدريب باستمرار مع زيادة العمق، في حين ترتفع دقة الاختبار حتى قيمة معينة ثم تستقر أو تنخفض. وتسمى هذه العلاقة بمفاضلة الانحياز والتباين: الشجرة الضحلة ذات انحياز أعلى وتباين أقل، بينما الشجرة العميقة ذات انحياز أقل وتباين أعلى.

اختيار نطاق منطقي لأعماق الشجرة

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

يمكن البدء بنطاق صغير ومتدرج، مثل القيم من 1 إلى 15 أو من 1 إلى 20، ثم توسيع البحث عند الحاجة. في مجموعة بيانات صغيرة، قد يكون العمق 4 أو 6 كافياً، لأن الأوراق الناتجة من شجرة عميقة ستحتوي أمثلة قليلة جداً. أما في البيانات الكبيرة ذات العلاقات المعقدة، فقد تحتاج الشجرة إلى عمق أكبر، مع فرض حد أدنى مناسب لعدد العينات في كل ورقة.

من المفيد أيضاً فهم النمو النظري للشجرة. في شجرة ثنائية كاملة بعمق d، قد يصل عدد الأوراق إلى نحو 2^d. هذا لا يعني أن كل شجرة ستبلغ هذا العدد، لكنه يوضح سرعة نمو التعقيد. فعند العمق 10 يمكن نظرياً تكوين ما يصل إلى 1024 ورقة، وعند العمق 20 يتجاوز العدد مليون ورقة. لذلك يصبح السماح بعمق غير محدود خطراً، خصوصاً عندما يكون عدد السجلات محدوداً أو تتضمن البيانات خصائص رقمية كثيرة يمكن استخدامها لصنع تقسيمات دقيقة جداً.

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

منهجية التحقق المتبادل لاختيار العمق الأمثل

التحقق المتبادل هو الأسلوب الأكثر موثوقية نسبياً لاختيار max_depth عندما لا تكون البيانات كبيرة جداً. في التحقق المتبادل الطبقي ذي k طيات، تُقسم البيانات إلى طيات تحافظ تقريباً على نسب الفئات الأصلية. يُدرَّب النموذج k مرات؛ في كل مرة تُستخدم طية للتحقق وتُستخدم الطيات الأخرى للتدريب. ثم يُحسب متوسط المقياس المختار وتباينه لكل قيمة عمق.

تمنع هذه الآلية الاعتماد المفرط على تقسيم واحد قد يكون محظوظاً أو غير ممثل للبيانات. فإذا حققت شجرة بعمق 8 متوسط دقة 0.89، وحققت شجرة بعمق 14 دقة 0.891 مع تذبذب أكبر وعدد عقد أعلى بكثير، فقد يكون العمق 8 الخيار الأفضل عملياً. فهو أبسط، وأسهل في التفسير، وأقل عرضة للتدهور عند وصول بيانات جديدة.

تتطلب المنهجية الصحيحة فصل مجموعة اختبار نهائية قبل تنفيذ البحث عن المعلمات. تُستخدم بيانات التدريب فقط في التحقق المتبادل وضبط العمق، ثم يُدرَّب النموذج النهائي بالإعدادات المختارة ويُقيَّم مرة واحدة على مجموعة الاختبار المحجوزة. استخدام مجموعة الاختبار مراراً لاختيار العمق يؤدي إلى تسرب معلومات منها، فتفقد وظيفتها بوصفها تقديراً محايداً للتعميم.

وفي حالات عدم توازن الفئات، يجب استخدام تقسيم طبقي وقياس مناسب. فإذا كانت فئة الاحتيال تمثل 2% فقط من المعاملات، فقد يحقق نموذج يتوقع دائماً «غير احتيال» دقة 98%، لكنه عديم الفائدة. هنا يُفضّل ضبط العمق باستخدام F1 أو متوسط الدقة أو الاستدعاء للفئة النادرة، مع فحص مصفوفة الالتباس بعد الاختيار.

تطبيق عملي باستخدام مكتبة سكايلرن

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

from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.20,
    stratify=y,
    random_state=42
)

model = DecisionTreeClassifier(
    criterion="gini",
    random_state=42
)

param_grid = {
    "max_depth": range(1, 21),
    "min_samples_split": [2, 10, 20],
    "min_samples_leaf": [1, 5, 10],
    "class_weight": [None, "balanced"]
}

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

search = GridSearchCV(
    estimator=model,
    param_grid=param_grid,
    scoring="f1_weighted",
    cv=cv,
    n_jobs=-1,
    return_train_score=True
)

search.fit(X_train, y_train)

best_tree = search.best_estimator_
predictions = best_tree.predict(X_test)

print("أفضل إعدادات:", search.best_params_)
print("أفضل نتيجة تحقق:", search.best_score_)
print(confusion_matrix(y_test, predictions))
print(classification_report(y_test, predictions))

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

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

التقليم وإيقاف النمو المبكر كوسائل مكملة

تقييد max_depth هو شكل من أشكال التنظيم المسبق، أي إيقاف نمو الشجرة قبل أن تصبح معقدة. لكنه ليس الأداة الوحيدة. فالمعلمة min_samples_split تحدد الحد الأدنى من العينات اللازمة لتقسيم عقدة داخلية، بينما تفرض min_samples_leaf عدداً أدنى من العينات في كل ورقة. كلما زادت هذه الحدود، صعب على الشجرة إنشاء فروع مبنية على أمثلة نادرة.

توجد أيضاً المعلمة max_leaf_nodes التي تقيد عدد الأوراق النهائي، وmax_features التي تحدد عدد الخصائص المرشحة في كل انقسام. يمكن أن يساعد تقليل عدد الخصائص المرشحة في الحد من استغلال ارتباطات عارضة، وإن كان استخدامه أكثر شيوعاً داخل الغابات العشوائية. أما min_impurity_decrease فيشترط أن يحقق التقسيم تحسناً أدنى في نقاء العقدة قبل قبوله.

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

أخطاء شائعة وممارسات موصى بها في بيئات الإنتاج

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

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

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

خاتمة

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

تعليقات