Что такое SVM и как формулировать, создавать и применять SVM для контролируемого обучения

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



Введение

Если вы следовали предыдущему уроку, вы уже знаете, что цель модели машинного обучения — найти параметры модели, которые лучше всего соответствуют данным. В случае линейной модели (например, линии) это означает найти лучшие коэффициенты линии, которая проходит через все точки данных. Однако невозможно подобрать линию ко всем точкам данных, которые распределены в виде кластера, поэтому необходимо найти линию, которая имеет кратчайшее расстояние от большинства точек. . Вот как работает линейная регрессия. Тем не менее, самая большая ошибка этих методов, основанных на большинстве, заключается в том, что они имеют тенденцию к чрезмерному приспособлению к обучающим примерам. Это означает, что они, как правило, хорошо работают на тренировочном наборе, но не могут предсказать новые примеры, которых не было в тренировочном наборе. Это отсутствие возможности обобщения привело к появлению нового класса методов, которые концептуально работают противоположным образом. Вместо того, чтобы найти наилучшее «соответствие» для большинства, эти методы стремятся смоделировать разделяющее пространство между двумя классами. Такое разделяющее пространство называется «Гиперплоскостью». SVM является одним из таких методов, который пытается изучить гиперплоскость, которая лучше всего разделяет два набора точек данных.

SVM выполняет эту задачу, находя те «выбросы» в обоих кластерах данных, которые существуют на границе такой гиперплоскости. Давайте посмотрим на пример изображения на рисунке 2; Если бы мы использовали мажоритарный классификатор, он попытался бы найти одну линию, которая разделяет синие и красные кластеры. Однако такая классификация была бы неправильной, потому что она в конечном итоге привела бы к неправильной границе из-за игнорирования точек, находящихся дальше от среднего значения кластера. Однако, когда становится доступным больше данных, средние сдвиги и более дальние точки больше не кажутся выбросами. Следовательно, такие мажоритарные методы потерпят неудачу и не смогут дать обобщенное решение, которое работает для новых выборок.

Метод SVM решает эту проблему, находя наиболее важные точки (или векторы, взятые из начала координат) в данных. Это точки, лежащие на границе гиперплоскости. Эти точки называются Опорными векторами. Они названы так, потому что их присутствие удерживает границу классификации. Если их удалить, линия, разделяющая два кластера, существенно изменится. SVM пытаются найти те опорные векторы из двух противоположных классов, которые имеют максимальное кратчайшее расстояние между ними. Это расстояние называется полем, а линии на крайних концах такого поля образуют границы поверхности принятия решений.

Линейный SVM

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

Целевая функция SVM

Ранее упоминалось, что цель модели SVM — найти гиперплоскость, которая максимизирует запас — расстояние между границами решений двух противоположных классов. Итак, нам нужно определить целевую функцию, которая находит лучшие векторы поддержки, таким образом находя границу решения, а также максимизируя разницу между двумя границами решения. В частности, мы хотим найти весовой вектор ‘w’, каждый элемент которого является коэффициентом для набора точек данных. Кратчайшее расстояние от опорного вектора до границы решения (т. е. расстояние от точки до линии) равно 1/||w||², а общее расстояние между двумя границами решения (т. margin) составляет 2/||w||². Итак, если мы хотим максимизировать маржу, нам нужно минимизировать ||w||². Функция f(x) на рисунке 3 показывает эту целевую функцию.

В дополнение к целевой функции нам также необходимо убедиться, что граница решения соблюдается. Для этого мы должны наложить ограничение на целевую функцию таким образом, чтобы для точек одного класса выход был равен ›=+1, а для точек другого класса выход был равен ‹=-1. Это ограничение представлено функцией g(x) в приведенном выше наборе уравнений. Теперь, чтобы решить эту задачу, мы должны записать ее в лагранжевой форме — формулировке математической оптимизации для задач оптимизации с ограничениями. Мы пишем новую целевую функцию, следуя лагранжеву формату формулировки целевой функции, как в приведенных выше уравнениях. Целевая функция 'L' состоит из двух частей: исходной функции минимизации f(x) и функции ограничения g(x) — граничное ограничение решения. Альфа-вектор — это набор параметров, которые мы хотели бы оптимизировать, однако у нас также нет w или b. Мы можем дополнительно упростить эту лагранжеву формулировку с помощью двойственной лагранжевой формулировки.

