الاعتماد الجزئي ومنحنيات ICE
“انظر بدقة كيف تتغير تنبؤات النموذج عند تغيير ميزة واحدة — مع تهميش كل شيء آخر”
تهمّش PDP على كل الميزات الأخرى لإظهار التأثير المتوسط. تكشف منحنيات ICE عن التجانس الفردي. تُصلح مخططات ALE مشكلة استقراء PDP.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
دالة الاعتماد الجزئي
متوسط مخرج النموذج عبر جميع قيم الميزات التكميلية — يهمّش التفاعلات
منحنى ICE (فردي)
التنبؤ للعينة i بينما تتغير الميزة j — يُبقي جميع الميزات الأخرى عند قيمها الفعلية
c-ICE (مرتكز)
منحنى ICE مُرسَّخ عند نقطة المرجع x_j0 — يُزيل فروق التقاطع ويُبرز شكل التفاعلات
العلاقة PDP–ICE
PDP هو تماماً المتوسط النقطي لجميع منحنيات ICE
▶محاكاة تفاعلية
ما وراء 'أي الميزات تهم' — كيف تهم؟
تُخبرك أهمية الميزات أن الدخل هو الميزة الأكثر تنبؤاً، لكنها لا تقول شيئاً عن شكل تلك العلاقة. هل يزداد التنبؤ خطياً مع الدخل؟ هل يستقر فوق 80 ألف يورو؟ هل هناك تأثير عتبة عند 40 ألف؟ تُجيب مخططات الاعتماد الجزئي (PDPs) على هذه الأسئلة بصرياً. إنها المقابل 'مخطط التأثير' لدرجات الأهمية. معاً يُشكّلان صورة كاملة: الأهمية تُخبرك بالحجم، وPDPs تُخبرك بالاتجاه والشكل. مع منحنيات ICE تكشف أيضاً ما إذا كان متوسط PDP ملخصاً موثوقاً أم متوسطاً مضلِّلاً لتأثيرات متباينة.
PDP يُظهر علاقة مسطحة لميزة عالية الأهمية هو علامة تحذير — غالباً يعني أن التهميش يخفي تأثيرات تفاعلية مرئية فقط في منحنيات ICE.
تفسير مونتي كارلو
يعمل تقدير PDP بمحاكاة مونتي كارلو: لقيمة معطاة x_j = v، استبدل العمود j في مجموعة البيانات بأكملها بـ v، مرّر جميع عينات n عبر النموذج، وحسب متوسط التنبؤات. كرر لكل v على شبكة. النتيجة هي منحنى استجابة النموذج المتوسط. الافتراض الرئيسي هو استقلالية الميزات — يتظاهر التهميش بأن x_j يمكنه أخذ القيمة v بينما تحتفظ جميع الميزات الأخرى بتوزيعها المشترك الأصلي. عندما تكون الميزات مرتبطة تخلق هذا استقراءً في مناطق غير معقولة. تُصلح مخططات ALE هذا بالاشتراط على توزيع البيانات الفعلي.
منحنيات ICE هي المكافئ على المستوى الفردي: بدلاً من حساب المتوسط ارسم منحنى كل عينة بشكل منفصل. إذا تباعدت أو تقاطعت منحنيات ICE فمتوسط PDP مضلِّل — هناك تأثيرات تفاعلية.
حساب PDP + ICE: خطوة بخطوة
اختر الميزة j وشبكة من القيم G = {v₁, v₂, …, vₖ} (افتراضياً: 100 نقطة بين النسيلة 5-95).
لكل قيمة شبكة v ∈ G: اضبط X_j = v لجميع عينات التدريب الـ n (أنشئ n نسخة)، احسب f(X_j=v, X_{-j}) لجميع عينات n، سجّل المتوسط كـ PDP(v) وجميع القيم كمنحنيات ICE.
ارسم PDP(v) كخط متوسط. ارسم كل منحنى ICE كخط خافت بنفس اللون.
اختيارياً مرّكز منحنيات ICE (c-ICE): اطرح قيمة كل منحنى عند v_min حتى تبدأ جميع المنحنيات عند 0 — يُزيل ضوضاء التقاطع.
لـPDPs ثنائية الأبعاد (مخططات التفاعل): ثبّت ميزتين j1, j2 على شبكة، هَمِّش على جميع الأخرى — ينتج خريطة حرارية تُظهر التأثير المشترك.
PDP + ICE مع واجهة الفحص في scikit-learn
from sklearn.ensemble import GradientBoostingClassifier from sklearn.inspection import PartialDependenceDisplay from sklearn.model_selection import train_test_split import pandas as pd import numpy as np import matplotlib.pyplot as plt class="tok-comment"># ── Dataset ─────────────────────────────────────────────────────────────────── np.random.seed(class="tok-num">0) n = class="tok-num">2000 X = pd.DataFrame({ class="tok-str">"income": np.random.normal(class="tok-num">50, class="tok-num">15, n).clip(class="tok-num">15, class="tok-num">120), class="tok-str">"age": np.random.randint(class="tok-num">18, class="tok-num">70, n).astype(float), class="tok-str">"credit_score": np.random.normal(class="tok-num">650, class="tok-num">80, n).clip(class="tok-num">300, class="tok-num">850), }) y = (class="tok-num">0.5*(X[class="tok-str">"income"]>class="tok-num">55) + class="tok-num">0.3*(X[class="tok-str">"credit_score"]>class="tok-num">660) + class="tok-num">0.2*(X[class="tok-str">"age"]>class="tok-num">40)) > class="tok-num">0.5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=class="tok-num">0.2) class="tok-comment"># ── Train model ─────────────────────────────────────────────────────────────── clf = GradientBoostingClassifier(n_estimators=class="tok-num">200, max_depth=class="tok-num">4, random_state=class="tok-num">42) clf.fit(X_train, y_train) class="tok-comment"># ── class="tok-num">1. Standard PDP for class="tok-num">3 features ──────────────────────────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"income", class="tok-str">"age", class="tok-str">"credit_score"], class="tok-comment"># feature names or indices kind=class="tok-str">"average", class="tok-comment"># class="tok-str">"average" = PDP only grid_resolution=class="tok-num">50, class="tok-comment"># number of grid points ax=axes, ) plt.suptitle(class="tok-str">"Partial Dependence Plots (PDP)") plt.tight_layout() plt.show() class="tok-comment"># ── class="tok-num">2. PDP + ICE overlay ───────────────────────────────────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"income", class="tok-str">"age", class="tok-str">"credit_score"], kind=class="tok-str">"both", class="tok-comment"># class="tok-str">"both" = PDP (bold) + ICE (faint) subsample=class="tok-num">100, class="tok-comment"># sample class="tok-num">100 ICE curves for readability alpha=class="tok-num">0.3, class="tok-comment"># ICE line transparency ax=axes, ) plt.suptitle(class="tok-str">"PDP + ICE Curves — divergence reveals interactions") plt.tight_layout() plt.show() class="tok-comment"># ── class="tok-num">3. Centered ICE (c-ICE) — removes intercept bias ───────────────────────── fig, axes = plt.subplots(class="tok-num">1, class="tok-num">3, figsize=(class="tok-num">15, class="tok-num">4)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[class="tok-str">"income", class="tok-str">"age", class="tok-str">"credit_score"], kind=class="tok-str">"individual", class="tok-comment"># ICE only centered=True, class="tok-comment"># anchor each curve at its leftmost value subsample=class="tok-num">150, alpha=class="tok-num">0.2, ax=axes, ) plt.suptitle(class="tok-str">"Centered ICE (c-ICE) — interaction shapes visible") plt.tight_layout() plt.show() class="tok-comment"># ── class="tok-num">4. 2D interaction PDP (heatmap) ────────────────────────────────────────── fig, ax = plt.subplots(figsize=(class="tok-num">6, class="tok-num">5)) PartialDependenceDisplay.from_estimator( clf, X_train, features=[(class="tok-str">"income", class="tok-str">"credit_score")], class="tok-comment"># tuple = 2D PDP ax=ax, ) plt.title(class="tok-str">"2D PDP: income × credit_score interaction") plt.tight_layout() plt.show() class="tok-comment"># ── class="tok-num">5. Manual PDP computation (educational) ────────────────────────────────── grid = np.linspace(X_train[class="tok-str">"income"].quantile(class="tok-num">0.05), X_train[class="tok-str">"income"].quantile(class="tok-num">0.95), class="tok-num">50) pdp_vals = [] for v in grid: X_mod = X_train.copy() X_mod[class="tok-str">"income"] = v pdp_vals.append(clf.predict_proba(X_mod)[:, class="tok-num">1].mean()) plt.figure(figsize=(class="tok-num">6, class="tok-num">3)) plt.plot(grid, pdp_vals, lw=class="tok-num">2, color=class="tok-str">"class="tok-comment">#8b5cf6") plt.xlabel(class="tok-str">"income") plt.ylabel(class="tok-str">"Avg predicted P(default=class="tok-num">1)") plt.title(class="tok-str">"Manual PDP — income effect") plt.tight_layout() plt.show()
مخططات ALE: إصلاح مشكلة الاستقراء في PDP
تُشترط مخططات ALE (التأثيرات المحلية المتراكمة) على جوار x_j = v بدلاً من التهميش عبر مجموعة البيانات الكاملة. يحترم هذا التوزيع الفعلي للبيانات ويتجنب الاستقراء في مناطق مستحيلة (مثل أشخاص عمرهم 20 عاماً بدخل 150 ألف يورو). تُحسب الصيغة المبنية على المشتقات التأثير المحلي لتحريك x_j بمقدار صغير ثم تدمج تلك التأثيرات المحلية — منتجةً نسخة وفية للتوزيع من PDP. للميزات غير المرتبطة تُنتج PDP وALE مخططات شبه متطابقة. للميزات المرتبطة ALE أكثر موثوقية بصرامة.
عندما يكذب PDP: مشكلة التأثير المتباين
يمكن أن يُظهر PDP خطاً مسطحاً تماماً للدخل بينما تتراوح منحنيات ICE الفردية من موجب قوي إلى سالب قوي — إذا ألغت التأثيرات ذات الإشارات المتعاكسة بعضها في المتوسط. يحدث هذا عند وجود تأثيرات تفاعلية قوية. تحقق دائماً من منحنيات ICE إلى جانب PDPs. أيضاً PDPs مُكلفة حسابياً للبيانات الكبيرة: تقييمات n × k للنموذج لكل ميزة. استخدم subsample=200 للحد من حساب منحنيات ICE. أخيراً لا تحتوي PDPs على فترات ثقة افتراضياً — استخدم PDPs متحيزة باستخدام bootstrap للحصول على نطاقات عدم اليقين.
إذا أظهر PDP خطاً مسطحاً لكن أهمية التبديل تقول إن الميزة حرجة، تحقق من منحنيات ICE — على الأرجح لديك تأثير تفاعلي مخفي.
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.