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

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

Простая SVM

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

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

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

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

Реализация SVM с помощью Scikit-Learn

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

Импорт библиотек

Следующий скрипт импортирует необходимые библиотеки:

Импорт набора данных

Данные доступны для скачивания по следующей ссылке:



Подробная информация о данных доступна по следующей ссылке:

Https://archive.ics.uci.edu/ml/datasets/banknote+authentication

Чтобы прочитать данные из файла CSV, самый простой способ - использовать read_csv метод библиотеки панды. Следующий код считывает данные банкнот в фреймворке pandas:

Исследовательский анализ данных

Существует практически безграничное количество способов анализа наборов данных с помощью различных библиотек Python. Для простоты мы проверим только размеры данных и увидим первые несколько записей. Чтобы увидеть строки и столбцы, а также данные, выполните следующую команду:

bankdata.shape

В выводе вы увидите (1372,5). Это означает, что набор данных банкнот состоит из 1372 строк и 5 столбцов.

Чтобы понять, как на самом деле выглядит наш набор данных, выполните следующую команду:

bankdata.head ()

Результат будет выглядеть так:

Вы можете видеть, что все атрибуты в наборе данных являются числовыми. Метка также числовая, то есть 0 и 1.

Предварительная обработка данных

Предварительная обработка данных включает в себя (1) разделение данных на атрибуты и метки и (2) разделение данных на наборы для обучения и тестирования.

Чтобы разделить данные на атрибуты и метки, выполните следующий код:

В первой строке приведенного выше сценария все столбцы bankdata фрейма данных сохраняются в переменной X, кроме столбца «Класс», который является столбцом метки. Метод drop() удаляет этот столбец.

Во второй строке в переменной y хранится только столбец класса. На данный момент переменная x содержит атрибуты, а переменная y содержит соответствующие метки.

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

Для этого выполните следующий сценарий:

Обучение алгоритму

Мы разделили данные на обучающие и тестовые наборы. Пришло время обучить нашу SVM на обучающих данных. Scikit-Learn содержит библиотеку svm, которая содержит встроенные классы для различных алгоритмов SVM. Поскольку мы собираемся выполнить задачу классификации, мы будем использовать класс классификатора опорных векторов, который записан как SVC в библиотеке svm Scikit-Learn. Этот класс принимает один параметр - тип ядра. Это очень важно. В случае простой SVM мы просто устанавливаем этот параметр как «linear», поскольку простые SVM могут классифицировать только линейно разделяемые данные. Мы увидим нелинейные ядра в следующем разделе.

Метод fit класса SVC вызывается для обучения алгоритма на обучающих данных, которые передаются в качестве параметра методу fit. Выполните следующий код для обучения алгоритма:

Прогнозы

Для прогнозов используется метод predict класса SVC. Взгляните на следующий код:

Оценка алгоритма

Матрица неточностей, точность, отзыв и меры F1 являются наиболее часто используемыми метриками для задач классификации. Библиотека metrics Scikit-Learn содержит методы classification_report и confusion_matrix, которые можно легко использовать для определения значений этих важных показателей.

Вот код для поиска этих показателей:

Полученные результаты

Результаты оценки следующие:

Ядро SVM

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

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

По сути, SVM ядра проецирует нелинейно разделяемые данные нижних измерений на линейно разделяемые данные более высоких измерений таким образом, что точки данных, принадлежащие разным классам, распределяются по разным измерениям. Опять же, здесь задействована сложная математика, но вам не нужно беспокоиться об этом, чтобы использовать SVM. Скорее мы можем просто использовать библиотеку Python Scikit-Learn, которая реализует и использует

Реализация Kernel SVM с помощью Scikit-Learn

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

Набор данных можно скачать по следующей ссылке:

Https://archive.ics.uci.edu/ml/datasets/iris4

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

Импорт библиотек

Импорт набора данных

Предварительная обработка

Тренировка тестового сплит

Обучение алгоритму

Для обучения SVM ядра мы используем тот же класс SVC библиотеки svm Scikit-Learn. Разница заключается в значении параметра ядра класса SVC. В случае простой SVM мы использовали «linear» в качестве значения параметра ядра. Однако для ядра SVM вы можете использовать гауссово, полиномиальное, сигмоидальное или вычислимое ядро. Мы реализуем полиномиальное, гауссовское и сигмовидное ядра, чтобы увидеть, какое из них лучше подходит для нашей задачи.

1. Полиномиальное ядро.

В случае полиномиального ядра вы также должны передать значение параметра degree класса SVC. Это в основном степень многочлена. Посмотрите, как мы можем использовать полиномиальное ядро ​​для реализации SVM ядра:

Прогнозы

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

Для этого выполните следующий сценарий:

Оценка алгоритма

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

Выходные данные для ядра SVM с полиномиальным ядром выглядят следующим образом:

Теперь давайте повторим те же шаги для гауссовского и сигмовидного ядер.

2. Гауссовское ядро.

Посмотрите, как мы можем использовать полиномиальное ядро ​​для реализации SVM ядра:

Чтобы использовать ядро ​​Гаусса, вы должны указать «rbf» в качестве значения параметра ядра класса SVC.

Прогноз и оценка

Результат Kernel SVM с гауссовым ядром выглядит так:

3. Сигмовидное ядро

Наконец, давайте использовать сигмоидное ядро ​​для реализации Kernel SVM. Взгляните на следующий сценарий:

Чтобы использовать сигмоидальное ядро, вы должны указать «сигмоид» в качестве значения параметра kernel класса SVC.

Прогноз и оценка

y_pred = svclassifier.predict (X_test)

Выходные данные Kernel SVM с ядром Sigmoid выглядят следующим образом:

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

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

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

Ресурсы

Хотите узнать больше о SVM, Scikit-Learn и других полезных алгоритмах машинного обучения? Я бы порекомендовал изучить более подробные ресурсы, например одну из этих книг:

Заключение

В этой статье мы изучили как простые, так и ядерные SVM. Мы изучили интуицию, лежащую в основе алгоритма SVM, и то, как его можно реализовать с помощью библиотеки Python Scikit-Learn. Мы также изучили различные типы ядер, которые можно использовать для реализации SVM ядра. Я предлагаю вам попробовать реализовать эти алгоритмы на реальных наборах данных, доступных на таких сайтах, как kaggle.com.

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

Спасибо за чтение.