دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

دليل نهائي لخوارزمية Random Forest مع Python و Scikit-Learn

المُقدّمة

تعد خوارزمية Random Forest واحدة من الخوارزميات الأكثر مرونة وقوة والأكثر استخدامًا لـ التصنيف والانحدار، بنيت على شكل مجموعة أشجار القرار.

إذا لم تكن معتادًا على هذه - لا تقلق ، فسنغطي كل هذه المفاهيم.

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

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

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

أشجار القرار

كيف تملأ عقد الشجرة؟ هذا هو المكان أشجار القرار تدخل في التركيز.

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

فيما يلي مثال على الشجرة التي تم وصفها:

في صورة الشجرة ، هناك 7 مربعات ، المربع الموجود في الأعلى والذي يمثل إجمالي 100 امرأة ، وهذا المربع العلوي متصل بمربعين أدناه ، يقسمن النساء بناءً على عددهن 78 غير حامل و 22 حامل ، و من كلا المربعين السابقين هناك أربعة مربعات ؛ اثنان متصلان بكل مربع أعلاه يقسمان النساء على أساس منطقتهن ، بالنسبة للنساء غير الحوامل ، تعيش 45 في منطقة حضرية ، و 33 في منطقة ريفية وللحوامل ، و 14 تعيش في منطقة ريفية و 8 في منطقة حضرية. بمجرد النظر إلى الشجرة ، يسهل فهم هذه التقسيمات ومعرفة كيفية اشتقاق كل "طبقة" من الطبقات السابقة ، فهذه الطبقات هي الشجرة ومستوياتها، المستويات تصف عمق من الشجرة:

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

نلاحظ في الصورة أعلاه أن مستوى الشجرة الأول هو مستوى 0 حيث يوجد مربع واحد فقط ، متبوعًا مستوى 1 حيث يوجد مربعان ، و مستوى 2 حيث توجد أربع مربعات. هذا ال العمق 2 شجرة.

في المستوى 0 هو المربع الذي ينشأ الشجرة ، يسمى الأول عقدة الجذر، هذا الجذر له اثنان العقد الفرعية في المستوى 1 ، هذا هو عقد الوالدين إلى العقد الأربعة في المستوى 2. لاحظ أن "المربعات" التي ذكرناها حتى الآن ، قد تم استدعاؤها بالفعل العقد؛ وأن كل عقدة سابقة هي أصل للعقد التالية ، التي هي فروعها. يتم استدعاء العقد الفرعية لكل مستوى التي لها نفس الأصل الأشقاءكما يتضح في الصورة التالية:

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

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

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

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

ملحوظة: هناك عدة أنواع من الأشجار في علوم الكمبيوتر ، مثل الأشجار الثنائية ، والأشجار العامة ، وأشجار AVL ، والأشجار السائلة ، والأشجار الحمراء السوداء ، وأشجار b ، وما إلى ذلك ، نركز هنا على إعطاء فكرة عامة عن ماهية شجرة القرار . إذا كان ذلك يعتمد على إجابة أ نعم فعلا or لا سؤال لكل عقدة وبالتالي كل عقدة لديها طفلين على الأكثر، عند الفرز بحيث تكون العقد "الأصغر" على اليسار ، فإن هذا يصنف أشجار القرار على أنها أشجار ثنائية.

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

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

الآن بعد أن فهمنا ما هي شجرة القرار ، وكيف يمكن استخدامها ، وما هي التسمية المستخدمة لوصفها ، يمكننا أن نتساءل عن حدودها.

فهم الغابات العشوائية

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

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

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

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

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

فيما يتعلق بإجابة السؤال الأولي ، نعلم بالفعل أنه سيتم تشفيره في أوراق الشجرة - ولكن ما الذي يتغير عندما يكون لدينا العديد من الأشجار بدلاً من شجرة واحدة؟

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

فرق التعلم والنموذج

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

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

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

نظرًا للاستخدام على نطاق واسع ، قامت مكتبات مثل Scikit-Learn بتطبيق أغلفة لـ RandomForestRegressorالصورة و RandomForestClassifiers ، المبنية على تطبيقات شجرة القرار الخاصة بهم ، للسماح للباحثين بتجنب بناء مجموعاتهم الخاصة.

دعونا نغوص في الغابات العشوائية!