Мы достигаем двойной лагранжевой формулировки, заменяя 'w' и 'b'в более ранней формулировке целевой функции. Мы можем получить 'w'и, взяв градиент L по отношению к w и b соответственно и установив их равными нулю (напомним, что градиент ноль в оптимальной точке). Это дает нам упрощенную целевую функцию, которая зависит только от вектора параметров alpha для каждой точки в наборе данных.

Если вы были наблюдательны, вы также должны заметить, что мы ввели еще один вектор Xⱼ в дополнение к Xᵢ. Это потому, что мы хотели различать два вектора: один, представляющий точку данных, и другой, представляющий веса. Однако обратите внимание, что оба исходят из одного и того же набора точек данных. Таким образом, этот продукт является просто точечным произведением одного вектора на другой. Скалярное произведение двух векторов дает меру сходства. Другими словами, мы хотим найти два похожих вектора из разных классов, которые максимизируют маржу.

Мы выполним это попарное вычисление подобия между двумя точками данных в наборе данных, а затем найдем наилучшее значение для вектора alpha, который будет разреженным вектором — вектором, в котором большинство элементов равно нулю и только несколько быть ненулевым. Таким образом, мы сможем выбрать опорные векторы, используя эти ненулевые коэффициенты из вектора alpha в конце процесса оптимизации.

Линейная классификация SVM с использованием Python

В предыдущих разделах мы поняли концептуальное понимание SVM. Мы можем использовать библиотеку scikit Python, чтобы построить линейную модель SVM и применить ее к примерному набору данных. Сначала мы создаем случайный набор данных и разделяем его на обучающий и тестовый наборы, как показано на рисунке ниже.

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

Крайние линии на рис. 7 показывают границу решения, а точки, расположенные близко к этим линиям, являются опорными векторами, которые изображены на рис. изменяет границу решения.

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

Нелинейный SVM

В предыдущем разделе мы успешно построили линейную модель SVM и использовали ее для классификации набора данных. Линейные SVM работают до тех пор, пока мы не столкнемся с данными, которые не являются линейно разделимыми. Однако большая часть реальных данных не является линейно разделимой. Здесь нам нужна нелинейная модель SVM для классификации.

Формулировка нелинейной целевой функции

На рисунке ниже вы можете увидеть пример нелинейных данных.

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

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

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

Нелинейная классификация с функциями ядра

Теперь, если мы используем эту новую формулировку для нелинейного набора данных, мы получим вывод, как показано на следующем рисунке. Мы используем ядро ​​в радианах для этого набора данных, потому что выборки данных четко показывают круговой узор. Как видите, он успешно классифицировал все примеры.

Как упоминалось ранее, для разных типов данных требуются разные типы функций ядра. Мы видели пример функции ядра RBF. Бывают ситуации, когда больше подходит другая функция ядра. Например, давайте возьмем пример следующих данных. Образцы в этих данных не образуют радиальный узор.

Два кластера в основном линейно разделимы, пока они не совпадут и не смешаются в центре. Мы можем нарисовать кривую, которая разделит эти два кластера. Здесь мы можем использовать полиномиальное ядро, которое использует полиномиальную функцию для границы решения. На рисунке ниже мы видим, что классификация с таким ядром успешно и точно классифицирует большинство выборок.

Заключительные замечания

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

Для просмотра кода перейдите по ссылке:

https://www.github.com/azad-academy/MLBasics-SVM

Поддержите меня на Patreon:



Найди меня в Substack:



Подпишитесь на Twitter для получения обновлений:

https://www.twitter.com/@azaditech