يا جماعة الخير، السلام عليكم ورحمة الله.
خليني أحكيلكم هالشغلة اللي صارت معي ومع فريقي قبل فترة. كنا شغالين على مشروع كبير، مشروع حساس جداً، لعميل في القطاع المالي. المطلوب كان بناء نموذج تعلم آلة (Machine Learning Model) يقدر يتنبأ باحتمالية تعثر العملاء عن سداد القروض. قضينا أسابيع وليالي واحنا بنبني النموذج، بنجمع البيانات، بننظفها، وبنختار أفضل الخوارزميات. وفي النهاية، طلع معنا وحش! نموذج من نوع XGBoost بدقة بتتجاوز الـ 94%. إشي بيرفع الراس، صح؟
عرضنا النتائج الأولية على مدير المشروع والعميل، كانوا مبسوطين بالأرقام. لكن بعدها إجا السؤال اللي نسف كل الفرحة: “ممتاز، بس ليش النموذج قرر إنه العميل ‘س’ رح يتعثر، والعميل ‘ص’ لأ؟”.
وقتها، كل اللي قدرنا نحكيه هو… “اممم… الخوارزمية قررت هيك”. شعرنا وقتها بإحراج شديد. كنا زي اللي اخترع سيارة سريعة جداً بس ما فيها مقود ولا بنعرف كيف بتشتغل من جوا. نموذجنا كان عبارة عن “صندوق أسود” (Black Box)، بيعطينا نتائج صحيحة، بس ما بنفهم كيف وصل لهاي النتائج. وهون كانت المشكلة الكبيرة، لأنه في عالم المال، “ليش” أهم من “شو” بكتير. ما بتقدر ترفض طلب قرض لعميل وتحكيله “والله الكمبيوتر هيك حكى”. دخلنا في جحيم “الصندوق الأسود”، والعميل بلش يفقد ثقته في شغلنا كله.
لماذا يعتبر “الصندوق الأسود” مشكلة حقيقية؟
قبل ما نكمل القصة، خلينا نوقف شوي ونفهم ليش هاي المشكلة “عويصة” لهالدرجة. لما يكون نموذجك صندوق أسود، أنت بتواجه عدة تحديات قاتلة لأي مشروع ذكاء اصطناعي:
- انعدام الثقة: كيف بدك تقنع مديرك، أو عميلك، أو حتى المستخدم النهائي، إنه يثق بقرار هو نفسه ما بيفهمه؟ الثقة هي عملة المشاريع التقنية.
- صعوبة التصحيح (Debugging): إذا النموذج بلش يعطي نتائج غريبة أو خاطئة، كيف بدك تعرف وين الخلل؟ هل المشكلة في البيانات؟ في الخوارزمية؟ في ميزة معينة؟ بدون فهم “المنطق” الداخلي، أنت بتكون زي اللي بصلح سيارة وهو معصوب العينين.
- العدالة والانحياز (Fairness & Bias): كثير من النماذج بتتعلم من بيانات تاريخية ممكن تكون منحازة ضد فئات معينة (مثلاً على أساس الجنس، أو المنطقة الجغرافية). الصندوق الأسود بخفي هاد الانحياز، وممكن نموذجك ياخد قرارات ظالمة بدون ما تدري.
- المتطلبات القانونية والتنظيمية: في قطاعات كثيرة زي الطب والمال، فيه قوانين (مثل GDPR في أوروبا) بتعطي المستخدم الحق في معرفة “سبب” القرارات الآلية اللي بتأثر عليه. الصندوق الأسود بخليك غير قادر على تلبية هاي المتطلبات.
باختصار، الصندوق الأسود بحول نموذجك الذكي إلى مجرد طلاسم غامضة. وهون كان لازم نلاقي حل.
المنقذ SHAP: تكسير قيود الصندوق الأسود
بعد بحث مكثف، ومعاناة، وكاسات شاي بالمرمية ما الها عدد، تعرفنا على عالم جميل اسمه “الذكاء الاصطناعي المفسر” (Explainable AI – XAI). ومن بين كل الأدوات والمكتبات، لمعت أداة بشكل خاص، وكانت هي طوق النجاة تبعنا: مكتبة SHAP (SHapley Additive exPlanations).
الفكرة ورا SHAP عبقرية وبسيطة بنفس الوقت. هي مستوحاة من “نظرية الألعاب” (Game Theory)، وتحديداً من مفهوم اسمه “قيم شابلي” (Shapley Values) اللي طورها عالم الرياضيات لويد شابلي. خلينا نبسطها بمثال من خارج البرمجة.
تخيل فريق كرة قدم سجل هدف. النتيجة النهائية (الهدف) معروفة. لكن مين اله الفضل الأكبر؟ المهاجم اللي سجل؟ ولا لاعب الوسط اللي مررله الكرة؟ ولا المدافع اللي قطع الكرة وبدأ الهجمة؟ SHAP بتعمل نفس الإشي، بس مع نموذج تعلم الآلة.
بتحسب SHAP “مساهمة” كل ميزة (feature) من بياناتك في “دفع” تنبؤ النموذج من قيمة أساسية (متوسط التنبؤات) إلى القيمة النهائية اللي وصلها. يعني، بدل ما تحكيلك “النموذج قرر يرفض الطلب”، SHAP بتحكيلك:
“النموذج قرر يرفض الطلب لأن دخل العميل منخفض (وهاي سحبت القرار بقوة نحو الرفض)، وعليه ديون سابقة (وهاي كمان سحبت القرار نحو الرفض)، بالرغم من إنه عمره مناسب (وهاي حاولت تسحب القرار نحو القبول بس ما كانت قوية كفاية)”.
فرق شاسع، صح؟ فجأة، صار للنموذج لسان يحكي فيه، وصار عنا منطق نقدر نناقشه ونحلله.
شغل عملي: كيف طبقنا SHAP؟
الحكي سهل، خلينا نشوف الكود. رح أستخدم مثال مبسط جداً عشان الفكرة توصل. تخيل عنا نموذج XGBoost مدرب على بيانات قروض، وبدنا نفسر قرار واحد لعميل معين.
أولاً، لازم يكون عندك مكتبة shap و xgboost. بتركبهم بسهولة:
pip install shap
pip install xgboost
الآن، لنفترض أنه عنا نموذج مدرب (model) وبيانات اختبار (X_test). الخطوات لتفسير تنبؤ واحد بتكون كالتالي:
import shap
import xgboost
# لنفترض أن هذا هو النموذج المدرب وبيانات الاختبار
# model = xgboost.XGBClassifier().fit(X_train, y_train)
# X_test = ...
# 1. إنشاء "المُفسِّر" (Explainer) الخاص بـ SHAP
# نستخدم TreeExplainer لأنه فعال جداً مع النماذج الشجرية مثل XGBoost
explainer = shap.TreeExplainer(model)
# 2. حساب قيم SHAP لبيانات الاختبار
shap_values = explainer.shap_values(X_test)
# 3. تفسير تنبؤ واحد (مثلاً، العميل الأول في بيانات الاختبار)
# shap.initjs() # لتفعيل الرسوم في بيئة مثل Jupyter Notebook
shap.force_plot(explainer.expected_value, shap_values[0,:], X_test.iloc[0,:])
السطر الأخير هاد هو السحر كله! رح ينتجلك رسم بياني تفاعلي اسمه Force Plot. شكله كالتالي:

