بناء الثقة في نماذج تعلم الآلة: دليل شامل لتفسير التنبؤات باستخدام LIME

دقائق القراءة: 7

مرحباً بك في هذا الدليل الشامل الذي سيأخذك خطوة بخطوة نحو فهم وتفسير تنبؤات نماذج تعلم الآلة لديك باستخدام تقنية LIME المبتكرة. حتى عندما يحقق نموذجك دقة تقترب من 100%، يظل هناك سؤال جوهري يتردد في الأذهان: هل يمكننا الوثوق به حقًا؟

تخيل موقفًا في عيادة الطبيب – هل سيثق الطبيب بجهاز حاسوب يقدم تشخيصًا دون تقديم أي سبب وجيه يدعم هذا التشخيص؟ أي نموذج يفشل في شرح المنطق وراء مخرجاته يُعتبر “صندوقًا أسود” (black box)، والاعتماد على مثل هذا النموذج ليس النهج الصحيح.

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

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

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

هل تفسير أي نموذج بهذه البساطة؟ لحسن الحظ، نعم. في عام 2016، نشر ماركو توليو ريبيرو، سمير سينغ، وكارلوس جستن ورقة بحثية بعنوان “لماذا يجب أن أثق بك؟”: شرح تنبؤات أي مصنف ("Why Should I Trust You?": Explaining the Predictions of Any Classifier). اقترحوا فيها تقنيتهم LIME. كان النهج الأساسي لهذه التقنية هو تفسير أي نموذج بسهولة من خلال تعلمه محليًا حول تنبؤاته. كتبوا هذه الورقة لفهم التفسيرات وراء تنبؤات أي نموذج، لذا كلما احتجت إلى اختيار نموذج، يمكنك استخدام الرؤى المستخلصة من LIME.

رسم بياني يوضح تفسير LIME لتنبؤ فردي، حيث يتم تسليط الضوء على الأعراض التي أدت إلى تشخيص الإنفلونزا.

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

ما هي تقنية LIME تحديدًا؟

LIME هي تقنية محايدة للنموذج (model-agnostic)، مما يعني أنه يمكن تطبيقها على أي نموذج تعلم آلة. الهدف من LIME هو تحديد نموذج قابل للتفسير (interpretable model) على تمثيل قابل للتفسير (interpretable representation) يكون مخلصًا محليًا للمصنف (locally faithful to the classifier).

– تعريف من الورقة الرسمية

لفهم هذا، نحتاج إلى فهم معنى الاختصار LIME:

  • Local (محلي): يشير إلى كيفية الحصول على هذه التفسيرات. تقارب LIME نموذج الصندوق الأسود محليًا في جوار التنبؤات.
  • Interpretable (قابل للتفسير): التفسيرات التي تقدمها LIME بسيطة بما يكفي ليفهمها البشر.
  • Model-agnostic (محايد للنموذج): تتعامل LIME مع النموذج كصندوق أسود، وبالتالي فهي تعمل مع أي نموذج.
  • Explanations (تفسيرات): المبررات المقدمة للإجراءات التي يقوم بها النموذج.

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

تطبيق عملي: تفسير تنبؤات نموذج تعلم الآلة

سنبدأ باستخدام نموذج RandomForestClassifier للعمل على مجموعة بيانات “هل أمطرت في سياتل؟” ("Did it rain in Seattle"). البيانات متاحة هنا.

استيراد المكتبات الأساسية

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

لتجنب التحذيرات المستقبلية في الكود الخاص بنا، سنضيف هذا إلى الكود في بداية السكريبت:

import warnings
warnings.filterwarnings('ignore')

ثم نستورد بعض مكتبات sklearn لتقسيم مجموعة البيانات ولتحديد المقاييس. سيتم أيضًا استيراد RandomForestClassifier من نفس المكتبة.

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier

تحميل البيانات ومعالجتها الأولية

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

df = pd.read_csv('seattleWeather_1948-2017.csv')
df.head()

لقطة شاشة لأول خمسة صفوف من بيانات الطقس في سياتل، تعرض أعمدة الميزات مثل PRCP وTMAX وTMIN وعمود الهدف RAIN.

تتكون البيانات من 4 أعمدة ميزات وعمود هدف، وهو RAIN. مهمتنا هي التنبؤ بما إذا كان هناك مطر في سياتل.

df.shape
(25551, 5)

تتكون بياناتنا من 25,551 صفًا وهو ما يكفي لتدريب نموذجنا. سنتحقق من القيم المفقودة، إن وجدت:

df.isnull().sum()

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

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

df.dropna(inplace=True)
df.pop('DATE')

سنقوم الآن بترميز عمود الهدف لدينا:

df.RAIN.replace({True: 1, False: 0},inplace=True)
df.head()

لقطة شاشة لأول خمسة صفوف من بيانات الطقس في سياتل بعد المعالجة، حيث تم ترميز عمود RAIN إلى 0 و 1.

هكذا تبدو بياناتنا في النهاية.

target = df.pop('RAIN')
x_train, x_test, y_train, y_test = train_test_split(df, target, train_size=0.75)

لقد قمنا الآن بتقسيم البيانات إلى مجموعات تدريب واختبار، حيث تمثل مجموعة التدريب 75% من البيانات الأصلية.

تدريب النموذج وتقييمه

سنقوم الآن بإنشاء نموذجنا بالمعاملات الافتراضية:

