مجموعات البيانات غير المتوازنة: استراتيجيات شاملة للتعامل معها بفعالية

فهم مجموعات البيانات غير المتوازنة، تجنب مزالق الدقة وتطبيق التقنيات الصحيحة لإعادة أخذ العينات والترجيح والتحقق.

مجموعات البيانات غير المتوازنة: استراتيجيات شاملة للتعامل معها بفعالية

في العديد من مشاريع الذكاء الاصطناعي، لا تكون البيانات موزعة بشكل متوازن بين الفئات. قد يبدو النموذج فعالاً بينما يكون غير مفيد في الممارسة العملية. تُعرف هذه الظاهرة باسم اختلال توازن الفئات، وهي تؤثر على مجالات حيوية مثل كشف الاحتيال أو التشخيص الطبي. دعونا نكتشف معاً كيفية تحديد هذه المشكلة وحلها خطوة بخطوة.

ما هي مجموعة البيانات غير المتوازنة ولماذا تشكل مشكلة؟

تكون مجموعة البيانات غير متوازنة عندما تمثل فئة واحدة (الأغلبية) الغالبية العظمى من الأمثلة، بينما تكون الفئة الأخرى (الأقلية) نادرة. على سبيل المثال، في اكتشاف الاحتيال البنكي، أقل من 0,5 % من المعاملات تكون احتيالية. وبالمثل، فإن اكتشاف الأمراض النادرة، والتنبؤ بترك العملاء، وتصفية البريد المزعج أو تحديد العيوب الصناعية غالبًا ما تقدم نسب 1:100 أو أكثر.

يغش النموذج بسهولة حينها: من خلال التنبؤ دائمًا بالفئة الأغلبية، يحصل على دقة عالية بينما يفوت بشكل منهجي الحالات النادرة التي تهمنا فعليًا.

فخ الدقة والمقاييس التي يجب تفضيلها

تقيس الدقة (accuracy) نسبة التنبؤات الصحيحة العامة. على مجموعة بيانات تحتوي على 99% من الفئة الرئيسية، يحقق النموذج الذي يتنبأ دائمًا بهذه الفئة دقة 99% دون اكتشاف أي شيء. لذلك يجب النظر إلى مصفوفة الالتباس، والدقة (نسبة الإيجابيات الحقيقية من بين الإيجابيات المتوقعة)، والاستدعاء (نسبة الإيجابيات الحقيقية المكتشفة) ودرجة F1 التي تجمعهما.

غالبًا ما تكون PR-AUC أكثر إفادة من ROC-AUC عندما تكون الفئات غير متوازنة جدًا. كما يصحح كل من الدقة المتوازنة (balanced accuracy) ومعامل كابا لكوهين (Cohen's kappa) التأثير العشوائي. يُفضل الاستدعاء عندما تكون السلبيات الكاذبة مكلفة (مرض فائت) والدقة عندما تكون الإيجابيات الكاذبة مكلفة (إنذار كاذب).

تقنيات إعادة أخذ العينات: oversampling و undersampling

يتكون الـoversampling من زيادة الفئة الأقلية. يعرّض النسخ البسيط لخطر الإفراط في التعلم؛ ينشئ SMOTE أمثلة اصطناعية بالاستيفاء، ويكيّف ADASYN الكثافة حسب درجة الصعوبة، بينما يركز Borderline-SMOTE على الحدود.

يقلل الـundersampling من الفئة الأكثرية. تتيح طرق random و Tomek links (التي تحذف الأزواج القريبة) و NearMiss و ENN (Edited Nearest Neighbours) تنظيف الأمثلة الزائدة أو المشوشة.

غالبًا ما توفر التركيبات مثل SMOTETomek أو SMOTEENN أفضل حل وسط، لكن يجب الحذر من خطر الـoverfitting مع الـoversampling ومن فقدان المعلومات مع الـundersampling.

الأساليب على مستوى الخوارزميات

تقبل العديد من الخوارزميات معامل class_weight الذي يعاقب الأخطاء على الفئة الأقلية بشكل أقوى. كما يمكن نقل عتبة القرار (threshold moving) بعد التدريب لتحسين الاستدعاء أو الدقة حسب المجال.

تقلل الـ focal loss، المستخدمة خاصة في كشف الكائنات، من تأثير الأمثلة السهلة وتركز التعلم على الحالات الصعبة للفئة النادرة.

الأساليب التجميعية المتكيفة مع البيانات غير المتوازنة

تجمع المناهج التجميعية بين عدة نماذج مدربة على مجموعات فرعية متوازنة. يعيد BalancedRandomForest توازن كل شجرة باستخدام undersampling. يطبق EasyEnsemble وRUSBoost عملية random undersampling قبل التعزيز. ينشئ Balanced Bagging عدة مجموعات فرعية متوازنة عبر bootstrap. تقلل هذه الطرق من التباين مع تحسين اكتشاف الفئة الأقلية.

متى يُعتمد إطار كشف الشذوذ

عندما تمثل الفئة النادرة أقل من 1٪ من البيانات، يقترب المشكل من كشف الشذوذ. تتعلم خوارزميات Isolation Forest وOne-Class SVM أو autoencodeurs توزيع الفئة السائدة فقط وتشير إلى النقاط التي تبتعد عنها بشدة، دون الحاجة إلى أمثلة إيجابية أثناء التدريب.

أفضل ممارسات التحقق وخطوط الأنابيب دون تسرب البيانات

لا ينبغي تطبيق إعادة أخذ العينات (resampling) أبدًا على مجموعة الاختبار أو التحقق، وإلا سيحدث تسرب للبيانات. استخدم دائمًا stratified k-fold للحفاظ على نسبة الفئات في كل طية. تقدم مكتبة imbalanced-learn خطوط أنابيب Pipeline متوافقة مع scikit-learn تطبق SMOTE حصريًا على طيات التدريب.

مثال عملي على كود Python باستخدام imbalanced-learn

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

X, y = make_classification(n_classes=2, weights=[0.95, 0.05],
                           n_informative=4, flip_y=0, n_samples=5000,
                           random_state=42)

pipe = Pipeline([
    ('smote', SMOTE(random_state=42)),
    ('clf', RandomForestClassifier(class_weight='balanced', random_state=42))
])

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
y_pred = cross_val_predict(pipe, X, y, cv=cv)
print(classification_report(y, y_pred))

يوضح هذا المثال كيفية الجمع بين SMOTE وترجيح الفئات والتحقق المتقاطع الطبقي ضمن خط أنابيب آمن.

  • تحقق دائمًا من توزيع الفئات قبل النمذجة
  • اختر المقاييس بناءً على التكلفة التجارية للأخطاء
  • طبق إعادة أخذ العينات فقط على بيانات التدريب
  • قارن بين عدة تقنيات (SMOTE، class_weight، العتبات)
  • استخدم خطوط أنابيب imblearn لتجنب التسربات
  • تحقق باستخدام stratified k-fold و PR-AUC

من خلال تطبيق هذه الممارسات الجيدة، ستحول نموذجًا «يغش» إلى نظام مفيد حقًا للكشف عن الحالات النادرة. اختبر النهج المختلفة تدريجيًا على بياناتك وقم بقياس التأثير الفعلي على مقياسك التجاري الرئيسي.

💬 هل لديك سؤال أو تريد التعمق أكثر؟ انضم إلى المجتمع على Discord : https://discord.gg/GwhUKccQcM