كيف تعمل خوارزمية الغابة العشوائية؟

فيما يلي الخطوات الأساسية المتبعة عند تنفيذ خوارزمية الغابة العشوائية:

  1. اختر عددًا من السجلات العشوائية ، يمكن أن يكون أي رقم ، مثل 4 أو 20 أو 76 أو 150 أو حتى 2.000 من مجموعة البيانات (تسمى N السجلات). سيعتمد الرقم على عرض مجموعة البيانات ، وكلما كان العرض أكبر ، كان العدد أكبر N يمكن ان يكون. هذا هو المكان عشوائية جزء من اسم الخوارزمية يأتي من!
  2. بناء شجرة قرار بناء على هؤلاء N سجلات عشوائية
  3. وفقًا لعدد الأشجار المحددة للخوارزمية ، أو عدد الأشجار في الغابة ، كرر الخطوتين 1 و 2. وهذا يولد المزيد من الأشجار من مجموعات سجلات البيانات العشوائية ؛
  4. بعد الخطوة 3 ، تأتي الخطوة الأخيرة ، وهي توقع النتائج:
    • في حالة التصنيف: ستتنبأ كل شجرة في الغابة بالفئة التي ينتمي إليها السجل الجديد. بعد ذلك ، يتم تعيين الرقم القياسي الجديد للفئة التي فازت بأغلبية الأصوات.
    • في حالة الانحدار: تتنبأ كل شجرة في الغابة بقيمة السجل الجديد ، وسيتم حساب قيمة التنبؤ النهائي بأخذ متوسط ​​جميع القيم التي تنبأت بها جميع الأشجار في الغابة.

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

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

مع حدس حول كيفية عمل الأشجار وفهم للغابات العشوائية - الشيء الوحيد المتبقي هو التدرب على بنائها وتدريبها وضبطها على البيانات!

بناء وتدريب نماذج الغابات العشوائية باستخدام Scikit-Learn

كان هناك سبب للأمثلة المستخدمة حتى الآن تتعلق بالحمل ومنطقة المعيشة والنساء.

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

تم بعد ذلك تنظيم البيانات التي تم جمعها في ملف قيم مفصولة بفواصل (csv) وتحميلها إلى مستودع التعلم الآلي الخاص بـ UCI.

هذه هي البيانات التي سنستخدمها للتدرب ومحاولة فهم ما إذا كانت المرأة الحامل مصابة بـ منخفض, متوسط or عالي خطر الوفاة.

ملاحظات: يمكنك تنزيل مجموعة البيانات هنا.

استخدام Random Forest للتصنيف

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

في هذا المثال الأول ، سنقوم بتنفيذ نموذج تصنيف متعدد الفئات مع مصنف Random Forest و Python's Scikit-Learn.

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

استيراد مكتبات

سنستخدم Pandas لقراءة البيانات ، و Seaborn و Matplotlib لتصورها ، و NumPy لطرق المساعدة الرائعة:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
استيراد مجموعة البيانات

يقوم الكود التالي باستيراد مجموعة البيانات وتحميلها في ثعبان DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

لإلقاء نظرة على الأسطر الخمسة الأولى من البيانات ، نقوم بتنفيذ head() أمر:

dataset.head()

هذا ينتج:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

هنا يمكننا أن نرى جميع السمات التي تم جمعها أثناء البحث.

  • العمر: الأعمار بالسنوات.
  • SystolicBP: القيمة العليا لضغط الدم بالمليمتر زئبقي ، سمة مهمة أثناء الحمل.
  • DiastolicBP: انخفاض قيمة ضغط الدم بالمليمتر زئبقي ، سمة مهمة أخرى أثناء الحمل.
  • BS: مستويات الجلوكوز في الدم من حيث التركيز المولي ، مليمول / لتر.
  • معدل ضربات القلب: معدل ضربات القلب أثناء الراحة بعدد النبضات في الدقيقة.
  • مستوى المخاطرة: مستوى الخطورة أثناء الحمل.
  • BodyTemp: درجة حرارة الجسم.

الآن بعد أن فهمنا المزيد حول ما يتم قياسه ، يمكننا إلقاء نظرة على أنواع البيانات باستخدام info():

dataset.info()

وينتج عنه:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

من النظر إلى RangeIndex السطر ، يمكننا أن نرى أن هناك 1014 سجلًا والعمود Non-Null Count يبلغ أن البيانات لا تحتوي على أي قيم مفقودة. هذا يعني أننا لن نحتاج إلى إجراء أي معالجة للبيانات المفقودة!

في مجلة Dtype العمود ، يمكننا أن نرى نوع كل متغير. حالياً، float64 أعمدة مثل BS و BodyTemp لها قيم عددية قد تختلف في أي نطاق ، مثل 15.0 ، 15.51 ، 15.76 ، 17.28 ، مما يجعلها مستمر عدديا (يمكنك دائمًا إضافة 0 إلى رقم فاصلة عائمة ، إعلان لا نهائي). من ناحية أخرى ، المتغيرات مثل Age, SystolicBP, DiastolicBPو HeartRate من النوع int64، هذا يعني أن الأرقام تتغير فقط بالوحدة ، مثل 11 ، 12 ، 13 ، 14 - لن يكون لدينا معدل ضربات قلب يبلغ 77.78 ، إما 77 أو 78 - هذه هي منفصلة عدديا القيم. ولدينا أيضًا RiskLevel مع object type ، يشير هذا عادةً إلى أن المتغير نص ، وربما نحتاج إلى تحويله إلى رقم. نظرًا لأن مستوى المخاطرة ينمو من الأقل إلى الأعلى ، فهناك أمر ضمني في الفئات ، وهذا يشير إلى أنه a ترتيبي قاطع المتغير.

ملاحظات: من المهم النظر إلى نوع كل بيانات ، ومعرفة ما إذا كانت منطقية وفقًا لسياقها. على سبيل المثال ، ليس من المنطقي أن يكون لديك نصف وحدة معدل ضربات القلب ، لذلك هذا يعني أن نوع interger مناسب لقيمة منفصلة. عندما لا يحدث ذلك ، يمكنك تغيير نوع البيانات باستخدام Pandas ' astype() اللياقة - df['column_name'].astype('type').

بعد النظر إلى أنواع البيانات ، يمكننا استخدامها describe() لأخذ ذروة في بعض الإحصاءات الوصفية ، مثل القيم المتوسطة لكل عمود ، والانحراف المعياري ، والكميات ، وقيم البيانات الدنيا والقصوى:

dataset.describe().T 

يعرض الكود أعلاه:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

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

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

في هذه الحالة ، فإن الخطوة في المعالجة المسبقة للبيانات التي يمكننا اتخاذها هي تحويل النوع الفئوي RiskLevel عمود في واحد رقمي.

تصور البيانات

قبل التحويل RiskLevel، دعنا أيضًا نتخيل البيانات بسرعة من خلال النظر في مجموعات النقاط لكل زوج من الميزات مع مخطط مبعثر وكيفية توزيع النقاط من خلال تصور منحنى الرسم البياني. للقيام بذلك ، سوف نستخدم Seaborn pairplot() الذي يجمع بين المؤامرات. يُنشئ كلا المخططين لكل مجموعة ميزات ويعرض النقاط المشفرة بالألوان وفقًا لمستوى المخاطرة مع hue خاصية:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

يولد الكود أعلاه:

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

بعد إجراء تحليل البيانات الاستكشافية الأساسي ، يمكننا معالجة ملف RiskLevel العمود.

المعالجة المسبقة للبيانات من أجل التصنيف

للتأكد من وجود ثلاث فئات فقط من RiskLevel في بياناتنا ، وأنه لم تتم إضافة أي قيم أخرى بشكل خاطئ ، يمكننا استخدامها unique() لعرض القيم الفريدة للعمود:

dataset['RiskLevel'].unique()

هذا ينتج:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

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

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

بعد استبدال القيم ، يمكننا تقسيم البيانات إلى ما سيتم استخدامه لتدريب النموذج ، و ملامح or X، وما نريد توقعه ، التسميات or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

بمجرد X و y المجموعات جاهزة ، يمكننا استخدام Scikit-Learn train_test_split() طريقة لتقسيمهم بشكل أكبر إلى مجموعات القطار والاختبار:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

