ML Learning Hub
تطبيقيمتقدم

الاعتماد الجزئي ومنحنيات ICE

انظر بدقة كيف تتغير تنبؤات النموذج عند تغيير ميزة واحدة — مع تهميش كل شيء آخر

تهمّش PDP على كل الميزات الأخرى لإظهار التأثير المتوسط. تكشف منحنيات ICE عن التجانس الفردي. تُصلح مخططات ALE مشكلة استقراء PDP.

40 min
8 مخططات
7 المفاهيم المغطاة

المتطلبات الأساسية

Feature Importance

المفاهيم المغطاة

PDPICE Curvesc-ICEALE PlotsMarginalisationInteraction EffectsPartialDependenceDisplay

الصيغ الرئيسية

دالة الاعتماد الجزئي

متوسط مخرج النموذج عبر جميع قيم الميزات التكميلية — يهمّش التفاعلات

منحنى ICE (فردي)

التنبؤ للعينة i بينما تتغير الميزة j — يُبقي جميع الميزات الأخرى عند قيمها الفعلية

c-ICE (مرتكز)

منحنى ICE مُرسَّخ عند نقطة المرجع x_j0 — يُزيل فروق التقاطع ويُبرز شكل التفاعلات

العلاقة PDP–ICE

PDP هو تماماً المتوسط النقطي لجميع منحنيات ICE

محاكاة تفاعلية

Loading visualization…
🎯

ما وراء 'أي الميزات تهم' — كيف تهم؟

motivation

تُخبرك أهمية الميزات أن الدخل هو الميزة الأكثر تنبؤاً، لكنها لا تقول شيئاً عن شكل تلك العلاقة. هل يزداد التنبؤ خطياً مع الدخل؟ هل يستقر فوق 80 ألف يورو؟ هل هناك تأثير عتبة عند 40 ألف؟ تُجيب مخططات الاعتماد الجزئي (PDPs) على هذه الأسئلة بصرياً. إنها المقابل 'مخطط التأثير' لدرجات الأهمية. معاً يُشكّلان صورة كاملة: الأهمية تُخبرك بالحجم، وPDPs تُخبرك بالاتجاه والشكل. مع منحنيات ICE تكشف أيضاً ما إذا كان متوسط PDP ملخصاً موثوقاً أم متوسطاً مضلِّلاً لتأثيرات متباينة.

PDP يُظهر علاقة مسطحة لميزة عالية الأهمية هو علامة تحذير — غالباً يعني أن التهميش يخفي تأثيرات تفاعلية مرئية فقط في منحنيات ICE.

💡

تفسير مونتي كارلو

intuition

يعمل تقدير PDP بمحاكاة مونتي كارلو: لقيمة معطاة x_j = v، استبدل العمود j في مجموعة البيانات بأكملها بـ v، مرّر جميع عينات n عبر النموذج، وحسب متوسط التنبؤات. كرر لكل v على شبكة. النتيجة هي منحنى استجابة النموذج المتوسط. الافتراض الرئيسي هو استقلالية الميزات — يتظاهر التهميش بأن x_j يمكنه أخذ القيمة v بينما تحتفظ جميع الميزات الأخرى بتوزيعها المشترك الأصلي. عندما تكون الميزات مرتبطة تخلق هذا استقراءً في مناطق غير معقولة. تُصلح مخططات ALE هذا بالاشتراط على توزيع البيانات الفعلي.

منحنيات ICE هي المكافئ على المستوى الفردي: بدلاً من حساب المتوسط ارسم منحنى كل عينة بشكل منفصل. إذا تباعدت أو تقاطعت منحنيات ICE فمتوسط PDP مضلِّل — هناك تأثيرات تفاعلية.

⚙️

حساب PDP + ICE: خطوة بخطوة

algorithm
1

اختر الميزة j وشبكة من القيم G = {v₁, v₂, …, vₖ} (افتراضياً: 100 نقطة بين النسيلة 5-95).

2

لكل قيمة شبكة v ∈ G: اضبط X_j = v لجميع عينات التدريب الـ n (أنشئ n نسخة)، احسب f(X_j=v, X_{-j}) لجميع عينات n، سجّل المتوسط كـ PDP(v) وجميع القيم كمنحنيات ICE.

3

ارسم PDP(v) كخط متوسط. ارسم كل منحنى ICE كخط خافت بنفس اللون.

4

اختيارياً مرّكز منحنيات ICE (c-ICE): اطرح قيمة كل منحنى عند v_min حتى تبدأ جميع المنحنيات عند 0 — يُزيل ضوضاء التقاطع.

5

لـPDPs ثنائية الأبعاد (مخططات التفاعل): ثبّت ميزتين j1, j2 على شبكة، هَمِّش على جميع الأخرى — ينتج خريطة حرارية تُظهر التأثير المشترك.

</>

PDP + ICE مع واجهة الفحص في scikit-learn

code
python92 lines
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

math

تُشترط مخططات ALE (التأثيرات المحلية المتراكمة) على جوار x_j = v بدلاً من التهميش عبر مجموعة البيانات الكاملة. يحترم هذا التوزيع الفعلي للبيانات ويتجنب الاستقراء في مناطق مستحيلة (مثل أشخاص عمرهم 20 عاماً بدخل 150 ألف يورو). تُحسب الصيغة المبنية على المشتقات التأثير المحلي لتحريك x_j بمقدار صغير ثم تدمج تلك التأثيرات المحلية — منتجةً نسخة وفية للتوزيع من PDP. للميزات غير المرتبطة تُنتج PDP وALE مخططات شبه متطابقة. للميزات المرتبطة ALE أكثر موثوقية بصرامة.

ALE — تكامل التأثيرات المحلية للمشتقة
⚠️

عندما يكذب PDP: مشكلة التأثير المتباين

pitfall

يمكن أن يُظهر PDP خطاً مسطحاً تماماً للدخل بينما تتراوح منحنيات ICE الفردية من موجب قوي إلى سالب قوي — إذا ألغت التأثيرات ذات الإشارات المتعاكسة بعضها في المتوسط. يحدث هذا عند وجود تأثيرات تفاعلية قوية. تحقق دائماً من منحنيات ICE إلى جانب PDPs. أيضاً PDPs مُكلفة حسابياً للبيانات الكبيرة: تقييمات n × k للنموذج لكل ميزة. استخدم subsample=200 للحد من حساب منحنيات ICE. أخيراً لا تحتوي PDPs على فترات ثقة افتراضياً — استخدم PDPs متحيزة باستخدام bootstrap للحصول على نطاقات عدم اليقين.

إذا أظهر PDP خطاً مسطحاً لكن أهمية التبديل تقول إن الميزة حرجة، تحقق من منحنيات ICE — على الأرجح لديك تأثير تفاعلي مخفي.

?اختبار المعرفة

يتم حفظ التقدم في متصفحك — لا حاجة لحساب.

تحتاج مهندس ذكاء اصطناعي أو عالم بيانات؟

أبني نماذج تعلم آلي مخصصة، ووكلاء ذكاء اصطناعي، ورؤية حاسوب، وأتمتة — من الفكرة إلى الإنتاج.