هاد الرسم بينقسم لقسمين:
- القيمة الأساسية (base value): هي متوسط تنبؤ النموذج على كل البيانات. ممكن تفكر فيها كنقطة البداية المحايدة.
- الأسهم الملونة: كل سهم بيمثل ميزة (feature) من بيانات العميل.
- الأسهم الحمراء: هي الميزات اللي “دفعت” القرار نحو نتيجة أعلى (مثلاً، نحو “الموافقة على القرض”). طول السهم بيمثل قوة الدفع.
- الأسهم الزرقاء: هي الميزات اللي “سحبت” القرار نحو نتيجة أقل (نحو “رفض القرض”).
لما عرضنا رسم زي هاد للعميل، عيونه لمعت. لأول مرة، شاف “منطق” النموذج بعينه. قدرنا نمسك كل حالة ونشرحها بالتفصيل: “شوف يا أستاذ، هون النموذج رفض الطلب بشكل أساسي بسبب ارتفاع نسبة الدين إلى الدخل (DTI Ratio)، بالرغم من إنه تاريخه الائتماني جيد”. صار الحوار مثمر وبنّاء بدل ما يكون مجرد جدال حول أرقام غامضة.
النظر إلى الصورة الكبيرة: تفسير النموذج ككل
تفسير قرار واحد إشي عظيم، بس SHAP بتعطينا أكثر من هيك. بتقدر تعطيك نظرة عامة على سلوك النموذج كله. مثلاً، أي الميزات هي الأهم بشكل عام؟ وكيف بتأثر هاي الميزات على القرارات؟
هون بيجي دور الـ Summary Plot.
# رسم بياني يلخص أهمية وتأثير كل الميزات
shap.summary_plot(shap_values, X_test)
النتيجة بتكون رسم بياني خرافي زي هاد:

