Метод опорных векторов
Идея метода
Метод опорных векторов (support vector machine, SVM) - частный случай линейного классификатора, когда веса находятся, используя функцию потерь hinge в сочетании с L2-регуляризацией.
Можно доказать, что этот метод имеет геометрическое обоснование, в том, что он проводит разделяющую гиперплоскость таким образом, чтобы разделить объекты разных классов максимально широкой пограничной полосой (если классы в принципе линейно разделимы), что повышает обобщающую способность метода.
Ниже приведён процесс настройки метода опорных векторов от начальной инициализации (слева) к окончательному решению (справа):
При этом решение будет зависеть только от опорных векторов (support vectors), имеющих отступ при настроенных весах. От неинформативных объектов (non-informative objects) с отступом решение зависеть не будет. Их добавление или удаление из выборки никак не изменит решение. Опорные вектора на рисунке выделены более тёмным цветом.
Другим достоинством метода опорных векторов является обобщаемость метода через ядра (kernel trick), то есть можно так записать фор мулу для построения прогнозов, что она будет зависеть только от попарных скалярных произведений между объектами (а не от самих объектов):
Это позволяет обобщить метод, заменяя операции стандартного скалярного произведения специальными функциями , называемыми ядрами Мерсера (Mercer kernel):
Ядра Мерсера соответствуют обычному скалярному произведению, но не в исходном пространстве признаков , а в нелинейно преобразованном :
что соответствует превращению линейного метода опорных векторов в нелинейный метод классификации.
Метод опорных векторов допускает более общую постановку для решения задачи многоклассовой классификации.
Пример запуска в Python
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
X_train, X_test, Y_train, Y_test = get_demo_classification_data()
model = SVC(C=1) # инициализация модели, (1/C) - вес при регуляризаторе
model.fit(X_train, Y_train) # обучение модели
Y_hat = model.predict(X_test) # построение прогнозов
print(f'Точность прогнозов: {100*accuracy_score(Y_test, Y_hat):.1f}%')
# Можно считать информацию по опорным векторам:
print(f'Число опорных векторов к каждом классе: {model.n_support_}')
print(model.support_vectors_[:5]) # выводим первые 5 опорных векторов
model = SVC(kernel='rbf', gamma=1) # инициализация модели с использованием Гауссова ядра
model.fit(X_train, Y_train) # обучение модели
Y_hat = model.predict(X_test) # построение прогнозов
print(f'Точность прогнозов: {100*accuracy_score(Y_test, Y_hat):.1f}%')