HDTree: شجرة قرارات مخصصة في Python



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



TL ؛ DR



  • مستودع HDTree
  • دفتر مكمل بالداخل examples. يوجد دليل المستودع هنا (سيتم إنشاء كل رسم توضيحي تراه هنا في المفكرة). يمكنك إنشاء الرسوم التوضيحية بنفسك.


ما هو موضوع المنشور؟



تنفيذ آخر لأشجار القرار التي كتبتها كجزء من أطروحتي. ينقسم العمل إلى ثلاثة أجزاء على النحو التالي: 



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


الدافع والخلفية



في رسالتي ، بدأت العمل مع أشجار القرار. هدفي الآن هو تنفيذ نموذج ML المتمحور حول الإنسان حيث HDTree (Human Decision Tree ، لهذا الأمر) هو مكون إضافي يتم تطبيقه كجزء من واجهة المستخدم الحقيقية لهذا النموذج. على الرغم من أن هذه القصة تدور حول HDTree حصريًا ، إلا أنه يمكنني كتابة تكملة تفصيلية عن المكونات الأخرى.



ميزات HDTree والمقارنة مع أشجار القرار scikit Learn



وبطبيعة الحال ، جئت عبر تنفيذ شجرة قرار scikit-learn[4]. التطبيق sckit-learnله العديد من المزايا:



  • إنه سريع ومبسط.
  • مكتوبة بلهجة سايثون. يقوم Cython بترجمة الكود C (والذي بدوره يقوم بالتجميع إلى رمز ثنائي) ، مع الاحتفاظ بالقدرة على التفاعل مع مترجم Python ؛
  • بسيط ومريح
  • يعرف الكثير من الأشخاص في ML كيفية العمل مع النماذج scikit-learn. احصل على المساعدة في كل مكان بفضل قاعدة المستخدمين ؛
  • تم اختباره في ظروف القتال (يستخدمه الكثيرون) ؛
  • إنه يعمل فقط ؛
  • وهو يدعم مجموعة متنوعة من تقنيات ما قبل التشذيب وما بعد التشذيب [6] ويوفر العديد من الميزات (على سبيل المثال ، التشذيب بأقل تكلفة وأوزان للعينة) ؛
  • يدعم التقديم الأساسي [7].


ومع ذلك ، فمن المؤكد أن لها بعض العيوب:



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


ميزات HDTree



تقدم HDTree حلاً لمعظم هذه المشكلات ، مع التضحية بالعديد من فوائد تطبيق scikit-Learn. سنعود إلى هذه النقاط لاحقًا ، لذلك لا تقلق إذا لم تفهم القائمة التالية بالكامل:



  • يتفاعل مع سلوك التعلم ؛
  • المكونات الرئيسية معيارية وسهلة التوسيع إلى حد ما (تنفيذ واجهة) ؛
  • مكتوب بلغة Python النقية (متوفر أكثر)
  • لديها تصور غني.
  • يدعم البيانات الفئوية ؛
  • يدعم القيم المفقودة ؛
  • يدعم تقسيم متعدد المتغيرات.
  • لديه واجهة تنقل مريحة من خلال هيكل الشجرة ؛
  • يدعم تقسيم n-ary (أكثر من عقدتين فرعيتين) ؛
  • تمثيلات نصية للحل ؛
  • يشجع على القابلية للتفسير عن طريق طباعة نص يمكن قراءته بواسطة الإنسان.


سلبيات:



  • بطيء؛
  • لم تختبر في المعارك.
  • جودة البرنامج متواضعة ؛
  • ليس هناك الكثير من خيارات المحاصيل. التنفيذ يدعم بعض المعايير الأساسية بالرغم من ذلك.


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



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


هيكل شجرة القرار



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







