Резюме

В этой статье вы узнаете о SVM или Support Vector Machine, который является одним из самых популярных алгоритмов ИИ (это один из 10 лучших алгоритмов ИИ), а также о Уловка с ядром, которая касается нелинейности и больших размеров. Мы коснемся таких тем, как гиперплоскости, множители Лагранжа, у нас будут наглядные примеры и примеры кода (аналогичные примеру кода, используемому в KNN глава ), чтобы лучше понять этот очень важный алгоритм.

Объяснение SVM

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

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

В качестве примера рассмотрим два сорта: яблоки и лимоны.

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

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

Если мы визуализируем приведенный выше пример в 2D, у нас будет что-то вроде этого:

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

На основе этих опорных векторов алгоритм пытается найти лучшую гиперплоскость, разделяющую классы. В 2D гиперплоскость - это линия, поэтому она будет выглядеть так:

Хорошо, но почему я нарисовал синюю границу, как на картинке выше? Я также могу нарисовать такие границы:

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

Поиск оптимальной гиперплоскости

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

Итак, если мы сравним изображение выше с изображением ниже, мы можем легко заметить, что первая является оптимальной гиперплоскостью (линией), а вторая - неоптимальным решением, потому что запас намного короче.

Поскольку мы хотим максимизировать поля с учетом всех классов, вместо использования одного поля для каждого класса, мы используем «глобальное» поле, которое принимает с учетом всех классов. Это поле будет выглядеть как фиолетовая линия на следующем рисунке:

Это поле ортогонально границе и равноудалено опорным векторам.

Так где же у нас векторы? Все вычисления (вычисление расстояния и оптимальных гиперплоскостей) выполняются в векторном пространстве, поэтому каждая точка данных считается вектором. Размер пространства определяется количеством атрибутов примеров. Чтобы понять математику, прочтите это краткое математическое описание векторов, гиперплоскостей и оптимизаций: SVM Succintly.

В целом, опорные векторы - это точки данных, которые определяют положение и границу гиперплоскости. Мы называем их «опорными» векторами, потому что это репрезентативные точки данных для классов, если мы переместим один из них, положение и / или поля изменится. Перемещение других точек данных не повлияет на поля или положение гиперплоскости.

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

Таким образом, обучение эквивалентно поиску гиперплоскости с наилучшим запасом, так что это простая задача оптимизации.

Основные шаги

Основные шаги SVM:

  1. выберите две гиперплоскости (в 2D), которые разделяют данные без точек между ними (красные линии)
  2. увеличить расстояние до них (маржа)
  3. средняя линия (здесь линия на полпути между двумя красными линиями) будет границей решения

Это очень красиво и легко, но найти лучший запас проблема оптимизации нетривиальна (это легко в 2D, когда у нас есть только два атрибута, но что, если у нас есть N измерений с N очень большим числом)

Для решения задачи оптимизации мы используем множители Лагранжа. Чтобы понять эту технику, вы можете прочитать следующие две статьи: Множитель двойственности Langrange и Простое объяснение того, почему работают умножители Langrange.

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

SVM для нелинейных наборов данных

Пример нелинейных данных:

В этом случае мы не можем найти прямую, чтобы отделить яблоки от лимонов. Итак, как мы можем решить эту проблему. Мы воспользуемся уловкой с ядром!

Основная идея состоит в том, что, когда набор данных неразделим в текущих измерениях, добавить еще одно измерение, возможно, таким образом данные будут разделены. Подумайте об этом, приведенный выше пример в 2D и неотделим друг от друга, но, возможно, в 3D есть разрыв между яблоками и лимонами, возможно, есть разница в уровнях, поэтому лимоны находятся на первом уровне, а лимоны - на втором. . В этом случае мы можем легко нарисовать разделяющую гиперплоскость (в 3D гиперплоскость - это плоскость) между уровнями 1 и 2.

Сопоставление с более высокими измерениями

Чтобы решить эту проблему, мы не должны просто слепо добавлять еще одно измерение, мы должны преобразовать пространство, чтобы создать эту разницу уровней намеренно.

Отображение из 2D в 3D

Предположим, мы добавляем еще одно измерение под названием X3. Еще одно важное преобразование заключается в том, что в новом измерении точки организованы по формуле x1² + x2².

Если построить плоскость, заданную формулой x² + y², мы получим что-то вроде этого:

Теперь нам нужно сопоставить яблоки и лимоны (которые представляют собой простые точки) с этим новым пространством. Подумайте хорошенько, что мы сделали? Мы просто использовали преобразование, в котором мы добавляли уровни в зависимости от расстояния. Если вы находитесь в начале координат, то точки будут на самом низком уровне. По мере удаления от начала координат это означает, что мы поднимаемся на холм (движемся от центра плоскости к краям), поэтому уровень точек будет выше. Теперь, если мы примем во внимание, что начало координат - это лимон из центра, у нас будет что-то вроде этого:

Теперь мы можем легко разделить два класса. Эти преобразования называются ядрами. Популярные ядра: Полиномиальное ядро, Гауссово ядро, радиальная базисная функция (RBF), RBF-ядро Лапласа, сигмовидное ядро, Anove RBF-ядро и т. Д. (См. Функции ядра или более подробное описание Машинное обучение Ядра »).

Отображение из 1D в 2D

Другой, более простой пример в 2D:

После использования ядра и после всех преобразований мы получим:

Таким образом, после преобразования мы можем легко разделить два класса, используя всего одну строку.

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

Параметры настройки

Как мы видели в предыдущем разделе, выбор правильного ядра имеет решающее значение, потому что, если преобразование неправильное, модель может иметь очень плохие результаты. Как правило, всегда проверяйте, есть ли у вас линейные данные и в этом случае всегда используйте линейную SVM (линейное ядро). Линейная SVM - это параметрическая модель, а SVM с ядром RBF - нет, поэтому сложность последней растет вместе с размером обучающего набора. Не только дороже обучать SVM ядра RBF, но также необходимо поддерживать матрицу ядра и проекцию в это «бесконечное» пространство более высокой размерности, где данные становятся линейно разделяемыми, также дороже во время прогнозирования. Кроме того, у вас есть больше гиперпараметров для настройки, поэтому выбор модели также обходится дороже! И, наконец, сложную модель проще переобучить!

Регуляризация

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

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

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

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

Гамма

Следующий важный параметр - Гамма. Параметр гамма определяет, насколько далеко распространяется влияние одного обучающего примера. Это означает, что высокая гамма будет учитывать только точки, близкие к вероятной гиперплоскости, а низкая гамма будет учитывать указывает на большее расстояние.

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

Прибыль

Последний параметр - маржа. Мы уже говорили о марже, чем выше маржа, тем лучше модель, а значит, лучше классификация (или прогноз). Маржа всегда должна быть максимальной.

Пример SVM с использованием Python

В этом примере мы будем использовать файл Social_Networks_Ads.csv, тот же файл, который мы использовали в предыдущей статье, см. Пример KNN с использованием Python.

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

Поскольку библиотека sklearn - это очень хорошо написанная и полезная библиотека Python, нам не нужно изменять слишком много кода. Единственное отличие состоит в том, что нам нужно импортировать класс SVC (SVC = SVM в sklearn) из sklearn.svm вместо класса KNeighborsClassifier из sklearn.neighbors.

# Fitting SVM to the Training set
from sklearn.svm import SVC
classifier = SVC(kernel = 'rbf', C = 0.1, gamma = 0.1)
classifier.fit(X_train, y_train)

После импорта SVC мы можем создать нашу новую модель, используя предопределенный конструктор. У этого конструктора много параметров, но я опишу только самые важные, в большинстве случаев вы не будете использовать другие параметры.