rfc = RandomForestClassifier()

وتدريب النموذج على عينات التدريب:

rfc.fit(x_train,y_train)

تمثيل نصي لكائن RandomForestClassifier بعد تدريبه، يعرض المعاملات الافتراضية للنموذج.

accuracy_score(y_test,rfc.predict(x_test))
1.0

لقد حقق النموذج دقة 100%. ولكن الآن، دعونا نفسر النموذج حتى نتمكن من الوثوق به.

تطبيق LIME لتفسير تنبؤات النموذج

أولاً، نحتاج إلى مناقشة بعض الجوانب النظرية قبل المتابعة. تنشئ LIME بيانات جديدة تتضمن عينات معدلة وتنبؤاتها الخاصة. على هذه البيانات، تقوم LIME بتدريب نموذج محلي يتم ترجيحه حسب قرب حالات العينة. يمكن أن يكون هذا النموذج أي نموذج أساسي، مثل شجرة القرار (Decision tree). يجب أن يكون لهذا النموذج تنبؤات محلية مماثلة لتلك الخاصة بالنموذج الأصلي. تُسمى هذه الدقة “الإخلاص المحلي” (local fidelity).

import lime
from lime import lime_tabular

الآن بعد أن استوردنا الحزم المطلوبة، نحتاج إلى إجراء تفسيرنا. إليك وصفة لتدريب النماذج البديلة المحلية (local surrogate models):

  1. اختر النموذج الذي تريد الحصول على تفسير لتنبؤاته.
  2. درب هذا النموذج واحصل على تنبؤاته لقيم الاختبار.
  3. بالنسبة لـ LIME، نقوم بترجيح العينات الجديدة فيما يتعلق بقربها من النموذج.
  4. أنشئ نموذجًا محليًا على مجموعة البيانات.
  5. أخيرًا، اشرح التنبؤ بتفسير النموذج المحلي.

حدد نموذج LimeTabularExplainer. معلمات هذا النموذج هي عينة التدريب (Training sample)، أسماء الميزات (Feature names)، وأسماء الفئات (class names):

explainer = lime_tabular.LimeTabularExplainer(x_train.values,feature_names=['PRCP', 'TMAX', 'TMIN'],class_names=['False', 'True'],discretize_continuous=True)

نحتاج إلى تمرير عينات التدريب، أسماء أعمدة التدريب، وأسماء الفئات المستهدفة المتوقعة. ثم نستدعي دالة explain_instance() من المفسر الذي أنشأناه. سنستخدم المعلمات التالية لهذه الدالة: عينة الاختبار (test sample)، دالة التنبؤ للنموذج (predict_proba)، عدد الميزات (num_features)، والتصنيفات العليا التي يجب مراعاتها (top_labels):

i = np.random.randint(0,x_test.shape[0])
exp = explainer.explain_instance(x_test.iloc[i],rfc.predict_proba,num_features=x_train.shape[1],top_labels=None)

لعرض التفسير في دفتر الملاحظات (notebook)، يلزم الكود التالي.

exp.show_in_notebook()

مخرجات تفسير LIME في دفتر الملاحظات، تعرض التنبؤ بالاحتمالية، الشروط المرجحة لكل فئة، وقيم الاختبار.

دعونا نفك تشفير الإخراج. يشير الرسم البياني العلوي الأيسر إلى الإخراج المتوقع مع الاحتمالية. إخراج النموذج هو False باحتمالية 100%. يشير الرسم البياني العلوي الأيمن إلى الشروط المطلوبة لكل فئة بأوزانها. بما أن الشرط لمتغيرات PRCP للتنبؤ بالهدف كـ False هو PRCP ≤0.00 وله وزن 0.96. يشير الرسم البياني السفلي الأيمن إلى قيم الاختبار الخاصة بنا. بما أن قيم PRCP تتوافق مع شرط False، يمكنك رؤية اللون الأزرق كخلفية لذلك.

لعرض التفسير كمخطط بياني:

fig = exp.as_pyplot_figure()

مخطط بياني يوضح أوزان LIME لكل ميزة، حيث تمثل الألوان الأحمر والأخضر الفئات المستهدفة False و True على التوالي.

هنا يمكنك رؤية وزن كل ميزة مع فئتها المتوقعة (ممثلة باللون). إنها تمثل الأوزان المحلية المخصصة لكل ميزة. يمثل اللون الأحمر الهدف False بينما يمثل اللون الأخضر الهدف True. أصبح من السهل الآن تفسير النموذج من خلال رؤية الوزن المعطى لكل ميزة وكذلك الشرط لكل قيمة اختبار تقع ضمن فئة معينة. تشير قيم PRCP و TMAX إلى أن الهدف المتوقع يجب أن يكون False بينما تشير قيمة TMIN إلى هدف True.

لا تُستخدم LIME فقط للتصنيف الثنائي للبيانات الجدولية، ولكن أيضًا للحالات متعددة الفئات، الصور، والنصوص. يمكن العثور على الكود في مستودع GitHub الخاص بي: https://github.com/Sid11/Lime

وهنا رابط إلى مستودع GitHub الرسمي لـ LIME: https://github.com/marcotcr/lime

إذا كان لديك أي أسئلة، فلا تتردد في التواصل معي. أتمنى أن يكون المقال قد نال إعجابك!

الخلاصة التقنية

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

اترك تعليقاً

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