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

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

تتكون البيانات من 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()

هكذا تبدو بياناتنا في النهاية.
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)

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):
- اختر النموذج الذي تريد الحصول على تفسير لتنبؤاته.
- درب هذا النموذج واحصل على تنبؤاته لقيم الاختبار.
- بالنسبة لـ
LIME، نقوم بترجيح العينات الجديدة فيما يتعلق بقربها من النموذج. - أنشئ نموذجًا محليًا على مجموعة البيانات.
- أخيرًا، اشرح التنبؤ بتفسير النموذج المحلي.
حدد نموذج 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()

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

هنا يمكنك رؤية وزن كل ميزة مع فئتها المتوقعة (ممثلة باللون). إنها تمثل الأوزان المحلية المخصصة لكل ميزة. يمثل اللون الأحمر الهدف False بينما يمثل اللون الأخضر الهدف True. أصبح من السهل الآن تفسير النموذج من خلال رؤية الوزن المعطى لكل ميزة وكذلك الشرط لكل قيمة اختبار تقع ضمن فئة معينة. تشير قيم PRCP و TMAX إلى أن الهدف المتوقع يجب أن يكون False بينما تشير قيمة TMIN إلى هدف True.
لا تُستخدم LIME فقط للتصنيف الثنائي للبيانات الجدولية، ولكن أيضًا للحالات متعددة الفئات، الصور، والنصوص. يمكن العثور على الكود في مستودع GitHub الخاص بي: https://github.com/Sid11/Lime
وهنا رابط إلى مستودع GitHub الرسمي لـ LIME: https://github.com/marcotcr/lime
إذا كان لديك أي أسئلة، فلا تتردد في التواصل معي. أتمنى أن يكون المقال قد نال إعجابك!
الخلاصة التقنية
تُعد تقنية LIME أداة حيوية في عالم تعلم الآلة، خاصة عند التعامل مع نماذج “الصندوق الأسود” التي تفتقر إلى الشفافية. من خلال توفير تفسيرات محلية وقابلة للفهم البشري لتنبؤات النموذج، تمكن LIME المطورين والمستخدمين على حد سواء من بناء ثقة أكبر في الأنظمة الذكية. إن قدرتها على الكشف عن الميزات الأكثر تأثيرًا في قرار معين، بغض النظر عن تعقيد النموذج الأساسي، تجعلها لا غنى عنها في مجالات تتطلب المساءلة والشفافية، مثل الطب والمالية. وبهذا، لا نكتفي بتحقيق الدقة العالية، بل نضمن أيضًا فهمًا عميقًا للمنطق الكامن وراء كل قرار.