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

احصل على أهم الميزات للغابات العشوائية باستخدام Python و Scikit-Learn

المُقدّمة

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

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

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

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

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

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

للقيام بذلك ، دعنا نستورد المكتبات الضرورية ، ونحمِّل مجموعة بيانات Palmer Penguins ، وقم بتقسيم البيانات ، وإنشاء النموذج ، والحصول على استيراد الميزات ، واستخدام Seaborn لرسمها! لن نتعمق كثيرًا في البيانات أو EDA أو النموذج نفسه - فهذه هي موضوع الدليل المخصص.

ملحوظة: يمكنك تنزيل مجموعة البيانات من GitHub جيثب: أو مباشرة من الكود.

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

لنبدأ باستيراد بعض المكتبات التي سنستخدمها:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

تقسيم البيانات

دعنا نقسم البيانات للتدريب والاختبار:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


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

الحصول على أهم الميزات

أخيرًا - يمكننا تدريب نموذج وتصدير أهميته باستخدام:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

هذا ينتج:

array([0.41267633, 0.30107056, 0.28625311])

هذه هي قيم الميزة ، لمشاهدة أسماء المعالم ، قم بتشغيل:


rf.feature_names_in_

ينتج عن هذا الاسم المقابل لكل ميزة:

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

هذا يعني أن أهم ميزة لتحديد فئات peguin لهذا النموذج المعين كانت bill_length_mm!

ترتبط الأهمية بمقياس مدى جودة فصل البيانات في كل انقسام عقدة - في هذه الحالة ، يتم إعطاء المقياس بواسطة مؤشر جيني - ثم يتم ترجيح قيمة gini بعدد الصفوف التي تم تقسيمها عند استخدام ملف bill_length_mm ميزة ومتوسط ​​أكثر من 100 شجرة في المجموعة. نتيجة هذه الخطوات لحساب 0.41267633، أو أكثر من 40٪ في هذه الحالة.

تصور أهمية الميزة

الطريقة الشائعة لتمثيل قيم الأهمية هي استخدام الدردشات الشريطية. لنقم أولاً بإنشاء إطار بيانات بأسماء الميزات والمهمات المقابلة لها ، ثم تصورها باستخدام Seaborn's barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

المشورة: من الممارسات الجيدة عند تقديم المعلومات ترتيب القيم إما بترتيب تصاعدي أو تنازلي. في هذه الحالة ، تكون البيانات مرتبة بالفعل ، مع كون القيمة الأولى هي أول ما نريد معرفته. عندما لا يكون الأمر كذلك ، يمكنك طلب إطار البيانات باستخدام sort_values. يمكن القيام بذلك في أي عمود بترتيب تصاعدي أو تنازلي: importances_df.sort_values(by="importances", ascending=False).

عند النظر إلى هذه الحبكة الأولى ، يصعب تفسير قيمة أهمية كل ميزة. من الواضح أن طول الفاتورة أكبر من العمودين الآخرين ، ولكن ليس بالضبط bill_depth_mm ما يعادل 0.30107056و أن flipper_length_mm هو 0.28625311. لذلك ، يمكن تحسين هذا المخطط الأول من خلال عرض قيمة كل شريط. يمكن القيام بذلك عن طريق الوصول إلى Seaborn containers هدف. يقوم بتخزين معلومات كل شريط وتمرير القيم كعناوين شريطية:

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

لاحظ أنه بعد إزالة العلامات ، يصعب قراءة العلامتين Y و X بعض الشيء. علامة Y ، feature_names، عمودي وفي المحور السيني ، لا يوجد سوى importances. نظرًا لأن العنوان ينص بالفعل على أن المخطط هو لـ أهمية الميزات، يمكننا أيضًا إزالة تسميات المحور:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

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

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

هذه هي النتيجة النهائية لمخطط استيراد الميزات:

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

وفي الختام

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

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

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