Впровадження SVM і Kernel SVM за допомогою Scikit-Learn Python

Впровадження SVM і Kernel SVM за допомогою Scikit-Learn Python

Вступ

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

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

1. Реалізація SVM і Kernel SVM за допомогою Scikit-Learn Python

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

2. Розуміння гіперпараметрів SVM (незабаром!)

  • Гіперпараметр C
  • Гамма-гіперпараметр

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

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

Випадок використання: підроблені банкноти

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

Але що відбувається, коли немає людини, яка б дивилася на кожну ноту? Чи є спосіб автоматично дізнатися, підроблені банкноти чи справжні?

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

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

Наразі ми знайшли спосіб обробляти та порівнювати банкноти, але як їх класифікувати на справжні та підроблені? Ми можемо використовувати машинне навчання для цієї класифікації. Існує алгоритм класифікації, який називається Підтримка векторної машини, в основному відомий своєю скороченою формою: SVM.

Передумови SVM

SVM були спочатку представлені в 1968 році Володимиром Вапником та Олексієм Червоненкісом. У той час їхній алгоритм обмежувався класифікацією даних, які можна розділити за допомогою лише однієї прямої лінії, або даних, які лінійно роздільні. Ми можемо побачити, як це поділ виглядатиме:

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

На наведеному вище зображенні ми маємо лінію посередині, деякі точки якої розташовані ліворуч, а інші — праворуч від цієї лінії. Зверніть увагу, що обидві групи точок ідеально розділені, немає точок між або навіть близько до лінії. Між подібними точками і лінією, яка їх розділяє, здається відстань, яка називається запас поділу. Функція поля розділення полягає в тому, щоб збільшити простір між подібними точками та лінією, яка їх розділяє. SVM робить це, використовуючи деякі точки та обчислює їх перпендикулярні вектори, щоб підтвердити рішення щодо краю лінії. Це те опорні вектори які є частиною назви алгоритму. Детальніше про них ми розберемося пізніше. І пряма лінія, яку ми бачимо посередині, знайдена такими методами максимізувати що простір між лінією та точками, або що максимізує поле поділу. Ці методи походять з області Теорія оптимізації.

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

Але що станеться, якщо немає способу розділити дані за допомогою однієї прямої лінії? Якщо є заплутані точки, що не доречні, чи потрібна крива?

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

Цікаво, що тільки останніми роками SVM набули широкого поширення, головним чином завдяки їхній здатності інколи досягати понад 90% правильних відповідей або точність, для складних завдань.

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

У цій статті ми побачимо, що таке алгоритми опорних векторних машин, коротку теорію опорних векторних машин та їх реалізацію в бібліотеці Scikit-Learn Python. Потім ми перейдемо до іншої концепції SVM, відомої як Ядро SVMабо Хитрість ядра, а також реалізовуватиме це за допомогою Scikit-Learn.

Проста (лінійна) модель SVM

Про набір даних

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

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

Існує метод, подібний до того, що ми щойно описали, який можна застосувати до зображень банкнот. Загалом, цей метод полягає в перетворенні пікселів зображення в сигнал, а потім врахуванні порядку, в якому кожен інший сигнал виникає на зображенні, шляхом перетворення його на маленькі хвилі, або вейвлет. Після отримання вейвлетів є спосіб дізнатися порядок, у якому певний сигнал з’являється перед іншим, або час, але не точно який сигнал. Щоб знати це, потрібно отримати частоти зображення. Їх отримують за допомогою методу, який розкладає кожен сигнал, який називається Метод Фур'є.

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

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

Імпорт набору даних

Набір даних банкнот, який ми будемо використовувати в цьому розділі, такий самий, як і в розділі класифікації підручник з дерева рішень.

Примітка: Ви можете завантажити набір даних тут.

Давайте імпортуємо дані в pandas dataframe і подивіться на її перші п’ять рядків head() метод.

Зверніть увагу, що дані зберігаються в a txt (текстовий) формат файлу, розділений комами та без заголовка. Ми можемо реконструювати його як таблицю, прочитавши це як a csv, вказуючи на separator у вигляді коми та додавання імен стовпців за допомогою names аргумент.

Давайте виконаємо ці три кроки одночасно, а потім переглянемо перші п’ять рядків даних:

import pandas as pd 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()

Це призводить до:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Примітка: Ви також можете зберегти дані локально та замінити data_link та цінності data_pathі вкажіть шлях до локального файлу.

