تعلم الآلةمترجم

قابلية الشرح: فتح الصندوق الأسود – الجزء الأول

كتابة: Manu Joseph   ترجمة: نضال إمام   مراجعة: فارس القنيعير   [للمقال الأصلي باللغة الإنجليزية اضغط هنا]

ما هي القابلية للشرح (explainability) في الذكاء الاصطناعي؟ وكيف يمكننا الاستفادة من التقنيات المختلفة لفتح الصندوق الأسود للذكاء الاصطناعي وإلقاء نظرة على الداخل؟ يقدم هذا الدليل العملي مراجعة ونقدًا لطرق التفسير (interpretability) المختلفة.

التفسير هو الدرجة التي يمكن للإنسان أن يفهم بها سبب القرار – ميلر، تيم

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

تطور الأوراق البحثية حول XAI في السنوات القليلة الماضية من Arrieta، وآخرون.

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

يُعد Yann LeCun، الحائز على جائزة Turing كبير علماء الذكاء الاصطناعي في Facebook وكاسي كوزيركوف، كبير مهندسي القرارات الذكية في Google، من أكثر المؤيدين لخط التفكير الذي يمكنك من استنتاج الأسباب التي من خلالها قام النموذج بالتنبؤ من خلال مراقبة أفعال النموذج (أي التنبؤات في إطار عمل تعليمي موجَّه supervised learning framework). من ناحية أخرى، ريتش كاروانا من Microsoft Research وعدد قليل من الآخرين يصرون على أن النماذج بطبيعتها لها قابلية للتفسير وليست مشتقة فقط من خلال أداء النموذج.

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

ما هو التفسير (Interpretability)؟

التفسير هو الدرجة التي يمكن للإنسان أن يفهم بها سبب القرار. وفي مجال الذكاء الاصطناعي فهذا يعني الدرجة التي يمكن أن يفهم بها الشخص كيف ولماذا قامت الخوارزمية باستنتاج توقعاتها. هناك طريقتان رئيسيتان للنظر إلى هذا – الشفافية (Transparency) والتفسير اللاحق (Post-hoc Interpretation).

الشفافية (Transparency)

تتناول الشفافية مدى إمكانية فهم النموذج. هذا يعتمد على طبيعة النموذج المستخدم.

أحد الجوانب الرئيسية للشفافية هو القابلية للمحاكاة (simulatability). تشير القابلية للمحاكاة إلى قدرة النموذج على أن تتم محاكاته أو التفكير فيه من قبل الإنسان [3]. يلعب مستوى التعقيد في النموذج دورًا كبيرًا في تحديد هذه الخاصية. في حين أن النموذج الخطي البسيط (linear model) أو الذي يحتوي على طبقة عصبية واحدة (single layer perceptron) يمكن التفكير فيه بسهولة، يصبح من الصعب و بشكل متزايد التفكير في شجرة قرار (decision tree) بعمق ٥، على سبيل المثال. كما يصبح من الصعب التفكير في نموذج يحتوي على الكثير من الخصائص (features). لذلك، فإن النموذج الخطي (Regularized Linear Model) المتناثر (sparse) أكثر قابلية للتفسير من النموذج الكثيف (dense).

القابلية للتحلل (Decomposability) هي مبدأ رئيسي آخر للشفافية. القابلية للتحلل تعني القدرة على شرح كل جزء من أجزاء النموذج (المدخلات والمعاملات والحسابات) [3]. يتطلب الأمر شرح المدخلات (من دون وجود خصائص معقدة) إلى المخرجات، وذلك من دون الحاجة إلى أداة أخرى.

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

التفسير اللاحق (Post-hoc Interpretation)

