Собесов

zadachi_ds: Логистическая регрессия vs линейный SVM

ML / Data ScienceЛинейные моделиСредняяMiddle

Условие

Объясните, чем линейная логистическая регрессия отличается от линейного SVM. Когда какую модель выбрать? Какие гиперпараметры важны? Что общего и в чём разница в loss-функциях?

Решение

Общее

Оба ищут разделяющую гиперплоскость w·x + b = 0. Отличаются loss-функцией:

Loss Что минимизируют
Логрег −y log p − (1−y) log(1−p) (cross-entropy) максимизируют правдоподобие Бернулли
Линейный SVM max(0, 1 − y · (w·x + b)) (hinge loss) maximum-margin, штраф только за ошибки и точки внутри margin

Оба добавляют L2-регуляризацию: + λ ||w||².

Геометрия

  • Логрег: гладкая sigmoid p = σ(w·x + b). Каждая точка влияет на решение, дальние влияют слабо (sigmoid плоский).
  • SVM: hinge — кусочно-линейный, не дифференцируем в точке. Только точки внутри margin (support vectors) определяют гиперплоскость.

Loss-функции — сравнение

hinge:        max(0, 1 - y·f(x))
log-loss:     log(1 + exp(-y·f(x)))         // где y ∈ {-1, +1}
0-1 loss:     I[y · f(x) < 0]               (не используется — недифференцируема)
  • hinge = 0 для правильно классифицированных вне margin (margin = 1).
  • log-loss всегда > 0, штраф даже за уверенно правильные (но маленький).

Когда какую выбрать

Логрег лучше, когда:

  • Нужны вероятности (p(y=1|x)), а не только класс.
  • Калибровка важна (скоринг).
  • Малая выборка / много фич (L1 даёт интерпретируемость).
  • Нужна Bayesian интерпретация.

SVM лучше, когда:

  • Только классификация (вероятности не нужны).
  • Нелинейные границы через kernel trick (RBF, polynomial).
  • Малая обучающая выборка (margin-based интуиция).
  • Сильный outlier-resistant behavior за счёт hinge.

Гиперпараметры

Логрег (sklearn):

  • C — обратная регуляризация (C = 1/λ).
  • penalty: l1, l2, elasticnet, none.
  • solver: liblinear для L1 на маленьких; saga для больших.
  • class_weight: 'balanced' или dict.

SVM (LinearSVC / SVC):

  • C — то же.
  • loss: hinge (классический) или squared_hinge.
  • kernel (для SVC): linear, rbf, poly.
  • gamma (для RBF): ширина RBF.

Производительность

  • LinearSVC в sklearn использует liblinear — почти как логрег по скорости, на больших данных оба ~ за секунды.
  • SVC с RBF — O(n² - n³) по обучению, не масштабируется > 50K строк.
  • На > 1M строк — обычно логрег + хорошая feature engineering, либо градиентный бустинг.

Калибровка вероятностей SVM

SVM не выдаёт вероятностей нативно. SVC(probability=True) использует Platt scaling — отдельный fit логрега на decision function. Долго и не всегда хорошо. Лучше CalibratedClassifierCV.

Multi-class

  • Логрег: нативно (softmax) через multi_class='multinomial'.
  • SVM: one-vs-one (sklearn default) или one-vs-rest.

Пример

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC, SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
 
logreg = Pipeline([
    ('sc', StandardScaler()),
    ('lr', LogisticRegression(C=1.0, penalty='l2', max_iter=2000))
])
 
svm = Pipeline([
    ('sc', StandardScaler()),
    ('svc', LinearSVC(C=1.0, loss='hinge', max_iter=5000))
])
 
# RBF SVM (только для малых N)
rbf = Pipeline([
    ('sc', StandardScaler()),
    ('svc', SVC(kernel='rbf', C=1.0, gamma='scale'))
])

Чем в практике почти всегда выигрывает логрег

  1. Даёт вероятности → удобно для threshold tuning.
  2. Масштабируется до миллионов строк.
  3. L1-регуляризация делает sparse → интерпретация.
  4. Калибрована из коробки.

SVM редко используется в индустрии для табличных задач — её ниши заняты бустингами (для нелинейных) и логрег (для линейных).

Подводные камни

  1. SVM без StandardScaler — почти всегда катастрофа: фичи разных масштабов ломают margin.
  2. SVC(probability=True) медленный и часто плохо откалиброван.
  3. C интерпретация перевёрнута относительно λ: большой C → слабая регуляризация.
  4. Hinge loss на дисбалансе: точки большинства внутри margin вытесняют минор. class_weight='balanced' обязателен.
  5. LinearSVC vs SVC(kernel='linear') — разные solver'ы, разная производительность; первый на больших данных.
  6. Логрег с extreme imbalance: class_weight='balanced' иначе модель «всё в большинство».
  7. Multi-class one-vs-one в SVM на 100 классах = 4950 моделей — невозможно.

Эталонный ответ

Логрег Линейный SVM
Loss log-loss hinge
Вероятности да, калиброванные нет (только через Platt)
Multi-class softmax нативно OvO/OvR
Outliers чувствительна устойчивее (hinge = 0 для верных)
Kernel нет да (RBF, poly в SVC)
Масштаб миллионы до 50К (RBF)

В практике: логрег — почти всегда лучший выбор для табличных линейных задач (вероятности + масштабируемость). SVM остаётся для малых выборок с нелинейными границами через RBF. Для серьёзных нелинейных задач — бустинг.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти