[Перевод] Реализация SVM и Kernel SVM с помощью Scikit-Learn

Программа перевода самородков Python алгоритм scikit-learn

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

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

Простой SVM

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

Multiple Decision Boundaries

Рисунок 1: Несколько границ принятия решений

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

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

Decision Boundary with Support Vectors

Рисунок 2: Опорные векторы для границ принятия решений

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

Внедрение SVM с помощью Scikit-Learn

мы будем использовать иУчебное пособие по дереву решенийте же данные.

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

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

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

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

Данные можно скачать по ссылке ниже:

drive.Google.com/file//13, который…

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

archive.ICS.UCI.credits/beauty/datasets…

Загрузите данные по ссылке на диск Google и сохраните их локально. Набор данных в этом примере сохранен в файле CSV в папке «Наборы данных» на диске D моего компьютера с Windows. Код ниже считывает данные из пути к файлу. Вы можете изменить его в соответствии с путем к файлу на вашем компьютере.

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

bankdata = pd.read_csv("D:/Datasets/bill_authentication.csv")

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

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

bankdata.shape

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

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

bankdata.head()

Результат выглядит следующим образом:

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

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

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

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

X = bankdata.drop('Class', axis=1)
y = bankdata['Class']

Первая строка приведенного выше кода начинается сbankdataУдалите столбец метки категории «Класс» из фрейма данных и назначьте результат переменной.X. функцияdrop()Удалить указанный столбец.

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

Теперь, когда набор данных отделен от меток атрибутов и классов, последним этапом предварительной обработки является разделение обучающего и тестового наборов. К счастью, в Scikit-Learnmodel_selectionмодуль обеспечивает функцииtrain_test_splitПозволяет нам элегантно разделить данные на обучение и тестирование.

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

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

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

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

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

from sklearn.svm import SVC
svclassifier = SVC(kernel='linear')
svclassifier.fit(X_train, y_train)

делать предсказания

SVCКатегорияpredictметод может использоваться для прогнозирования класса новых данных. код показывает, как показано ниже:

y_pred = svclassifier.predict(X_test)

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

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

Ниже приведен код для расчета индекса оценки:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

результат

Вот результаты оценки:

[[152    0]
 [  1  122]]
              precision   recall   f1-score   support

           0       0.99     1.00       1.00       152
           1       1.00     0.99       1.00       123

avg / total        1.00     1.00       1.00       275

Из приведенных выше результатов оценки мы можем сделать вывод, что SVM немного лучше, чем дерево решений. SVM имеет только 1% ошибок классификации, а дерево решений - 4%.

Kernel SVM

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

Non-linearly Separable Data

Рис. 3: Нелинейно разделяемые данные

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

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

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

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

Данные можно скачать по ссылке ниже:

archive.ICS.UCI.credits/beauty/datasets…

Остальные шаги являются типичными шагами машинного обучения.Перед обучением Kernel SVM нам нужны краткие инструкции.

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

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

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

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# Assign colum names to the dataset
colnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

# Read dataset to pandas dataframe
irisdata = pd.read_csv(url, names=colnames)

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

X = irisdata.drop('Class', axis=1)
y = irisdata['Class']

Разделение обучающих и тестовых наборов

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

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

Также с помощью Scikit-Learn'ssvmв модулеSVCсвоего рода. Разница в классеSVCЗначения параметров типа функции ядра не совпадают. Тип ядра, который мы используем в Simple SVM, — «линейный». Однако с ядром SVM вы можете использовать гауссово, полиномиальное, сигмовидное или другое вычислимое ядро. Мы реализуем полиномиальное, гауссовское и сигмовидное ядра и проверим, какое из них работает лучше.

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

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

from sklearn.svm import SVC
svclassifier = SVC(kernel='poly', degree=8)
svclassifier.fit(X_train, y_train)

делать предсказания

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

Для этого запустите следующий код:

y_pred = svclassifier.predict(X_test)

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

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

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

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

[[11  0  0]
 [ 0 12  1]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       1.00     1.00       1.00        11
Iris-versicolor       1.00     0.92       0.96        13  
 Iris-virginica       0.86     1.00       0.92         6

    avg / total       0.97     0.97       0.97        30

Теперь давайте повторим описанные выше шаги, используя ядра Гаусса и сигмоиды.

2. Ядро Гаусса

Взгляните, как мы реализовали ядро ​​SVM с гауссовым ядром:

from sklearn.svm import SVC
svclassifier = SVC(kernel='rbf')
svclassifier.fit(X_train, y_train)

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

Прогнозировать и оценивать

y_pred = svclassifier.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Вывод с использованием ядра Гаусса:

[[11  0  0]
 [ 0 13  0]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       1.00     1.00       1.00        11
Iris-versicolor       1.00     1.00       1.00        13  
 Iris-virginica       1.00     1.00       1.00         6

    avg / total       1.00     1.00       1.00        30

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

Наконец, давайте реализуем Kernel SVM, используя сигмовидные ядра. См. код ниже:

from sklearn.svm import SVC
svclassifier = SVC(kernel='sigmoid')
svclassifier.fit(X_train, y_train)

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

Прогнозировать и оценивать

y_pred = svclassifier.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

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

[[ 0  0 11]
 [ 0  0 13]
 [ 0  0  6]]
                 precision   recall   f1-score   support

    Iris-setosa       0.00     0.00       0.00        11
Iris-versicolor       0.00     0.00       0.00        13  
 Iris-virginica       0.20     1.00       0.33         6

    avg / total       0.04     0.20       0.07        30

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

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

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

ресурс

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

Суммировать

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

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

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.