المشورة: تذكر استخدام بذرة حالة عشوائية إذا كنت تريد جعل النتيجة قابلة للتكرار. لقد استخدمنا بذرة حالة عشوائية حتى تتمكن من إعادة إنتاج نفس النتائج كما في الدليل.

هنا ، نستخدم 20٪ من البيانات للاختبار و 80٪ للتدريب.

تدريب RandomForestClassifier

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

نفذت مجموعات Scikit-Learn تحت sklearn.ensemble وحدة. مجموعة من أشجار القرار المستخدمة في التصنيف ، والتي يتم فيها التصويت بالأغلبية يتم تنفيذها باسم RandomForestClassifier.

بوجود مجموعات القطار والاختبار ، يمكننا استيراد ملف RandomForestClassifier فئة وإنشاء النموذج. للبدء ، دعونا ننشئ غابة بثلاث أشجار ، عن طريق الإعداد n_estimators المعلمة كـ 3 ، ولكل شجرة ثلاثة مستويات ، عن طريق الإعداد max_depthإلى 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

ملحوظة: القيمة الافتراضية لـ n_estimators is 100. هذا يعزز القدرة التنبؤية والتعميم للمجموعة ، لكننا نقوم بإنشاء مجموعة أصغر لتسهيل تصورها وفحصها. من خلال 3 أشجار فقط - يمكننا تصورها وفحصها يدويا لزيادة بناء حدسنا لكل من الأشجار الفردية والاعتماد المشترك عليها. الأمر نفسه ينطبق على max_depth، والذي هو None، مما يعني أن الأشجار يمكن أن تصبح أعمق وأعمق لملاءمة البيانات كما هو مطلوب.

لملاءمة النموذج حول البيانات - نسمي fit() الطريقة ، التمرير في ميزات التدريب والتسميات:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

يمكننا الآن مقارنة التسميات المتوقعة بالتسميات الحقيقية لتقييم مدى نجاح النموذج! قبل تقييم النموذج ، دعنا نلقي نظرة على المجموعة.

لإلقاء نظرة أعمق قليلاً على النموذج ، يمكننا تصور كل من الأشجار وكيف يقسمون البيانات. يمكن القيام بذلك باستخدام ملف tree وحدة مدمجة في Scikit-Learn ، ثم تمر عبر كل من المقدرين في المجموعة:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

يعرض الكود أعلاه مخططات الشجرة:

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

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

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

تقييم RandomForestClassifier

يجعل Scikit-Learn من السهل إنشاء خطوط أساسية من خلال توفير ملف DummyClassifierالذي ينتج التنبؤات دون استخدام ميزات الإدخال (نواتج عشوائية تمامًا). إذا كان نموذجك أفضل من DummyClassifier, بعض التعلم يحدث! لتعظيم التعلم - يمكنك اختبار العديد من المعلمات التشعبية تلقائيًا باستخدام ملف RandomizedSearchCV or GridSearchCV. إلى جانب وجود خط أساس ، يمكنك تقييم أداء نموذجك من منظور العديد من المقاييس.

بعض مقاييس التصنيف التقليدية التي يمكن استخدامها لتقييم الخوارزمية هي الدقة والتذكر ودرجة f1 والدقة ومصفوفة الارتباك. فيما يلي شرح موجز لكل منهم:

  1. دقة: عندما يكون هدفنا هو فهم قيم التنبؤ الصحيحة التي اعتبرها المصنف صحيحًا. ستقسم الدقة تلك القيم الإيجابية الحقيقية على العينات التي تم توقعها على أنها إيجابية ؛

$$
الدقة = فارك {النص {الإيجابيات الحقيقية}} {النص {الإيجابيات الحقيقية} + النص {الإيجابيات الخاطئة}}
$$

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

$$
الاستدعاء = frac {النص {الإيجابيات الحقيقية}} {النص {الإيجابيات الحقيقية} + النص {السلبيات الكاذبة}}
$$

  1. نتيجة F1: هو متوازن ام الوسط التوافقي من الدقة والاستدعاء. أدنى قيمة هي 0 وأعلى قيمة هي 1. متى f1-score تساوي 1 ، فهذا يعني أنه تم توقع جميع الفئات بشكل صحيح - هذه درجة صعبة للغاية للحصول عليها باستخدام بيانات حقيقية (توجد استثناءات دائمًا تقريبًا).

