Предисловие
В этой статье мы рассмотрим несколько аспектов SVM:
- теоретическая составляющая СВМ;
- как алгоритм работает на выборках, которые нельзя разделить на классы линейно;
- пример использования на Python и реализация алгоритма в библиотеке SciKit Learn.
Как известно, проблемы машинного обучения делятся на две основные категории — классификация и регрессия.
В зависимости от того, какая из этих задач перед нами стоит и какой набор данных у нас есть для этой задачи, мы выбираем, какой алгоритм использовать.
Машины опорных векторов или SVM (машины опорных векторов) — это линейный алгоритм, используемый в задачах классификации и регрессии.
Этот алгоритм широко используется на практике и может решать как линейные, так и нелинейные задачи.
Суть работы машин опорных векторов проста: алгоритм создает линию или гиперплоскость, которая делит данные на классы.
Теория
Основная задача алгоритма — найти наиболее правильную линию или гиперплоскость, разделяющую данные на два класса.SVM — это алгоритм, который принимает данные в качестве входных данных и возвращает такую разделительную линию.
Рассмотрим следующий пример.
Допустим, у нас есть набор данных, и мы хотим классифицировать и отделить красные квадраты от синих кругов (скажем, положительные и отрицательные).
Основной целью в этой задаче будет найти «идеальную» линию, разделяющую эти два класса.
Найдите идеальную линию или гиперплоскость, которая делит набор данных на синий и красный классы.
На первый взгляд, это не так уж и сложно, правда? Но, как видите, не существует одной, уникальной линии, которая бы решила такую проблему.
Мы можем выбрать бесконечное количество таких линий, которые смогут разделить эти два класса.
Как именно SVM находит «идеальную» линию и что она подразумевает под «идеальной»?
Взгляните на пример ниже и подумайте, какая из двух линий (желтая или зеленая) лучше всего разделяет два класса и соответствует описанию «идеала»?
Какая линия, по вашему мнению, лучше всего разделяет набор данных?
Если вы выбрали желтую линию, поздравляем: это та же самая линия, которую выбрал бы алгоритм.
В этом примере мы можем интуитивно понять, что желтая линия разделяет и, соответственно, классифицирует два класса лучше, чем зеленая.
В случае с зеленой линией она расположена слишком близко к красному классу.
Даже несмотря на то, что она правильно классифицировала все объекты в текущем наборе данных, такая линия не будет обобщена — она не будет вести себя так же хорошо с незнакомым набором данных.
Задача поиска обобщенного разделителя между двумя классами — одна из основных проблем машинного обучения.
Как SVM находит лучшую линию
Алгоритм SVM устроен таким образом, что он ищет на графике точки, ближайшие к разделительной линии.Эти точки называются опорными векторами.
Затем алгоритм вычисляет расстояние между опорными векторами и разделяющей плоскостью.
Это расстояние называется зазором.
Основная цель алгоритма — максимизировать расстояние зазора.
Лучшей гиперплоскостью считается та гиперплоскость, для которой этот зазор максимально велик.
Довольно просто, правда? Рассмотрим следующий пример с более сложным набором данных, который нельзя разделить линейно.
Очевидно, что этот набор данных нельзя разделить линейно.
Мы не можем провести прямую линию, классифицирующую эти данные.
Но этот набор данных можно разделить линейно, добавив дополнительное измерение, которое мы назовем осью Z. Представьте, что координаты по оси Z подчиняются следующему ограничению:
Таким образом, ордината Z представлена квадратом расстояния точки до начала оси.
Ниже представлена визуализация того же набора данных по оси Z.
Теперь данные можно разделить линейно.
Допустим, есть фиолетовая линия, разделяющая данные z=k, где k — константа.
Если
, то, следовательно,
- формула круга.
Таким образом, с помощью этого преобразования мы можем спроецировать наш линейный сепаратор обратно на исходное количество измерений выборки.
В результате мы можем классифицировать нелинейный набор данных, добавив к нему дополнительное измерение, а затем вернуть его к исходному виду с помощью математического преобразования.
Однако не все наборы данных могут выполнить такое преобразование с одинаковой легкостью.
К счастью, реализация этого алгоритма в библиотеке sklearn решает за нас эту проблему.
Гиперплоскость
Теперь, когда мы знакомы с логикой алгоритма, перейдем к формальному определению гиперплоскости.Гиперплоскость — это n-1-мерная подплоскость в n-мерном евклидовом пространстве, которая делит пространство на две отдельные части.
Например, представьте, что наша линия представлена как одномерное евклидово пространство (то есть наш набор данных лежит на линии).
Выберите точку на этой линии.
Эта точка разделит набор данных, в нашем случае линию, на две части.
Линия имеет одну меру, а точка — 0 мер.
Следовательно, точка является гиперплоскостью прямой.
Для двумерного набора данных, с которым мы познакомились ранее, разделительной линией была та самая гиперплоскость.
Проще говоря, для n-мерного пространства существует n-1-мерная гиперплоскость, делящая это пространство на две части.
КОД
Точки представлены в виде массива X, а классы, которым они принадлежат, представлены в виде массива y. Теперь мы обучим нашу модель этому образцу.import numpy as np X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) y = np.array([1, 1, 2, 2])
Для этого примера я установил линейный параметр классификатора «ядро».
from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf = SVC.fit(X, y)
Прогнозирование класса нового объекта prediction = clf.predict([[0,6]])
Настройки
Параметры — это аргументы, которые вы передаете при создании классификатора.Ниже я перечислил некоторые из наиболее важных настраиваемых параметров SVM: "С" Этот параметр помогает настроить тонкую грань между «гладкостью» и точностью классификации объектов в обучающей выборке.
Чем больше значение «C», тем больше объектов в обучающей выборке будет правильно классифицировано.
В этом примере есть несколько порогов принятия решения, которые мы можем определить для этой конкретной выборки.
Обратите внимание на прямую линию (представленную на графике зеленой линией) порога принятия решения.
Это довольно просто, и по этой причине несколько объектов были классифицированы неправильно.
Точки, которые были неправильно классифицированы, называются выбросами в данных.
Мы также можем настроить параметры так, чтобы в итоге мы получили более изогнутую линию (голубой порог принятия решения), которая будет правильно классифицировать абсолютно все данные в обучающем наборе.
Конечно, в этом случае шансы на то, что наша модель сможет обобщить и показать столь же хорошие результаты на новых данных, катастрофически малы.
Поэтому, если вы пытаетесь добиться точности при обучении модели, вам следует стремиться к чему-то более плавному и прямолинейному.
Чем выше число «C», тем более запутанной будет гиперплоскость в вашей модели, но также тем выше количество правильно классифицированных объектов в обучающей выборке.
Поэтому важно «подстроить» параметры модели под конкретный набор данных, чтобы избежать переобучения, но в то же время добиться высокой точности.
Гамма В официальной документации библиотеки SciKit Learn говорится, что гамма определяет, насколько каждый элемент в наборе данных влияет на определение «идеальной линии».
Чем ниже гамма, тем больше элементов, даже тех, которые находятся достаточно далеко от разделительной линии, принимают участие в процессе выделения этой самой линии.
Если гамма высокая, то алгоритм будет «опираться» только на те элементы, которые находятся ближе всего к самой линии.
Если вы установите слишком высокий уровень гаммы, то в процессе принятия решения о размещении линии будут участвовать только самые близкие к линии элементы.
Это поможет вам игнорировать выбросы в данных.
Алгоритм SVM устроен таким образом, чтобы точки, расположенные ближе всего друг к другу, имели больший вес при принятии решения.
Однако при правильных настройках «C» и «гаммы» можно достичь оптимального результата, который позволит построить более линейную гиперплоскость, игнорирующую выбросы и, следовательно, более обобщаемую.
Заключение
Я искренне надеюсь, что эта статья помогла вам понять суть работы SVM или Support Vector Machine. Жду от вас любых комментариев и советов.В последующих публикациях я расскажу о математической составляющей SVM и проблемах оптимизации.
Источники: Официальная документация SVM в пакете SciKit Learn. Блог TowardsDataScience Сирадж Раваль: машины опорных векторов Видео курса Udacity «Введение в машинное обучение» о SVM: Gamma Википедия: СВМ Теги: #Машинное обучение #python #математика #программирование #большие данные #машинное обучение #наука о данных #алгоритмы #sklearn
-
«Сделай Меня Красивой!» Выпуск №27
19 Oct, 24 -
Кинетические Скульптуры
19 Oct, 24 -
Колышки Для Палатки С Подсветкой
19 Oct, 24 -
Iis 7: Сжатие Ответа Json
19 Oct, 24 -
Дворжак Или Как Превратить Жизнь В Боль
19 Oct, 24