Анализ данных на Python в примерах и задачах

Метод опорных векторов

Лекция посвящена алгоритму метода опорных векторов (SVM) — одному из популярных методов классификации с учителем. Рассматриваются геометрические основы алгоритма (поиск гиперплоскости, максимизация зазора), ключевые гиперпараметры (коэффициент регуляризации C, параметр ядра gamma), а также виды ядер (линейное, полиномиальное, RBF, сигмоидное). Практическая часть демонстрирует применение SVM на двух задачах: определение фальшивых банкнот и классификация ирисов Фишера с помощью библиотеки scikit-learn. Показано, как выбор ядра и настройка параметров влияют на точность модели (от переобучения до идеального разделения классов).

Основные мысли

1. Геометрия SVM – алгоритм переводит объекты в многомерное пространство и ищет гиперплоскость (разделяющую прямую), которая максимизирует расстояние до ближайших точек обоих классов («зазор»).
2. Баланс точности и обобщения – параметр C (штраф за ошибку) регулирует компромисс: маленький C допускает ошибки ради широкого зазора (устойчивость к выбросам), большой C стремится классифицировать идеально, но ведет к переобучению.
3. Ядра – позволяют разделять классы не только прямой, но и кривой линией (окружность, экспонента). Основные типы: линейное, полиномиальное, RBF (радиально-базисное) и сигмоидное.
4. Гамма (γ) – параметр RBF-ядра: при малых значениях граница плавная, при больших – каждый объект обводится контуром (сильное переобучение).
5. SVM в scikit-learn – реализован классом SVC. Унифицированный интерфейс (fit/predict) позволяет легко сравнивать SVM с деревьями решений или Random Forest.
Показывать лекцию целиком
Краткое изложение

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

2. Механизм работы на плоскости
• Исходные данные (красные кружки и синие звездочки) разделяются прямой.
• Из нескольких возможных прямых выбирается та, которая максимизирует расстояние до обоих классов (прямая C на слайде). Это называется «максимизация зазора».
• Прямая A может идеально разделять обучающую выборку (ноль ошибок), но это часто признак переобучения, особенно если есть выбросы.

3. Борьба с выбросами и параметр C
• Выброс (одинокая синяя звездочка среди красных) не должен сильно влиять на границу. SVM с небольшим C проигнорирует выброс ради широкой полосы.
• Чем выше C, тем сильнее алгоритм штрафуется за каждую ошибку, и граница начинает изгибаться, подстраиваясь под каждую точку (вплоть до переобучения).

4. Нелинейные ядра
• Если классы нельзя разделить прямой (например, один внутри другого по окружности), используются ядра для перехода в новое пространство признаков:
o Линейное – простая прямая.
o Полиномиальное – кривая (например, окружность – степень 2).
o RBF (Radial Basis Function) – экспоненциальное разделение, создает гладкие изогнутые границы.
o Сигмоидное – напоминает нейронные сети.

5. Параметр Gamma (γ) для RBF
• Маленькая γ → грубое, обобщенное разделение.
• Большая γ → каждый объект обводится индивидуально → переобучение, но высокая точность на обучении.

6. Практика на Python (scikit-learn)
Задача 1: Фальшивые банкноты.
Датасет с 4 признаками (вейвлет-анализ изображений). SVM с линейным ядром дал ~99% точности (всего 4 ошибки на 275 тестовых образцов).
Задача 2: Ирисы Фишера (3 класса).
Сравнили разные ядра:
o Полиномиальное (степень 8) – 97% accuracy.
o RBF – 100% accuracy (идеальное разделение).
o Сигмоидное – провал (один класс вообще не распознан, предупреждения о делении на ноль).
Настройкой степени полинома (уменьшили с 8 до 4) тоже достигли 100% точности.

7. Вывод по библиотеке
Все алгоритмы в scikit-learn работают единообразно: создаем объект класса, вызываем fit(X_train, y_train), затем predict(X_test).

Выводы

1. SVM – мощный алгоритм для классификации, особенно когда данные не линейно разделимы. Он хорошо работает с широким набором признаков (в примере с банкнотами – 4 числовых признака).
2. Ключевая сила – использование ядер для автоматического перехода в пространство более высокой размерности без явного вычисления координат.
3. Основные гиперпараметры для настройки: тип ядра (kernel), коэффициент регуляризации C и параметр gamma (для RBF). Их подбор позволяет бороться с переобучением.
4. Сигмоидное ядро оказалось непригодным для классификации ирисов – это напоминание, что выбор ядра должен опираться на данные.
5. Универсальность scikit-learn сильно упрощает эксперименты: SVM легко заменить на другой классификатор, изменив всего одну строку кода.

Вопросы для самопроверки

1. В чем заключается идея «максимизации зазора» в SVM? Почему прямая C лучше, чем A и B на первом слайде?
2. Что произойдет с разделяющей границей, если сильно увеличить параметр C? Как это связано с переобучением?
3. Зачем нужны нелинейные ядра (полиномиальное, RBF)? Приведите пример данных, где линейное ядро не справится.
4. Что означает высокое значение параметра gamma в RBF-ядре? Как оно влияет на форму границы?
5. В примере с фальшивыми банкнотами SVM ошибся всего 4 раза. Почему для бизнеса может быть критично, что ошибки присутствуют в обоих классах (а не только в одном)?
6. Почему сигмоидное ядро показало настолько плохой результат на ирисах (точность почти 0 для одного класса)?
7. Как, зная единый интерфейс scikit-learn, заменить SVM на другой алгоритм (например, логистическую регрессию) в уже написанном коде?
8. Что такое выброс (аномалия) с точки зрения SVM? Как параметр C помогает алгоритму игнорировать выбросы?
Вернуться к учебному плану