يكون التفسير اللاحق مفيدًا عندما يكون النموذج نفسه غير شفاف. لذلك في غياب الوضوح حول كيفية عمل النموذج نلجأ إلى شرح النموذج وتوقعاته باستخدام عدة طرق. Arrieta وAlejandro Barredo et al. قاموا بتجميعها وتصنيفها إلى ٦ فئات رئيسية. سوف نتحدث عن بعضها هنا.

  • الشرح المرئي (Visual Explanations) – تحاول هذه المجموعة من الطرق تصور سلوك النموذج لمحاولة شرحها. تستخدم غالبية الطرق التي تندرج تحت هذه الفئة تقنيات مثل تقليل الأبعاد لتصوير النموذج بصيغة يمكن فهمها من قِبل الإنسان.
  • الشرح الملائم للخصائص (Feature Relevance Explanations) – تحاول هذه المجموعة من الطرق الكشف عن العمل الداخلي للنموذج عن طريق حساب ملاءمة الخصائص أو أهميتها. يُنظر إلى هذه على أنها طريقة غير مباشرة لشرح النموذج.
  • الشرح عن طريق التبسيط (Explanations by simplification) – تحاول هذه المجموعة من الطرق تدريب النظام الجديد بالكامل بناءً على النموذج الأصلي لتقديم الشرح (explainability).

نظرًا لأن هذا الموضوع واسع النطاق وتغطيته بالكامل في هذه التدوينة سوف يكون ضخمًا، فقد قمت بتقسيمه إلى أجزاء متعددة. سنغطي النماذج القابلة للتفسير (interpretable model) و “المشاكل” الموجودة فيها في الجزء الحالي ونترك التحليل اللاحق (post-hoc analysis) للجزء التالي.

النماذج القابلة للتفسير (interpretable models)

تنص مقولة أوكام ريزور (Occam’s Razor) على أن الحلول البسيطة من المرجح أن تكون صحيحة أكثر من الحلول المعقدة. في علم البيانات، عادة ما يتم ذكر أوكام ريزور مع فرط التخصيص (overfitting). لكنني أعتقد أنها قابل للتطبيق بنفس القدر في سياق قابلية الشرح (explainability). إذا كان بإمكانك الحصول على الأداء الذي نريده باستخدام نموذج شفاف (transparent model)، فلا تبحث المزيد عن خوارزمية مثالية.

قام Arrieta, Alejandro Barredo et al. بتلخيص نماذج تعلم الآلة (ML) في جدول جميل.

الإنحدار الخطي/اللوجِستي (LINEAR/LOGISTIC REGRESSION)

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

  • الاسطوانات: قيمة منفصلة متعددة القيم (multi-valued discrete)
  • الإزاحة (displacement): قيمة مستمرة
  • القدرة بالحصان (horsepower): قيمة مستمرة
  • الوزن (weight): قيمة مستمرة
  • التسارع (acceleration): قيمة مستمرة
  • سنة الطراز (model year): قيمة منفصلة متعددة القي
  • المنشأ (origin): قيمة منفصلة متعددة القي
  • اسم السيارة: نص (فريدة لكل حالة)

بعد تحميل البيانات، فإن الخطوة الأولى هي تشغيل pandas_profiling.

import pandas as pd
import numpy as np
import pandas_profiling
import pathlib
import cufflinks as cf

#We set the all charts as public
cf.set_config_file(sharing='public',theme='pearl',offline=False)
cf.go_offline()
cwd = pathlib.Path.cwd()
data = pd.read_csv(cwd/'mpg_dataset'/'auto-mpg.csv')
report = data.profile_report()
report.to_file(output_file="auto-mpg.html")

سطر واحد فقط من التعليمات البرمجية وهذه المكتبة الرائعة تقوم بعمل تحليل بيانات استكشافي (EDA) تمهيدي نيابة عنك.

لقطة من تقرير Pandas Profiling. انقر هنا لمشاهدة التقرير الكامل

معالجة البيانات (DATA PREPROCESSING)

  • على الفور نستطيع أن نرى أن أسماء السيارات لها ٣٠٥ قيمة مميزة في ٣٩٦ صفًا. لذلك قمنا بإزالة هذا المتغير
  • يتم تفسير القدرة الحصانية على أنها متغير فئوي (categorical variable). بعد التحقيق، اتضح أن هذه الخاصية لديها بعض الصفوف التي تحتوي على “؟”. قمنا باستبدال هذه الصفوف بمتوسط العمود، ثم تحويلها إلى قيمة كسرية (float)
  • يُظهر أيضًا العلاقة الخطية المتعددة بين الإزاحة والأسطوانات والوزن