هاد الرسم بيحكيلك قصة كاملة:
- المحور الرأسي (Y-axis): الميزات مرتبة من الأكثر أهمية للأقل أهمية.
- المحور الأفقي (X-axis): قيمة SHAP. القيم الموجبة بتدفع التنبؤ للأعلى، والسالبة بتسحبه للأسفل.
- اللون: لون النقطة بيعبر عن قيمة الميزة نفسها (عالية أو منخفضة).
من رسم زي هاد، بنقدر نستنتج علاقات معقدة. مثلاً، ممكن نكتشف إنه “الدخل المنخفض” (نقاط زرقاء) دائماً بيعطي قيم SHAP سالبة (بسحب القرار نحو الرفض)، بينما “الدخل المرتفع” (نقاط حمراء) بيعطي قيم SHAP موجبة (بدفع القرار نحو الموافقة). هاد التحليل أعطانا ثقة هائلة في سلوك نموذجنا، وساعدنا نكتشف بعض العلاقات غير المتوقعة في البيانات اللي كنا رح نتجاهلها تماماً لولا SHAP.
نصائح أبو عمر العملية (من الكيس)
بعد ما استخدمنا SHAP في عدة مشاريع، جمعت لكم كم نصيحة من واقع التجربة، زي ما بنحكي “من الآخر”:
- ابدأ بتفسير قرار واحد: لا تغرق نفسك في البداية بتحليل كل البيانات. اختر حالة مثيرة للاهتمام (مثلاً، حالة تنبأ فيها النموذج بشكل خاطئ، أو حالة نتيجتها غير متوقعة) واستخدم
force_plotلفهمها بعمق. هاد أفضل مدخل لعالم SHAP. - SHAP حسابياً مكلفة: حساب قيم شابلي ممكن يكون بطيء جداً، خصوصاً مع البيانات الكبيرة أو النماذج المعقدة. مكتبة SHAP فيها تحسينات ممتازة (زي
TreeExplainerللنماذج الشجرية)، بس خليك واعي للموضوع. لو بياناتك ضخمة، جرب تحسب القيم على عينة ممثِّلة من البيانات. - SHAP تفسر ما يراه النموذج، وليس الحقيقة المطلقة: هاي نقطة مهمة جداً. إذا كان نموذجك فيه انحياز (bias) لأنه تعلم من بيانات منحازة، SHAP رح تظهرلك هاد الانحياز بوضوح. هي بتكشفلك “عقلية” النموذج، وهاد بحد ذاته أداة قوية جداً لاكتشاف وتصحيح الانحياز.
- استخدمها كأداة لتصحيح الأخطاء (Debugging): هل فيه ميزة الها تأثير أكبر بكتير من المتوقع؟ يمكن فيه تسريب بيانات (Data Leakage). هل تأثير ميزة معينة عكس المنطق؟ يمكن فيه خطأ في معالجة البيانات (Preprocessing). SHAP هي أفضل صديق للمبرمج في مرحلة الـ Debugging لنماذج تعلم الآلة.
الخلاصة: من طلاسم إلى ثقة ✅
في النهاية، ما بقدر أوصفلكم حجم الراحة والنقلة النوعية اللي صارت في مشروعنا بعد ما تبنينا SHAP. انتقلنا من فريق محبط بيحاول يدافع عن صندوق أسود غامض، إلى فريق واثق بيشرح قرارات النموذج بوضوح ومنطق. العميل استعاد ثقته، والمشروع نجح نجاح باهر.
نصيحتي لكل مطور ومهندس بيانات في مجال الذكاء الاصطناعي: لا تتوقف عند بناء نموذج بدقة عالية. هاد مجرد جزء من الشغلانة. الجزء الأهم هو بناء نماذج موثوقة، عادلة، وقابلة للتفسير. أدوات مثل SHAP ما عادت رفاهية، بل أصبحت ضرورة حتمية في أي مشروع جاد.
لا تبنوا صناديق سوداء، بل ابنوا جسوراً من الثقة مع المستخدمين. وتذكروا دائماً، القيمة الحقيقية للذكاء الاصطناعي مش في غموضه، بل في قدرته على تمكيننا من اتخاذ قرارات أفضل وأكثر وعياً. بالتوفيق يا جماعة الخير!