Введение
Это руководство является третьей и последней частью трех руководств по машинам опорных векторов (SVM). В этом руководстве мы продолжим работать с вариантом использования поддельных банкнот, кратко рассмотрим общую идею SVM, поймем, в чем заключается хитрость ядра, и реализуем различные типы нелинейных ядер с помощью Scikit-Learn.
В полной серии руководств по SVM, помимо изучения других типов SVM, вы также узнаете о простом SVM, предопределенных параметрах SVM, гиперпараметрах C и Gamma и о том, как их можно настроить с помощью поиска по сетке и перекрестной проверки.
Если вы хотите прочитать предыдущие руководства, вы можете взглянуть на первые два руководства или посмотреть, какие темы вас интересуют больше всего. Ниже приведена таблица тем, рассматриваемых в каждом руководстве:
- Пример использования: забудьте о банкнотах
- Предыстория SVM
- Простая (линейная) модель SVM
- О наборе данных
- Импорт набора данных
- Изучение набора данных
- Внедрение SVM с помощью Scikit-Learn
- Разделение данных на обучающие/тестовые наборы
- Обучение модели
- Делать прогнозы
- Оценка модели
- Интерпретация результатов
- Гиперпараметр 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
Теперь мы можем повторить те же шаги для гауссовых и сигмовидных ядер.
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
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
Сравнение производительности нелинейного ядра
Если кратко сравнить производительность разных типов нелинейных ядер, то может показаться, что у сигмовидного ядра самые низкие метрики, а значит, худшая производительность.
Среди гауссовских и полиномиальных ядер мы можем видеть, что гауссовское ядро достигло идеальной 100%-й скорости предсказания, что обычно подозрительно и может указывать на переобучение, в то время как полиномиальное ядро неправильно классифицировало 68 экземпляров класса 1.
Поэтому не существует жесткого и быстрого правила относительно того, какое ядро работает лучше всего в каждом сценарии или в нашем текущем сценарии без дальнейшего поиска гиперпараметров, понимания каждой формы функции, изучения данных и сравнения результатов обучения и тестирования, чтобы увидеть, работает ли алгоритм. является обобщающим.
Все дело в тестировании всех ядер и выборе того, с комбинацией параметров и подготовкой данных, которые дают ожидаемые результаты в соответствии с контекстом вашего проекта.
Идти дальше — Ручной сквозной проект
Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим Управляемый проект: «Практическое прогнозирование цен на жилье — машинное обучение на Python».
В этом управляемом проекте вы узнаете, как создавать мощные модели традиционного машинного обучения, а также модели глубокого обучения, использовать Ensemble Learning и обучать мета-обучающихся прогнозировать цены на жилье на основе моделей Scikit-Learn и Keras.
С помощью Keras, API глубокого обучения, построенного на основе Tensorflow, мы будем экспериментировать с архитектурами, создавать набор многоуровневых моделей и обучать мета-ученик нейронная сеть (модель уровня 1), чтобы выяснить цену дома.
Глубокое обучение удивительно, но прежде чем прибегать к нему, рекомендуется также попытаться решить проблему с помощью более простых методов, таких как поверхностное обучение алгоритмы. Наша базовая производительность будет основываться на Случайная лесная регрессия алгоритм. Кроме того, мы рассмотрим создание ансамблей моделей с помощью Scikit-Learn с помощью таких методов, как мешковина и голосование.
Это сквозной проект, и, как и все проекты машинного обучения, мы начнем с — с Исследовательский анализ данных, с последующим Предварительная обработка данных и, наконец, Мелководье и Модели глубокого обучения чтобы соответствовать данным, которые мы исследовали и очистили ранее.
Заключение
В этой статье мы сделали краткий обзор SVM, изучили трюк с ядром и реализовали различные разновидности нелинейных SVM.
Я предлагаю вам реализовать каждое ядро и продолжать двигаться дальше. Вы можете изучить математику, используемую для создания каждого из различных ядер, почему они были созданы и различия в их гиперпараметрах. Таким образом, вы узнаете о методах и о том, какой тип ядра лучше всего применять в зависимости от контекста и доступных данных.
Четкое понимание того, как работает каждое ядро и когда их использовать, определенно поможет вам в вашем путешествии. Дайте нам знать, как идут успехи, и удачного кодирования!
- SEO-контент и PR-распределение. Получите усиление сегодня.
- Платоблокчейн. Интеллект метавселенной Web3. Расширение знаний. Доступ здесь.
- Чеканка будущего с Эдриенн Эшли. Доступ здесь.
- Источник: https://stackabuse.com/implementing-other-svm-flavors-with-pythons-scikit-learn/
- :имеет
- :является
- :нет
- :куда
- $UP
- 1
- 20
- 67
- 8
- 84
- a
- в состоянии
- О нас
- об этом
- По
- точность
- достигнутый
- на самом деле
- Дополнительно
- влиять на
- После
- Оповещение
- алгоритм
- алгоритмический
- алгоритмы
- Все
- выделено
- уже
- причислены
- Несмотря на то, что
- всегда
- удивительный
- an
- и
- API
- Применить
- подхода
- МЫ
- гайд
- AS
- At
- доступен
- сумка
- Банка
- основанный
- Базовая линия
- BE
- , так как:
- становится
- до
- начало
- за
- не являетесь
- ниже
- ЛУЧШЕЕ
- между
- больший
- граница
- изоферменты печени
- Границы
- кратко
- строить
- построенный
- но
- by
- расчет
- призывают
- под названием
- CAN
- не могу
- случаев
- изменения
- контроль
- Выберите
- Выбирая
- класс
- классов
- классификация
- Очистить
- тесно
- ближе
- код
- сочетание
- объединять
- сравнить
- сравнив
- полный
- комплекс
- заключение
- замешательство
- Рассматривать
- считается
- контекст
- соответствующий
- может
- покрытый
- Создайте
- создали
- Создающий
- Пересекать
- Текущий
- данным
- точки данных
- Подготовка данных
- решение
- глубоко
- глубокое обучение
- более глубокий
- определенно
- Степень
- в зависимости
- Производный
- описано
- подробность
- подробнее
- разница
- Различия
- различный
- Размеры
- размеры
- обсуждается
- расстояние
- do
- каждый
- Ранее
- впритык
- окончания поездки
- ошибка
- оценки
- Каждая
- пример
- выполнять
- ожидаемый
- эксперимент
- объяснение
- Больше
- Разведанный
- Исследование
- БЫСТРО
- Особенности
- несколько
- фигура
- окончательный
- в заключение
- Найдите
- обнаружение
- Во-первых,
- соответствовать
- гибкого
- Фокус
- следует
- после
- Что касается
- лес
- форма
- 4
- от
- функция
- далее
- Общие
- получить
- идти
- Дайте
- Go
- будет
- сетка
- инструкция
- Гиды
- практический
- счастливый
- Жесткий
- Есть
- помощь
- здесь
- высший
- Вилла / Бунгало
- зависать
- Как
- How To
- Однако
- HTML
- HTTPS
- ICON
- идея
- осуществлять
- в XNUMX году
- Осуществляющий
- важную
- in
- включены
- повышение
- указывать
- Бесконечный
- пример
- интерес
- интересный
- в
- Введение
- вовлеченный
- IT
- ЕГО
- саму трезвость
- путешествие
- JPG
- Сохранить
- keras
- Вид
- Знать
- знание
- УЧИТЬСЯ
- изучение
- LG
- библиотеки
- Библиотека
- лежит
- такое как
- линия
- линий
- мало
- посмотреть
- ВЗГЛЯДЫ
- машина
- обучение с помощью машины
- Продукция
- Макрос
- сделанный
- сделать
- ДЕЛАЕТ
- Создание
- многих
- карта
- Маржа
- математический
- математика
- Matplotlib
- матрица
- максимизирует
- Май..
- упомянутый
- просто
- методы
- метрический
- Метрика
- может быть
- модель
- Модели
- модифицировало
- БОЛЕЕ
- самых
- с разными
- таинственный
- природа
- необходимо
- Необходимость
- сеть
- нейронной сети
- следующий
- Заметки
- сейчас
- NumPy
- получать
- полученный
- of
- on
- ONE
- только
- оптимальный
- or
- заказ
- Организованный
- Другое
- наши
- выходной
- панд
- параметр
- параметры
- часть
- pass
- ИДЕАЛЬНОЕ
- производительность
- выполняет
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- Играть
- пунктов
- мощный
- практическое
- Точность
- предсказывать
- прогноз
- Predictions
- Подготовить
- предыдущий
- предварительно
- цена
- Прогнозирование цены
- Цены
- цены
- Проблема
- процесс
- Прогресс
- Проект
- проектов
- Питон
- САЙТ
- Обменный курс
- скорее
- Руб.
- достигать
- Читать
- реальные
- резюме
- получение
- рекомендовать
- по
- помнить
- повторять
- повторный
- отчету
- ОТДЫХ
- Итоги
- кольцо
- Правило
- Бег
- s
- то же
- сценарий
- scikit учиться
- рожденное море
- Поиск
- поиск
- Раздел
- семя
- видя
- кажется
- выбор
- отдельный
- Серии
- несколько
- Shadow
- Форма
- показанный
- просто
- с
- So
- твердый
- Решение
- некоторые
- SPELL
- Стекабьюс
- сложены
- стандарт
- стандартов
- Начало
- статистика
- Шаг
- Шаги
- Stop
- прямой
- учился
- такие
- поддержка
- подозрительный
- SVG
- ТАБЛИЦЫ
- взять
- цель
- снижения вреда
- tensorflow
- тестXNUMX
- Тестирование
- который
- Ассоциация
- их
- Их
- Там.
- они
- мышление
- В третьих
- этой
- три
- Через
- время
- раз
- Название
- в
- топ
- Темы
- традиционный
- Train
- специалистов
- Обучение
- Transform
- переход
- правда
- Типы
- типичный
- понимать
- понимание
- us
- использование
- прецедент
- используемый
- через
- обычно
- использовать
- Проверка
- ценностное
- Наши ценности
- Ve
- версия
- с помощью
- Путь..
- we
- ЧТО Ж
- были
- Что
- Что такое
- будь то
- который
- в то время как
- зачем
- Википедия.
- будете
- без
- Выиграл
- работает
- работает
- Наихудший
- бы
- X
- Ты
- ВАШЕ
- зефирнет