قراية
وضع الحكايات

الـ decision trees (أشجار القرار)

~18 دقيقة قراية الدرس 1 من 4 في الوحدة 3

التعلّم بإنك تسأل أسئلة

تخيّل إنك بتحاول تقرر هتلعب تنس النهارده ولا لأ. ممكن تسأل: الجو مشمس؟ لو آه، الرطوبة عالية؟ ولو لأ، فيه هوا؟ سلسلة أسئلة آه/لأ بتوصّلك في الآخر لقرار. ودي بالظبط طريقة شغل الـ decision tree (شجرة القرار) — model بيطلّع predictions بإنه يقسم البيانات مرة ورا مرة على حسب قيم الـ features، وبيمشي في مسار متفرّع من الـ root لحد الـ leaf.

الـ decision trees من أسهل models الـ Machine Learning (تعلم الآلة) في التفسير. على عكس الـ neural networks أو الـ support vector machines، تقدر تقرا الـ decision tree زي flowchart وتفهم السبب بالظبط ورا كل prediction. والشفافية دي بتخلّيها مالهاش بديل في الطب والمال وأي مجال التفسير فيه مهم قد الدقة.

تشريح الـ decision tree

الـ decision tree فيها تلات أنواع من الـ nodes (العقد). الـ root node (العقدة الجذر) هي قمة الشجرة — فيها كل عينات التدريب وبتعمل أول split. الـ internal nodes (العقد الداخلية) (واسمها كمان decision nodes) بتمثّل اختبارات على الـ features: "الحرارة أكبر من 75°F؟" وكل internal node بتقسم البيانات لفرعين أو أكتر. والـ leaf nodes (عقد الأوراق) هي نقط النهاية — مفيهاش splits تانية وفيها الـ prediction النهائي، سواء كان class label (للـ classification) أو قيمة رقمية (للـ regression).

الـ depth (العمق) بتاع الشجرة هو عدد الحواف من الـ root لأعمق leaf. الـ stump (عمق = 1) بيعمل split واحد. والأشجار العميقة تقدر تمسك patterns معقّدة بس بتخاطر بالـ overfitting. والمسار من الـ root للـ leaf بيحدّد القاعدة اللي اتستخدمت في أي prediction — ودي ميزة سهولة التفسير.

أشجار الـ classification قصاد أشجار الـ regression

الـ decision trees تقدر تتعامل مع المهمتين. أشجار الـ classification بتتنبأ بـ class label منفصل — الـ leaf بترجّع الـ class الأغلبية من عينات التدريب بتاعتها. وأشجار الـ regression بتتنبأ بقيمة مستمرة — الـ leaf بترجّع متوسط عينات التدريب بتاعتها. ومعايير الـ split مختلفة (Gini/entropy للـ classification؛ الـ variance للـ regression)، بس هيكل الـ algorithm واحد.

نعمل split إزاي: مقاييس الـ impurity

السؤال الأساسي في بناء الشجرة: نعمل split على أنهي feature وأنهي threshold؟ الهدف إننا نلاقي splits بتطلّع child nodes أنضف ما يمكن — في الحالة المثالية، كل child node فيها عينات من class واحد بس. وفيه مقياسين للـ impurity (الشوائب) مستخدمين على نطاق واسع.

الـ Gini impurity (شائبة جيني) بتقيس احتمال إن عينة عشوائية تتصنّف غلط لو اتصنّفت على حسب توزيع الـ classes في الـ node. الـ node النضيفة (كل العينات من نفس الـ class) الـ Gini بتاعها = 0. والـ node الأكتر impurity (50/50 من class اتنين) الـ Gini بتاعها = 0.5.

الـ Gini impurity
G = 1 - \sum_{k=1}^{K} p_k^2
p_k هي نسبة العينات اللي تبع الـ class k. بتتراوح من 0 (نضيفة) لـ 1-1/K (أقصى impurity).

الـ entropy (الانتروبيا) (من information theory) بتقيس متوسط كمية المعلومات في الـ class labels جوه الـ node. وزي الـ Gini، الـ entropy = 0 للـ node النضيفة. وحسابها أغلى شوية (فيه لوغاريتمات) بس ليها أساس نظري في information theory.

