Розуміння гіперпараметрів SVM

Розуміння гіперпараметрів SVM

Вступ

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

У повній серії посібників 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

Щоб побачити всі параметри моделі, які вже були встановлені Scikit-learn, і їх значення за замовчуванням, ми можемо використати get_params() метод:

svc.get_params()

Цей метод відображає:

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

Зверніть увагу, що загалом уже встановлено 15 гіперпараметрів, це відбувається тому, що алгоритм SVM має багато варіацій. Ми використовували лінійне ядро, щоб отримати лінійну функцію, але є також ядра, які описують інші види функцій, і ці ядра параметризовані різними способами.

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

Тепер, коли ми розуміємо, що існує 4 типи різних функцій ядра, ми можемо повернутися до параметрів. Коли алгоритм SVM намагається знайти поділ між класами, ми вже зрозуміли, що він малює класифікацію margin між опорними векторами та лінією поділу (або кривою).

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

Коли вибрано ці поля, параметром, який їх визначає, є C параметр.

Гіперпараметр C

Команда C параметр обернено пропорційний розміру маржі, це означає, що більше Значення C, менше націнка, і, навпаки, на менше Значення C, більше маржа. The C Параметр можна використовувати разом з будь-яким ядром, він повідомляє алгоритму, наскільки уникнути неправильної класифікації кожної навчальної вибірки, через це він також відомий як регуляризація. Наше лінійне ядро ​​SVM використовує a C 1.0, що є a великий значення і дає a менша маржа.

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Ми можемо експериментувати з a менше значення 'C' і зрозуміти на практиці, що відбувається з a більший запас. Для цього ми створимо новий класифікатор, svc_cі змінити лише значення C до 0.0001. Давайте також повторимо fit та predict кроки:

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

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

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

Це виводить:

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

За допомогою меншого C і отримавши більший запас, класифікатор став більш гнучким і з більшою кількістю помилок класифікації. У класифікаційному звіті ми бачимо, що f1-score, який раніше становив 0.99 для обох класів, знизився до 0.88 для класу 0 і до 0.84 для класу 1. У матриці плутанини модель перейшла від 2 до 6 помилкових позитивних результатів і від 2 до 31 помилкових негативних результатів.

Ми також можемо повторити predict і подивіться на результати, щоб перевірити, чи все ще є перевищення під час використання даних поїзда:

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

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

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

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

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

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

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

примітки: Границя рішення також може називатися a гіперплощина. Гіперплощина — це геометричне поняття, яке позначає кількість вимірів простору мінус один (dims-1). Якщо простір двовимірний, наприклад площина з координатами x і y, одновимірні лінії (або криві) є гіперплощинами. У контексті машинного навчання, оскільки кількість стовпців, які використовуються в моделі, є розмірами її площини, коли ми працюємо з 2 стовпцями та класифікатором SVM, ми знаходимо тривимірну гіперплощину, яка розділяє класи.

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

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

Люблю C, gamma дещо обернено пропорційна його відстані. The вище його значення, Найближчий це точки, які розглядаються як межа рішення, і найнижчий gamma, далі точки також враховуються для вибору межі рішення.

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

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

Understanding SVM Hyperparameters PlatoBlockchain Data Intelligence. Vertical Search. Ai.

У випадку нашої моделі значення за замовчуванням gamma було scale. Як видно в Документація Scikit-learn SVC, це означає, що його значення:

$$
gamma = (1/ text{n_features} * X.var())
$$

or

$$
гамма = (1/ text{number_of_features} * text{features_variance})
$$

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

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

Це виводить:

gamma: 0.013924748072859962

Існує також інший спосіб подивитися на значення gamma, шляхом доступу до об’єкта класифікатора gamma параметр за допомогою ._gamma:

svc._gamma 

Ми бачимо, що gamma використовуваний у нашому класифікаторі був низьким, тому він також враховував віддалені точки.

примітки: Як ми бачили, C та gamma важливі для деяких визначень моделі. Інший гіперпараметр, random_state, часто використовується в Scikit Learn, щоб гарантувати перемішування даних або випадкове початкове число для моделей, тому ми завжди маємо однакові результати, але це дещо інше для SVM. Зокрема, random_state має наслідки, лише якщо інший гіперпараметр, probability, встановлено значення true. Це пояснюється тим, що він перетасує дані для отримання оцінок ймовірності. Якщо нам не потрібні оцінки ймовірності для наших класів і для ймовірності встановлено значення false, SVM random_state параметр не впливає на результати моделі.

Немає правила щодо вибору значень для гіперпараметрів, таких як C і гамма – це залежатиме від того, як довго та які ресурси доступні для експериментування з різними значеннями гіперпараметрів, які перетворення можна зробити з даними та які результати очікуються . Звичайним способом пошуку значень гіперпараметрів є комбінування кожного із запропонованих значень через a пошук по сітці разом із процедурою, яка застосовує ці значення гіперпараметрів і отримує показники для різних частин викликаних даних перехресна перевірка. У Scikit-learn це вже реалізовано як GridSearchCV (CV із перехресної перевірки).

Щоб запустити пошук у сітці з перехресною перевіркою, нам потрібно імпортувати GridSearchCV, визначте словник зі значеннями гіперпараметрів, з якими буде проводитися експеримент, наприклад тип kernel, діапазон для C, А для gamma, створіть екземпляр SVC, визначте score або метрика буде використовуватися для оцінювання (тут ми виберемо оптимізацію як для точності, так і для запам’ятовування, тому ми будемо використовувати f1-score), кількість ділень, які будуть зроблені в даних для запуску пошуку cv – за замовчуванням 5, але добре використовувати принаймні 10 – тут ми використаємо 5 згорток даних, щоб було зрозуміліше під час порівняння результатів.

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

Це код для пошуку в сітці з перехресною перевіркою:

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

Цей код виводить:

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

Після пошуку за гіперпараметрами ми можемо використати best_estimator_, best_params_ та best_score_ властивості для отримання найкращої моделі, значень параметрів і найвищої оцінки f1:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

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

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

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

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

обидві C та gamma мають значення 1, а f1-score дуже високий, 0.99. Оскільки значення високе, давайте перевіримо, чи було перевищення, заглянувши в середнє значення тесту та оцінки тренування, які ми повернули всередині cv_results_ об’єкт:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

Середні бали були:

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

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

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

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

Висновок

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

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

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

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

Більше від Stackabuse