Лекция 10.
Метод опорных векторов
Цель лекции. Изучить принцип метода опорных векторов (SVM), понятия разделяющей
гиперплоскости и зазора, роль опорных векторов, мягкий зазор и ядерные функции.
Научиться применять SVM для классификации в Python.
Ключевые
понятия: метод
опорных векторов, гиперплоскость, зазор, опорные векторы, линейно разделимые
данные, мягкий зазор, параметр C, ядерный трюк, RBF-ядро, параметр gamma.
1.
Назначение и принцип работы SVM
Метод опорных
векторов (Support Vector Machine, SVM) — алгоритм обучения с учителем, применяемый
прежде всего для классификации. Его основная идея заключается в поиске границы,
которая разделяет объекты разных классов с максимально возможным зазором.
Для двух
признаков граница представляет собой прямую, для трёх — плоскость, а в
пространстве большего числа признаков — гиперплоскость.
Гиперплоскость
задаётся уравнением:
![]()
Здесь
— вектор признаков объекта,
— вектор коэффициентов,
— свободный член. Для бинарной классификации
удобно использовать метки
.
Решение для
нового объекта в линейном случае определяется знаком выражения:
![]()
SVM
отличается от классификатора, который ищет любую разделяющую границу: он
стремится сделать границу устойчивой к небольшим изменениям признаков.
2. Максимальный зазор и опорные
векторы
Зазор
(Margin) —
расстояние между разделяющей гиперплоскостью и ближайшими обучающими объектами.
Эти ближайшие объекты называются опорными векторами (Support Vectors).
Именно они определяют положение границы.
Для линейно
разделимых данных можно выбрать масштаб коэффициентов так, чтобы выполнялось
условие:
![]()
Тогда
ширина полного зазора между двумя опорными гиперплоскостями равна:
![]()
Максимизация
зазора эквивалентна следующей задаче оптимизации:
![]()
при
ограничениях для всех обучающих объектов:
![]()
Чем шире
зазор, тем менее чувствительной к небольшим изменениям данных может оказаться
граница. Однако идеальное разделение без ошибок в реальных задачах возможно не
всегда.
В реальных
данных классы часто пересекаются или содержат шум. Чтобы допустить нарушения
границы, используется мягкий зазор (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.