Ми бачимо, що в нашому наборі даних є п’ять стовпців, а саме: variance, skewness, curtosis, entropy та class. У п’яти рядках перші чотири стовпці заповнюються такими числами, як 3.62160, 8.6661, -2.8073 або безперервний значення, а остан class перші п'ять рядків стовпця заповнені нулями або a дискретний value.

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

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

  • skewness вейвлет-трансформованого зображення. Асиметрія — це безперервне значення, яке вказує на асиметрію розподілу. Якщо ліворуч від середнього є більше значень, розподіл є таким негативно зміщений, якщо є більше значень праворуч від середнього, розподіл є позитивно перекошений, і якщо середнє значення, мода та медіана однакові, розподіл дорівнює симетрична. Чим більш симетричним є розподіл, тим ближчим він є до нормального розподілу, а його значення також розподілені краще. У поточному контексті це асимметрия коефіцієнтів, які є результатом вейвлет-перетворення. Чим більше симетрично, тим ближче коефіцієнти wevariance, skewness, curtosis, entropyщодо перекладу фактичного зображення.

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

  • curtosis (або ексцес) зображення Wavelet Transformed. Ексцес — це безперервне значення, яке, як і асиметрія, також описує форму розподілу. Залежно від коефіцієнта ексцесу (k), розподіл – у порівнянні зі звичайним розподілом може бути більш-менш рівним – або мати більше чи менше даних у своїх кінцях чи хвостах. Коли розподіл більш розлогий і плоский, це називається платикуртик; коли він менш розповсюджений і більш сконцентрований у середині, мезокуртик; і коли розподіл майже повністю зосереджено в середині, це називається лептокуртик. Це той самий випадок, що й попередні випадки дисперсії та асиметрії, чим більш мезокуртичним є розподіл, тим ближчими були коефіцієнти до трансляції фактичного зображення.

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

  • entropy зображення. Ентропія також є постійною величиною, зазвичай вона вимірює випадковість або безлад у системі. У контексті зображення ентропія вимірює різницю між пікселем і сусідніми пікселями. Для нашого контексту, чим більшу ентропію мають коефіцієнти, тим більше втрат при перетворенні зображення – і чим менша ентропія, тим менша втрата інформації.

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

П'ятою змінною була class змінна, яка, ймовірно, має значення 0 і 1, які визначають, чи була купюра справжньою чи підробленою.

Ми можемо перевірити, чи п’ятий стовпець містить нулі та одиниці за допомогою Pandas unique() метод:

bankdata['class'].unique()

Наведений вище метод повертає:

array([0, 1]) 

Наведений вище метод повертає масив із значеннями 0 і 1. Це означає, що єдиними значеннями, які містяться в рядках нашого класу, є нулі та одиниці. Він готовий до використання як мета у нашому контрольованому навчанні.

  • class зображення. Це ціле число, воно дорівнює 0, коли зображення підроблене, і 1, якщо зображення справжнє.

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

Поради: щоб дізнатися більше про міркування Wavelet Transform на зображеннях банкнот і використання SVM, прочитайте опубліковану статтю авторів.

Ми також можемо побачити, скільки у нас записів або зображень, подивившись на кількість рядків у даних за допомогою shape майно:

bankdata.shape

Це виводить:

(1372, 5)

Рядок вище означає, що є 1,372 рядки трансформованих зображень банкнот і 5 стовпців. Це дані, які ми будемо аналізувати.

Ми імпортували наш набір даних і зробили кілька перевірок. Тепер ми можемо досліджувати наші дані, щоб краще їх зрозуміти.

Вивчення набору даних

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

Щоб дізнатися пропорцію, ми можемо порахувати кожне значення нуль і одиницю в даних value_counts() метод:

bankdata['class'].value_counts()

Це виводить:

0 762
1 610
Name: class, dtype: int64

У наведеному вище результаті ми бачимо, що є 762 нулі та 610 одиниць, або на 152 нулі більше, ніж одиниці. Це означає, що ми трохи більше підробили реальні зображення, і якби ця розбіжність була більшою, наприклад, 5500 нулів і 610 одиниць, це могло б негативно вплинути на наші результати. Як тільки ми намагаємося використати ці приклади в нашій моделі – чим більше прикладів зазвичай означає, що тим більше інформації модель матиме вибрати між підробленими чи справжніми банкнотами – якщо прикладів справжніх банкнот мало, модель схильна до помилялися, намагаючись їх розпізнати.

Ми вже знаємо, що існує ще 152 підроблені купюри, але чи можемо ми бути впевнені, що цих прикладів достатньо для вивчення моделі? Дуже важко відповісти на запитання, скільки прикладів потрібно для навчання, натомість ми можемо спробувати зрозуміти, у відсотках, яка ця різниця між класами.

