ML Learning Hub
التصنيفمتوسط

التصنيف متعدد الفئات: OvA مقابل OvO

توسيع المصنّفات الثنائية إلى متعددة الفئات — أقواس بطولة للخوارزميات

استراتيجيات كل واحد مقابل الكل وكل واحد مقابل واحد لتوسيع المصنفات الثنائية — حدود القرار وقابلية التوسع وتطبيقات SVM ومتى تستخدم Softmax.

30 min
6 مخططات
6 المفاهيم المغطاة

المتطلبات الأساسية

SVM
Logistic Regression

المفاهيم المغطاة

Multi-classDecision BoundariesOvAOvOSoftmaxClass Imbalance

الصيغ الرئيسية

مصنِّفات OvA

K مصنِّفات ثنائية، واحد لكل فئة ضد جميع الأخرى — يستلزم K مرات وقت التدريب

مصنِّفات OvO

مصنِّف ثنائي واحد لكل زوج من الفئات — K(K-1)/2 نموذجاً، كل منها يتدرب على فئتين

دالة Softmax

تُطبِّع K لوجيتس إلى توزيع احتمالي — الخرج الطبيعي للتصنيف متعدد الفئات

محاكاة تفاعلية

Loading visualization…

هندسة النموذج

Loading visualization…
🎯

مشكلة التصنيف المتعدد

motivation

كثير من المشاكل الحقيقية لها أكثر من فئتين: التعرف على الأرقام (10 فئات)، تصنيف الأنواع (مئات)، تصنيف المنتجات (آلاف). بعض الخوارزميات (الانحدار اللوجستي، SVMs) ثنائية بطبعها. استراتيجيتان تمتدانهما: OvA تُدرب K مصنِّفاً، كل منها يفصل الفئة k عن الباقي. OvO تُدرب K(K-1)/2 مصنِّفاً لكل زوج.

⚖️

واحد مقابل الكل، واحد مقابل واحد، وSoftmax

comparison
1

OvA: K مصنِّفاً، كل منها يستخدم جميع البيانات. تدريب سريع. غير متوازن (إيجابي واحد مقابل K-1 سلبية). جيد لـK الكبير.

2

OvO: K(K-1)/2 مصنِّفاً، كل منها يستخدم فئتين فقط. متوازن لكن بطيء لـK الكبير (100 فئة = 4950 مصنِّفاً).

3

Softmax (LR متعدد الحدود): نموذج واحد، K مخرجاً، مُدرَّب بإنتروبيا تقاطعية. الأكثر كفاءة. أصيل لشبكات الخلايا العصبية.

4

اصطلاح SVM: OvO هو الافتراضي في sklearn (تاريخياً أداؤه أفضل قليلاً). لشبكات الخلايا العصبية، دائماً Softmax.

</>

التصنيف متعدد الفئات بـSoftmax

code
python49 lines
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.