ПОДДЕРЖКА ВЕКТОРНЫХ МАШИН
SVM - это управляемый алгоритм машинного обучения, который можно использовать как для задач классификации, так и для регрессии.
Этот алгоритм хорошо работает как с линейно, так и с нелинейно разделяемыми данными и довольно популярен. В этом блоге я остановлюсь на SVM для классификации.
РАБОТА SVM
Векторы поддержки
Прежде чем перейти к работе, давайте сначала разберемся, что такое векторы поддержки.
Слева вы можете видеть, что есть два класса точек (розовые и синие или + ve и -ve), разделенные гиперплоскостью π.
Есть две другие гиперплоскости π + и π-, идущие параллельно π.
Обратите внимание на точки, соприкасающиеся с π + и π-. Эти точки называются опорными векторами.
Кроме того, эти точки являются ближайшими точками к нашей разделяющей гиперплоскости π.
Точки, через которые проходят π + и π-, или точки, ближайшие к π (разделяющая гиперплоскость), называются опорными векторами.
Идеология SVM.
Ключевая идея SVM - найти гиперплоскость, которая разделяет два класса как можно шире.
Посмотрите на картинку ниже -
Если вас попросят нарисовать гиперплоскость так, чтобы она разделяла два класса, вы можете получить много гиперплоскостей. Правильно? Возьмем две такие гиперплоскости π1 и π2.
В π1 мы видим, что он очень близко к точкам как класса, так и в π2, оба класса находятся на разумном расстоянии.
Итак, SVM пытается найти такую гиперплоскость, которая максимизирует маргинальное расстояние между точками или разделяет классы настолько широко, насколько это возможно.
Маргинальное расстояние - это расстояние между π + и π-.
По мере увеличения маржи повышается точность обобщения.
ЛОГИСТИЧЕСКАЯ РЕГРЕССИЯ И SVM
Основное различие между логистической регрессией и SVM состоит в том, что SVM пытается найти гиперплоскость, максимизирующую маржу, тогда как логистическая регрессия этого не делает.
На приведенном выше рисунке LR также дал бы π1 в качестве разделяющей гиперплоскости. Но SVM дает нам наиболее подходящую гиперплоскость - π2.
Вот почему на SVM не влияют выбросы, потому что выбор гиперплоскости зависит только от опорных векторов, в отличие от логистической регрессии.
Математический вывод
Пусть
π: w’x + b
π +: w’x + b = 1
π-: wx + b = -1
w - перпендикулярно всем гиперплоскостям.
пусть d = расстояние между π + и π-.
d = 2 / || w || , || w || ≠ 1
Наша цель - максимизировать d.
Следовательно,
(w *, b *) = argmax (2 / || w ||)
Но приведенное выше уравнение работает только тогда, когда наши данные линейно разделимы, то есть нет точки данных между π- и π +.
Следовательно, приведенное выше уравнение становится,
(w *, b *) = argmax (2 / || w ||), такое, что yi (w’xi + b) ≥ 1 для всех xi
Для опорных векторов yi (w’xi + b) = 1
Вышеупомянутое условие также известно как Hard Margin SVM.
SVM В СЛУЧАЕ НЕЛИНЕЙНО ОТДЕЛЬНЫХ ДАННЫХ
Рассмотрим тип распределения точек данных, приведенных слева, и обратите внимание на неправильно классифицированные точки здесь.
Для неправильно классифицированной точки пусть уравнение будет следующим:
yi (w’xi + b) = k
где k: расстояние со знаком до точки от π.
Давайте перепишем уравнение как
yi (w’xi + b) = 1-Z
здесь Z: расстояние xi от его правильной гиперплоскости (π + или π-).
Можно сделать вывод,
если Z = 0, yi (w'xi + b) ≥ 1, что означает правильную классификацию по π + и π-.
Z ›0, неправильно классифицировано и равно расстояние от правильной гиперплоскости (π + и π-) в неправильном направлении.
Итак, окончательное уравнение
(w *, b *) argmin (|| w || / 2) + c / n Σ Zi, такое, что yi (w'xi + b) ≥ 1- Zi и Zi ≥0
Вышеупомянутый тип SVM известен как Soft Margin SVM.
Уравнение также называется Первичная форма SVM.
ДВОЙНАЯ ФОРМА SVM
Выше приведено уравнение, известное как двойная форма SVM.
Давайте подробно рассмотрим это уравнение: -
- αi ›0 для опорных векторов, αi = 0 для неопорных векторов.
- В приведенном выше уравнении xi’xj можно заменить на матрицу подобия (xi, xj), которая в конечном итоге будет заменена на K (xi, xj), k означает «трюк с ядром».
ЯДЕРНЫЙ ТРЮК
Уловка с ядром - это, по сути, метод, при котором сходство между точками данных вычисляется путем преобразования их в другое пространство. Уловка с ядром позволяет избежать необходимости явного преобразования точек данных в более высокое измерение.
Это уловка ядра, благодаря которой SVM могут обрабатывать нелинейные данные, используя правильное ядро. Такой тип SVM также известен как SVM ядра.
Давайте посмотрим на 2 таких ядра: -
- Полиномиальное ядро
Учитывая две точки данных x1 и x2, полиномиальное ядро можно записать как: -
K (x1, x2) = (x1 'x2 + c) ^ d
Здесь d обычно представляет собой измерение, в котором точки данных будут внутренне преобразованы. Например, если d = 2, это называется квадратичным ядром и так далее. - Ядро RBF
Учитывая две точки данных x1 и x2, ядро RBF можно записать как: -
K (x1, x2) = exp ( - || x1-x2 || ² / 2σ²)
В приведенном выше уравнении || x1-x2 || ² фактически представляет собой расстояние между двумя точками.
По мере увеличения || x1-x2 || ², т.е. расстояние между двумя точками данных увеличивается, сходство уменьшается, и, следовательно, K (x1, x2) уменьшается экспоненциально.
СЛОЖНОСТЬ ПОЕЗДКИ И ВРЕМЕНИ БЕГА
Время обучения: -
O (n²) для SVM ядра
O (nd²), если d ‹n (более оптимизировано)
d = Dimension и n = no точек данных.
Вот почему, когда n велико, SVM избегают.
Время выполнения: -
O (kd), где k = количество опорных векторов и d = размер.
Значение k варьируется от 1≤k≤n.
ВНЕДРЕНИЕ SVM
Я снова буду использовать набор данных Titanic от Kaggle, где задача состоит в том, чтобы создать модель, которая предсказывает, какие пассажиры выжили при кораблекрушении Titanic. Набор данных можно скачать здесь.
Это также проблема бинарной классификации, когда цель Выжившие имеет 0 для людей, которые не пережили катастрофу, и 1 для тех, кто выжил.
Мы предварительно обработали наши данные в x_train и y_train и импортировали SVM из sklearn.
- Параметр C здесь равен 2. Это C из первичной формы SVM.
Если C увеличивается, склонность к ошибкам уменьшается, что приводит к переобучению.
Если C уменьшается, это приводит к недообучению.
Оптимальное C можно найти, используя методы настройки гиперпараметров. - используемое здесь ядро является линейным
Для более детальной реализации и понимания данных обратитесь здесь.
Удачного кодирования! :)