Перший крок - використання панд value_counts() знову, але тепер давайте подивимося на відсоток, включивши аргумент normalize=True:

bankdata['class'].value_counts(normalize=True)

Команда normalize=True обчислює відсоток даних для кожного класу. Наразі відсоток підроблених (0) і справжніх даних (1) становить:

0 0.555394
1 0.444606
Name: class, dtype: float64

Це означає, що приблизно (~) 56% нашого набору даних підроблені, а 44% — справжні. Це дає нам співвідношення 56%-44%, що дорівнює різниці в 12%. Статистично це вважається невеликою різницею, оскільки вона лише трохи перевищує 10%, тому дані вважаються збалансованими. Якби замість пропорції 56:44 існувала пропорція 80:20 або 70:30, наші дані вважалися б незбалансованими, і нам потрібно було б провести деяку обробку дисбалансу, але, на щастя, це не так.

Ми також можемо побачити цю різницю візуально, подивившись на розподіл класів або цілей за допомогою гістограми, наповненої Pandas, за допомогою:

bankdata['class'].plot.hist();

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

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

Дивлячись на гістограму, ми можемо бути впевнені, що наші цільові значення дорівнюють 0 або 1 і що дані збалансовані.

Це був аналіз стовпця, який ми намагалися передбачити, але як щодо аналізу інших стовпців наших даних?

Ми можемо переглянути статистичні вимірювання за допомогою describe() метод фрейму даних. Ми також можемо використовувати .T of transpose – щоб інвертувати стовпці та рядки, що робить більш прямим порівняння між значеннями:

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

bankdata.describe().T

Це призводить до:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

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

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

Почнемо з розподілу кожної функції та побудуємо гістограму для кожного стовпця даних, за винятком class колонка. The class стовпець не буде враховано за його позицією в масиві стовпців банківських даних. Усі стовпці будуть виділені, крім останнього з columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

Після виконання наведеного вище коду ми бачимо, що обидва skewness та entropy розподіл даних негативно спотворений і curtosis має позитивний перекіс. Усі розподіли симетричні, і variance є єдиним розподілом, близьким до нормального.

Тепер ми можемо перейти до другої частини та побудувати діаграму розсіювання кожної змінної. Для цього ми також можемо вибрати всі стовпці, крім класу, з columns[:-1], використовуйте Сіборн scatterplot() і два цикли for, щоб отримати варіанти поєднання для кожної функції. Ми також можемо виключити сполучення функції з самою собою, перевіривши, чи дорівнює перша ознака другій з if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

Зауважте, що всі графіки мають як реальні, так і підроблені точки даних, невідокремлені одна від одної, це означає, що існує якась суперпозиція класів. Оскільки модель SVM використовує лінію для розділення класів, чи можна будь-яку з цих груп на графіках розділити лише однією лінією? Це здається малоймовірним. Ось так виглядає більшість реальних даних. Найближче до поділу ми можемо підійти в поєднанні skewness та varianceабо entropy та variance сюжети. Ймовірно, це пов'язано з variance дані, що мають форму розподілу, ближчу до нормальної.

Але дивитися на всі ці графіки в послідовності може бути трохи важко. У нас є альтернатива перегляду всіх графіків розподілу та діаграми розсіювання разом за допомогою Сіборна pairplot().

Обидва попередні цикли for, які ми зробили, можна замінити лише цим рядком:

sns.pairplot(bankdata, hue='class');

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

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

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

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

Примітка: Зазвичай у статистиці під час створення моделей зазвичай дотримуються процедури, яка залежить від типу даних (дискретні, неперервні, категоріальні, числові), їх розподілу та припущень моделі. Хоча в інформатиці (CS) є більше місця для проб, помилок і нових ітерацій. У CS зазвичай є базова лінія для порівняння. У Scikit-learn є реалізація фіктивних моделей (або фіктивних оцінювачів), деякі з них не кращі, ніж підкидання монети та просто відповідь так (або 1) 50% часу. Цікаво використовувати фіктивні моделі як основу для фактичної моделі під час порівняння результатів. Очікується, що фактичні результати моделі кращі, ніж випадкові припущення, інакше використовувати модель машинного навчання не потрібно.

Впровадження SVM за допомогою Scikit-Learn

Перш ніж детальніше розбиратися в теорії роботи SVM, ми можемо створити нашу першу базову модель на основі даних і Scikit-Learn Підтримуйте векторний класифікатор or SVC клас.

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

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

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