العقد



  • ai: , . . * * . . 3.
  • aii: , , , , . , . . , ( , .. ). HDTree.
  • aiii: تشير حدود العقد إلى عدد نقاط البيانات التي تمر عبر هذه العقدة. كلما زادت سماكة الحد ، زاد تدفق البيانات عبر العقدة.
  • aiv: قائمة بأهداف التنبؤ والتسميات التي تحتوي على نقاط بيانات تمر عبر هذه العقدة. يتم وضع علامة على الفئة الأكثر شيوعًا.
  • av: اختياريًا ، يمكن أن يحدد التصور المسار الذي تتبعه نقاط البيانات الفردية (يوضح القرار الذي يتم اتخاذه عندما تعبر نقطة البيانات الشجرة). يتم تمييز ذلك بخط في زاوية شجرة القرار.


ضلوع



  • bi: يربط سهم كل نتيجة انقسام محتملة (ai) بالعقد الفرعية. كلما زادت البيانات المتعلقة "بالتدفقات" الأصلية حول الحافة ، زادت سماكة عرضها.
  • bii: كل حافة لها تمثيل نصي يمكن قراءته من قبل الإنسان لنتيجة التقسيم المقابلة.


من أين تأتي مجموعات الانقسام والاختبارات المختلفة؟



في هذه المرحلة ، قد تتساءل بالفعل عن كيفية اختلاف HDTree عن الشجرة scikit-learn(أو أي تطبيق آخر) ولماذا قد نرغب في الحصول على أنواع مختلفة من الأقسام؟ دعنا نحاول توضيح هذا. ربما يكون لديك فهم بديهي لمساحة الميزة . جميع البيانات التي نعمل معها موجودة في مساحة معينة متعددة الأبعاد ، والتي يتم تحديدها من خلال عدد ونوع الميزات في بياناتك. تتمثل مهمة خوارزمية التصنيف الآن في تقسيم هذه المساحة إلى مناطق غير متداخلة وتعيينهاهذه المناطق من الدرجة. دعونا نتخيل هذا. نظرًا لأن أدمغتنا تواجه صعوبة في العبث بالأبعاد العالية ، فسوف نتمسك بمثال ثنائي الأبعاد ومشكلة بسيطة جدًا من فئتين ، مثل:







ترى مجموعة بيانات بسيطة للغاية تتكون من بعدين (السمات / السمات) وفئتين. تم توزيع نقاط البيانات التي تم إنشاؤها بشكل طبيعي في المركز. f(x) = yيفصل الشارع الذي هو مجرد دالة خطية  بين الفئتين: الفئة 1 (أسفل اليمين) والفئة 2 (أعلى اليسار). تمت أيضًا إضافة بعض الضوضاء العشوائية (نقاط البيانات الزرقاء باللون البرتقالي والعكس صحيح) لتوضيح تأثيرات فرط التجهيز لاحقًا. تتمثل مهمة خوارزمية التصنيف مثل HDTree (على الرغم من إمكانية استخدامها أيضًا في مشاكل الانحدار ) في معرفة الفئة التي تنتمي إليها كل نقطة بيانات. بمعنى آخر ، إعطاء زوج من الإحداثيات (x, y)مثل(6, 2)... الهدف هو معرفة ما إذا كان هذا الإحداثي ينتمي إلى الفئة البرتقالية 1 أو الفئة الزرقاء 2. سيحاول النموذج المميز تقسيم مساحة الكائن (هنا المحاور (س ، ص)) إلى مناطق زرقاء وبرتقالية ، على التوالي.

بالنظر إلى هذه البيانات ، فإن القرار (القواعد) بشأن كيفية تصنيف البيانات يبدو بسيطًا للغاية. قد يقول الشخص العاقل "فكر بنفسك أولاً".

"هذه هي الفئة 1 إذا كانت x> y ، وإلا فإن الفئة 2." ستعمل الوظيفة y=xالمنقطة على إنشاء فصل مثالي . في الواقع ، مصنف الهامش الأقصى مثل آلات ناقلات الدعم [8] قد يقترح حلاً مشابهًا. لكن لنرى أي أشجار القرار تحل السؤال بشكل مختلف:







تُظهر الصورة المناطق التي تصنف فيها شجرة قرار قياسية بعمق متزايد نقطة بيانات على أنها فئة 1 (برتقالي) أو فئة 2 (أزرق).

تقترب شجرة القرار من دالة خطية باستخدام دالة الخطوة.

يرجع ذلك إلى نوع قاعدة التحقق والتقسيم التي تستخدمها أشجار القرار. تعمل جميعها في نمط  attribute < thresholdينتج عنه طائرات مفرطة موازية للمحاور . في الفضاء ثنائي الأبعاد ، يتم "قطع" المستطيلات. في الشكل ثلاثي الأبعاد ، ستكون هذه الأشكال شبه مستطيلة وما إلى ذلك. بالإضافة إلى ذلك ، تبدأ شجرة القرار في نمذجة الضوضاء في البيانات عندما يكون هناك بالفعل 8 مستويات ، أي أن إعادة التدريب تحدث. ومع ذلك ، لا تجد أبدًا تقريبًا جيدًا لوظيفة خطية حقيقية. للتحقق من ذلك ، استخدمت تقسيمًا نموذجيًا 2 إلى 1 من بيانات التدريب والاختبار وقمت بحساب دقة الأشجار. هي 93.84٪ ، 93.03٪ ، 90.81٪ لمجموعة الاختبار و 94.54٪ ، 96.57٪ ، 98.81٪ لمجموعة التدريب(مرتبة حسب أعماق الشجرة 4 ، 8 ، 16). بينما تنخفض الدقة في الاختبار ، تزداد دقة التدريب .

تعتبر زيادة كفاءة التدريب وانخفاض نتائج الاختبار علامة على الإفراط في التدريب.

تعتبر أشجار القرار الناتجة معقدة للغاية لمثل هذه الوظيفة البسيطة. أبسط هذه (العمق 4) المقدمة باستخدام scikit Learn تبدو بالفعل كما يلي:







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



تطبيق حزمة HDTree



سيقدم لك هذا القسم أساسيات HDTree. سأحاول أن أتطرق إلى بعض أجزاء API الخاصة به. لا تتردد في طرح الأسئلة في التعليقات أو الاتصال بي إذا كان لديك أي أسئلة حول هذا الموضوع. يسعدني الرد ، وإذا لزم الأمر ، استكمال المقال. يعد تثبيت HDTree أكثر تعقيدًا بقليل من pip install hdtree. آسف. تحتاج أولاً إلى Python 3.5 أو أحدث.



  • قم بإنشاء دليل فارغ وداخله مجلد باسم hdtree ( your_folder/hdtree)
  • استنساخ المستودع إلى دليل hdtree (وليس دليلًا فرعيًا آخر).
  • قم بتثبيت التبعيات المطلوبة: numpy، pandas، graphviz، sklearn.
  • أضف your_folderإلى PYTHONPATH. سيشمل هذا الدليل في محرك استيراد Python. ستتمكن من استخدامه مثل حزمة Python العادية.


بدلا من ذلك أضف hdtreeإلى مجلد site-packagesالتثبيت الخاص بك python. يمكنني إضافة ملف التثبيت لاحقًا. في وقت كتابة هذا التقرير ، لم يكن الرمز متاحًا في مستودع النقطة. كل الكود الذي يولد الرسومات والمخرجات أدناه (كما هو موضح سابقًا) موجود في المستودع ، ويتم نشره مباشرة هنا . حل مشكلة خطية مع الشجرة الشقيقة



لنبدأ فورًا بالكود:



from hdtree import HDTreeClassifier, SmallerThanSplit, EntropyMeasure
hdtree_linear = HDTreeClassifier(allowed_splits=[SmallerThanSplit.build()], # Split rule in form a < b
    information_measure=EntropyMeasure(), # Use Information Gain for the scores attribute_names=['x', 'y' ]) # give the
    attributes some interpretable names # standard sklearn-like interface hdtree_linear.fit(X_street_train,
    y_street_train) # create tree graph hdtree_linear.generate_dot_graph() 








نعم ، الشجرة الناتجة هي على ارتفاع مستوى واحد فقط وتقدم الحل الأمثل لهذه المشكلة. هذا مثال مصطنع لإظهار التأثير. ومع ذلك ، آمل أن توضح النقطة: احصل على رؤية بديهية للبيانات ، أو قم ببساطة بتزويد شجرة قرار بخيارات مختلفة لتقسيم مساحة الميزة ، والتي قد تقدم حلاً أبسط وأحيانًا أكثر دقة . تخيل أنك بحاجة إلى تفسير القواعد من الأشجار المعروضة هنا للعثور على معلومات مفيدة. ما هو التفسير الذي يمكنك فهمه أولاً ، وأي تفسير تثق به أكثر؟ تفسير معقد باستخدام وظائف متعددة الخطوات ، أو شجرة صغيرة دقيقة؟ أعتقد أن الجواب بسيط للغاية. لكن دعونا نتعمق قليلاً في الكود نفسه. عند التهيئة ، فإن HDTreeClassifierأهم شيء عليك تقديمه هو allowed_splits. تقدم هنا قائمة تحتوي على قواعد التقسيم المحتملة التي تحاول الخوارزمية أثناء التدريب لكل عقدة إيجاد تقسيم محلي جيد للبيانات. في هذه الحالة ، قدمنا ​​حصريًا  SmallerThanSplit. يقوم هذا التقسيم بما تراه بالضبط: فهو يأخذ سمتين (يجرب أي مجموعة) ويقسم البيانات وفقًا للمخطط a_i < a_j. والتي (ليست عشوائية للغاية) تطابق بياناتنا قدر الإمكان.



يشار إلى هذا النوع من الانقسام باسم الانقسام متعدد المتغيراتهذا يعني أن الفصل يستخدم أكثر من ميزة لاتخاذ قرار. هذا ليس مثل التقسيم أحادي الاتجاه المستخدم في معظم الأشجار الأخرى ، مثل scikit-tree(انظر أعلاه لمزيد من التفاصيل) التي تأخذ في الاعتبار سمة واحدة بالضبط . بالطبع ، HDTreeلديها أيضًا خيارات لتحقيق "التقسيم الطبيعي" مثل تلك الموجودة في أشجار scikit - العائلة QuantileSplit. سأريكم المزيد مع تقدم المقال. شيء آخر غير مألوف قد تراه في الكود هو المعلمة الفائقة information_measure. تمثل المعلمة بُعدًا يُستخدم لتقييم قيمة عقدة واحدة أو انقسام كامل (العقدة الأصلية مع توابعها). يعتمد الخيار المختار على الانتروبيا [10]. ربما سمعت أيضا عنمعامل جيني ، والذي سيكون خيارًا صالحًا آخر. بالطبع ، يمكنك توفير بُعدك الخاص ببساطة عن طريق تنفيذ الواجهة المناسبة. إذا كنت ترغب في ذلك ، فقم بتنفيذ مؤشر جيني الذي يمكنك استخدامه في الشجرة دون إعادة تنفيذ أي شيء آخر. فقط انسخ EntropyMeasure()وتكيف مع نفسك. دعونا نتعمق أكثر في كارثة تايتانيك . أنا أحب التعلم من الأمثلة الخاصة بي. سترى الآن عددًا قليلاً من وظائف HDTree مع مثال محدد ، وليس على البيانات التي تم إنشاؤها.



مجموعة البيانات



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







