Машины опорных векторов

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

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

звучит просто, правда? Это основа для SVM.

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

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

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

Что такое опорные векторы?

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

Машина опорных векторов преследует две основные цели.

  • Найдите гиперплоскость (линию), которая линейно разделяет точки данных на два класса
  • Максимальное увеличение разницы между опорными векторами двух классов

Как SVM разделяет два класса, если они не являются линейно разделенными?

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

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

Приведенные выше данные нельзя линейно разделить в двухмерном пространстве. Мы преобразовываем данные в трехмерное пространство и рисуем гиперплоскость. Теперь гиперплоскость линейно разделяет два класса. Это трюк с ядром.

Пошаговое выполнение трюка с ядром

допустим, у нас есть 5 точек данных в двухмерном пространстве, которые нельзя разделить линейно.

Мы преобразуем данные в трехмерное пространство и посмотрим, являются ли данные линейно разделимыми.

Давайте попробуем с тремя уравнениями: x + y, x * y и x² + y².

x * y имеет продукт как 0 или положительное число. Следовательно, если продукт равен 0, мы можем отнести точку к классу 1. Если продукт является положительным числом, мы можем отнести точку к классу 2.

Мы берем x * y в качестве координаты z и строим данные в трехмерном пространстве. Теперь мы видим линейно разделяемые точки данных.

Что, если данные двух классов перекрываются?

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

  • График справа: правильно классифицирует все тренировочные точки
  • График слева: неверно классифицирует несколько тренировочных точек.

Один из способов справиться с этим - Регуляризация (C).

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

  • Когда параметры регуляризации (C) имеют тенденцию быть близкими к 0, допускается больше ошибок классификации. Меньшее значение C заставит оптимизатор искать большой запас для гиперплоскостей, разделяющих два класса.
  • Параметр «Высокая регуляризация» (C) выберет гиперплоскость, которая позволяет правильно классифицировать все точки данных. Большое значение C заставит оптимизатор выбрать меньший запас для гиперплоскости. Это приводит к правильной классификации большего количества точек данных обучения.

Другой подход к обработке перекрывающихся данных - указать гиперпараметр под названием Gamma (γ).

Гамма (γ) определяет, насколько далеко распространяется влияние обучающего примера.

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

Резюме SVM

Машина опорных векторов

  • Детерминированный алгоритм: выход для конкретного входа предопределен. Результат останется неизменным независимо от того, сколько раз вы запускали алгоритм.
  • SVM не является вероятностным
  • SVM - это алгоритм двоичной линейной классификации m
  • SVM используется как для регрессии, так и для классификации

Плюсы и минусы SVM

Плюсы SVM

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

Минусы SVM

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

Теперь мы реализуем классификатор Support Vector Machine с использованием Python.

Я использовал сегментацию кожи Dataset. Я взял подмножество данных, которое содержит два класса

Сначала импортируем необходимые библиотеки. мы будем добавлять больше библиотек по мере создания классификатора SVM

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing

Я сохранил данные в папке Jupyter по умолчанию как skin_1.csv.

Чтение данных в dataset_1

dataset_1 = pd.read_csv(‘skin_1.csv’)

Изучение данных в наборе данных и описание всех входных переменных

dataset_1.info()

Визуализируйте данные с помощью seaborn

sns.pairplot(dataset_1, hue='Skin')

Создание объекта ввода (X) и объекта вывода (Y)

X= dataset_1.iloc[:,0:3]
Y= dataset_1.iloc[:,-1]

Разделение набора данных_1 на обучающий и тестовый наборы. Набор тестов будет составлять 40%, а обучающий набор - 60% набора данных_1.

from sklearn.model_selection import train_test_split
X_train, X_test,Y_train, Y_test = train_test_split(X, Y, test_size=0.4)

мы используем StandardScaler для обычного распределения входных функций, как обучающих, так и тестовых данных. Таким образом, данные распределяются около 0 со стандартным отклонением 1.

from sklearn.preprocessing import StandardScaler
sc= StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Теперь создаем экземпляр svm и затем применяем классификатор SVC.

from sklearn.svm import SVC
classifier=SVC(kernel ='linear', C=1, gamma=1)
classifier.fit(X_train, Y_train)

теперь мы прогнозируем данные.

y_pred= classifier.predict(X_test)

расчет точности

from sklearn.metrics import accuracy_score
print(accuracy_score(Y_test, y_pred))

с точностью 0,997598463016330.

Я попытался использовать интуицию в SVM. Надеюсь, я упростил понимание

Поделитесь ею и похлопайте, если вам понравилась статья!