الـ entropy
H = -\sum_{k=1}^{K} p_k \log_2 p_k
الـ entropy بتاعة node. بتتستخدم في حساب الـ information gain لما نقيّم الـ split.

وعشان نختار split، الـ algorithm بيحسب الـ information gain (كسب المعلومات): النزول في الـ entropy (أو الـ Gini) من الأب للأبناء، موزون بنسبة العينات في كل ابن. والـ split اللي ليه أعلى information gain هو اللي بيتختار.

نمو الشجرة: الـ CART algorithm

أشهر algorithm لبناء الـ decision trees هو CART (Classification and Regression Trees). ده algorithm greedy (جشع): في كل node، بيدوّر في كل الـ features وكل الـ thresholds الممكنة عشان يلاقي الـ split اللي بيقلّل الـ impurity. ومش بيبص لقدام — بيختار أحسن split محلي في كل خطوة.

والإجراء recursive: بعد كل split، نفس الـ algorithm بيتطبّق على كل child node لوحدها، لحد ما شرط التوقف يتحقق. ومن شروط التوقف المعتادة: الوصول لأقصى depth للشجرة، أقل عدد عينات مطلوب عشان node تتقسم، أقل نزول في الـ impurity مطلوب للـ split، أو أقل عدد عينات مطلوب في leaf.

ليه greedy؟

إنك تلاقي الشجرة المثلى عالميًا مسألة مستحيلة حسابيًا (NP-hard). والطريقة الـ greedy بتاخد اختيارات مثلى محليًا في كل node وبتطلّع نتايج معقولة في وقت polynomial. وعشان كده الـ decision trees اللي اتبنت بـ CART مش مثلى عالميًا — بس عمليًا بتشتغل كويس، خصوصًا لما تتستخدم كـ base learners في طرق الـ ensemble.

مشكلة الـ overfitting

لو سبتها تكبر من غير قيود، الـ decision tree هتحفظ في الآخر بيانات التدريب بالظبط — هتعمل leaf لكل عينة تدريب، وتجيب training accuracy 100%. بس الشجرة العميقة المعقّدة دي هتعمّم وحش على البيانات الجديدة: اتعلّمت الـ noise بتاعة الـ training set، مش الـ pattern اللي تحت.

ودي مشكلة الـ overfitting (الإفراط في التخصص) الكلاسيكية. والـ decision tree الواحدة معرّضة ليها بالذات بسبب الـ variance العالي بتاعها: تغييرات صغيرة في بيانات التدريب ممكن تطلّع أشجار مختلفة خالص.

الـ pruning: التحكم في التعقيد

الأداة الأساسية لمحاربة الـ overfitting في الـ decision trees هي الـ pruning (التقليم) — إنك تشيل حتت من الشجرة مش بتحسّن الـ generalization. وفيه طريقتين أساسيتين.

الـ pre-pruning (التقليم المسبق) (early stopping) بيوقّف نمو الشجرة قبل ما تحفظ بيانات التدريب كلها. hyperparameters زي max_depth وmin_samples_split وmin_impurity_decrease بتحط حدود صارمة أثناء البناء. والـ pre-pruning سريع بس محتاج ظبط.

الـ post-pruning (التقليم اللاحق) بيكبّر الشجرة كاملة الأول، وبعدين يشيل الـ subtrees اللي مش بتحسّن الأداء على الـ validation set. والـ cost-complexity pruning (واسمه كمان weakest link pruning) طريقة post-pruning مبنية على مبدأ: بتزوّد عقوبة α لكل leaf، وتمسح قيم α عشان تلاقي حجم الشجرة الأمثل. وده متنفّذ في scikit-learn كـ ccp_alpha.

الـ feature importance

ناتج جانبي مفيد من تدريب الـ decision tree هو الـ feature importance (أهمية الميزات). لكل feature، بنجمع النزول الكلي في الـ impurity اللي عملته في كل الـ nodes اللي اتستخدمت فيها كـ split، موزون بعدد العينات اللي عدّت على الـ nodes دي. والـ features اللي بتظهر قريب من الـ root وبتقلّل الـ impurity جامد بتتعتبر أهم.

