استكشاف تقنيات SHAP-IQ المرئية لفهم نماذج التعلم الآلي

يقدم هذا المقال شرحًا تفصيليًا لاستخدام مكتبة SHAP-IQ في بيثون، وهي أداة قوية لتحليل وتفسير نماذج التعلم الآلي. سنتعلم كيفية استخدام هذه المكتبة لعرض وفهم مساهمات الميزات المختلفة في تنبؤات النموذج، سواءً بشكل فردي أو تفاعلي. سنستخدم مجموعة بيانات MPG (أميال لكل جالون) كمثال عملي.

1. التجهيز والبيانات:

1.1 تثبيت المكتبات:

أولاً، يجب تثبيت المكتبات اللازمة باستخدام الأمر التالي في بيئة Anaconda أو أي بيئة افتراضية مناسبة:

pip install shapiq overrides scikit-learn pandas numpy seaborn

1.2 استيراد البيانات:

سنستخدم مجموعة بيانات MPG من مكتبة Seaborn:

import seaborn as sns
df = sns.load_dataset("mpg")

1.3 معالجة البيانات:

نقوم بتحويل الأعمدة التصنيفية إلى قيم رقمية باستخدام ترميز العلامات (Label Encoding):

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# إزالة الصفوف التي تحتوي على قيم مفقودة
df = df.dropna()

# ترميز عمود "origin"
le = LabelEncoder()
df.loc[:, "origin"] = le.fit_transform(df["origin"])
df['origin'].unique()

# طباعة قيم ترميز العلامات
for i, label in enumerate(le.classes_):
    print(f"{label} → {i}")

1.4 تقسيم البيانات:

نقسم البيانات إلى مجموعات تدريب واختبار:

# تحديد الميزات والهدف
X = df.drop(columns=["mpg", "name"])
y = df["mpg"]
feature_names = X.columns.tolist()
x_data, y_data = X.values, y.values

# تقسيم البيانات
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, random_state=42)

2. تدريب وتقييم النموذج:

سنستخدم نموذج Random Forest Regressor لتدريب النموذج:

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# تدريب النموذج
model = RandomForestRegressor(random_state=42, max_depth=10, n_estimators=10)
model.fit(x_train, y_train)

# تقييم النموذج
mse = mean_squared_error(y_test, model.predict(x_test))
r2 = r2_score(y_test, model.predict(x_test))
print(f"Mean Squared Error: {mse:.2f}")
print(f"R2 Score: {r2:.2f}")

3. توليد التوضيحات باستخدام SHAP-IQ:

سنختار مثيلًا محددًا من مجموعة الاختبار (instance_id = 7) لشرح كيفية وصول النموذج إلى تنبؤه:

# تحديد مثيل محدد
instance_id = 7
x_explain = x_test[instance_id]
y_true = y_test[instance_id]
y_pred = model.predict(x_explain.reshape(1, -1))[0]
print(f"Instance {instance_id}, True Value: {y_true}, Predicted Value: {y_pred}")
for i, feature in enumerate(feature_names):
    print(f"{feature}: {x_explain[i]}")

ثم نستخدم SHAP-IQ لتوليد التوضيحات لترتيبات التفاعل المختلفة (الترتيب الأول، الثاني، وجميع التفاعلات):

import shapiq
from tqdm.asyncio import tqdm

# توليد التوضيحات لترتيبات التفاعل المختلفة
feature_names = list(X.columns)
n_features = len(feature_names)
si_order: dict[int, shapiq.InteractionValues] = {}
for order in tqdm([1, 2, n_features]):
    index = "k-SII" if order > 1 else "SV"
    explainer = shapiq.TreeExplainer(model=model, max_order=order, index=index)
    si_order[order] = explainer.explain(x=x_explain)

4. أنواع الرسوم البيانية لتفسير النتائج:

يوفر SHAP-IQ عدة أنواع من الرسوم البيانية لتفسير النتائج:

4.1 رسم القوى (Force Plot):

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

sv = si_order[1]
si = si_order[2]
mi = si_order[n_features]
sv.plot_force(feature_names=feature_names, show=True)
si.plot_force(feature_names=feature_names, show=True)
mi.plot_force(feature_names=feature_names, show=True)

4.2 رسم الشلال (Waterfall Plot):

يُظهر هذا الرسم تأثير كل ميزة على التنبؤ بشكل تراكمي.

sv.plot_waterfall(feature_names=feature_names, show=True)
si.plot_waterfall(feature_names=feature_names, show=True)
mi.plot_waterfall(feature_names=feature_names, show=True)

4.3 رسم الشبكة (Network Plot):

يعرض هذا الرسم التفاعلات بين الميزات.

si.plot_network(feature_names=feature_names, show=True)
mi.plot_network(feature_names=feature_names, show=True)

4.4 رسم الرسم البياني للتفاعلات (SI Graph Plot):

يعرض هذا الرسم التفاعلات بين الميزات بشكل أكثر تفصيلاً.

abbrev_feature_names = shapiq.plot.utils.abbreviate_feature_names(feature_names)
sv.plot_si_graph(feature_names=abbrev_feature_names, show=True, size_factor=2.5, node_size_scaling=1.5, plot_original_nodes=True)
si.plot_si_graph(feature_names=abbrev_feature_names, show=True, size_factor=2.5, node_size_scaling=1.5, plot_original_nodes=True)
mi.plot_si_graph(feature_names=abbrev_feature_names, show=True, size_factor=2.5, node_size_scaling=1.5, plot_original_nodes=True)

4.5 رسم الشريط (Bar Plot):

يُلخص هذا الرسم أهمية كل ميزة بشكل عام.

explanations = []
explainer = shapiq.TreeExplainer(model=model, max_order=2, index="k-SII")
for instance_id in tqdm(range(20)):
    x_explain = x_test[instance_id]
    si = explainer.explain(x=x_explain)
    explanations.append(si)
shapiq.plot.bar_plot(explanations, feature_names=feature_names, show=True)

5. الخلاصة:

تُعد SHAP-IQ أداة قوية لفهم كيفية عمل نماذج التعلم الآلي. تتيح هذه المكتبة توليد توضيحات مرئية تساعد في تحديد أهم الميزات وتفاعلاتها، مما يُسهم في تحسين دقة النماذج وقابلية تفسيرها.

المصدر: MarkTechPost