التصنيف متعدد الفئات: OvA مقابل OvO
“توسيع المصنّفات الثنائية إلى متعددة الفئات — أقواس بطولة للخوارزميات”
استراتيجيات كل واحد مقابل الكل وكل واحد مقابل واحد لتوسيع المصنفات الثنائية — حدود القرار وقابلية التوسع وتطبيقات SVM ومتى تستخدم Softmax.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
مصنِّفات OvA
K مصنِّفات ثنائية، واحد لكل فئة ضد جميع الأخرى — يستلزم K مرات وقت التدريب
مصنِّفات OvO
مصنِّف ثنائي واحد لكل زوج من الفئات — K(K-1)/2 نموذجاً، كل منها يتدرب على فئتين
دالة Softmax
تُطبِّع K لوجيتس إلى توزيع احتمالي — الخرج الطبيعي للتصنيف متعدد الفئات
▶محاكاة تفاعلية
⬡هندسة النموذج
مشكلة التصنيف المتعدد
كثير من المشاكل الحقيقية لها أكثر من فئتين: التعرف على الأرقام (10 فئات)، تصنيف الأنواع (مئات)، تصنيف المنتجات (آلاف). بعض الخوارزميات (الانحدار اللوجستي، SVMs) ثنائية بطبعها. استراتيجيتان تمتدانهما: OvA تُدرب K مصنِّفاً، كل منها يفصل الفئة k عن الباقي. OvO تُدرب K(K-1)/2 مصنِّفاً لكل زوج.
واحد مقابل الكل، واحد مقابل واحد، وSoftmax
OvA: K مصنِّفاً، كل منها يستخدم جميع البيانات. تدريب سريع. غير متوازن (إيجابي واحد مقابل K-1 سلبية). جيد لـK الكبير.
OvO: K(K-1)/2 مصنِّفاً، كل منها يستخدم فئتين فقط. متوازن لكن بطيء لـK الكبير (100 فئة = 4950 مصنِّفاً).
Softmax (LR متعدد الحدود): نموذج واحد، K مخرجاً، مُدرَّب بإنتروبيا تقاطعية. الأكثر كفاءة. أصيل لشبكات الخلايا العصبية.
اصطلاح SVM: OvO هو الافتراضي في sklearn (تاريخياً أداؤه أفضل قليلاً). لشبكات الخلايا العصبية، دائماً Softmax.
التصنيف متعدد الفئات بـSoftmax
import torch import torch.nn as nn from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.multiclass import OneVsRestClassifier, OneVsOneClassifier from sklearn.svm import SVC # ── Sample data ──────────────────────────────────────────────────────── X_np, y_np = make_classification(n_samples=300, n_features=8, n_classes=3, n_informative=6, random_state=42) X_train_np, X_test_np, y_train_np, _ = train_test_split( X_np, y_np, test_size=0.2, random_state=42) # ── PyTorch multiclass setup ─────────────────────────────────────────── K = 3 # number of classes batch = 16 # Tiny 2-layer net for the demo class SimpleNet(nn.Module): def __init__(self): super().__init__(); self.fc = nn.Linear(8, K) def forward(self, x): return self.fc(x) model = SimpleNet() x = torch.randn(batch, 8) # one mini-batch y = torch.randint(0, K, (batch,)) # class indices # Class weights (handle imbalance) class_weights = torch.tensor([1.0, 2.0, 1.5]) # weight rarer classes higher # Softmax + Cross-Entropy (combined for numerical stability) criterion = nn.CrossEntropyLoss( weight=class_weights, # For imbalanced classes label_smoothing=0.1 # Prevents overconfident predictions ) # Model outputs raw logits (no softmax in forward pass) logits = model(x) # Shape: (batch, K) loss = criterion(logits, y) # y contains class indices print(f"Multiclass CE loss: {loss.item():.4f}") # Predictions probs = torch.softmax(logits, dim=-1) preds = probs.argmax(dim=-1) # Sklearn: OvR (OvA) strategy ovr = OneVsRestClassifier(SVC(kernel='rbf', probability=True)) ovo = OneVsOneClassifier(SVC(kernel='rbf')) ovr.fit(X_train_np, y_train_np) print(f"OvR accuracy: {ovr.score(X_test_np, _):.3f}")
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.
Need a Data Scientist or AI Engineer?
I build custom ML models, RAG chatbots, data pipelines, and production APIs — from analysis to deployment.