ویژگی تصویر

معرفی کتابخانه imbalanced-learn در پایتون

  /  پایتون   /  کتابخانه imbalanced-learn در پایتون
بنر تبلیغاتی الف

در مسائل طبقه‌بندی واقعی اغلب با مجموعه‌داده‌های نامتوازن (imbalanced datasets) روبه‌رو می‌شویم؛ یعنی تعداد نمونه‌های یک یا چند کلاس به‌مراتب کمتر از بقیه است. کتابخانه imbalanced-learn (یا imblearn) یک کتابخانهٔ تخصصی در اکوسیستم پایتون است که ابزارهایی برای رفع مشکل نامتوازنی فراهم می‌کند. این کتابخانه مکمل scikit-learn است و روش‌های نمونه‌سازی (oversampling، undersampling)، تکنیک‌های ترکیبی و استراتژی‌های پیشرفته‌تری ارائه می‌دهد که بهبود عملکرد مدل‌ها در برابر کلاس‌های اقلیت را هدف دارند.

چرا باید از imbalanced-learn استفاده کنیم؟

  • افزایش کارایی مدل‌ها در تشخیص کلاس‌های اقلیت (مثلاً تشخیص تقلب یا بیماری‌های نادر).
  • پیشگیری از بایاس مدل نسبت به کلاس اکثریت.
  • ارائه ابزارهای ساده و سازگار با pipelineهای scikit-learn برای جلوگیری از نشت داده (data leakage).

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

برای ارزیابی مدل‌ها در داده‌های نامتوازن باید از معیارهایی فراتر از دقت (accuracy) استفاده کنیم. معیارهایی مانند precision، recall، F1-score، AUC-ROC و به‌خصوص Precision-Recall AUC یا balanced accuracy برای این کاربردها مناسب‌ترند. همچنین هنگام آماده‌سازی داده باید از stratified cross-validation یا pipeline استفاده شود تا نمونه‌برداری قبل از تقسیم‌بندی داده باعث نشت اطلاعات نشود.

روش‌های رایج در imbalanced-learn

  • Oversampling: تولید نمونه‌های مصنوعی برای کلاس اقلیت مثل SMOTE، ADASYN.
  • Undersampling: حذف نمونه از کلاس اکثریت مثل RandomUnderSampler، NearMiss.
  • Hybrid: ترکیب oversampling و undersampling مثل SMOTEENN، SMOTETomek.
  • Ensemble: تکنیک‌های مبتنی بر چندمدل که تعادل را با نمونه‌سازی در هر عضو حفظ می‌کنند (مثل BalancedRandomForest).

نمونه کد: استفاده از SMOTE در یک pipeline

from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=20, 
                           n_informative=2, n_redundant=10,
                           weights=[0.95], flip_y=0, random_state=42)