Розподіл даних на набори тренувань/тестів

На попередній сесії ми зрозуміли та дослідили дані. Тепер ми можемо розділити наші дані на два масиви – один для чотирьох функцій, а інший для п’ятої, або цільової, функції. Оскільки ми хочемо передбачити клас залежно від вейвлет-коефіцієнтів, наш y буде class колонка і наша X буде variance, skewness, curtosis та entropy стовпчики.

Щоб розділити ціль і ознаки, ми можемо віднести лише class стовпець до y, пізніше видаливши його з фрейму даних, щоб приписати решту стовпців X з .drop() метод:

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

Після того, як дані розділені на атрибути та мітки, ми можемо далі розділити їх на навчальні та тестові набори. Це можна було б зробити вручну, але model_selection бібліотека Scikit-Learn містить train_test_split() метод, який дозволяє нам випадковим чином розділяти дані на набори тренувань і тестів.

Щоб використовувати його, ми можемо імпортувати бібліотеку, зателефонуйте train_test_split() метод, передати в X та y даних і визначте a test_size передати як аргумент. У цьому випадку ми визначимо це як 0.20– це означає, що 20% даних буде використано для тестування, а інші 80% – для навчання.

Цей метод випадково бере вибірки з дотриманням визначеного нами відсотка, але зважає на пари Xy, щоб вибірка повністю не сплутала зв’язок.

Оскільки процес вибірки за своєю суттю є випадковим, ми завжди матимемо різні результати під час виконання методу. Щоб отримати однакові або відтворювані результати, ми можемо визначити константу під назвою SEED зі значенням 42.

Для цього можна виконати наступний сценарій:

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

Зверніть увагу, що train_test_split() метод уже повертає X_train, X_test, y_train, y_test набори в такому порядку. Ми можемо надрукувати кількість зразків, розділених для тренування та тестування, отримавши перший (0) елемент shape властивість повертає кортеж:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

Це свідчить про те, що є 1097 проб для навчання та 275 для перевірки.

Навчання моделі

Ми розділили дані на навчальні та тестові набори. Тепер настав час створити та навчити модель SVM на даних поїзда. Для цього ми можемо імпортувати Scikit-Learn svm бібліотека разом з ім Підтримуйте векторний класифікатор клас, або SVC клас.

Після імпортування класу ми можемо створити його екземпляр – оскільки ми створюємо просту модель SVM, ми намагаємося розділити наші дані лінійно, тож ми можемо намалювати лінію, щоб розділити наші дані – це те саме, що використання лінійна функція – шляхом визначення kernel='linear' як аргумент для класифікатора:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

Таким чином, класифікатор намагатиметься знайти лінійну функцію, яка розділяє наші дані. Після створення моделі навчимо її, або відповідати це, з даними поїзда, використовуючи fit() метод і надання в X_train Особливості і y_train цілі як аргументи.

Ми можемо виконати наступний код, щоб навчити модель:

svc.fit(X_train, y_train)

Просто так модель тренується. Наразі ми зрозуміли дані, розділили їх, створили просту модель SVM і підігнали модель до даних поїзда.

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

Складання прогнозів

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

Враховуючи, що навчання контролюється, ми можемо робити прогнози X_test і порівняти ці результати передбачення, які ми можемо назвати y_pred – з фактичним y_testабо основна правда.

Щоб передбачити деякі дані, модель predict() метод можна використовувати. Цей метод отримує тестові властивості, X_test, як аргумент і повертає прогноз, 0 або 1, для кожного з X_testрядки.

Після передбачення X_test даних, результати зберігаються в a y_pred змінна. Таким чином, кожен із класів, передбачених простою лінійною моделлю SVM, тепер доступний y_pred змінна.

Це код передбачення:

y_pred = svc.predict(X_test)

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

Оцінка моделі

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

  1. Матриця плутанини: коли нам потрібно знати, скільки зразків ми взяли правильно чи неправильно кожен клас. Значення, які були правильними і правильно передбачуваними, називаються справжні позитиви, ті, які були передбачені як позитивні, але не були позитивними, називаються помилкові позитиви. Та сама номенклатура справжні негативи та помилкові негативи використовується для від’ємних значень;

  2. Точність: коли наша мета полягає в тому, щоб зрозуміти, які правильні значення прогнозу вважалися правильними нашим класифікатором. Точність ділить справжні позитивні значення на зразки, які були прогнозовані як позитивні;

$$
точність = frac{текст{справжні позитивні}}{текст{справжні позитивні} + текст{хибні позитивні}}
$$

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

