Реалізація інших варіантів SVM за допомогою Scikit-Learn Python

Реалізація інших варіантів SVM за допомогою Scikit-Learn Python

Вступ

Цей посібник є третьою й останньою частиною трьох посібників про машини підтримки векторів (SVM). У цьому посібнику ми продовжимо роботу з випадком використання підроблених банкнот, коротко нагадаємо загальну ідею SVM, зрозуміємо, у чому полягає хитрість ядра, і реалізуємо різні типи нелінійних ядер за допомогою Scikit-Learn.

У повній серії посібників SVM, окрім вивчення інших типів SVM, ви також дізнаєтесь про прості SVM, попередньо визначені параметри SVM, гіперпараметри C і Gamma та те, як їх можна налаштувати за допомогою пошуку в сітці та перехресної перевірки.

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

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

3. Реалізація інших варіантів SVM за допомогою Scikit-Learn Python

  • Загальна ідея SVM (підсумок)
  • Ядро (Trick) SVM
  • Впровадження нелінійного ядра SVM за допомогою Scikit-Learn
  • Імпорт бібліотек
    • Імпорт набору даних
    • Розподіл даних на функції (X) і ціль (y)
    • Розподіл даних на набори тренувань/тестів
    • Навчання алгоритму
  • Поліноміальне ядро
    • Складання прогнозів
    • Оцінка алгоритму
  • Гауссове ядро
    • Прогнозування та оцінка
  • Сигмовидне ядро
    • Прогнозування та оцінка
  • Порівняння продуктивності нелінійного ядра

Давайте згадаємо, що таке SVM, перш ніж побачити кілька цікавих варіантів ядра SVM.

Загальна ідея SVM

У разі лінійно роздільних даних у двох вимірах (як показано на рис. 1) типовий підхід алгоритму машинного навчання полягав би в спробі знайти межу, яка розділяє дані таким чином, щоб помилка неправильної класифікації була мінімізована. Якщо ви уважно подивитесь на малюнок 1, то помітите, що може бути кілька меж (нескінченних), які правильно розділяють точки даних. Дві пунктирні лінії, а також суцільна лінія є дійсною класифікацією даних.

Межі кількох рішень

Малюнок 1: Межі кількох рішень

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

Під час обчислення цієї межі рішення алгоритм вибирає, скільки точок враховувати та наскільки далеко може досягати маржа – це налаштовує проблему максимізації маржі. У вирішенні цієї проблеми максимізації маржі SVM використовує опорні вектори (як показано на рис. 2) і намагається з’ясувати, які оптимальні значення зберігають більшу відстань маржі, при цьому правильно класифікуючи більше точок відповідно до функції, яка використовується для розділити дані.

Границя рішення з опорними векторами

Рис. 2: Межа прийняття рішення з допоміжними векторами

Ось чому SVM відрізняється від інших алгоритмів класифікації, коли він не просто знаходить межу рішення, а в кінцевому підсумку знаходить оптимальну межу рішення.

Існує складна математика, отримана зі статистики та обчислювальних методів, залучених до пошуку опорних векторів, обчислення запасу між межею рішення та опорними векторами та максимізації цього запасу. Цього разу ми не будемо вдаватися в деталі того, як розгортається математика.

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

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

Ядро (Trick) SVM

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

Нелінійно розділені дані

Малюнок 3: Нелінійно розділені дані

Натомість ми можемо використовувати модифіковану версію SVM, яку ми обговорювали на початку, під назвою Kernel SVM.

По суті, SVM ядра буде проектувати нелінійно розділені дані нижчих вимірів у відповідну форму у вищих вимірах. Це хитрість, тому що під час проектування нелінійно роздільних даних у вищих вимірах форма даних змінюється таким чином, що стає роздільною. Наприклад, якщо говорити про 3 виміри, то точки даних з кожного класу можуть в кінцевому підсумку бути розподіленими в іншому вимірі, що робить його роздільним. Одним із способів збільшення розмірності даних може бути їх піднесення до степеня. Знову ж таки, це складна математика, але вам не потрібно турбуватися про це, щоб використовувати SVM. Натомість ми можемо використати бібліотеку Scikit-Learn Python для реалізації та використання нелінійних ядер так само, як ми використовували лінійні.

Впровадження нелінійного ядра 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. Поліноміальне ядро

В алгебрі поліном є виразом виду:

$$
2a*b^3 + 4a – 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 і назва матриці плутанини Сіборна з 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. Вертикальний пошук. Ai.

Тепер ми можемо повторити ті самі кроки для гауссових і сигмоїдних ядер.

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. Вертикальний пошук. Ai.

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

Нарешті, давайте використаємо сигмоподібне ядро ​​для реалізації Kernel SVM. Подивіться на наступний сценарій:

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

Щоб використовувати ядро ​​sigmoid, ви повинні вказати «sigmoid» як значення для 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)

Висновок ядра 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. Вертикальний пошук. Ai.

Порівняння продуктивності нелінійного ядра

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

Серед ядра Гауса та поліноміального ядра ми бачимо, що ядро ​​Гаусса досягло ідеальної 100%-ої швидкості передбачення – що зазвичай є підозрілим і може вказувати на перевищення, тоді як поліноміальне ядро ​​неправильно класифікувало 68 екземплярів класу 1.

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

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

Йти далі – ручний наскрізний проект

Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Керований проект: «Практичний прогноз ціни житла – машинне навчання на Python».

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

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

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

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

Це наскрізний проект, і, як і всі проекти машинного навчання, ми почнемо з – з Дослідницький аналіз даних, А потім Попередня обробка даних і, нарешті Будівля неглибока та Моделі глибокого навчання щоб відповідати даним, які ми дослідили та очистили раніше.

Висновок

У цій статті ми зробили короткий підсумок SVM, вивчили трюк ядра та реалізували різні варіанти нелінійних SVM.

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

Чітке розуміння того, як працює кожне ядро ​​та коли його використовувати, безумовно, допоможе вам у вашій подорожі. Повідомте нам про прогрес і щасливого кодування!

Часова мітка:

Більше від Stackabuse