وده بيدّي ترتيب بديهي للـ features مبني على الـ model. بس الـ feature importances في الـ decision trees ممكن تبقى منحازة للـ features اللي الـ cardinality بتاعتها عالية (الـ features اللي فيها قيم مميزة كتير). وطرق زي الـ permutation importance أو قيم SHAP بتدّي تقديرات أوثق.

أهم الـ hyperparameters

max_depth: أقصى depth للشجرة. أهم parameter للـ regularization. ابدأ بـ 3–5 وظبط وإنت طالع.

min_samples_split: أقل عدد عينات مطلوب عشان internal node تتقسم. القيم الأعلى بتمنع الشجرة إنها تعمل splits على مجموعات صغيرة جدًا، وده بيقلّل الـ variance.

min_samples_leaf: أقل عدد عينات مطلوب في الـ leaf node. بيضمن إن كل prediction وراه على الأقل العدد ده من أمثلة التدريب، وده بينعّم الـ predictions.

criterion: مقياس الـ impurity المستخدم ("gini" أو "entropy" للـ classification؛ "squared_error" للـ regression). وعمليًا، الـ Gini والـ entropy بيطلّعوا أشجار شبه بعض جدًا.

المزايا والقيود

الـ decision trees بتلمع في كذا موقف. سهل تفسيرها — تقدر ترسم وتشرح كل prediction. بتتعامل مع أنواع بيانات مختلطة (features فئوية ورقمية) من غير preprocessing. هي non-parametric ومش بتفترض توزيع للبيانات. وكمان بتعمل feature selection ضمني — الـ features اللي مالهاش علاقة ببساطة مش بتتستخدم في الـ splits.

بس الـ decision trees ليها نقط ضعف كبيرة. عندها variance عالي وحسّاسة للتغييرات الصغيرة في البيانات. ممكن تعمل splits منحازة مع الـ datasets اللي مش متوازنة. والـ splits الموازية للمحاور معناها إنها بتعاني مع الـ decision boundaries المايلة. وقدرتها التعبيرية محدودة مقارنةً بطرق الـ ensemble.

وعمليًا، الـ decision tree الواحدة نادرًا ما تبقى أحسن model للبيانات الجدولية. قيمتها الحقيقية إنها حجر أساس للـ ensembles: الـ random forests بتاخد متوسط أشجار كتير مش مترابطة عشان تقلّل الـ variance، والـ gradient boosting بيدرّب أشجار ورا بعض على الـ residuals عشان يوصل لدقة عالية.

في الدرس الجاي، هنشوف إزاي إنك تجمع decision trees كتير في random forest بيحسّن الدقة والمتانة جامد عن طريق تقليل الـ variance بإنك تاخد متوسط أشجار مش مترابطة.

أهم النقط
  • الـ decision trees بتتنبأ بإنها تقسم البيانات مرة ورا مرة باختبارات آه/لأ على الـ features، وبتمشي في مسار من الـ root للـ leaf.
  • الـ Gini impurity والـ entropy بيقيسوا نضافة الـ node؛ والـ split اللي ليه أعلى information gain بيتختار في كل خطوة.
  • الـ CART algorithm greedy — بيلاقي الـ split الأمثل محليًا في كل node بس مش أمثل عالميًا.
  • الأشجار اللي من غير قيود بتعمل overfitting. الـ pre-pruning (max_depth) والـ post-pruning (ccp_alpha) بيتحكموا في التعقيد.
  • الـ feature importance ناتج جانبي مفيد بس ممكن يبقى منحاز للـ features اللي الـ cardinality بتاعتها عالية.
  • الـ decision trees سهل تفسيرها وبتتعامل مع البيانات المختلطة ومش محتاجة feature scaling — بس الـ variance بتاعها عالي.
  • القيمة الحقيقية للـ decision trees إنها حجر أساس لطرق الـ ensemble: الـ random forests والـ gradient boosting.
اللي فات الـ regularization (التنظيم) نظرة عامة اللي بعده الـ random forests (الغابات العشوائية)