في عالم Python، يتوفر الانحدار الخطي (Linear regression) في مكتبتي Sci-kit Learn و Statsmodels. كلاهما يعطي نفس النتائج، لكن Statsmodels مفضلة أكثر عند الإحصائيين و Sci-kit Learn يفضلها ممارسوا تعلم الآلة (ML). دعونا نستخدم statsmodels بسبب الملخص الجميل الذي يقدمه بدون إعدادات إضافية.

X = data.drop(['mpg'], axis=1)
y = data['mpg']

## let's add an intercept (beta_0) to our model
# Statsmodels does not do that by default
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
predictions = model.predict(X)

# Print out the statistics
model.summary()

# Plot the coefficients (except intercept)
model.params[1:].iplot(kind='bar')

التفسير مباشر جداً في هذا المثال.

  • يمكن تفسير التقاطع (intercept) على أنه عدد الأميال المتوقعة لحالة تكون فيها جميع المتغيرات المستقلة (independent variables) صفراً. المأخذ هنا هو أنه إذا كان ليس من المعقول أن تكون المتغيرات المستقلة صفرًا وإذا حدث مثل ذلك في البيانات التي تم تدريب الانحدار الخطي (Linear Regression) عليها، فإن التقاطع يكون بلا معنى تمامًا. إنه فقط يثبت الانحدار في المكان المناسب.
  • يمكن تفسير المعاملات (coefficients) على أنها التغير في المتغير التابع (dependent variable) والذي من شأنه أن يؤدي إلى تغيير الوحدة في المتغير المستقل (independent variable). على سبيل المثال، إذا قمنا بزيادة الوزن بمقدار ١، فسوف ينخفض عدد الأميال بمقدار ٠.٠٠٦٧.
  • بعض الخصائص (features) مثل الأسطوانات، وسنة الطراز، وما إلى ذلك، ذات طبيعة فئوية (categorical). يجب تفسير هذه المعاملات على أنها متوسط الفرق في الأميال بين الفئات المختلفة. هناك تحذير آخر هنا وهو أن جميع الخصائص الفئوية (categorical features) في هذا المثال هي أيضًا ترتيبية (ordinal) (المزيد من الأسطوانات يعني عددًا أقل من الأميال، أو كلما طال عمر النموذج، كلما كانت الأميال أفضل)، ومن ثم لا بأس من تركها كما هي وحساب الانحدار. ولكن إذا لم يكن الأمر كذلك، فيمكن استخدام الترميز الوهمي (dummy encoding) أو الترميز الواحد النشط (one-hot encoding) للمتغيرات الفئوية (categorical features).

الآن نأتي إلى أهمية الخصائص (features). يبدو أن المنشأ وسنة الطراز هي من الخصائص الرئيسية التي تقود النموذج، أليس كذلك؟

لا. دعونا نلقي نظرة عليها بالتفصيل. لتوضيح وجهة نظري، دعونا نلقي نظرة على بضعة صفوف من البيانات.

المنشأ (origin) له قيم مثل ١، ٢، وما إلى ذلك، سنة الطراز (model_year) لها قيم مثل ٧٠،٨٠، وما إلى ذلك، للوزن (weight) قيم مثل ٣٥٠٤، ٣٤٤٩ وما إلى ذلك، وميل لكل جالون mpg (المتغير التابع لدينا) له قيم مثل ١٦،١٥، إلخ. هل ترى المشكلة هنا؟ لعمل معادلة تنتج ١٥ أو ١٦، يجب أن يكون للمعادلة معامل (coefficient) صغير للوزن، ومعامل (coefficient) كبير للمنشأ.

إذن ماذا نفعل؟

