کتابخانه 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) میتوان عملکرد مدل را در تشخیص کلاسهای اقلیت بهطور چشمگیری بهبود داد.
آیا این مطلب برای شما مفید بود ؟