$$
text {f1-score} = 2 * frac {text {دقة} * نص {استدعاء}} {نص {دقة} + نص {استدعاء}}
$$

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

  2. دقة: يصف عدد التنبؤات التي حصل عليها المصنف بشكل صحيح. أقل قيمة دقة هي 0 وأعلى قيمة هي 1. عادةً ما يتم ضرب هذه القيمة في 100 للحصول على نسبة مئوية:

$$
دقة = فارك {نص {عدد التنبؤات الصحيحة}} {نص {العدد الإجمالي للتنبؤات}}
$$

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

يمكنك تنفيذ البرنامج النصي التالي لاستيراد المكتبات الضرورية وإلقاء نظرة على النتائج:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

سيبدو الإخراج كما يلي:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

في تقرير التصنيف ، لاحظ أن الاسترجاع مرتفع ، 0.89 للفئة 0 ، كل من الدقة والاسترجاع مرتفعان للفئة 2 ، 0.74 ، 0.72 - وبالنسبة للفئة 1 ، فهي منخفضة ، خاصة استدعاء 0.17 ودقة 0.57 . يتم التقاط العلاقة بين الاستدعاء والدقة لجميع الفئات الثلاثة بشكل فردي في F1 النتيجة ، وهي الوسط التوافقي بين الاستدعاء والدقة - يقوم النموذج بعمله حسنا للفئة 0 ، سيء إلى حد ما للفئة 1 ولائق للفئة 2.

يواجه النموذج وقتًا عصيبًا للغاية عند تحديد ملف حالات متوسطة الخطورة.

الدقة التي حققها مُصنِّف الغابة العشوائي مع 3 أشجار فقط هي من 0.58 (58٪) - هذا يعني أنها تحصل على أكثر من نصف النتائج بشكل صحيح. هذه دقة منخفضة ، وربما يمكن تحسينها بإضافة المزيد من الأشجار.

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

الشيء الآخر الذي يمكن التحقق منه لتوليد المزيد من البصيرة هو الميزات التي يأخذها المصنف في الاعتبار عند التنبؤ. هذه خطوة مهمة يجب اتخاذها أنظمة التعلم الآلي القابلة للتفسير، ويساعد في تحديد وتخفيف التحيز في النماذج.

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


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

لقد حان الوقت أخيرًا لإنشاء نموذج جديد به عدد أكبر من الأشجار لمعرفة كيفية تأثيره على النتائج. لنقم بإنشاء ملف rfc_ غابة بها 900 شجرة و 8 مستويات ونفس البذرة. هل ستتحسن النتائج؟

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

حساب وعرض المقاييس:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

هذا ينتج:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

يوضح هذا كيف أدت إضافة المزيد من الأشجار والمزيد من الأشجار المتخصصة (المستويات الأعلى) إلى تحسين مقاييسنا. لا يزال لدينا معدل استدعاء منخفض للفئة 1 ، لكن الدقة الآن تبلغ 74٪. درجة F1 عند تصنيف الحالات عالية الخطورة هي 0.85 ، مما يعني أنه أصبح من السهل الآن تحديد الحالات عالية الخطورة عند مقارنتها بـ 0.73 في النموذج السابق!

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

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

استخدام الغابات العشوائية للانحدار

في هذا القسم سوف ندرس كيف يمكن استخدام خوارزمية Random Forest لحل مشاكل الانحدار باستخدام Scikit-Learn. الخطوات المتبعة لتنفيذ هذه الخوارزمية متطابقة تقريبًا مع الخطوات التي تم إجراؤها للتصنيف ، إلى جانب نوع النموذج ونوع البيانات المتوقعة - التي ستكون الآن قيمًا مستمرة - هناك اختلاف واحد فقط في إعداد البيانات.

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

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

استيراد المكتبات والبيانات
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
المعالجة المسبقة للبيانات من أجل الانحدار

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

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
تدريب RandomForestRegressor

الآن بعد أن قمنا بتوسيع نطاق مجموعة البيانات الخاصة بنا ، حان الوقت لتدريب خوارزمية لدينا على حل مشكلة الانحدار هذه ، لتغييرها قليلاً - سننشئ نموذجًا يحتوي على 20 شجرة في الغابة وكل واحدة بها 4 مستويات. للقيام بذلك ، يمكنك تنفيذ الكود التالي:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