أقدم لك معاملات الانحدار المعيارية (Standardized Regression Coefficients)

 

 

نضرب كل من المعاملات في نسبة الانحراف المعياري (standard deviation) للمتغير المستقل (independent variable) على الانحراف المعياري للمتغير التابع (dependent variable). تشير المعاملات المعيارية إلى عدد الانحرافات المعيارية التي سوف يتغيرها المتغير التابع، لكل زيادة في الانحراف المعياري في المتغير المتوقع (predictor variable).

#Standardizing the Regression coefficients
std_coeff = model.params

for col in X.columns:
    std_coeff[col] = (std_coeff[col]* np.std(X[col]))/ np.std(y)

std_coeff[1:].round(4).iplot(kind='bar')

 

الصورة تغيرت حقاً، أليس كذلك؟ تبين أن وزن السيارة التي كانت معاملاتها تقريبًا صفر هو أكبر عامل في تحديد الأميال. إذا كنت ترغب في الحصول على مزيد من الحدس/الرياضيات وراء التوحيد القياسي (standardization)، أقترح عليك الرجوع إلى هذا الموضوع stackoverflow.

هناك طريقة أخرى للحصول على نتائج مماثلة وهي توحيد متغيرات الإدخال قبل حساب الانحدار الخطي (linear regression) ثم فحص المعاملات (coefficients).

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_std = scaler.fit_transform(X)
lm = LinearRegression()
lm.fit(X_std,y)
r2 = lm.score(X_std,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))

params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
    params[col] = lm.coef_[i]

params[1:].round(4).iplot(kind='bar')

على الرغم من اختلاف المعاملات الفعلية، تظل الأهمية النسبية بين الخصائص كما هي.

تدور النقطة الأخيرة في الانحدار الخطي (linear regression) حول الخطية المتعددة ( multicollinearity) و أصغر تربيع الاعتيادي (OLS) بشكل عام. يتم حل الانحدار الخطي باستخدام OLS، وهو مُقدِّر غير متحيز (unbiased estimator). على الرغم من أنه يبدو شيئًا جيدًا، إلا أنه ليس بالضرورة. ما تعنيه كلمة “غير متحيز” هنا هو أن إجراء الحل لا يأخذ بعين الاعتبار المتغير المستقل (independent variables) الأكثر أهمية من المتغيرات الأخرى؛ أي أنها غير متحيزة تجاه المتغيرات المستقلة وتسعى جاهدة للتوصل الى المعاملات التي تقلل المجموع المتبقي للمربعات (Residual Sum of Squares) – وتختصر بـ RSS. ولكن هل نريد حقًا نموذجًا يقلل فقط من قيمة RSS؟ تلميح: يتم حساب RSS في مجموعة التدريب.

عندما نقايض بين التحيز (Bias) مقابل التباين (Variance)، توجد نقطة جيدة نستطيع من خلالها الحصول على التعقيد الأمثل للنموذج، والذي يمكّننا من تجنب فرط التخصيص (overfitting). وعادةً نظرًا لأنه من الصعب جدًا تقدير التحيز والتباين للقيام بالتفكير التحليلي والوصول إلى النقطة المثلى فإننا نستخدم استراتيجيات تستند على التحقق المتقاطع (cross-validation) للوصول لنفس الشيء. ولكن إذا فكرت في الأمر فلا يوجد معامل ضبط حقيقي (hyperparameter) يمكن تعديله في الانحدار الخطي.

ونظرًا لأن المُقدِّر غير متحيز (unbiased estimator)، فإنه سيخصص جزءًا صغيرًا من المساهمة لكل خاصية متاحة له. تصبح هذه مشكلة أكبر عندما يكون هناك علاقة خطية متعددة (multicollinearity). في حين أن هذا لا يؤثر كثيرًا على القدرة التنبؤية للنموذج، إلا أنه يؤثر على قابلية تفسيره (interpretability). عندما ترتبط إحدى الخصائص ارتباطًا وثيقًا بخصائص أخرى أو مجموعة من الخصائص، فإن المساهمة لتلك الخاصية تتأثر بالخصائص الأخرى. لذلك، إذا كان هناك علاقة خطية متعددة (multi-collinearity) قوية في مجموعة البيانات الخاصة بك، فإن معاملات الانحدار ستكون مضللة (misleading).