Наиболее важные параметры:

  1. ядро ​​: используемый тип ядра. Наиболее распространенными ядрами являются rbf (это значение по умолчанию), poly или sigmoid, но вы также можете создать собственное ядро.
  2. C: это параметр регуляризации, описанный в разделе Параметры настройки.
  3. гамма: это также было описано в разделе Параметры настройки.
  4. степень: используется только в том случае, если выбранное ядро ​​является поли и устанавливает степень полинома
  5. вероятность: это логический параметр, и если он верен, то модель будет возвращать для каждого прогноза вектор вероятностей принадлежности к каждому классу переменной ответа. Таким образом, в основном это даст вам уверенность для каждого прогноза.
  6. сжатие: показывает, хотите ли вы использовать эвристику сжатия при оптимизации SVM, которая используется в Последовательной минимальной оптимизации. По умолчанию используется значение "истина", если у вас нет веской причины, не меняйте это значение на ложное, потому что сжатие значительно улучшит ваши производительность, что в большинстве случаев дает очень небольшие потери с точки зрения точности.

Теперь давайте посмотрим на результат выполнения этого кода. Граница решения для обучающей выборки выглядит так:

Как мы видим и как мы узнали в разделе Параметры настройки, поскольку C имеет небольшое значение (0,1), граница принятия решения гладкая.

Теперь, если мы увеличим C с 0,1 до 100, у нас будет больше кривых на границе решения:

Что бы произошло, если бы мы использовали C = 0,1, но теперь мы увеличим гамму с 0,1 до 10? Давайте посмотрим!

Что здесь случилось? Почему у нас такая плохая модель? Как вы видели в разделе Параметры настройки, высокая гамма означает, что при вычислении вероятной гиперплоскости мы учитываем только близкие точки. Теперь, поскольку плотность зеленых точек высока только в выбранной зеленой области, в этой области точки достаточно близки к вероятной гиперплоскости, поэтому были выбраны именно эти гиперплоскости. Будьте осторожны с параметром гаммы, потому что он может очень плохо повлиять на результаты вашей модели, если вы установите для него очень высокое значение (что такое очень высокое значение, зависит от плотности точек данных).

В этом примере лучшие значения для C и Gamma - 1.0 и 1.0. Теперь, если мы запустим нашу модель на тестовом наборе, мы получим следующую диаграмму:

А матрица неточностей выглядит так:

Как видите, у нас всего 3 ложных срабатывания и только 4 ложных отрицательных результата. Точность этой модели составляет 93%, что является действительно хорошим результатом, мы получили лучший результат, чем при использовании KNN (точность которого составила 80%).

ПРИМЕЧАНИЕ. точность - не единственный показатель, используемый в машинном обучении, а также не лучший показатель для оценки модели из-за парадокса точности. Мы используем эту метрику для простоты, но позже, в главе Метрики для оценки алгоритмов ИИ мы поговорим о парадоксе точности, и я покажу другие очень популярные метрики, используемые в этом поле.

Выводы

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

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

Чтобы получить лучшую модель, мы увидели методы настройки алгоритма. В конце статьи у нас был пример кода на Python, который показал нам, как мы можем использовать алгоритм KNN.

Мне очень нравится кофе, потому что он дает мне силы писать больше статей.

Если вам понравилась эта статья, то вы можете выразить свою признательность и поддержку, купив мне кофе!

В заключение я хотел бы выделить несколько плюсов и минусов и несколько популярных вариантов использования.

Станьте писателем на Medium: https://czakozoltan08.medium.com/membership

Плюсы

  1. SVN может быть очень эффективным, потому что он использует только подмножество обучающих данных, только векторы поддержки.
  2. Очень хорошо работает с меньшими наборами данных, с нелинейными наборами данных и пространствами большой размерности
  3. Очень эффективен в случаях, когда количество измерений превышает количество образцов
  4. Он может иметь высокую точность, иногда даже лучше, чем нейронные сети.
  5. Не очень чувствителен к переобучению

Минусы

  1. Время обучения слишком велико, когда у нас большие наборы данных
  2. Когда в наборе данных больше шума (т. Е. Целевые классы перекрываются) SVM не работает

Популярные варианты использования

  1. Текстовая классификация
  2. Обнаружение спама
  3. Анализ настроений
  4. Признание на основе аспектов
  5. Признание на основе аспектов
  6. Распознавание рукописных цифр

использованная литература

  1. Понимание SVM
  2. SVM: простое объяснение
  3. SVM: разбираться в математике
  4. Теория SVM
  5. Udemy: Машинное обучение от А до Я