Вступ
Цей посібник є другою частиною трьох посібників про машини підтримки векторів (SVM). У цьому посібнику ми продовжимо працювати над сценарієм використання підроблених банкнот, зрозуміємо, які параметри SVM вже встановлюються Scikit-learn, що таке гіперпараметри C і Gamma і як їх налаштувати за допомогою перехресної перевірки та пошуку в сітці.
У повній серії посібників SVM, окрім гіперпараметрів SVM, ви також дізнаєтеся про простий SVM, концепцію під назвою трюк ядрата досліджуйте інші типи SVM.
Якщо ви бажаєте прочитати всі посібники, перегляньте перший посібник або подивіться, які з них вас найбільше цікавлять, нижче наведено таблицю тем, які розглядаються в кожному посібнику:
- Випадок використання: забути банкноти
- Передумови 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 менша маржа.
Ми можемо експериментувати з 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
За допомогою меншого 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
Дивлячись на результати з меншим C
і дані потягу, ми бачимо, що було покращено перевищення, але оскільки більшість показників все ще вищі для даних потягу, здається, що надлишок не вирішено. Отже, просто змінюючи C
параметра було недостатньо, щоб зробити модель більш гнучкою та покращити її узагальнення.
примітки: Спроба знайти баланс між функцією, яка надто далеко від даних, надто фіксованою чи наявністю високе упередження або це навпаки, функція підходить близько до даних, надто гнучка або має висока дисперсія зазвичай називають компроміс дисперсії зміщення. Знайти цей баланс нетривіально, але коли він досягається, модель не підлаштовується або переобладнується з даними. Щоб зменшити дисперсію та запобігти переобладнанню, дані можна рівномірно скоротити, щоб зробити їх більш регулярними та спрощеними під час отримання функції, яка їх описує. Ось що таке параметр C
робить, коли він використовується в SVM, з цієї причини він також називається L2 регуляризація or Регресія хребта.
До цього моменту ми зрозуміли поля у SVM і як вони впливають на загальний результат алгоритму, але як щодо лінії (чи кривої), яка розділяє класи? Ця лінія є межа рішення. Отже, ми вже знаємо, що запаси впливають на гнучкість меж прийняття рішень щодо помилок, тепер ми можемо поглянути на інший параметр, який також впливає на межі прийняття рішень.
Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!
примітки: Границя рішення також може називатися a гіперплощина. Гіперплощина — це геометричне поняття, яке позначає кількість вимірів простору мінус один (dims-1). Якщо простір двовимірний, наприклад площина з координатами x і y, одновимірні лінії (або криві) є гіперплощинами. У контексті машинного навчання, оскільки кількість стовпців, які використовуються в моделі, є розмірами її площини, коли ми працюємо з 2 стовпцями та класифікатором SVM, ми знаходимо тривимірну гіперплощину, яка розділяє класи.
Гамма-гіперпараметр
Можна вибрати нескінченні межі прийняття рішень, деякі з цих меж будуть розділяти класи, а інші – ні. При виборі межі ефективного рішення чи слід враховувати перші 10 найближчих точок кожного класу? Або варто розглядати більше точок, включно з далекими? У SVM цей вибір діапазону визначається іншим гіперпараметром, gamma
.
Люблю C
, gamma
дещо обернено пропорційна його відстані. The вище його значення, Найближчий це точки, які розглядаються як межа рішення, і найнижчий gamma
, далі точки також враховуються для вибору межі рішення.
Інший вплив гами полягає в тому, що чим вище її значення, тим більше межа прийняття рішень наближається до точок навколо неї, роблячи її більш нерівною та схильною до надмірного пристосування – і щонайнижче її значення, то більш гладка та регулярна межа рішення поверхня також стає менш схильною до надмірного укладання. Це вірно для будь-якої гіперплощини, але це легше спостерігати, розділяючи дані у вищих вимірах. У деяких документах, gamma
також можна назвати sigma
.
У випадку нашої моделі значення за замовчуванням 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.
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- Платоблокчейн. Web3 Metaverse Intelligence. Розширені знання. Доступ тут.
- Карбування майбутнього з Адріенн Ешлі. Доступ тут.
- джерело: https://stackabuse.com/understanding-svm-hyperparameters/
- : має
- :є
- 1
- 10
- 20
- 200
- 7
- 8
- 84
- 9
- a
- МЕНЮ
- вище
- доступ до
- точність
- досягнутий
- насправді
- Відрегульований
- Оповіщення
- алгоритм
- ВСІ
- по
- вже
- Також
- завжди
- an
- та
- Інший
- будь-який
- ЕСТЬ
- навколо
- стаття
- AS
- At
- доступний
- назад
- Balance
- Банк
- основа
- BE
- оскільки
- ставати
- було
- за
- буття
- нижче
- КРАЩЕ
- Краще
- між
- border
- обидва
- Межі
- буфера
- але
- by
- обчислювати
- званий
- CAN
- кандидатів
- випадок
- випадків
- зміна
- Зміни
- заміна
- перевірка
- вибір
- Вибирати
- Вибираючи
- вибрав
- вибраний
- клас
- класів
- класифікація
- класифікований
- ясно
- ясніше
- близько
- ближче
- код
- Колони
- об'єднувати
- об'єднання
- Приходити
- майбутній
- загальний
- порівняти
- порівняння
- повний
- комплекс
- концепція
- поняття
- висновок
- замішання
- вважається
- контекст
- покритий
- створювати
- Перетинати
- крива
- дані
- витоку даних
- Підготовка даних
- наука про дані
- рішення
- дефолт
- певний
- Ступінь
- описувати
- визначає
- різний
- розміри
- дисплеїв
- відстань
- справи
- Дон
- малювати
- кожен
- легше
- Ефективний
- або
- Машинобудування
- досить
- Оцінки
- оцінки
- очікуваний
- експеримент
- дослідити
- Розвіданий
- f1
- Падати
- false
- особливість
- риси
- знайти
- виявлення
- Перший
- пристосування
- фіксованою
- Гнучкість
- гнучкий
- Сфокусувати
- після
- для
- форма
- від
- функція
- Функції
- далі
- Загальне
- отримання
- Git
- дає
- Go
- добре
- сітка
- гарантувати
- керівництво
- Гід
- практичний
- траплятися
- відбувається
- Мати
- має
- тут
- Високий
- вище
- найвищий
- hover
- Як
- How To
- HTML
- HTTPS
- Налаштування гіперпараметрів
- i
- ICON
- ідея
- Impact
- Вплив
- здійснювати
- реалізація
- реалізовані
- реалізації
- наслідки
- імпорт
- важливо
- удосконалювати
- поліпшення
- in
- В інших
- включати
- включені
- У тому числі
- вказує
- початковий
- екземпляр
- цікавий
- інтереси
- в
- Вступ
- залучений
- IT
- ЙОГО
- просто
- тримати
- Знати
- відомий
- більше
- УЧИТЬСЯ
- вчений
- вивчення
- LG
- libraries
- як
- Лінія
- ліній
- зв'язку
- трохи
- Довго
- подивитися
- шукати
- серія
- низький
- машина
- навчання за допомогою машини
- Машинки для перманенту
- Macro
- made
- зробити
- РОБОТИ
- Робить
- багато
- Маржа
- поля
- математичний
- Матриця
- засоби
- згаданий
- метод
- метрика
- Метрика
- може бути
- помилки
- модель
- Моделі
- більше
- найбільш
- Необхідність
- Нові
- Нові можливості
- примітки
- зараз
- номер
- об'єкт
- отримувати
- отримання
- отримує
- of
- on
- ONE
- тільки
- протилежний
- Оптимізувати
- варіант
- or
- Інше
- інші
- наші
- поза
- загальний
- параметр
- параметри
- частина
- особливо
- частини
- Виконувати
- зберігається
- plato
- Інформація про дані Платона
- PlatoData
- точка
- точок
- Практичний
- практика
- Точність
- Прогнози
- попередження
- раніше
- властивості
- запропонований
- Python
- випадковий
- діапазон
- Rbf
- Читати
- причина
- Короткий огляд
- отримує
- зниження
- називають
- регулярний
- повторювати
- звітом
- ресурси
- результат
- результати
- кільце
- Правило
- прогін
- біг
- s
- то ж
- шкала
- наука
- scikit-вчитися
- сфера
- рахунок
- рахунок
- Пошук
- другий
- насіння
- Здається,
- сенс
- окремий
- розділення
- Серія
- комплект
- набори
- тінь
- форми
- Повинен
- перемішування
- простий
- спрощений
- з
- Розмір
- невеликий
- менше
- більш гладкий
- So
- так далеко
- деякі
- що в сім'ї щось
- кілька
- Простір
- Розколи
- стандартів
- Крок
- заходи
- Як і раніше
- Стоп
- сильно
- такі
- костюм
- підходящий
- підтримка
- поверхню
- SVG
- таблиця
- Приймати
- Мета
- методи
- розповідає
- тест
- ніж
- Що
- Команда
- Лінія
- їх
- Їх
- Там.
- вони
- це
- ті
- три
- поріг
- через
- до
- разом
- занадто
- теми
- Усього:
- до
- поїзд
- Навчання
- Перетворення
- перетворень
- перехід
- правда
- Двічі
- Типи
- розуміти
- розуміння
- зрозуміла
- використання
- використання випадку
- використовуваний
- використання
- зазвичай
- перевірка достовірності
- значення
- Цінності
- було
- шлях..
- способи
- we
- були
- Що
- який
- в той час як
- всі
- волі
- з
- Виграв
- слова
- Work
- робочий
- б
- X
- Ти
- зефірнет