SVM

Коротко

Definition

SVM, или метод опорных векторов, — это модель обучения с учителем, которая строит разделяющую границу между классами так, чтобы зазор между границей и ближайшими обучающими объектами был максимальным.

SVM чаще всего используют для классификации. В базовом случае модель ищет гиперплоскость, которая разделяет два класса:

Предсказание делается по знаку функции:

Ближайшие к границе объекты называются опорными векторами. Именно они сильнее всего определяют положение разделяющей границы.

Интуиция

Представим, что есть точки двух классов на плоскости. Через них можно провести много разделяющих прямых, но SVM выбирает не любую прямую, а ту, которая оставляет максимальный зазор до ближайших точек каждого класса.

Этот зазор называется margin.

Идея SVM:

  • не просто разделить классы;
  • а разделить их с максимально возможным запасом;
  • чтобы новая точка, немного отличающаяся от обучающих данных, всё ещё классифицировалась устойчиво.

Если данные нельзя хорошо разделить прямой линией, SVM может использовать ядра. Ядро позволяет сравнивать объекты так, как будто они были перенесены в более сложное пространство признаков.

Формальное описание

Для бинарной классификации обычно используют метки:

Линейный SVM строит функцию:

Класс определяется знаком этой функции:

Для идеально разделимых данных SVM ищет такую гиперплоскость, чтобы выполнялось условие:

Ширина зазора обратно пропорциональна норме весов:

Поэтому максимизация зазора эквивалентна минимизации .

В реальных данных классы часто пересекаются. Поэтому используется soft-margin SVM со slack-переменными :

при ограничениях:

Параметр задаёт баланс между шириной зазора и штрафом за ошибки.

Входы и выходы

КомпонентОписание
ВходВектор признаков объекта
ВыходКласс объекта
Основная задачаБинарная классификация
РасширениеМногоклассовая классификация через схемы one-vs-rest или one-vs-one
Тип обученияОбучение с учителем
Целевая переменнаяКатегориальная метка класса

Примеры задач:

  • классификация медицинских измерений;
  • разделение материалов на устойчивые и неустойчивые;
  • классификация текстов по признакам;
  • распознавание простых паттернов в табличных данных;
  • бинарная классификация объектов при небольшом или среднем размере выборки.

Как обучается

SVM обучается как оптимизационная задача.

Для линейного SVM модель подбирает и так, чтобы:

  • зазор между классами был большим;
  • ошибки классификации были ограничены;
  • итоговая граница была устойчивой.

Для нелинейных задач используется ядровой вариант SVM. Вместо явного преобразования признаков модель использует функцию похожести:

Ядро позволяет работать так, будто данные были перенесены в пространство большей размерности, но без явного вычисления координат в этом пространстве.

Типичные ядра:

ЯдроИдея
LinearОбычная линейная граница
PolynomialПолиномиальные зависимости между признаками
RBFЛокальная похожесть объектов; часто используется по умолчанию
SigmoidПохоже на старые нейросетевые активации, сейчас используется реже

Для обучения часто решают двойственную задачу оптимизации. В ней итоговое решение выражается через обучающие объекты и коэффициенты :

Объекты с становятся опорными векторами.

Функция потерь

SVM можно понимать через hinge loss:

Если объект классифицирован правильно и находится достаточно далеко от границы, loss равен нулю.

Если объект:

  • классифицирован неправильно;
  • или находится слишком близко к границе;

то он получает штраф.

С регуляризацией задача записывается так:

Первый член контролирует сложность модели, второй — ошибки и нарушения margin.

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

Главные гиперпараметры SVM:

ГиперпараметрЧто контролирует
CБаланс между широким margin и ошибками на train-данных
kernelТип разделяющей границы
gammaРадиус влияния отдельного объекта для RBF/poly/sigmoid-ядер
degreeСтепень полинома для polynomial kernel
coef0Свободный член для polynomial и sigmoid kernel
class_weightВес классов при дисбалансе
tolКритерий остановки оптимизатора

Интерпретация :

  • маленький — шире margin, больше регуляризация, больше допускаемых ошибок;
  • большой — сильнее попытка правильно классифицировать train-данные, выше риск переобучения.

Интерпретация gamma для RBF:

  • маленькая gamma — гладкая, более простая граница;
  • большая gamma — более извилистая граница, выше риск переобучения.

Когда использовать

SVM стоит использовать, когда:

  • задача — классификация;
  • данных не слишком много;
  • число признаков среднее или большое;
  • нужна сильная классическая модель;
  • классы можно разделить с хорошим margin;
  • важна устойчивость на небольших выборках;
  • хочется попробовать нелинейную границу через RBF-ядро.

SVM часто хорошо работает на табличных данных малого и среднего размера, особенно если признаки нормализованы.

Когда не использовать

SVM может быть неудобен, если:

  • данных очень много;
  • нужна быстрая online-инференс-система;
  • требуется хорошо откалиброванная вероятность класса;
  • много категориальных признаков без аккуратной предобработки;
  • данные очень шумные;
  • подбор C, gamma и kernel становится слишком дорогим;
  • нужна простая интерпретация коэффициентов для нелинейного случая.

Для очень больших датасетов часто удобнее использовать линейные модели, деревья, градиентный бустинг или нейросети.

Метрики оценки

Для SVM-классификатора используют обычные метрики классификации:

  • accuracy;
  • precision;
  • recall;
  • F1-score;
  • ROC-AUC;
  • PR-AUC;
  • confusion matrix.

Подробнее: Метрики качества классификаторов.

Важно: SVM изначально выдаёт не вероятность, а значение decision function — расстояние до разделяющей границы с учётом знака. Вероятности обычно получают дополнительной калибровкой.

Типичные ошибки понимания

Ошибка 1. Думать, что SVM всегда линейный

Базовая идея SVM — линейная разделяющая гиперплоскость, но ядра позволяют строить нелинейные границы.

Ошибка 2. Не нормализовать признаки

SVM чувствителен к масштабу признаков. Если один признак измеряется в тысячах, а другой в долях единицы, модель может дать неадекватный результат.

Перед SVM обычно нужны стандартизация или нормализация.

Ошибка 3. Считать C точностью модели

не является метрикой качества. Это параметр регуляризации, который управляет компромиссом между margin и ошибками.

Ошибка 4. Слепо использовать RBF kernel

RBF часто работает хорошо, но требует аккуратного подбора C и gamma. Без настройки он может переобучиться или недообучиться.

Ошибка 5. Интерпретировать SVM как вероятностную модель

SVM не моделирует вероятность класса напрямую. Его базовый выход — расстояние до границы, а не вероятность.

Минимальный пример

import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
 
X = np.array([
    [0.0, 0.1],
    [0.2, 0.3],
    [1.0, 1.1],
    [1.2, 1.0],
])
 
y = np.array([0, 0, 1, 1])
 
model = make_pipeline(
    StandardScaler(),
    SVC(kernel="linear", C=1.0),
)
 
model.fit(X, y)
 
sample = np.array([ [0.9, 1.0] ])
prediction = model.predict(sample)
 
print(prediction)

В этом примере SVM строит линейную границу между двумя классами. StandardScaler добавлен потому, что SVM чувствителен к масштабу признаков.

Связанные понятия

Что знать перед этим

Связанные заметки