← بازگشت به بلاگ

غلبه بر عدم تعادل داده‌ها با الگوریتم SMOTE و پلتفرم هوشی

غلبه بر عدم تعادل داده‌ها با الگوریتم SMOTE و پلتفرم هوشی
\nیکی از چالش‌های اساسی در دنیای یادگیری ماشین، مواجهه با مجموعه داده‌هایی است که توزیع کلاس‌ها در آن‌ها یکسان نیست. در چنین شرایطی، مدل‌های هوش مصنوعی تمایل پیدا می‌کنند تا به سمت کلاس اکثریت سوگیری کرده و عملکرد ضعیفی در شناسایی کلاس اقلیت از خود نشان دهند. الگوریتم SMOTE (Synthetic Minority Over-sampling Technique) به عنوان یکی از راه‌حل‌های کارآمد برای مقابله با این مشکل شناخته می‌شود. در این مقاله، به بررسی عمیق‌تر این الگوریتم و نحوه پیاده‌سازی آن با استفاده از ابزارهای مدرن می‌پردازیم.

چرا عدم تعادل داده‌ها یک چالش است؟

عدم تعادل داده‌ها زمانی رخ می‌دهد که تعداد نمونه‌های یک کلاس (کلاس اکثریت) به مراتب بیشتر از کلاس دیگر (کلاس اقلیت) باشد. این نسبت می‌تواند از 1:10 تا حتی 1:1000 یا بیشتر متغیر باشد. این پدیده در بسیاری از کاربردهای واقعی مانند تشخیص تقلب مالی (تراکنش‌های کلاهبردارانه نادر هستند)، تشخیص پزشکی (بیماری‌های نادر)، تشخیص اسپم (ایمیل‌های هرزنامه کمتر از ایمیل‌های عادی) و تشخیص نقص در سیستم‌های صنعتی (خرابی دستگاه‌ها در مقایسه با عملکرد عادی) مشاهده می‌شود.

آشنایی با الگوریتم SMOTE

الگوریتم SMOTE که در سال 2002 معرفی شد، به جای تکرار ساده نمونه‌های موجود (که منجر به بیش‌برازش یا Overfitting می‌شود)، نمونه‌های مصنوعی جدیدی برای کلاس اقلیت تولید می‌کند. این کار از طریق درون‌یابی بین نمونه‌های موجود در فضای ویژگی انجام می‌شود. مراحل اصلی کار SMOTE به شرح زیر است:
  • انتخاب نمونه اقلیت: یک نمونه از کلاس اقلیت به صورت تصادفی انتخاب می‌شود.
  • یافتن نزدیک‌ترین همسایگان: با استفاده از الگوریتم k-نزدیک‌ترین همسایه (KNN)، k همسایه نزدیک به نمونه انتخابی در فضای ویژگی پیدا می‌شوند (معمولاً k=5).
  • تولید نمونه مصنوعی: یکی از همسایگان به صورت تصادفی انتخاب شده و نمونه مصنوعی جدید در امتداد خط بین نمونه اصلی و همسایه انتخاب شده ایجاد می‌شود. فرمول آن به صورت \(x_{new} = x_i + \lambda \times (x_k - x_i)\) است، که \(\lambda\) عددی تصادفی بین 0 و 1 است.
  • تکرار: این فرآیند تا رسیدن به تعادل مطلوب بین کلاس‌ها تکرار می‌شود.
تفاوت اصلی SMOTE با روش‌های سنتی مانند نمونه‌برداری تصادفی ساده، در ایجاد تنوع بیشتر در داده‌های آموزشی و کاهش بیش‌برازش است.

پیاده‌سازی SMOTE با هوشی

برای پیاده‌سازی الگوریتم SMOTE و استفاده از آن در پروژه‌های یادگیری ماشین، می‌توانید از پلتفرم هوشی (hooshi.net) بهره ببرید. هوشی امکانات لازم برای مدیریت و پردازش داده‌ها را فراهم می‌کند. ابتدا، کتابخانه‌های مورد نیاز را نصب کنید:

pip install imbalanced-learn numpy pandas scikit-learn matplotlib
سپس، می‌توانید با استفاده از کد زیر، SMOTE را پیاده‌سازی کنید. در هوشی، شما می‌توانید به راحتی این کدها را در محیط‌های توسعه خود اجرا کرده و نتایج را مشاهده نمایید. برای شروع، کافیست در هوشی ثبت‌نام کنید.

import numpy as np
import pandas as pd
from collections import Counter
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from imblearn.over_sampling import SMOTE

# ایجاد مجموعه داده نامتعادل
X, y = make_classification(
    n_samples=10000, n_features=20, n_informative=15, n_redundant=5,
    n_classes=2, weights=[0.95, 0.05], random_state=42
)

print("توزیع کلاس‌ها قبل از SMOTE:", Counter(y))

# تقسیم داده به آموزش و آزمون
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# اعمال SMOTE فقط روی داده‌های آموزشی
smote = SMOTE(sampling_strategy='auto', k_neighbors=5, random_state=42)
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)

print("\nتوزیع کلاس‌ها بعد از SMOTE:", Counter(y_train_resampled))

# آموزش مدل بدون SMOTE
model_without_smote = LogisticRegression(random_state=42)
model_without_smote.fit(X_train, y_train)
y_pred_without = model_without_smote.predict(X_test)

# آموزش مدل با SMOTE
model_with_smote = LogisticRegression(random_state=42)
model_with_smote.fit(X_train_resampled, y_train_resampled)
y_pred_with = model_with_smote.predict(X_test)

print("\n=== نتایج بدون SMOTE ===")
print(classification_report(y_test, y_pred_without))

print("\n=== نتایج با SMOTE ===")
print(classification_report(y_test, y_pred_with))
برای استفاده پیشرفته‌تر و جلوگیری از نشت داده (data leakage)، توصیه می‌شود SMOTE را در یک پایپ‌لاین (Pipeline) قرار دهید. این کار اطمینان حاصل می‌کند که نمونه‌سازی مصنوعی تنها بر روی داده‌های آموزشی در طول اعتبارسنجی متقاطع اعمال می‌شود.

معیارهای ارزیابی مناسب برای داده‌های نامتعادل

در مجموعه داده‌های نامتعادل، معیار دقت (Accuracy) به تنهایی کافی نیست. معیارهای بهتر شامل موارد زیر هستند:
  • دقت (Precision): نسبت موارد مثبت پیش‌بینی شده که واقعاً مثبت هستند.
  • بازخوانی (Recall): نسبت موارد مثبت واقعی که به درستی شناسایی شده‌اند.
  • امتیاز F1: میانگین هارمونیک دقت و بازخوانی، که تعادل بین این دو را نشان می‌دهد.
  • منحنی ROC و AUC: ارزیابی عملکرد کلی مدل در سطوح مختلف آستانه.
  • ماتریس درهم‌ریختگی (Confusion Matrix): نمایش جزئیات پیش‌بینی‌های صحیح و غلط.
انتخاب معیار مناسب بستگی به کاربرد دارد؛ برای مثال، در تشخیص تقلب، بازخوانی بالا اولویت دارد، در حالی که برای تشخیص اسپم، دقت بالا مهم‌تر است.

چرا هوشی؟

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