النحو التالي : يمكنك أن ترى أن هناك جميع أنواع السمات. الأنواع الرقمية والفئوية والأعداد الصحيحة وحتى القيم المفقودة (انظر إلى عمود الكابينة). يتمثل التحدي في التنبؤ بما إذا كان أحد الركاب قد نجا من كارثة تيتانيك بناءً على معلومات الركاب المتاحة. يمكنك العثور على وصف لسمات القيمة هنا . من خلال دراسة دروس تعلم الآلة وتطبيق مجموعة البيانات هذه ، فأنت تقوم بكل أنواعالمعالجة المسبقة لتكون قادرًا على العمل مع نماذج التعلم الآلي الشائعة ، على سبيل المثال ، إزالة القيم المفقودة NaNعن طريق استبدال القيم [12] ، وإسقاط الصفوف / الأعمدة ، والتشفير الأحادي [13] البيانات الفئوية (على سبيل المثال ، Embarkedو / Sexأو تجميع البيانات للحصول على مجموعة بيانات صالحة الذي يقبل نموذج ML. هذا النوع من التنظيف غير مطلوب تقنيًا بواسطة HDTree. يمكنك تقديم البيانات كما هي وسوف يقبلها النموذج بكل سرور. قم بتغيير البيانات فقط عند تصميم كائنات حقيقية. لقد قمت بتبسيط كل شيء للبدء.



تدريب أول HDTree على بيانات تيتانيك



دعنا فقط نأخذ البيانات كما هي ونغذيها بالنموذج. الكود الأساسي مشابه للكود أعلاه ، لكن هذا المثال سيسمح بالعديد من تقسيمات البيانات.



    hdtree_titanic = HDTreeClassifier(allowed_splits=[FixedValueSplit.build(), # e.g., Embarked = 'C'
    SingleCategorySplit.build(), # e.g., Embarked -> ['C', 'Q', 'S']
    TwentyQuantileRangeSplit.build(), # e.g., IN Quantile 3-5
    TwentyQuantileSplit.build()], # e.g., BELOW Quantile 7
    information_measure=EntropyMeasure(),
    attribute_names=col_names,
    max_levels=3) # restrict to grow to a max of 3 levels
    hdtree_titanic.fit(X_titanic_train.values, y_titanic_train.values)
    hdtree_titanic.generate_dot_graph()
    






دعونا نلقي نظرة فاحصة على ما يحدث. لقد أنشأنا شجرة قرار بها ثلاثة مستويات ، والتي اخترناها لاستخدام 3 من 4 قواعد SplitRules ممكنة . يتم تمييزها بالأحرف S1 و S2 و S3. سأشرح بإيجاز ما يفعلونه.



  • وS1: FixedValueSplit. يعمل هذا التقسيم مع البيانات الفئوية ويختار إحدى القيم الممكنة. ثم يتم تقسيم البيانات إلى جزء له هذه القيمة وجزء آخر ليس له قيمة محددة. على سبيل المثال ، PClass = 1 و Pclass ≠ 1 .
  • S2: () QuantileRangeSplit. . , . 1 5 . ( ) (measure_information). (i) (ii) — . .
  • ج 3: (عشرون) QuantileSplit. يشبه Split Range (S2) ، لكنه يقسم البيانات حسب الحد الأدنى. هذا هو أساسًا ما تفعله أشجار القرار العادية ، باستثناء أنها تحاول عادةً كل الحدود الممكنة بدلاً من الرقم الثابت.


ربما لاحظت أنك SingleCategorySplitغير مشارك. سأغتنم الفرصة للتوضيح على أي حال ، حيث سيظهر حذف هذا التقسيم لاحقًا:



  • S4: SingleCategorySplitستعمل بشكل مشابه FixedValueSplit، لكنها ستنشئ عقدة فرعية لكل قيمة ممكنة ، على سبيل المثال: بالنسبة لسمة PClass ستكون 3 عقد فرعية (كل منها للفئة 1 والفئة 2 والفئة 3 ). لاحظ أنه FixedValueSplitمتطابق SingleValueSplitإذا كان هناك فئتان محتملتان فقط.


تعتبر الأقسام الفردية "ذكية" إلى حد ما فيما يتعلق بأنواع / قيم البيانات التي "تقبل". حتى بعض التمديد ، فإنهم يعرفون تحت أي ظروف تنطبق ولا تنطبق. تم تدريب الشجرة أيضًا على تقسيم 2 إلى 1 من بيانات التدريب والاختبار.كان الأداء بدقة 80.37 ٪ على بيانات التدريب و 81.69 على بيانات الاختبار. لا باس به.



الحد من الانقسامات



لنفترض أنك لست سعيدًا جدًا بالحلول الموجودة لسبب ما. ربما قررت أن الانقسام الأول في الجزء العلوي من الشجرة تافه جدًا (مقسم حسب السمة sex). HDTree يحل المشكلة. سيكون الحل الأبسط هو منع FixedValueSplit(وما يعادله SingleCategorySplit) من الظهور في الأعلى. انها بسيطة جدا. قم بتغيير تهيئة الانقسامات على النحو التالي:



    - SNIP -
    ...allowed_splits=[FixedValueSplit.build_with_restrictions(min_level=1),
    SingleCategorySplit.build_with_restrictions(min_level=1),...],
    - SNIP -


سأقدم HDTree الناتج بالكامل ، حيث يمكننا ملاحظة الانقسام المفقود (S4) داخل الشجرة التي تم إنشاؤها حديثًا.







من خلال منع الانقسام من sexالظهور في الجذر بفضل المعلمة  min_level=1(تلميح: بالطبع يمكنك توفيره max_level) ، قمنا بإعادة هيكلة الشجرة بالكامل. أداؤها الآن 80.37٪ و 81.69٪ (تدريب / اختبار). لم يتغير على الإطلاق ، حتى لو أخذنا الفصل الأفضل المفترض في عقدة الجذر.



نظرًا لأن أشجار القرار جشعة ، فإنها ستعثر فقط على أفضل قسم محلي لكل عقدة ، وهو ليس بالضرورة الخيار _ الأفضل _ على الإطلاق. في الحقيقة ، إيجاد حل مثالي لمشكلة شجرة القرار هو مشكلة NP كاملة ، كما ثبت في [15].
لذا فإن أفضل ما يمكن أن نطلبه هو الاستدلال. دعنا نعود إلى المثال: هل لاحظت أننا حصلنا بالفعل على تمثيل غير تافه للبيانات؟ على الرغم من تافهة. للقول إن الرجال لديهم فرصة ضئيلة للبقاء على قيد الحياة ، وبدرجة أقل ، يمكن الاستنتاج أن كونك شخصًا من الدرجة الأولى أو الثانية PClassتطير من شيربورج ( Embarked=C) قد يزيد من فرصك في البقاء على قيد الحياة. أو ماذا لو كنت ذكرًا  PClass 3أقل من 33 عامًا ، تزداد فرصك أيضًا؟ تذكر: النساء و الأطفال أولا. إنه تمرين جيد أن تستخلص هذه الاستنتاجات بنفسك من خلال تفسير التصور. كانت هذه الاستنتاجات ممكنة فقط بسبب محدودية الشجرة. من يدري ما الذي يمكن الكشف عنه أيضًا من خلال تطبيق قيود أخرى؟ جربها!



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



    - SNIP -
    ...allowed_splits=[TwentyQuantileRangeSplit.build_with_restrictions(blacklist_attribute_indices=['PassengerId']),
    FixedValueSplit.build_with_restrictions(blacklist_attribute_indices=['Name Length']),
    ...],
    - SNIP -
    






قد تسأل لماذا name lengthيظهر على الإطلاق. اعلم أن الأسماء الطويلة (الأسماء المزدوجة أو الألقاب [النبيلة]) يمكن أن تشير إلى ماضٍ غني ، مما يزيد من فرصك في البقاء على قيد الحياة.

نصيحة إضافية: يمكنك دائمًا إضافة نفس الشيء  SplitRuleمرتين. إذا كنت تريد فقط إدراج سمة في القائمة السوداء لمستويات HDTree معينة ، فما عليك سوى إضافة SplitRuleأي حد للمستوى.


توقع نقطة البيانات



كما لاحظت بالفعل ، يمكن استخدام الواجهة العامة لـ scikit-Learn للتنبؤ. هذا predict()، predict_proba()فضلا  score(). لكن يمكنك الذهاب أبعد من ذلك. هناك explain_decision()واحد سيعرض التمثيل النصي للحل.



print(hdtree_titanic_3.explain_decision(X_titanic_train[42]))


يُفترض أن يكون هذا هو التغيير الأخير للشجرة. سيخرج الكود هذا:



Query:
Query: 
 {'PassengerId': 273, 'Pclass': 2, 'Sex': 'female', 'Age': 41.0, 'SibSp': 0, 'Parch': 1, 'Fare': 19.5, 'Cabin': nan, 'Embarked': 'S', 'Name Length': 41}

Predicted sample as "Survived" because of: 
Explanation 1:
Step 1: Sex doesn't match value male
Step 2: Pclass doesn't match value 3
Step 3: Fare is OUTSIDE range [134.61, ..., 152.31[(19.50 is below range)
Step 4: Leaf. Vote for {'Survived'}
    


هذا يعمل حتى مع البيانات المفقودة. لنقم بتعيين فهرس السمة 2 ( Sex) على مفقود (None):



    passenger_42 = X_titanic_train[42].copy()
    passenger_42[2] = None
    print(hdtree_titanic_3.explain_decision(passenger_42))
    


Query: 
 {'PassengerId': 273, 'Pclass': 2, 'Sex': None, 'Age': 41.0, 'SibSp': 0, 'Parch': 1, 'Fare': 19.5, 'Cabin': nan, 'Embarked': 'S', 'Name Length': 41}

Predicted sample as "Death" because of: 
Explanation 1:
Step 1: Sex has no value available
Step 2: Age is OUTSIDE range [28.00, ..., 31.00[(41.00 is above range)
Step 3: Age is OUTSIDE range [18.00, ..., 25.00[(41.00 is above range)
Step 4: Leaf. Vote for {'Death'}
---------------------------------
Explanation 2:
Step 1: Sex has no value available
Step 2: Pclass doesn't match value 3
Step 3: Fare is OUTSIDE range [134.61, ..., 152.31[(19.50 is below range)
Step 4: Leaf. Vote for {'Survived'}
---------------------------------
    


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



... أشياء مفيدة أخرى



يمكنك المضي قدمًا والحصول على عرض الشجرة كنص:



    Level 0, ROOT: Node having 596 samples and 2 children with split rule "Split on Sex equals male" (Split Score:
    0.251)
    -Level 1, Child #1: Node having 390 samples and 2 children with split rule "Age is within range [28.00, ..., 31.00["
    (Split Score: 0.342)
    --Level 2, Child #1: Node having 117 samples and 2 children with split rule "Name Length is within range [18.80,
    ..., 20.00[" (Split Score: 0.543)
    ---Level 3, Child #1: Node having 14 samples and no children with
    - SNIP -
    


أو الوصول إلى جميع العقد النظيفة (بدرجة عالية):



    [str(node) for node in hdtree_titanic_3.get_clean_nodes(min_score=0.5)]
    


    ['Node having 117 samples and 2 children with split rule "Name Length is within range [18.80, ..., 20.00[" (Split
    Score: 0.543)',
    'Node having 14 samples and no children with split rule "no split rule" (Node Score: 1)',
    'Node having 15 samples and no children with split rule "no split rule" (Node Score: 0.647)',
    'Node having 107 samples and 2 children with split rule "Fare is within range [134.61, ..., 152.31[" (Split Score:
    0.822)',
    'Node having 102 samples and no children with split rule "no split rule" (Node Score: 0.861)']
    


تمديد HDTree



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



فهرس




صورة


تعرف على تفاصيل كيفية الحصول على مهنة رفيعة المستوى من البداية أو من المستوى الأعلى في المهارات والراتب من خلال حضور دورات SkillFactory عبر الإنترنت:





E







All Articles