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

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

هذه الوحدة مستوحاة من 🧭 YDF للبدء البرنامج التعليمي.

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

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

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

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

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

  • حزام الذقن
  • جنتو
  • Adelie

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

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

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

 

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

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 Adelie Torgersen 39.1 18.7 181.0 3750.0 ذكر 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 أنثى 2007
2 Adelie Torgersen 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

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

 

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

الأنواع الاحتمالية
"Adelie" (آديلي) (أحمر) 97%
جنتو (أزرق) 2%
"Chinstrap" (شريطي الذقن) (أخضر) 0%

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

إذا كانت قيمة bill_depth_mm ≥ 42.3 هي True، يُرجى إجراء مزيد من الاختبارات لمعرفة ما إذا كانت يمكن لـ flipper_length_mm ≥ 207.5 فصل جنتو ومن جنتو +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

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

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

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

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