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

Эта история была впервые опубликована в моем блоге.

Что делают машины опорных векторов?

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

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

Разница между линейными и нелинейными данными

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

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

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

Линейный пример

Чтобы создать линейный пример и обучить модель с помощью алгоритма Support Vector Machines, я буду использовать алгоритм C-Support Vector Classification из библиотеки sklearn в Python. Сначала мы просто реализуем чистый алгоритм классификации C-Support Vector Classification (SVC) на наборе данных радужной оболочки глаза.

# iris_svc.py
# iris dataset
# 150 total entries
# features are: sepal length in cm, sepal width in cm, petal length in cm, petal width in cm\n 
# labels names: setosa, versicolor, virginica
#
# used algorithm: SVC (C-Support Vector Classifiction) 
#
# accuracy ~100%
#
from time import time
import numpy as np
from sklearn.datasets import load_iris
from sklearn import svm
from sklearn.metrics import accuracy_score
def main():
	data_set = load_iris()
	features, labels = split_features_labels(data_set)
	train_features, train_labels, test_features, test_labels = split_train_test(features, labels, 0.18)
	print(len(train_features), " ", len(test_features))
	clf = svm.SVC()
	print("Start training...")
	tStart = time()
	clf.fit(train_features, train_labels)
	print("Training time: ", round(time()-tStart, 3), "s")
	print("Accuracy: ", accuracy_score(clf.predict(test_features), test_labels))

def split_train_test(features, labels, test_size):
	total_test_size = int(len(features) * test_size)
	np.random.seed(2)
	indices = np.random.permutation(len(features))
	train_features = features[indices[:-total_test_size]]
	train_labels = labels[indices[:-total_test_size]]
	test_features  = features[indices[-total_test_size:]]
	test_labels  = labels[indices[-total_test_size:]]
	return train_features, train_labels, test_features, test_labels
def split_features_labels(data_set):
	features = data_set.data
	labels = data_set.target
	return features, labels
if __name__ == "__main__":
	main()

Выход:

123 27
Начать тренировку…
Время тренировки: 0,002 с
Точность: 1,0

Хорошо, похоже, это работает очень хорошо, но как выглядит линия решения машины опорных векторов? Сначала давайте построим график набора данных диафрагмы, чтобы увидеть, как он выглядит. Чтобы упростить задачу, давайте сосредоточимся на первых двух характеристиках: длине чашелистика и ширине чашелистника.

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

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

Как это работает?

Людям это кажется довольно интуитивным. Мы просто рисуем линию, чтобы отделить разные помеченные классы друг от друга. Но как опорные векторные машины решают эту проблему? SVM, который нужно найти, - это так называемая гиперплоскость с максимальным запасом.

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

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

куда

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

не обязательно должен быть единичным вектором.

Параметр

определяет смещение гиперплоскости от начала координат вдоль вектора нормали

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

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

Использование машин опорных векторов для нелинейных данных с помощью трюка с ядром

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

Как работает метод ядра?

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

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

Реализация

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

Продолжить

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

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

Эта история была впервые опубликована в моем блоге.