يمكنك العثور على تفاصيل لجميع معلمات RandomForestRegressor في الوثائق الرسمية.

نظرًا لأن التخطيط والنظر إلى 20 شجرة سيتطلب بعض الوقت والتفاني ، يمكننا رسم أول شجرة فقط لإلقاء نظرة على كيفية اختلافها عن شجرة التصنيف:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

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

حان الوقت للانتقال إلى الخطوة الأخيرة والأخيرة عند حل مشكلة التعلم الآلي وتقييم أداء الخوارزمية!

تقييم RandomForestRegressor

بالنسبة لمشاكل الانحدار ، فإن المقاييس المستخدمة لتقييم الخوارزمية هي متوسط ​​الخطأ المطلق (MAE) ، والخطأ التربيعي المتوسط ​​(MSE) ، والخطأ التربيعي المتوسط ​​(RMSE).

  1. متوسط ​​الخطأ المطلق (MAE): عندما نطرح القيم المتوقعة من القيم الفعلية ، نحصل على الأخطاء ، ونجمع القيم المطلقة لتلك الأخطاء ونحصل على متوسطها. يعطي هذا المقياس فكرة عن الخطأ الكلي لكل تنبؤ بالنموذج ، وكلما كان أصغر (أقرب إلى 0) كان ذلك أفضل.

$$
mae = (frac {1} {n}) sum_ {i = 1} ^ {n} يسار | الفعلي - الحق المتوقع |
$$

ملحوظة: قد تواجه أيضًا y و ŷ التدوين في المعادلات. ال y يشير إلى القيم الفعلية و ŷ للقيم المتوقعة.

  1. متوسط ​​الخطأ التربيعي (MSE): إنه مشابه لمقياس MAE ، لكنه يربّع القيم المطلقة للأخطاء. أيضًا ، كما هو الحال مع MAE ، كلما كان أصغر أو أقرب إلى 0 ، كان ذلك أفضل. يتم تربيع قيمة MSE لجعل الأخطاء الكبيرة أكبر. هناك شيء واحد يجب الانتباه إليه عن كثب ، وهو أنه عادةً ما يكون من الصعب تفسيره نظرًا لحجم قيمه وحقيقة أنها ليست في نفس نطاق البيانات.

$$
mse = sum_ {i = 1} ^ {D} (فعلي - متوقع) ^ 2
$$

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

$$
rmse = sqrt {sum_ {i = 1} ^ {D} (فعلي - متوقع) ^ 2}
$$

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

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

يمكنك الكود التالي للعثور على هذه القيم:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

يجب أن يكون الإخراج:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

مع وجود 20 شجرة ، يكون الخطأ التربيعي لمتوسط ​​الجذر هو 1.75 وهو منخفض ، ولكن مع ذلك - من خلال زيادة عدد الأشجار وتجربة المعلمات الأخرى ، من المحتمل أن يصبح هذا الخطأ أصغر.

مزايا استخدام Random Forest

كما هو الحال مع أي خوارزمية ، هناك مزايا وعيوب لاستخدامها. في القسمين التاليين ، سنلقي نظرة على إيجابيات وسلبيات استخدام Random Forest للتصنيف والانحدار.

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

عيوب استخدام Random Forest

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

المضي قدمًا - مشروع باليد من البداية إلى النهاية

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من مشروع موجه: "توقع عملي لأسعار المنازل - التعلم الآلي في لغة Python".

دليل نهائي لخوارزمية Random Forest باستخدام Python و Scikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

في هذا المشروع الموجه - ستتعلم كيفية بناء نماذج تعلم الآلة التقليدية القوية بالإضافة إلى نماذج التعلم العميق ، واستخدام مجموعة التعلم وتدريب المتعلمين الفوقيين للتنبؤ بأسعار المنازل من حقيبة من نماذج Scikit-Learn و Keras.

باستخدام Keras ، واجهة برمجة التطبيقات للتعلم العميق المبنية على قمة Tensorflow ، سنقوم بتجربة البنى وإنشاء مجموعة من النماذج المكدسة وتدريب المتعلم الفوقي الشبكة العصبية (نموذج المستوى الأول) لمعرفة سعر المنزل.

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

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

الطابع الزمني:

اكثر من ستاكابوز