إنشاء شجرة قرارات

في هذه الوحدة، ستستخدم قطار مكتبة YDF (Yggdrasil Discision Forest) وتفسر شجرة القرارات.

تستند هذه الوحدة إلى الدليل التعليمي حول 🧭 YDF Getting Started (بدء استخدام YDF).

الجولات التمهيدية

قبل دراسة مجموعة البيانات، قم بما يلي:

  1. أنشئ دفتر ملاحظات Colab جديد.
  2. ثبِّت مكتبة YDF من خلال وضع سطر الرمز التالي وتنفيذه في ملف Colab notebook الجديد:
    !pip install ydf -U
    
  3. استيراد المكتبات التالية:
    import ydf
    import numpy as np
    import pandas as pd
    

مجموعة بيانات طيور بطريق بالمر

يستخدم مشروع Colab هذا مجموعة بيانات بطاريق بالمر، والتي تحتوي على قياسات حجم لثلاثة أنواع من البطريق:

  • شريط ذقن
  • جنتو
  • أديلي

هذه مشكلة تصنيف - الهدف هو التنبؤ بأنواع البطاريق بناءً على البيانات الموجودة في مجموعة بيانات طيور البطريق بالمر. ها هي طيور البطريق:

ثلاثة أنواع مختلفة
من البطاريق.

الشكل 16. ثلاثة أنواع مختلفة من البطاريق. صورة من @allisonhorst

 

يستدعي الرمز البرمجي التالي دالة pandas لتحميل مجموعة بيانات طيور بطريق بالمر في الذاكرة:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

ينسق الجدول التالي أول 3 أمثلة في مجموعة بيانات بطاريق بالمر:

الجدول 3. أول 3 أمثلة في طيور بطريق بالمر

الأنواع جزيرة bill_length_mm bill_depth_mm flipper_length_mm body_mass_g الجنس سنة
0 أديلي تورغرسن 39.1 18.7 181.0 3750.0 ذكر 2007
1 أديلي تورغرسن 39.5 17.4 186.0 3800.0 أنثى 2007
2 أديلي تورغرسن 40.3 18 195.0 3250.0 أنثى 2007

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

تقسّم خلية الرمز التالية مجموعة البيانات إلى مجموعة تدريب ومجموعة اختبار:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

تدريب أشجار القرارات باستخدام مُعلِّمات الفائق التلقائية

يمكنك تدريب شجرة القرارات الأولى باستخدام خوارزمية التعلم CART (التصنيف وأشجار الانحدار) (المعروفة أيضًا باسم المتعلم) بدون تحديد أي معلمات فائقة. ذلك لأن المتعلم ydf.CartLearner يوفر قيمًا تلقائية جيدة لمعلمة معلمة. وسوف تتعلم المزيد حول كيفية عمل هذا النوع من النماذج لاحقًا في الدورة.

model = ydf.CartLearner(label=label).train(train_dataset)

لم يحدِّد الاستدعاء السابق أعمدة لاستخدامها كميزات إدخال. وبالتالي، يتم استخدام كل عمود في مجموعة التطبيق. لم يحدّد الطلب أيضًا الدلالات (على سبيل المثال، العددية والفئوية والنصية) لميزات الإدخال. وبالتالي، يتم استنتاج الميزات الدلالية تلقائيًا.

اتصل بـ model.plot_tree() لعرض شجرة القرارات الناتجة:

model.plot_tree()

في Colab، يمكنك استخدام الماوس لعرض تفاصيل حول عناصر محددة مثل توزيع الفئة في كل عقدة.

شجرة قرارات مدرَّبة باستخدام
المعاملات الفائقة الافتراضية.

الشكل 17. شجرة قرارات مدرَّبة باستخدام مُعلِّمات فائقة تلقائية

يوضح Colab أن شرط الجذر يحتوي على 243 مثالاً. ومع ذلك، قد تتذكر أن مجموعة بيانات التدريب تحتوي على 272 مثالاً. تم حجز الأمثلة الـ 29 المتبقية تلقائيًا للتحقق من صحتها وتقليم الأشجار.

ويختبر الشرط الأول قيمة bill_depth_mm. يوضح الجدولان 4 و5 احتمالية أنواع مختلفة اعتمادًا على نتيجة الشرط الأول.

الجدول 4. احتمالية ظهور أنواع مختلفة في حال bill_depth_mm ≥ 42.3

الأنواع الاحتمالية
أديلي (أحمر) 8%
جنتو (أزرق) 58%
ذقن (أخضر) 36%

 

الجدول 5. احتمالية ظهور أنواع مختلفة في حال bill_depth_mm < 42.3

الأنواع الاحتمالية
أديلي (أحمر) 97%
جنتو (أزرق) 2%
ذقن (أخضر) ‫0%

السمة bill_depth_mm هي ميزة عددية. وبالتالي، تم العثور على القيمة 42.3 باستخدام التقسيم الدقيق للتصنيف الثنائي باستخدام خوارزمية الميزات العددية.

إذا كانت قيمة السمة bill_depth_mm ≥ 42.3 صحيحة، يجب إجراء اختبارات إضافية لمعرفة ما إذا كان flipper_length_mm ≥ 207.5 يمكنه أن يفصل بشكل مثالي بين سلالة "Gentoo" (جنتو) وعجائب "جنتو" و"ديلي" (Adelie).

ويوفر الرمز التالي دقة تدريب النموذج واختباره:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

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

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

تحسين مُعلَّمات النموذج الفائق

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

  1. استخدِم متعلّمًا أكثر قوةً مثل غابة عشوائية أو نموذج أشجار متدرجة سيتم شرح خوارزميات التعلم هذه في الصفحة التالية.

  2. حسِّن المَعلمة الفائقة باستخدام ملاحظاتك وملاحظاتك. يمكن أن يكون دليل تحسين النموذج مفيدًا.

  3. استخدِم ضبط المَعلمة الفائقة لاختبار عدد كبير من المعلَمات الفائقة المحتملة تلقائيًا.

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

شجرة القرار الموضحة أعلاه صغيرة، ويحتوي الورقة التي تحتوي على مثال 61 على مزيج من تسميات "Adelie" (آديلي) و"Chinstrap" (شريطي الذقن). لماذا لم تقسم الخوارزمية هذه الورقة إلى أبعد من ذلك؟ ‏‫يوجد سببان محتملان لذلك:

  • يُحتمل أن يكون قد تم الوصول إلى الحد الأدنى لعدد العيّنات لكل ورقة (min_examples=5 بشكل تلقائي).
  • قد تكون الشجرة قد تم تقسيمها ثم تقليمها لمنع فرط التخصيص.

قلّل الحد الأدنى من عدد الأمثلة إلى 1 واطّلِع على النتائج:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

شجرة قرار مدرَّبة باستخدام
min_examples=1.

الشكل 18. شجرة قرارات مدرّبة باستخدام min_examples=1.

 

تم تقسيم العقدة الطرفية التي تحتوي على 61 مثالاً عدة مرات.

لمعرفة ما إذا كان مزيد من تقسيم العقدة مفيدًا، نقيّم جودة هذا النموذج الجديد على مجموعة بيانات الاختبار:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

زادت جودة النموذج مع ارتفاع دقة الاختبار من 0.9167 إلى 0.97222. كان هذا التغيير في المعلمة الفائقة فكرة جيدة.

السابق من مجموعة غابات القرارات

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

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

دقة الغابة العشوائية أفضل من شجرتنا البسيطة. سوف تتعرف في الصفحات التالية على السبب.

الاستخدام والقيود

كما ذكرنا سابقًا، غالبًا ما تكون شجرة القرارات الفردية أقل جودة من طرق التعلم الآلي الحديثة مثل الغابات العشوائية والأشجار المحسّنة المتدرجة والشبكات العصبية. ومع ذلك، لا تزال أشجار القرارات مفيدة في الحالات التالية:

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