Теория

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

Найдите идеальную линию или гиперплоскость, которая разделяет набор данных на синий и красный классы.

На первый взгляд это не так уж и сложно, правда?

Но, как видите, нет ни одной уникальной линии, которая решила бы такую ​​проблему. Мы можем выбрать бесконечное количество таких линий, которые могут разделить эти два класса. Как именно SVM находит «идеальную» линию и что означает «идеал» в ее понимании?

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

В случае с зеленой линией - это слишком близко к красному классу. Несмотря на то, что она правильно классифицирует все объекты в текущем наборе данных, такая линия не будет обобщена - она ​​не будет вести себя так же хорошо с незнакомым набором данных. Задача поиска обобщенного делителя для двух классов - одна из основных задач в машинном обучении.

Как SVM находит лучшую линию

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

Но давайте рассмотрим следующий пример с более сложным набором данных, который нельзя разделить линейно.

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

z = x²+y²

Таким образом, ордината Z представлена ​​квадратом расстояния от точки до начала оси.
Ниже представлена ​​визуализация того же набора данных по оси Z.

Теперь данные можно разделить линейно. Предположим, что пурпурная линия разделяет данные z = k, где k - константа. Если

z = x²+y²

, то, следовательно,

k = x²+y²

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

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

Гиперплоскость

Теперь, когда мы знакомы с логикой алгоритма, перейдем к формальному определению гиперплоскости.

Гиперплоскость - это n-1 мерная подплоскость в n-мерном евклидовом пространстве, которая делит пространство на две отдельные части.

Например, представьте, что наша линия представлена ​​как одномерное евклидово пространство (то есть наш набор данных лежит на прямой линии). Выберите точку на этой линии. Эта точка разделит набор данных, в нашем случае линию, на две части. У линии одна мера, а у точки 0 мер. Следовательно, точка - это гиперплоскость линии.

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

КОД

import numpy as np 
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])

Точки представлены как массив X, а классы, к которым они принадлежат, как массив y. Теперь обучим нашу модель на этом образце. Для этого примера я установил линейный параметр «ядра» классификатора (ядра).

from sklearn.svm import SVC 
clf = SVC(kernel='linear')
clf = SVC.fit(X, y)

Прогнозирование класса нового объекта

prediction = clf.predict([[0,6]])

настройка параметров

Параметры - это аргументы, которые вы передаете при создании классификатора. Ниже я перечислил некоторые из наиболее важных настраиваемых параметров SVM:

“C”

Этот параметр помогает настроить тонкую грань между «гладкостью» и точностью классификации объектов обучающей выборки. Чем выше значение «C», тем более корректно будут классифицированы объекты обучающей выборки.

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

Мы также можем настроить параметры таким образом, чтобы в конечном итоге мы получили более изогнутую линию (голубой порог решения), которая правильно классифицирует все данные обучающей выборки. Конечно, в этом случае шансы, что наша модель сможет обобщить и показать столь же хорошие результаты на новых данных, катастрофически малы. Поэтому, если вы пытаетесь добиться точности при обучении модели, вы должны стремиться к чему-то более ровному, прямому.
Чем выше число «C», тем более запутанной будет гиперплоскость в вашей модели, но тем выше количество правильно классифицированных объектов обучающей выборки. Поэтому важно «настроить» параметры модели для конкретного набора данных, чтобы избежать повторного обучения, но в то же время добиться высокой точности.

Гамма

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

есть отличное видео на YouTube, которое вдохновило этот пост в блоге

Https://www.youtube.com/watch?v=g8D5YL6cOSE