$$
recall = frac{текст{справжні позитивні}}{текст{справжні позитивні} + текст{хибні негативні}}
$$

  1. F1 бал: є збалансованим або гармонійне середнє точності та відкликання. Найменше значення 0, а найвище 1. Коли f1-score дорівнює 1, це означає, що всі класи були правильно передбачені – це дуже важко отримати оцінку з реальними даними (майже завжди існують винятки).

$$
text{f1-score} = 2* frac{text{precision} * text{recall}}{text{precision} + text{recall}}
$$

Ми вже познайомилися з матрицею плутанини, точністю, запам’ятовуванням і показниками F1. Щоб обчислити їх, ми можемо імпортувати Scikit-Learn metrics бібліотека. Ця бібліотека містить classification_report та confusion_matrix метод класифікаційного звіту повертає точність, відкликання та оцінку f1. Обидва classification_report та confusion_matrix можна легко використовувати для визначення значень усіх цих важливих показників.

Для обчислення метрик ми імпортуємо методи, викликаємо їх і передаємо як аргументи передбачені класифікації, y_test, і класифікаційні мітки, або y_true.

Для кращої візуалізації матриці плутанини ми можемо побудувати її у вигляді Сіборна heatmap разом із кількісними анотаціями, а для звіту про класифікацію найкраще надрукувати його результат, щоб його результати були відформатовані. Це наступний код:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

Тут відображається:

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

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

У класифікаційному звіті ми знаємо, що точність 0.99, відкликання 0.99 та оцінка f1 0.99 для підроблених банкнот, або клас 0. Ці вимірювання були отримані з використанням 148 зразків, як показано в опорному стовпці. Тим часом, для класу 1, або справжніх нот, результат був на одну одиницю нижче, 0.98 точності, 0.98 запам’ятовування та той самий бал f1. Цього разу для отримання цих результатів було використано 127 вимірювань зображень.

Якщо ми подивимося на матрицю плутанини, ми також побачимо, що зі 148 зразків класу 0 146 були правильно класифіковані, і було 2 хибнопозитивних, тоді як для 127 зразків класу 1 було 2 хибнонегативних і 125 справді позитивних.

Ми можемо прочитати звіт про класифікацію та матрицю плутанини, але що вони означають?

Інтерпретація результатів

Щоб дізнатися значення, давайте розглянемо всі показники разом.

Майже всі зразки для класу 1 були правильно класифіковані, було 2 помилки для нашої моделі при ідентифікації справжніх банкнот. Це те саме, що 0.98, або 98%, відкликання. Щось подібне можна сказати про клас 0, лише 2 зразки були класифіковані неправильно, тоді як 148 є справді негативними, що становить загальну точність 99%.

Окрім цих результатів, усі інші оцінюють 0.99, тобто майже 1, дуже високий показник. У більшості випадків, коли така висока метрика трапляється з реальними даними, це може вказувати на те, що модель надто адаптована до даних, або переобладнаний.

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

Швидкий тест, щоб з’ясувати, чи відбувається перевищення, також виконується за допомогою даних поїзда. Якщо модель певною мірою запам’ятала дані поїзда, показники будуть дуже близькими до 1 або 100%. Пам’ятайте, що дані потягу більші, ніж дані тестування – з цієї причини – намагайтеся дивитися на них пропорційно, більше зразків, більше шансів на помилки, якщо тільки не було перевищення.

Щоб передбачити дані поїзда, ми можемо повторити те, що ми зробили для тестових даних, але тепер із X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

Це виводить:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

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

Легко побачити, що, здається, є перевищення, коли показники поїзда становлять 99%, маючи в 4 рази більше даних. Що можна зробити в цьому випадку?

Щоб скасувати перевищення, ми можемо додати більше спостережень поїзда, використати метод навчання з різними частинами набору даних, наприклад перехресна перевірка, а також змінити параметри за замовчуванням, які вже існують до навчання, під час створення нашої моделі, або гіперпараметри. У більшості випадків Scikit-learn встановлює деякі параметри за замовчуванням, і це може відбуватися мовчки, якщо немає багато часу, присвяченого читанню документації.

Ви можете переглянути другу частину цього посібника (незабаром!), щоб побачити, як реалізувати перехресну перевірку та виконати налаштування гіперпараметрів.

Висновок

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

Щоб продовжувати практику, ви можете спробувати інші реальні набори даних, доступні в таких місцях, як Згорнути, UCI, Публічні набори даних Big Query, університети та державні веб-сайти.

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

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

Більше від Stackabuse