Реализация других разновидностей SVM с помощью Python Scikit-Learn

Реализация других разновидностей SVM с помощью Python Scikit-Learn

Введение

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

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

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

  1. Реализация SVM и Kernel SVM с помощью Python Scikit-Learn
  • Пример использования: забудьте о банкнотах
  • Предыстория SVM
  • Простая (линейная) модель SVM
    • О наборе данных
    • Импорт набора данных
    • Изучение набора данных
  • Внедрение SVM с помощью Scikit-Learn
    • Разделение данных на обучающие/тестовые наборы
    • Обучение модели
    • Делать прогнозы
    • Оценка модели
    • Интерпретация результатов
  1. Понимание гиперпараметров SVM
  • Гиперпараметр C
  • Гамма-гиперпараметр

3. Реализация других разновидностей SVM с помощью Python Scikit-Learn

  • Общая идея SVM (резюме)
  • Ядро (Трюк) SVM
  • Реализация нелинейного ядра SVM с помощью Scikit-Learn
  • Импорт библиотек
    • Импорт набора данных
    • Разделение данных на функции (X) и цель (y)
    • Разделение данных на обучающие/тестовые наборы
    • Обучение алгоритму
  • Полиномиальное ядро
    • Делать прогнозы
    • Оценка алгоритма
  • Гауссово ядро
    • Прогноз и оценка
  • Сигмовидное ядро
    • Прогноз и оценка
  • Сравнение производительности нелинейного ядра

Давайте вспомним, что такое SVM, прежде чем увидеть некоторые интересные варианты ядра SVM.

Общая идея SVM

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

Множественные границы принятия решений

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

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

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

Граница решения с опорными векторами

Рис. 2. Граница принятия решения с опорными векторами

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

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

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

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

Ядро (Трюк) SVM

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

Нелинейно разделимые данные

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

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

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

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

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

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

Разделение данных на функции (X) и цель (y)

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

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

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

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

Для обучения SVM ядра мы будем использовать тот же SVC класс Scikit-Learn's svm библиотека. Разница заключается в значении параметра ядра SVC класса.

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

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

В алгебре многочлен — это выражение вида:

$$
2а*б^3 + 4а – 9
$$

Это имеет переменные, такие как a и b, константы, в нашем примере 9 и коэффициенты (константы, сопровождаемые переменными), такие как 2 и 4, 3 считается степенью многочлена.

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

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Так, для реализации полиномиальное ядро, помимо выбора poly ядро, мы также передадим значение для degree параметр SVC учебный класс. Ниже приведен код:

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

Делать прогнозы

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

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

y_pred_poly = svclassifier.predict(X_test)

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

Как обычно, последним шагом является оценка полиномиального ядра. Поскольку мы несколько раз повторяли код для отчета о классификации и матрицы путаницы, давайте преобразуем его в функцию, которая display_results после получения соответствующих y_test, y_pred и заголовок к матрице путаницы Seaborn с cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

Теперь мы можем вызвать функцию и посмотреть на результаты, полученные с полиномиальным ядром:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

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

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Реализация других разновидностей SVM с помощью Python Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

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

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

При дальнейшем изучении этого ядра вы также можете использовать поиск по сетке, чтобы комбинировать его с различными C и gamma значения.

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

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

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

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

Реализация других разновидностей SVM с помощью Python Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

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

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

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

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

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Реализация других разновидностей SVM с помощью Python Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

Среди гауссовских и полиномиальных ядер мы можем видеть, что гауссовское ядро ​​достигло идеальной 100%-й скорости предсказания, что обычно подозрительно и может указывать на переобучение, в то время как полиномиальное ядро ​​неправильно классифицировало 68 экземпляров класса 1.

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

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

Идти дальше — Ручной сквозной проект

Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим Управляемый проект: «Практическое прогнозирование цен на жилье — машинное обучение на Python».

Реализация других разновидностей SVM с помощью Python Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

С помощью Keras, API глубокого обучения, построенного на основе Tensorflow, мы будем экспериментировать с архитектурами, создавать набор многоуровневых моделей и обучать мета-ученик нейронная сеть (модель уровня 1), чтобы выяснить цену дома.

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

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

Заключение

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

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

Четкое понимание того, как работает каждое ядро ​​и когда их использовать, определенно поможет вам в вашем путешествии. Дайте нам знать, как идут успехи, и удачного кодирования!

Отметка времени:

Больше от Стекабьюс