Вступ
Цей посібник є третьою й останньою частиною трьох посібників про машини підтримки векторів (SVM). У цьому посібнику ми продовжимо роботу з випадком використання підроблених банкнот, коротко нагадаємо загальну ідею SVM, зрозуміємо, у чому полягає хитрість ядра, і реалізуємо різні типи нелінійних ядер за допомогою Scikit-Learn.
У повній серії посібників SVM, окрім вивчення інших типів SVM, ви також дізнаєтесь про прості SVM, попередньо визначені параметри SVM, гіперпараметри C і Gamma та те, як їх можна налаштувати за допомогою пошуку в сітці та перехресної перевірки.
Якщо ви бажаєте прочитати попередні посібники, ви можете переглянути перші два посібники або дізнатися, які теми вас цікавлять найбільше. Нижче наведено таблицю тем, які розглядаються в кожному посібнику:
- Випадок використання: забути банкноти
- Передумови SVM
- Проста (лінійна) модель SVM
- Про набір даних
- Імпорт набору даних
- Вивчення набору даних
- Впровадження SVM за допомогою Scikit-Learn
- Розподіл даних на набори тренувань/тестів
- Навчання моделі
- Складання прогнозів
- Оцінка моделі
- Інтерпретація результатів
- Гіперпараметр 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
Тепер ми можемо повторити ті самі кроки для гауссових і сигмоїдних ядер.
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)
Щоб використовувати ядро 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
Порівняння продуктивності нелінійного ядра
Якщо ми коротко порівняємо продуктивність різних типів нелінійних ядер, може здатися, що сигмоподібне ядро має найнижчі показники, отже, найгіршу продуктивність.
Серед ядра Гауса та поліноміального ядра ми бачимо, що ядро Гаусса досягло ідеальної 100%-ої швидкості передбачення – що зазвичай є підозрілим і може вказувати на перевищення, тоді як поліноміальне ядро неправильно класифікувало 68 екземплярів класу 1.
Тому немає жорсткого правила щодо того, яке ядро працює найкраще в кожному сценарії або в нашому поточному сценарії без подальшого пошуку гіперпараметрів, розуміння форми кожної функції, вивчення даних і порівняння результатів навчання та тестування, щоб побачити, чи алгоритм є узагальнюючим.
Йдеться про тестування всіх ядер і вибір того з комбінацією параметрів і підготовки даних, які дають очікувані результати відповідно до контексту вашого проекту.
Йти далі – ручний наскрізний проект
Ваша допитлива природа змушує вас йти далі? Ми рекомендуємо перевірити наш Керований проект: «Практичний прогноз ціни житла – машинне навчання на Python».
У цьому керованому проекті ви дізнаєтеся, як створювати потужні традиційні моделі машинного навчання, а також моделі глибокого навчання, використовувати Ensemble Learning і навчати мета-навчальників прогнозувати ціни на житло на основі моделей Scikit-Learn і Keras.
Використовуючи Keras, API глибокого навчання, створений на основі Tensorflow, ми експериментуватимемо з архітектурами, створюватимемо ансамбль складених моделей і навчатимемо мета-учень нейронна мережа (модель рівня 1), щоб визначити ціну будинку.
Глибоке навчання дивовижне, але перш ніж вдаватися до нього, радимо також спробувати вирішити проблему за допомогою простіших методів, наприклад поверхневе навчання алгоритми. Наша базова продуктивність базуватиметься на a Регресія випадкового лісу алгоритм. Крім того, ми дослідимо створення ансамблів моделей за допомогою Scikit-Learn за допомогою таких методів, як мішок та голосування.
Це наскрізний проект, і, як і всі проекти машинного навчання, ми почнемо з – з Дослідницький аналіз даних, А потім Попередня обробка даних і, нарешті Будівля неглибока та Моделі глибокого навчання щоб відповідати даним, які ми дослідили та очистили раніше.
Висновок
У цій статті ми зробили короткий підсумок SVM, вивчили трюк ядра та реалізували різні варіанти нелінійних SVM.
Я пропоную вам реалізувати кожне ядро та продовжувати йти далі. Ви можете дослідити математику, використану для створення кожного з різних ядер, чому вони були створені та відмінності щодо їхніх гіперпараметрів. Таким чином ви дізнаєтесь про методи та про те, який тип ядра найкраще застосувати залежно від контексту та доступних даних.
Чітке розуміння того, як працює кожне ядро та коли його використовувати, безумовно, допоможе вам у вашій подорожі. Повідомте нам про прогрес і щасливого кодування!
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- Платоблокчейн. Web3 Metaverse Intelligence. Розширені знання. Доступ тут.
- Карбування майбутнього з Адріенн Ешлі. Доступ тут.
- джерело: https://stackabuse.com/implementing-other-svm-flavors-with-pythons-scikit-learn/
- : має
- :є
- : ні
- :де
- $UP
- 1
- 20
- 67
- 8
- 84
- a
- Здатний
- МЕНЮ
- про це
- За
- точність
- досягнутий
- насправді
- Додатково
- впливати
- після
- Оповіщення
- алгоритм
- алгоритмічний
- алгоритми
- ВСІ
- виділено
- вже
- Також
- хоча
- завжди
- дивовижний
- an
- та
- API
- Застосовувати
- підхід
- ЕСТЬ
- стаття
- AS
- At
- доступний
- сумка
- Банк
- заснований
- Базова лінія
- BE
- оскільки
- стає
- перед тим
- початок
- за
- буття
- нижче
- КРАЩЕ
- між
- більший
- border
- обидва
- Межі
- коротко
- будувати
- побудований
- але
- by
- розрахунок
- call
- званий
- CAN
- не може
- випадок
- Зміни
- контроль
- Вибирати
- Вибираючи
- клас
- класів
- класифікація
- ясно
- тісно
- ближче
- код
- поєднання
- об'єднувати
- порівняти
- порівняння
- повний
- комплекс
- висновок
- замішання
- Вважати
- вважається
- контекст
- Відповідний
- може
- покритий
- створювати
- створений
- створення
- Перетинати
- Поточний
- дані
- точки даних
- Підготовка даних
- рішення
- глибокий
- глибоке навчання
- глибше
- безумовно
- Ступінь
- Залежно
- Отриманий
- описаний
- деталь
- деталі
- різниця
- Відмінності
- різний
- Розмір
- розміри
- обговорювалися
- відстань
- do
- кожен
- Раніше
- кінець в кінець
- закінчується
- помилка
- оцінки
- Кожен
- приклад
- виконувати
- очікуваний
- експеримент
- пояснення
- дослідити
- Розвіданий
- Дослідження
- ШВИДКО
- риси
- кілька
- Рисунок
- остаточний
- в кінці кінців
- знайти
- виявлення
- Перший
- відповідати
- гнучкий
- Сфокусувати
- потім
- після
- для
- ліс
- форма
- чотири
- від
- функція
- далі
- Загальне
- отримати
- Git
- Давати
- Go
- буде
- сітка
- керівництво
- Гід
- практичний
- щасливий
- Жорсткий
- Мати
- допомога
- тут
- вище
- будинок
- hover
- Як
- How To
- Однак
- HTML
- HTTPS
- ICON
- ідея
- здійснювати
- реалізовані
- реалізації
- важливо
- in
- включені
- зростаючий
- вказувати
- Нескінченний
- екземпляр
- інтерес
- цікавий
- в
- Вступ
- залучений
- IT
- ЙОГО
- сам
- подорож
- JPG
- тримати
- керас
- Дитина
- Знати
- Знання
- УЧИТЬСЯ
- вивчення
- LG
- libraries
- бібліотека
- лежить
- як
- Лінія
- ліній
- трохи
- подивитися
- ВИГЛЯДИ
- машина
- навчання за допомогою машини
- Машинки для перманенту
- Macro
- made
- зробити
- РОБОТИ
- Робить
- багато
- карта
- Маржа
- математичний
- математика
- matplotlib
- Матриця
- максимізує
- Може..
- згаданий
- просто
- методика
- метрика
- Метрика
- може бути
- модель
- Моделі
- модифікований
- більше
- найбільш
- множинний
- таємничий
- природа
- необхідно
- Необхідність
- мережу
- нейронної мережі
- наступний
- примітки
- зараз
- нумпі
- отримувати
- отриманий
- of
- on
- ONE
- тільки
- оптимальний
- or
- порядок
- Організований
- Інше
- наші
- вихід
- панди
- параметр
- параметри
- частина
- проходити
- ідеальний
- продуктивність
- виступає
- plato
- Інформація про дані Платона
- PlatoData
- Play
- точок
- потужний
- Практичний
- Точність
- передбачати
- прогноз
- Прогнози
- Готувати
- попередній
- раніше
- price
- Прогноз цін
- ціни
- ціни без прихованих комісій
- Проблема
- процес
- прогрес
- проект
- проектів
- Python
- Швидко
- ставка
- швидше
- Rbf
- досягати
- Читати
- реальний
- Короткий огляд
- отримання
- рекомендувати
- про
- запам'ятати
- повторювати
- повторний
- звітом
- REST
- результати
- кільце
- Правило
- біг
- s
- то ж
- сценарій
- scikit-вчитися
- морський народжений
- Пошук
- Грати короля карти - безкоштовно Nijumi логічна гра гри
- розділ
- насіння
- бачачи
- Здається,
- вибирає
- окремий
- Серія
- кілька
- тінь
- Форма
- показаний
- простий
- з
- So
- solid
- Розв’язування
- деякі
- ОРФОГРАФІЯ
- Stackabuse
- укладені
- standard
- стандартів
- старт
- статистика
- Крок
- заходи
- Стоп
- прямий
- навчався
- такі
- підтримка
- підозрілі
- SVG
- таблиця
- Приймати
- Мета
- методи
- тензорний потік
- тест
- Тестування
- Що
- Команда
- їх
- Їх
- Там.
- вони
- Мислення
- третій
- це
- три
- через
- час
- times
- назва
- до
- топ
- теми
- традиційний
- поїзд
- навчений
- Навчання
- Перетворення
- перехід
- правда
- Типи
- типовий
- розуміти
- розуміння
- us
- використання
- використання випадку
- використовуваний
- використання
- зазвичай
- використовувати
- перевірка достовірності
- значення
- Цінності
- Ve
- версія
- через
- шлях..
- we
- ДОБРЕ
- були
- Що
- Що таке
- Чи
- який
- в той час як
- чому
- Вікіпедія
- волі
- з
- без
- Виграв
- робочий
- працює
- найгірше
- б
- X
- Ти
- вашу
- зефірнет