Лекция 10. Метод опорных векторов

Цель лекции. Изучить принцип метода опорных векторов (SVM), понятия разделяющей гиперплоскости и зазора, роль опорных векторов, мягкий зазор и ядерные функции. Научиться применять SVM для классификации в Python.

Ключевые понятия: метод опорных векторов, гиперплоскость, зазор, опорные векторы, линейно разделимые данные, мягкий зазор, параметр C, ядерный трюк, RBF-ядро, параметр gamma.

1. Назначение и принцип работы SVM

Метод опорных векторов (Support Vector Machine, SVM) — алгоритм обучения с учителем, применяемый прежде всего для классификации. Его основная идея заключается в поиске границы, которая разделяет объекты разных классов с максимально возможным зазором.

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

Гиперплоскость задаётся уравнением:

Здесь  — вектор признаков объекта,  — вектор коэффициентов,  — свободный член. Для бинарной классификации удобно использовать метки .

Решение для нового объекта в линейном случае определяется знаком выражения:

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

2. Максимальный зазор и опорные векторы

Зазор (Margin) — расстояние между разделяющей гиперплоскостью и ближайшими обучающими объектами. Эти ближайшие объекты называются опорными векторами (Support Vectors). Именно они определяют положение границы.

Для линейно разделимых данных можно выбрать масштаб коэффициентов так, чтобы выполнялось условие:

Тогда ширина полного зазора между двумя опорными гиперплоскостями равна:

Максимизация зазора эквивалентна следующей задаче оптимизации:

при ограничениях для всех обучающих объектов:

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

3. Мягкий зазор и параметр C

В реальных данных классы часто пересекаются или содержат шум. Чтобы допустить нарушения границы, используется мягкий зазор (Soft Margin).

Вводятся неотрицательные переменные , описывающие степень нарушения ограничений:

Оптимизационная задача принимает вид:

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

Значение C

Типичное поведение

Небольшое

Более сильная регуляризация; допускается больше нарушений

Большое

Более высокий штраф за нарушения; модель стремится точнее разделить обучающие объекты

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

4. Нелинейная классификация и ядерный трюк

Не все данные можно разделить прямой или гиперплоскостью в исходном пространстве признаков. В таком случае SVM использует ядерные функции (Kernels), позволяющие строить нелинейные границы.

Ядро вычисляет скалярное произведение в некотором преобразованном пространстве признаков без необходимости явно строить все новые признаки:

Здесь  — преобразование признаков.

Распространённые ядра:

Линейное ядро:

Полиномиальное ядро:

Радиально-базисное ядро (RBF):

Для RBF параметр  задаёт, насколько быстро уменьшается сходство при увеличении расстояния между объектами. Большое  обычно делает границу более локальной и сложной, малое — более гладкой.

5. Масштабирование признаков и настройка модели

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

Поэтому часто применяют стандартизацию:

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

Основные гиперпараметры SVC в scikit-learn:

Параметр

Назначение

kernel

Тип ядра: linear, rbf, poly и др.

C

Штраф за нарушения и сила регуляризации

gamma

Масштаб влияния объектов для RBF и некоторых других ядер

degree

Степень полинома для poly

SVM может быть эффективен при умеренном объёме данных и большом количестве признаков. Однако обучение нелинейного SVM на очень крупных наборах данных может требовать значительных вычислительных ресурсов.

6. Практическая реализация на Python

Рассмотрим бинарную классификацию искусственного набора данных с нелинейной границей. Используем SVC с RBF-ядром.

from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

X, y = make_moons(n_samples=400, noise=0.20, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

model = make_pipeline(
    StandardScaler(),
    SVC(kernel="rbf", C=1.0, gamma="scale")
)

model.fit(X_train, y_train)
predictions = model.predict(X_test)

print("Accuracy:", accuracy_score(y_test, predictions))
print(classification_report(y_test, predictions))

Сначала создаются данные make_moons, которые не удаётся идеально разделить одной прямой. Затем выборка делится на обучающую и тестовую части. Pipeline обеспечивает стандартизацию без использования информации тестовой выборки. Метод fit() обучает SVM, а predict() выдаёт прогнозы классов.

Сравнение гиперпараметров

Сравним несколько комбинаций  и  на обучающих данных с помощью перекрёстной проверки:

for C in [0.1, 1, 10]:
    for gamma in [0.1, 1, 10]:
        candidate = make_pipeline(
            StandardScaler(),
            SVC(kernel="rbf", C=C, gamma=gamma)
        )
        scores = cross_val_score(
            candidate, X_train, y_train,
            cv=5, scoring="accuracy"
        )
        print(f"C={C}, gamma={gamma}: {scores.mean():.3f}")

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

7. Практическое значение и выводы

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

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

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