أقدم لك الضبط (ِEnter Regularization)

تقريبًا في قلب أي خوارزمية لتعلم الآلة (ML) توجد مشكلة التحسين (optimization) التي تقلل من دالة التكلفة (cost function). في حالة الانحدار الخطي، فإن دالة التكلفة هذه هي المجموع المتبقي للمربعات (Residual Sum of Squares)، وهي ليست سوى الخطأ التربيعي بين قيمة التنبؤ (prediction) التي تحددها المعاملات والقيمة الحقيقية (ground truth).

المصدر: https://web.stanford.edu/~hastie/ElemStatLearn/

لاستخدام الضبط (regularization)، نضيف جزءاً إضافيًا إلى دالة تكلفة التحسين (cost function of the optimization). تصبح دالة التكلفة الآن:

انحدار ريدج (Ridge) (ضبط المستوى ل٢ L2 Regularization)

انحدار لاسو (Lasso) (ضبط المستوى ل١ L1 Regularization)

 لقد أضفنا مجموع كل المعاملات التربيعية (squared coefficients) إلى دالة التكلفة في انحدار ريدج (Ridge Regression)، وفي انحدار لاسو (Lasso Regression) أضفنا مجموع المعاملات المطلقة (absolute coefficients). بالإضافة إلى ذلك، قمنا بإضافة مُدخَل (parameter) وهو مُدخل ضبط (hyperparameter) نستطيع ضبطه للوصول إلى التعقيد الأمثل للنموذج. وبحكم الخصائص الرياضية لضبط ل١ (L1) و ل٢ (L2) فإن التأثير على المعاملات يختلف قليلاً.

  • يعمل انحدار ريدج (Ridge Regression) على تقليص المعاملات إلى ما يقارب الصفر بالنسبة للمتغيرات المستقلة التي يعتبرها أقل أهمية.
  • يقلص انحدار لاسو (Lasso Regression) المعاملات إلى الصفر بالنسبة للمتغيرات المستقلة التي يعتبرها أقل أهمية.
  • إذا كان هناك علاقة خطية متعددة (multicollinearity)، يختار لاسو أحدهما ويقلص الآخر إلى الصفر، بينما يقلص ريدج الآخر إلى ما يقرب من الصفر.

يقدم كتاب التعلم الإحصائي (بواسطة Hastie، Tibshirani، Friedman) التوجيهات التالية: عندما يكون لديك العديد من المؤثرات (effects) الصغيرة/متوسطة الحجم، يجب عليك استخدام ريدج (Ridge). إذا كان لديك متغيرات قليلة فقط ذات تأثير متوسط/كبير، يفضل استخدام لاسو (Lasso). يمكنك الرجوع إلى هذه التدوينة التي تشرح الضبط بالتفصيل. قدم المؤلف أيضًا ملخصًا موجزًا أقتبسه هنا في الصورة التالية.

lm = RidgeCV()
lm.fit(X,y)

r2 = lm.score(X,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))

params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
    params[col] = lm.coef_[i]

ridge_params = params.copy()

lm = LassoCV()
lm.fit(X,y)
r2 = lm.score(X,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))

params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
    params[col] = lm.coef_[i]

lasso_params = params.copy()
ridge_params.to_frame().join(lasso_params.to_frame(), lsuffix='_ridge', rsuffix='_lasso')

لقد قمنا بإستخدام انحدار ريدج ولاسو على نفس البيانات. أعطى انحدار ريدج نفس درجات ر٢ (R2) و ر٢ المعدلة (Adjusted R2) مثل الانحدار الأصلي ( ٨٢.٠٨٪ و ٨١.٧٢٪ على التوالي)، ولكن مع تقلص بسيط للمعاملات (coefficients). وأعطى لاسو ر٢ (R2) أقل ودرجة ر٢ المعدلة (Adjusted R2) ( ٧٦.٦٧٪ و ٧٦.١٩٪ على التوالي) مع تقلص أكبر للمعاملات.

