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

Введение

Все слышали об известных и широко используемых машинах опорных векторов (SVM). Оригинальный алгоритм SVM был изобретен Владимиром Н. Вапником и Алексеем Я. Червоненкис в 1963 году.

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

SVM чаще используются для задач классификации, и по этой причине в этой статье я сосредоточусь только на моделях SVC.

Суть метода

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

1. Граница решения (разделяющая гиперплоскость)

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

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

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

гиперплоскость - это (N-1) - размерное подпространство для N - размерное пространство.

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

Математически мы можем определить границу решения следующим образом:

2. Опорные векторы

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

3. Жесткий запас: как SVM находит лучшую гиперплоскость?

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

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

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

4. Замечание о мягком поле и параметре C.

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

Мягкая маржа SVM решает следующую проблему оптимизации:

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

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

5. Что произойдет, если нет четкой разделяющей гиперплоскости (ядра SVM)?

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

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

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

Уловка с ядром основана на некоторых функциях ядра , которые измеряют сходство образцов. Этот трюк на самом деле не преобразует точки данных в новое, многомерное пространство признаков, явно. Ядро-SVM вычисляет границу решения в терминах мер сходства в многомерном пространстве функций, фактически не выполняя проекцию. Некоторые известные функции ядра включают линейные, полиномиальные, радиальные базисные функции (RBF) и сигмовидные ядра.

Рабочий пример Python с использованием набора данных Iris и линейной модели SVC в scikit-learn

Напоминание: набор данных Iris состоит из 150 образцов цветов, каждый из которых имеет 4 характеристики / переменные (т. Е. Ширину / длину чашелистика и ширину / длину лепестка).

2D

Давайте нарисуем границу принятия решения в 2D (мы будем использовать только 2 функции набора данных):

from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()# Select 2 features / variables
X = iris.data[:, :2] # we only take the first two features.
y = iris.target
feature_names = iris.feature_names[:2]
classes = iris.target_names
def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() — 1, x.max() + 1
    y_min, y_max = y.min() — 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    return xx, yy
def plot_contours(ax, clf, xx, yy, **params):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out
# The classification SVC model
model = svm.SVC(kernel="linear")
clf = model.fit(X, y)
fig, ax = plt.subplots()
# title for the plots
title = (‘Decision surface of linear SVC ‘)
# Set-up grid for plotting.
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)
plot_contours(ax, clf, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors="k")
ax.set_ylabel("{}".format(feature_names[0]))
ax.set_xlabel("{}".format(feature_names[1]))
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(title)
plt.show()

В наборе данных iris у нас есть 3 класса цветов и 4 особенности. Здесь мы использовали только 2 функции (так что у нас есть 2 -мерное пространство функций), и мы построили границу решения линейной модели SVC. Цвета точек соответствуют классам / группам.

3D

Давайте нарисуем границу принятия решения в 3D (мы будем использовать только 3 функции набора данных):

from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from mpl_toolkits.mplot3d import Axes3D
iris = datasets.load_iris()
X = iris.data[:, :3] # we only take the first three features.
Y = iris.target
#make it binary classification problem
X = X[np.logical_or(Y==0,Y==1)]
Y = Y[np.logical_or(Y==0,Y==1)]
model = svm.SVC(kernel='linear')
clf = model.fit(X, Y)
# The equation of the separating plane is given by all x so that np.dot(svc.coef_[0], x) + b = 0.
# Solve for w3 (z)
z = lambda x,y: (-clf.intercept_[0]-clf.coef_[0][0]*x -clf.coef_[0][1]*y) / clf.coef_[0][2]
tmp = np.linspace(-5,5,30)
x,y = np.meshgrid(tmp,tmp)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot3D(X[Y==0,0], X[Y==0,1], X[Y==0,2],'ob')
ax.plot3D(X[Y==1,0], X[Y==1,1], X[Y==1,2],'sr')
ax.plot_surface(x, y, z(x,y))
ax.view_init(30, 60)
plt.show()

В наборе данных iris у нас есть 3 класса цветов и 4 особенности. Здесь мы использовали только 3 функции (так что у нас есть трехмерное пространство функций) и только 2 класса (проблема двоичной классификации). Затем мы построили границу решения линейной модели SVC. Цвета точек соответствуют 2 классам / группам.

Построение опорных векторов

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
np.random.seed(2)
# we create 40 linearly separable points
X = np.r_[np.random.randn(20, 2) — [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20
# fit the model
clf = svm.SVC(kernel=’linear’, C=1)
clf.fit(X, Y)
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx — (clf.intercept_[0]) / w[1]
margin = 1 / np.sqrt(np.sum(clf.coef_ ** 2))
yy_down = yy — np.sqrt(1 + a ** 2) * margin
yy_up = yy + np.sqrt(1 + a ** 2) * margin
plt.figure(1, figsize=(4, 3))
plt.clf()
plt.plot(xx, yy, "k-")
plt.plot(xx, yy_down, "k-")
plt.plot(xx, yy_up, "k-")
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80,
 facecolors="none", zorder=10, edgecolors="k")
plt.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired,
 edgecolors="k")
plt.xlabel("x1")
plt.ylabel("x2")
plt.show()

Двойные - обведенные точки представляют опорные векторы.

Последние посты











Следите за обновлениями и поддержите эти усилия

Если вам понравилась и эта статья показалась вам полезной, подпишитесь на меня!

Вопросы? Отправьте их как комментарий, и я отвечу как можно скорее.

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

[1] https://www.nature.com/articles/nbt1206-1565

[1] » «https://en.wikipedia.org/wiki/Support_vector_machine

[2] https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

Свяжись со мной