pipeline = Pipeline([
    ('smote', SMOTE(random_state=42)),
    ('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(pipeline, X, y, scoring='f1', cv=cv, n_jobs=-1)
print("F1 scores:", scores)
print("Mean F1:", scores.mean())

توضیح: در این مثال ابتدا یک مجموعه‌دادهٔ شبیه‌سازی‌شده با عدم تعادل شدید ساخته‌ایم. سپس یک pipeline تعریف کرده‌ایم که ابتدا SMOTE نمونه‌های کلاس اقلیت را تولید می‌کند و بعد مدل RandomForest آموزش می‌یابد. استفاده از pipeline و اجرای cross_val_score با StratifiedKFold باعث می‌شود نمونه‌سازی فقط روی داده‌های آموزشی هر fold انجام شود و از نشت اطلاعات جلوگیری شود. معیار ارزیابی F1 انتخاب شده زیرا در داده‌های نامتوازن مناسب‌تر است.

نمونه کد: ترکیب SMOTE و RandomUnderSampler (SMOTEENN)

from imblearn.combine import SMOTEENN
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2,
                                                    stratify=y,
                                                    random_state=42)

sampler = SMOTEENN(random_state=42)
X_res, y_res = sampler.fit_resample(X_train, y_train)

clf = LogisticRegression(max_iter=1000)
clf.fit(X_res, y_res)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

توضیح: SMOTEENN یک روش ترکیبی است که ابتدا SMOTE نمونه‌های اقلیت را تولید می‌کند و سپس با استفاده از روش ENN (Edited Nearest Neighbors) نمونه‌های سر و صدا را حذف می‌کند. در این کد نمونه‌سازی روی مجموعهٔ آموزشی انجام شده و سپس مدل رگرسیون لجستیک آموزش یافته و عملکرد آن روی تست ارزیابی شده است. استفاده از stratify در train_test_split تضمین می‌کند توزیع کلاس‌ها در بخش آموزشی و آزمایشی مشابه بماند.

کاربردهای عملی و نکات تخصصی

  • در مسائل پزشکی که نمونهٔ اقلیت بسیار حیاتی است، oversampling مانند SMOTE می‌تواند حساسیت (recall) را افزایش دهد اما مراقب افزایش نرخ مثبت کاذب باشید.
  • برای داده‌های بسیار بزرگ، undersampling تصادفی ممکن است سریع و قابل قبول باشد؛ اما در صورتی که اطلاعات مهم در نمونه‌های حذف‌شده باشد، از روش‌های هوشمندتر (مثل NearMiss یا cluster-based sampling) استفاده کنید.
  • SMOTE ممکن است باعث تولید نمونه‌های مصنوعی در نواحی نامناسب شود؛ استفاده از SMOTEENN یا SMOTETomek می‌تواند کیفیت نمونه‌ها را بهبود دهد.
  • در مدل‌های درختی می‌توانید از پارامتر class_weight=’balanced’ استفاده کنید اما در برخی موارد ترکیب class_weight و sampling بهتر عمل می‌کند.
  • هنگام استفاده از تکنیک‌های متن‌محور (NLP) یا ویژگی‌های پیچیده، بهتر است نمونه‌سازی روی فضای ویژگی‌های نهایی اعمال شود و از نمونه‌سازی روی توکن‌های خام اجتناب شود.

مقایسهٔ سریع روش‌ها

روشمزیتمعایب
RandomOverSamplerساده و سریعافزایش احتمال overfitting
SMOTEتولید نمونه‌های مصنوعی واقع‌گرایانهممکن است نمونه‌های میان‌مرزی نامناسب بسازد
RandomUnderSamplerسریع و کاهش حجم دادهاز دست رفتن اطلاعات ممکن است
SMOTEENN / SMOTETomekبهبود کیفیت داده پس از ترکیبپیچیده‌تر و زمان‌بر

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

  • همیشه از pipeline استفاده کنید تا نمونه‌سازی داخل هر fold انجام شود.
  • برای انتخاب مدل و پارامترها از متریک‌های مرتبط با دادهٔ نامتوازن استفاده کنید (مثلاً F1 یا PR-AUC).
  • برای مجموعه‌داده‌های کوچک، احتیاط کنید: oversampling ممکن است منجر به overfitting شود؛ در این حالت اعتبارسنجی قوی و استفاده از regularization اهمیت دارد.
  • برای مشکلات چندکلاسه نامتوازن، imblearn ابزارهایی برای oversampling هر کلاس اقلیت به‌صورت جداگانه دارد.

نتیجه‌گیری

کتابخانه imbalanced-learn ابزار قدرتمندی برای مقابله با عدم تعادل داده‌هاست. انتخاب روش مناسب بستگی به اندازهٔ داده، ماهیت ویژگی‌ها و خطرات overfitting دارد. با رعایت نکات عملی مثل استفاده از pipeline، انتخاب متریک مناسب و آزمایش چند روش مختلف (oversampling، undersampling، hybrid) می‌توان عملکرد مدل را در تشخیص کلاس‌های اقلیت به‌طور چشمگیری بهبود داد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: