مقدمه: درک بصری مدلهای یادگیری ماشین با SHAP-IQ
در دنیای پیچیده یادگیری ماشین، مدلها اغلب به جعبههای سیاه تبدیل میشوند، جایی که ورودیها پردازش شده و خروجیها تولید میشوند، اما چگونگی رسیدن به این پیشبینیها نامفهوم میماند. برای رفع این چالش، ابزارهای تفسیرپذیری مانند SHAP-IQ توسعه یافتهاند. این آموزش به بررسی عمیق ابزارهای بصریسازی ارائهشده توسط SHAP-IQ میپردازد که میتواند بینشهای عمیقی در مورد نحوه عملکرد مدلهای یادگیری ماشین ارائه دهد.
هدف اصلی SHAP-IQ، تجزیه و تحلیل پیشبینیهای پیچیده مدل به مؤلفههای قابل تفسیر است. این کار با آشکار کردن سهم فردی هر ویژگی و همچنین مشارکتهای تعاملی بین ویژگیها در یک پیشبینی خاص انجام میشود. با استفاده از این بصریسازیها، متخصصان داده میتوانند به درک بهتری از دلایل پشت خروجیهای مدل دست یابند، که این امر برای اعتمادسازی، اعتبارسنجی مدل و رفع خطاهای احتمالی بسیار حیاتی است.
این ابزارها نه تنها به شفافیت مدل کمک میکنند، بلکه امکان شناسایی ویژگیهای مهم، درک روابط پیچیده بین آنها، و حتی کشف سوگیریهای ناخواسته در مدل را نیز فراهم میآورند. در ادامه، گام به گام به بررسی نحوه نصب وابستگیها، آمادهسازی دادهها، آموزش مدل، و در نهایت، نحوه استفاده از انواع مختلف نمودارهای SHAP-IQ برای تفسیر نتایج مدل خواهیم پرداخت.
نصب وابستگیها و آمادهسازی محیط
قبل از کاوش بصریسازیهای SHAP-IQ، لازم است که کتابخانههای مورد نیاز را نصب کنیم. این کتابخانهها شامل shapiq
، overrides
، scikit-learn
، pandas
، numpy
و seaborn
هستند. اطمینان حاصل کنید که محیط پایتون شما برای نصب این پکیجها آماده است.
!pip install shapiq overrides scikit-learn pandas numpy seaborn
پس از نصب، ماژولهای اصلی مانند RandomForestRegressor
، mean_squared_error
، r2_score
، train_test_split
و tqdm
را وارد میکنیم. همچنین، shapiq
نیز برای استفاده از قابلیتهای آن وارد میشود. نسخه shapiq
نیز برای اطمینان از سازگاری بررسی میشود.
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from tqdm.asyncio import tqdm
import shapiq
print(f"shapiq version: {shapiq.__version__}")
وارد کردن و پیشپردازش مجموعه داده MPG
در این آموزش، از مجموعه داده MPG (مایل بر گالن) استفاده خواهیم کرد که مستقیماً از کتابخانه Seaborn بارگذاری میشود. این مجموعه حاوی اطلاعاتی در مورد مدلهای مختلف خودروها، از جمله ویژگیهایی مانند اسب بخار، وزن و مبدأ ساخت است.
import seaborn as sns
df = sns.load_dataset("mpg")
df
پیشپردازش دادهها شامل حذف ردیفهای دارای مقادیر گمشده و تبدیل ستون طبقهبندی شده «origin» به فرمت عددی با استفاده از Label Encoding است. این مرحله، دادهها را برای آموزش مدل مناسب میسازد.
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# Drop rows with missing values
df = df.dropna()
# Encoding the origin column
le = LabelEncoder()
df.loc[:, "origin"] = le.fit_transform(df["origin"])
df['origin'].unique()
پس از Label Encoding، نگاشت بین برچسبهای اصلی و مقادیر عددی آنها را بررسی میکنیم. این نگاشت برای تفسیر نتایج مدل در آینده ضروری است و به ما کمک میکند تا مقادیر عددی را به معنای واقعی آنها بازگردانیم.
for i, label in enumerate(le.classes_):
print(f"{label} → {i}")
تقسیم دادهها، آموزش و ارزیابی مدل
پس از آمادهسازی دادهها، آنها را به زیرمجموعههای آموزش و آزمون تقسیم میکنیم. ویژگیها (X) و متغیر هدف (y) (“mpg”) جدا شده، و سپس دادهها با نسبت ۸۰٪ آموزش و ۲۰٪ آزمون تقسیم میشوند. random_state=42
تکرارپذیری تقسیمبندی را تضمین میکند.
# Select features and target
X = df.drop(columns=["mpg", "name"])
y = df["mpg"]
feature_names = X.columns.tolist()
x_data, y_data = X.values, y.values
# Train-test split
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, random_state=42)
مدل RandomForestRegressor
با حداکثر عمق ۱۰ و ۱۰ درخت تصمیم آموزش داده میشود. این مدل با دادههای آموزش متناسب شده تا بتواند پیشبینیها را انجام دهد.
# Train model
model = RandomForestRegressor(random_state=42, max_depth=10, n_estimators=10)
model.fit(x_train, y_train)
در نهایت، عملکرد مدل با Mean Squared Error (MSE)
و R2 Score
ارزیابی میشود. این معیارها دیدگاهی کلی از دقت مدل ارائه داده و نشان میدهند که مدل چقدر خوب توانسته است مقادیر MPG را پیشبینی کند.
# Evaluate
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}")
تفسیر یک نمونه محلی و تولید توضیحات Shapley
برای درک عمیقتر چگونگی رسیدن مدل به پیشبینیهای خاص، نمونهای با instance_id = 7
از مجموعه داده آزمون انتخاب میشود. مقدار واقعی، پیشبینی شده و مقادیر ویژگیهای این نمونه چاپ میشوند تا نقطه شروعی برای تحلیل فراهم شود.
# select a local instance to be explained
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]}")
توضیحات مبتنی بر مقادیر Shapley برای مرتبههای مختلف تعامل (Order 1، Order 2، و Order N) با استفاده از shapiq.TreeExplainer
تولید میشوند. این کار به ما امکان میدهد سهم انفرادی ویژگیها و تعاملات آنها را در پیشبینی مدل بررسی کنیم. هر مرتبه از تعاملات، دیدگاه متفاوتی از رفتار مدل ارائه میدهد.
# create explanations for different orders
feature_names = list(X.columns) # get the feature names
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" # will also be set automatically by the explainer
explainer = shapiq.TreeExplainer(model=model, max_order=order, index=index)
si_order[order] = explainer.explain(x=x_explain)
si_order
۱. نمودار نیروی (Force Chart)
نمودار نیروی یک ابزار بصریسازی قدرتمند است که چگونگی رسیدن مدل به یک پیشبینی خاص را نشان میدهد. این نمودار پیشبینی خط پایه را نمایش داده و سپس نشان میدهد که چگونه هر ویژگی یا تعامل بین آنها، پیشبینی را به سمت بالا یا پایین سوق میدهد. نوارهای قرمز رنگ نشاندهنده افزایش پیشبینی و نوارهای آبی نشاندهنده کاهش آن هستند.
sv = si_order[1] # get the SV
si = si_order[2] # get the 2-SII
mi = si_order[n_features] # get the Moebius transform
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)
هنگام استفاده از مقادیر تعامل Shapley، نمودار نیروی قادر است نه تنها سهم فردی ویژگیها بلکه تعاملات بین آنها را نیز بصریسازی کند. این قابلیت آن را در تفسیر مدلهای پیچیده بسیار مفید میسازد. از اولین نمودار، مشاهده میکنیم که مقدار پایه 23.5 است. ویژگیهایی مانند وزن، سیلندرها، اسب بخار و حجم موتور تأثیر مثبتی بر پیشبینی دارند، در حالی که سال ساخت مدل و شتاب آن را به سمت پایین میکشند.
۲. نمودار آبشار (Waterfall Chart)
نمودار آبشار، مشابه نمودار نیرو، روشی محبوب برای بصریسازی مقادیر Shapley است. این نمودار نشان میدهد که چگونه ویژگیهای مختلف، پیشبینی را نسبت به خط پایه بالا یا پایین میبرند. مزیت اصلی آن، گروهبندی خودکار ویژگیهای با تأثیر کوچک در دسته “دیگر” است، که نمودار را تمیزتر و قابل فهمتر میکند.
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)
این نمودار به صورت پلهای سهم هر ویژگی را در رسیدن از مقدار پایه به مقدار پیشبینی شده نهایی نشان میدهد. افزایشها با قرمز و کاهشها با آبی مشخص میشوند. این شفافیت، برای توضیح پیشبینیهای فردی مدل به ذینفعان غیرمتخصص بسیار مفید است.
۳. نمودار شبکه (Network Plot)
نمودار شبکه چگونگی تعامل ویژگیها را با استفاده از تعاملات Shapley مرتبه اول و دوم نشان میدهد. اندازه گرهها تأثیر فردی ویژگیها را منعکس میکند، در حالی که عرض و رنگ یالها قدرت و جهت تعامل را نمایش میدهند. این نمودار در مواجهه با تعداد زیادی ویژگی مفید است.
si.plot_network(feature_names=feature_names, show=True)
mi.plot_network(feature_names=feature_names, show=True)
این دیدگاه شبکهای به ما امکان میدهد به سرعت مهمترین جفتهای ویژگی که با هم کار میکنند تا بر پیشبینی مدل تأثیر بگذارند را شناسایی کنیم. این امر میتواند به کشف روابط علت و معلولی پنهان یا همبستگیهای غیرخطی کمک کند.
۴. نمودار گرافی SI (SI Graph Plot)
نمودار گرافی SI، توسعهیافتهای از نمودار شبکه است که تمامی تعاملات از مرتبههای بالاتر را به صورت “ابر-یال” نمایش میدهد. اندازه گرهها تأثیر فردی ویژگیها را نشان داده، در حالی که عرض، رنگ، و شفافیت یالها، قدرت و جهت تعاملات را بازتاب میدهند. این ابزار دیدگاه جامعتری از چگونگی تأثیرگذاری مشترک ویژگیها بر پیشبینی مدل ارائه میدهد.
# we abbreviate the feature names since, they are plotted inside the nodes
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,
)
این نمودار برای شناسایی تعاملات پیچیده که شامل سه یا بیشتر ویژگی هستند، بسیار کارآمد است. درک این تعاملات پیچیده میتواند منجر به بهبودهای قابل توجهی در عملکرد مدل و قابلیت تفسیر آن شود. SI Graph Plot ابزاری حیاتی در جعبه ابزار تفسیر مدلهای یادگیری ماشین است.
۵. نمودار میلهای (Bar Plot)
نمودار میلهای برای توضیحات سراسری (global explanations) طراحی شده است. این نمودار اهمیت کلی ویژگیها (یا تعاملات ویژگیها) را با نمایش میانگین مطلق مقادیر Shapley در تمام نمونهها نشان میدهد. در shapiq
، این نمودار برجسته میکند که کدام تعاملات ویژگی بیشترین سهم را در پیشبینی مدل دارند.
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)
با نگاهی به نمودار، “فاصله” و “اسب بخار” تأثیرگذارترین ویژگیها هستند. این از مقادیر بالای میانگین مطلق تعامل Shapley آنها مشهود است. همچنین، ترکیبهای “اسب بخار × وزن” و “فاصله × اسب بخار” تأثیر مشترک قابل توجهی با مشارکت حدود ۱.۴ را نشان میدهند، که بیانگر روابط غیرخطی مهم در مدل است.
نتیجهگیری و منابع بیشتر
در این آموزش، به بررسی جامع بصریسازیهای مختلف SHAP-IQ پرداختیم تا مدلهای یادگیری ماشین را تفسیر کنیم. این ابزارها، از نمودار نیروی تا نمودار میلهای، به شفافیت مدل کمک میکنند و امکان شناسایی نقاط ضعف و قوت مدل، بهبود مهندسی ویژگی، و افزایش اعتماد به تصمیمات مبتنی بر هوش مصنوعی را فراهم میآورند.
قابلیت تفسیرپذیری مدلها در حال تبدیل شدن به یک جنبه حیاتی در توسعه هوش مصنوعی است، به خصوص در حوزههایی که شفافیت و مسئولیتپذیری اهمیت بالایی دارند. این ابزارها نه تنها دقت مدل را افزایش میدهند، بلکه به ایجاد مدلهای قویتر و قابل اعتمادتر نیز کمک میکنند.
برای دسترسی به کدهای کامل و دفترچههای Jupyter Notebook استفاده شده در این آموزش، میتوانید به صفحه گیتهاب ما مراجعه کنید. همچنین، برای دریافت بهروزرسانیها و آخرین اخبار هوش مصنوعی، ما را در توییتر دنبال کنید، به سابردیت ۱۰۰ هزار نفری ما در ML بپیوندید و در خبرنامه ما مشترک شوید.
منبع اصلی: کدهای کامل را از اینجا ببینید.
همچنین، لطفاً صفحه گیتهاب ما برای آموزشها، کدها و دفترچهها را نیز بررسی کنید.
ما را در توییتر دنبال کنید و به سابردیت ۱۰۰ هزار نفری ما در ML بپیوندید.
در خبرنامه ما مشترک شوید.