إذا نظرت إلى المعاملات بعناية، يمكنك أن ترى أن انحدار ريدج (Ridge Regression) لم يقلص المعامِلات كثيرًا. المعاملات التي تقلصت حقًا هي النزوح (displacement) والمنشأ (origin). قد يكون هناك سببان لذلك:

  1. كان للنزوح علاقة قوية بالأسطوانات (٠.٩٥)، وبالتالي تقلص
  2. كانت معظم المعاملات في المشكلة الأصلية قريبة بالفعل من الصفر وبالتالي تقلصت بشكل بسيط جدًا

ولكن إذا نظرت إلى كيف قلصت لاسو المعاملات، فسترى أن أثرها كان شديداً.

  • معاملات الأسطوانات والتسارع والمنشأ تم تقليصهم تمامًا إلى الصفر. الأسطوانات بسبب الخطية المتعددة، والتسارع بسبب افتقارها إلى القدرة التنبؤية (كانت القيمة p في الانحدار الأصلي ٠.٢٨٧).

كقاعدة عامة، أود أن أقترح دائمًا استخدام نوع من الضبط.

أشجار القرار (DECISION TREES)

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

الأعمدة في مجموعة البيانات هذه هي:

  • الهوية (ID)
  • طول السبلة سم (Sepal Length)
  • عرض السبلة سم (Sepal Width)
  • طول البتلة سم (Petal Length)
  • عرض البتلة سم (Petal Width)
  • النوع (Species)

قمنا بإزالة عامود “الهوية”، وقمنا بترميز الأنواع المستهدفة لجعلها اهداف، وقمنا بتدريب مصنف شجرة القرار (Decision Tree Classifier) عليه.

دعنا نلقي نظرة على “أهمية الخصائص” (سنناقش بالتفصيل أهمية الخصائص وتفسيرها في الجزء التالي من سلسلة التدوينات) من شجرة القرار.

clf = DecisionTreeClassifier(min_samples_split = 4)
clf.fit(X,y)
feat_imp = pd.DataFrame({'features': X.columns.tolist(), "mean_decrease_impurity": clf.feature_importances_}).sort_values('mean_decrease_impurity', ascending=False)
feat_imp = feat_imp.head(25)

feat_imp.iplot(kind='bar',
        y='mean_decrease_impurity',
        x='features',
        yTitle='Mean Decrease Impurity',
        xTitle='Features',
        title='Mean Decrease Impurity',
)

من بين السمات الأربع، استخدم المصنف فقط طول البتلة وعرض البتلة لفصل الأنواع الثلاثة.

دعونا نصور شجرة القرار باستخدام المكتبة الرائعة (dtreeviz) ونرى كيف تعلم النموذج القواعد.

from dtreeviz.trees import *

viz = dtreeviz(clf,
        X,
        y,
        target_name='Species',
        class_names=["setosa", "versicolor", "virginica"],
        feature_names=X.columns
)

viz

عمل النموذج واضح جدًا. دعونا نتقدم خطوة للأمام ونصور كيف يقوم النموذج بالتنبؤ.

# random sample from training
x = X.iloc[np.random.randint(0, len(X)),:]

viz = dtreeviz(clf,
        X,
        y,
        target_name='Species',
        class_names=["setosa", "versicolor", "virginica"],
        feature_names=X.columns,
        X=x
)

viz

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

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

الكود الكامل متاح في Github الخاص بي.

السيرة الذاتية: Manu Joseph @manujosephv هو عالم بيانات فضولي بطبيعته و قام بتعليم نفسه بنفسه ولديه أكثر من ٨ سنوات من خبرة المهنية في شركة Fortune 500، وايضاً باحث في Thoucentric Analytics.

اظهر المزيد

نضال إمام

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

‫2 تعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى