اهمیت ویژگی‌ های مدل در یادگیری ماشین یکی از مباحث کلیدی است که به درک بهتر عملکرد الگوریتم‌ها کمک می‌کند. وقتی صحبت از ساخت مدل‌های هوش مصنوعی می‌شود، نمی‌توان تنها به دقت پیش‌بینی اکتفا کرد. باید بدانیم کدام ویژگی‌ها بیشترین تاثیر را بر نتایج دارند. این شناخت به بهبود مدل، کاهش پیچیدگی و افزایش اعتماد کاربران کمک می‌کند. در این مقاله با 10 روش ساده پایتونی برای محاسبه اهمیت ویژگی‌های مدل آشنا می‌شوید که هر کدام در یک خط کد قابل پیاده‌سازی هستند.

چرا اهمیت ویژگی مهم است؟

قبل از پرداختن به کدها، بهتر است بدانیم چرا باید اهمیت ویژگی‌ها را بسنجیم. در یادگیری ماشین، داده‌ها شامل ستون‌های مختلفی هستند که به آن‌ها ویژگی می‌گویند. همه این ویژگی‌ها تاثیر یکسانی بر پیش‌بینی ندارند. برخی بسیار موثرند و برخی دیگر تقریبا بی‌تاثیر. شناسایی ویژگی‌های مهم باعث می‌شود بتوانیم مدل را ساده‌تر کنیم، سرعت آموزش را افزایش دهیم و از بیش‌برازش جلوگیری کنیم. علاوه بر این، درک اینکه چرا مدل یک پیش‌بینی خاص را انجام داده، برای کسب‌وکارها و محققان حیاتی است.

اهمیت ویژگی داخلی در مدل‌های درختی

مدل‌های مبتنی بر درخت تصمیم مانند Random Forest و XGBoost به طور پیش‌فرض اهمیت ویژگی‌ها را محاسبه می‌کنند. این مدل‌ها دارای یک ویژگی داخلی هستند که لیست اهمیت ویژگی‌ها را برمی‌گرداند. برای دسترسی به این اطلاعات کافی است از کد زیر استفاده کنید:

importances = model.feature_importances_

این خط کد یک آرایه از اعداد برمی‌گرداند که هر عدد نشان‌دهنده اهمیت یک ویژگی است. اگر می‌خواهید نتایج را خواناتر کنید، می‌توانید نام ویژگی‌ها را هم اضافه کنید:

print("Feature importances:", list(zip(iris.feature_names, model.feature_importances_)))

این روش برای مدل‌های درختی بسیار سریع و موثر است و نیازی به محاسبات اضافی ندارد.

ضرایب در مدل‌های خطی

مدل‌های خطی مانند رگرسیون خطی و رگرسیون لجستیک نیز اطلاعاتی درباره اهمیت ویژگی‌ها در اختیار ما قرار می‌دهند. در این مدل‌ها، ضرایب آموخته شده نشان می‌دهند هر ویژگی چقدر بر پیش‌بینی تاثیر دارد. برای دسترسی به این ضرایب از کد زیر استفاده کنید:

importances = abs(model.coef_[0])

استفاده از مقدار مطلق ضروری است چون ما فقط به میزان تاثیر علاقه‌مندیم نه جهت آن. این روش برای مدل‌های ساده و قابل تفسیر بسیار مناسب است و می‌تواند درک خوبی از روابط خطی بین ویژگی‌ها و هدف ارائه دهد.

مرتب سازی ویژگی‌ها بر اساس اهمیت

پس از محاسبه اهمیت ویژگی‌ها، معمولا می‌خواهیم آن‌ها را مرتب کنیم تا بهترین‌ها را شناسایی کنیم. این کار با یک خط کد ساده انجام می‌شود:

sorted_features = sorted(zip(features, importances), key=lambda x: x[1], reverse=True)

این کد ویژگی‌ها را به همراه مقادیر اهمیت‌شان به صورت نزولی مرتب می‌کند. نتیجه یک لیست است که بالاترین ویژگی‌ها در ابتدای آن قرار دارند. این روش برای تحلیل سریع و تصمیم‌گیری درباره حذف یا نگهداری ویژگی‌ها بسیار کاربردی است.

اهمیت جایگشتی مستقل از مدل

روش اهمیت جایگشتی یک تکنیک قدرتمند و مستقل از نوع مدل است. در این روش، مقادیر یک ویژگی به صورت تصادفی جابجا می‌شوند و سپس کاهش عملکرد مدل اندازه‌گیری می‌شود. هرچه کاهش عملکرد بیشتر باشد، ویژگی مهم‌تر است. کتابخانه scikit-learn این قابلیت را به راحتی فراهم می‌کند:

from sklearn.inspection import permutation_importance
result = permutation_importance(model, X, y).importances_mean

این روش برای هر نوع مدلی کار می‌کند و نتایج قابل اعتمادی ارائه می‌دهد. مزیت آن این است که به ساختار داخلی مدل وابسته نیست و می‌توان آن را برای مدل‌های پیچیده نیز به کار برد.

جایگشت در اعتبارسنجی متقاطع

برای ارزیابی دقیق‌تر، می‌توان اهمیت جایگشتی را در بستر اعتبارسنجی متقاطع انجام داد. این کار نشان می‌دهد که جابجایی هر ویژگی چگونه بر عملکرد مدل در چندین fold تاثیر می‌گذارد:

import numpy as np
from sklearn.model_selection import cross_val_score
importances = [(cross_val_score(model, X.assign(**{f: np.random.permutation(X[f])}), y).mean()) for f in X.columns]

این روش زمان‌بر است اما نتایج پایدارتری ارائه می‌دهد. با این کد می‌توانید اطمینان حاصل کنید که اهمیت ویژگی‌ها در شرایط مختلف نمونه‌برداری نیز ثابت است.

نمایش بصری با کتابخانه Eli5

Eli5 یک کتابخانه عالی برای توضیح مدل‌های یادگیری ماشین است. نام آن مخفف عبارت Explain Like I am 5 یعنی طوری توضیح بده که یک بچه 5 ساله بفهمد. این کتابخانه خروجی‌های بصری و تعاملی ارائه می‌دهد:

import eli5
eli5.show_weights(model, feature_names=features)

خروجی این کد یک نمایش HTML است که در نوت‌بوک‌های Jupyter به خوبی نشان داده می‌شود. این روش برای ارائه نتایج به افراد غیرفنی و تصمیم‌گیرندگان کسب‌وکار مناسب است.

اهمیت کلی SHAP

SHAP یکی از محبوب‌ترین و قدرتمندترین ابزارها برای توضیح مدل‌های یادگیری ماشین است. این کتابخانه بر پایه نظریه بازی شکل گرفته و اهمیت ویژگی‌ها را به صورت منصفانه محاسبه می‌کند:

import numpy as np
import shap
shap_values = shap.TreeExplainer(model).shap_values(X)
importances = np.abs(shap_values).mean(0)

مقادیر SHAP نشان می‌دهند هر ویژگی چقدر به پیش‌بینی نهایی کمک می‌کند. میانگین مقدار مطلق این مقادیر معیاری برای اهمیت کلی ویژگی‌ها است.

نمودار خلاصه SHAP

علاوه بر اهمیت کلی، SHAP می‌تواند نمودار خلاصه‌ای ارائه دهد که هم اهمیت و هم جهت تاثیر ویژگی‌ها را نشان می‌دهد:

shap.summary_plot(shap_values, X)

این نمودار به شما می‌گوید که مقادیر بالا یا پایین هر ویژگی چطور بر پیش‌بینی تاثیر می‌گذارند. رنگ‌ها نشان‌دهنده مقدار ویژگی و موقعیت افقی نشان‌دهنده میزان تاثیر است.

توضیح پیش‌بینی تکی با SHAP

یکی از ویژگی‌های جذاب SHAP توانایی توضیح پیش‌بینی‌های فردی است. به این ترتیب می‌توانید ببینید چرا مدل برای یک نمونه خاص پیش‌بینی خاصی انجام داده:

shap.force_plot(shap.TreeExplainer(model).expected_value, shap_values[0], X.iloc[0])

این کد یک نمودار تعاملی تولید می‌کند که نشان می‌دهد هر ویژگی چقدر پیش‌بینی را به سمت بالا یا پایین هل داده است. این برای تحلیل موارد خاص و یافتن دلایل پیش‌بینی‌های غیرمنتظره بسیار مفید است.

اهمیت ویژگی محلی با LIME

LIME جایگزین دیگری برای SHAP است که توضیحات محلی ارائه می‌دهد. این کتابخانه یک مدل ساده جایگزین برای هر پیش‌بینی می‌سازد:

from lime.lime_tabular import LimeTabularExplainer
exp = LimeTabularExplainer(X.values, feature_names=features).explain_instance(X.iloc[0], model.predict_proba)

LIME و SHAP مکمل یکدیگرند و استفاده از هر دو می‌تواند دید جامع‌تری از رفتار مدل ارائه دهد. LIME برای مدل‌های طبقه‌بندی با احتمالات خروجی بسیار مناسب است.

نکات عملی برای استفاده از این روش‌ها

انتخاب روش مناسب برای محاسبه اهمیت ویژگی‌های مدل به نوع مدل و هدف شما بستگی دارد. اگر از مدل‌های درختی استفاده می‌کنید، روش داخلی سریع‌ترین گزینه است. برای مدل‌های پیچیده‌تر، SHAP و LIME گزینه‌های قدرتمندی هستند. اهمیت جایگشتی برای هر مدلی کار می‌کند اما زمان‌بر است. بهتر است چند روش را امتحان کنید و نتایج را با هم مقایسه کنید. این کار به شما اطمینان بیشتری می‌دهد که ویژگی‌های واقعا مهم را شناسایی کرده‌اید.

تفاوت بین توضیح پذیری و تفسیرپذیری

در یادگیری ماشین، توضیح پذیری به توانایی توصیف ساختار داخلی مدل اشاره دارد. تفسیرپذیری به این موضوع می‌پردازد که انسان‌ها چقدر می‌توانند روابط بین ورودی‌ها و خروجی‌ها را درک کنند. اهمیت ویژگی‌های مدل پلی بین این دو مفهوم است. وقتی می‌دانیم کدام ویژگی‌ها مهم‌تر هستند، هم ساختار مدل را بهتر درک می‌کنیم و هم می‌توانیم تصمیمات آن را توجیه کنیم. این برای کاربردهای حساس مانند پزشکی و مالی بسیار حیاتی است.

کاربردهای عملی اهمیت ویژگی

در دنیای واقعی، اهمیت ویژگی‌ های مدل در یادگیری ماشین کاربردهای زیادی دارد. در بانک‌ها برای تشخیص تقلب استفاده می‌شود تا مشخص شود کدام رفتارها مشکوک‌تر هستند. در بازاریابی کمک می‌کند بفهمیم کدام ویژگی‌های مشتری بیشتر به خرید منجر می‌شود. در پزشکی می‌تواند نشان دهد کدام علائم برای تشخیص بیماری مهم‌ترند. همه این کاربردها نیاز به درک دقیق تاثیر هر ویژگی دارند و روش‌های معرفی شده در این مقاله ابزارهای مناسبی برای این کار هستند.

جمع بندی

در این مقاله با 10 روش مختلف برای محاسبه اهمیت ویژگی‌ های مدل در یادگیری ماشین آشنا شدید. از روش‌های ساده داخلی مدل‌های درختی گرفته تا تکنیک‌های پیشرفته مانند SHAP و LIME. هر کدام از این روش‌ها مزایا و محدودیت‌های خاص خود را دارند. استفاده ترکیبی از چند روش می‌تواند دید جامع‌تری از رفتار مدل ارائه دهد. با این ابزارها دیگر نیازی نیست مدل‌های یادگیری ماشین را جعبه سیاه ببینید. می‌توانید دقیقا بفهمید چه اتفاقی در درون آن‌ها می‌افتد و چرا پیش‌بینی‌های خاصی انجام می‌شود.