Машина опорних векторів або SVM є одним із найпопулярніших алгоритмів керованого навчання, який використовується для задач класифікації та регресії. Однак, в основному, він використовується для проблем класифікації в машинному навчанні.
Мета алгоритму SVM — створити найкращу лінію або межу рішення, яка може розділити n-вимірний простір на класи, щоб ми могли легко помістити нову точку даних у правильну категорію в майбутньому. Ця границя найкращого рішення називається гіперплощиною.
SVM вибирає крайні точки/вектори, які допомагають створити гіперплощину. Ці екстремальні випадки називають опорними векторами, а отже, алгоритм називають машиною опорних векторів. Розглянемо наведену нижче діаграму, на якій є дві різні категорії, які класифікуються за допомогою границі рішення або гіперплощини:
приклад: SVM можна зрозуміти на прикладі, який ми використали в класифікаторі KNN. Припустімо, ми бачимо дивного кота, який також має деякі особливості собак, тож якщо нам потрібна модель, яка може точно ідентифікувати, чи це кіт чи собака, таку модель можна створити за допомогою алгоритму SVM. Спочатку ми навчимо нашу модель великою кількістю зображень котів і собак, щоб вона могла дізнатися про різні особливості котів і собак, а потім перевіримо її на цій дивній істоті. Так як опорний вектор створює межу рішення між цими двома даними (кіт і собака) і вибирає крайні випадки (опорні вектори), він побачить крайній випадок кота і собаки. На основі опорних векторів він класифікує його як кота. Розгляньте схему нижче:
Алгоритм SVM можна використовувати для Розпізнавання обличчя, класифікація зображень, категоризація тексту, тощо
макет сітки
Типи СВМ
SVM може бути двох типів:
Гіперплощина та опорні вектори в алгоритмі SVM:
Гіперплан: Для розділення класів у n-вимірному просторі може бути кілька ліній/меж рішень, але нам потрібно знайти найкращу межу прийняття рішень, яка допоможе класифікувати точки даних. Ця найкраща межа відома як гіперплощина SVM.
Розміри гіперплощини залежать від об’єктів, присутніх у наборі даних, тобто якщо є 2 об’єкти (як показано на зображенні), то гіперплощина буде прямою лінією. І якщо є 3 ознаки, то гіперплощина буде двовимірною площиною.
Ми завжди створюємо гіперплощину з максимальним запасом, що означає максимальну відстань між точками даних.
Допоміжні вектори:
Точки даних або вектори, які є найближчими до гіперплощини та впливають на положення гіперплощини, називають опорним вектором. Оскільки ці вектори підтримують гіперплощину, тому їх називають опорним вектором.
Як працює SVM?
Лінійний SVM:
Роботу алгоритму SVM можна зрозуміти на прикладі. Припустимо, у нас є набір даних, який має два теги (зелений і синій), і набір даних має дві функції x1 і x2. Нам потрібен класифікатор, який може класифікувати пару (x1, x2) координат зеленим або синім кольором. Розгляньте зображення нижче:
Отже, оскільки це двовимірний простір, ми можемо легко розділити ці два класи, просто використовуючи пряму лінію. Але може бути кілька рядків, які можуть розділяти ці класи. Розгляньте зображення нижче:
Отже, алгоритм SVM допомагає знайти найкращу лінію або межу рішення; цей найкращий кордон або регіон називається a гіперплощина . Алгоритм SVM знаходить найближчу точку ліній з обох класів. Ці точки називаються опорними векторами. Відстань між векторами і гіперплощиною називається запас . І метою SVM є максимізація цієї маржі. The гіперплощина з максимальною маржею називається оптимальна гіперплощина .
Нелінійний SVM:
Якщо дані розташовані лінійно, ми можемо розділити їх за допомогою прямої лінії, але для нелінійних даних ми не можемо намалювати одну пряму лінію. Розгляньте зображення нижче:
Отже, щоб розділити ці точки даних, нам потрібно додати ще один вимір. Для лінійних даних ми використовували два виміри x і y, тому для нелінійних даних ми додамо третій вимір z. Його можна розрахувати як:
z=x<sup>2</sup> +y<sup>2</sup>
Додавши третій вимір, простір зразка стане таким, як зображено нижче:
Отже, тепер SVM розділить набори даних на класи таким чином. Розгляньте зображення нижче:
Оскільки ми знаходимося в 3-вимірному просторі, отже, воно виглядає як площина, паралельна осі х. Якщо ми перетворимо його в 2d простір з z=1, то він стане таким:
Отже, ми отримуємо окружність радіуса 1 у випадку нелінійних даних.
Реалізація опорної векторної машини на Python
Тепер ми реалізуємо алгоритм SVM за допомогою Python. Тут ми будемо використовувати той самий набір даних дані користувача , який ми використовували в логістичній регресії та класифікації KNN.
До етапу попередньої обробки даних код залишатиметься незмінним. Нижче наведено код:
#Data Pre-processing Step # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
Після виконання наведеного вище коду ми попередньо обробимо дані. Код видасть набір даних у вигляді:
Масштабований вихід для тестового набору буде таким:
щось швидке сортування
Підгонка класифікатора SVM до навчального набору:
Тепер навчальний набір буде підігнаний до класифікатора SVM. Щоб створити класифікатор SVM, ми імпортуємо SVC клас від Sklearn.svm бібліотека. Нижче наведено його код:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
У наведеному вище коді ми використали kernel='linear' , оскільки тут ми створюємо SVM для лінійно роздільних даних. Однак ми можемо змінити його для нелінійних даних. Потім ми підігнали класифікатор до навчального набору даних (x_train, y_train)
Вихід:
Out[8]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='auto_deprecated', kernel='linear', max_iter=-1, probability=False, random_state=0, shrinking=True, tol=0.001, verbose=False)
Продуктивність моделі можна змінити, змінивши значення C (фактор регулярізації), гамма та ядро .
файл розширення java
Тепер ми передбачимо вихід для тестового набору. Для цього ми створимо новий вектор y_pred. Нижче наведено його код:
#Predicting the test set result y_pred= classifier.predict(x_test)
Отримавши вектор y_pred, ми можемо порівняти результат y_pred і y_test щоб перевірити різницю між фактичним і прогнозованим значенням.
Вихід: Нижче наведено вихідні дані для передбачення тестового набору:
Тепер ми побачимо продуктивність класифікатора SVM, тобто кількість невірних прогнозів у порівнянні з класифікатором логістичної регресії. Щоб створити матрицю плутанини, нам потрібно імпортувати confusion_matrix функція бібліотеки sklearn. Після імпорту функції ми викличемо її за допомогою нової змінної см . Функція в основному приймає два параметри y_true (фактичні значення) і y_pred (цільове значення, яке повертає класифікатор). Нижче наведено його код:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Вихід:
Як ми бачимо на вихідному зображенні вище, є 66+24= 90 правильних прогнозів і 8+2= 10 правильних прогнозів. Тому ми можемо сказати, що наша модель SVM покращилася порівняно з моделлю логістичної регресії.
Тепер візуалізуємо результат тренувального набору, нижче наведено його код:
from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green'))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
Вихід:
Виконуючи наведений вище код, ми отримаємо результат у вигляді:
Як ми бачимо, вихідні дані вище виглядають схожими на вихідні дані логістичної регресії. На виході ми отримали пряму як гіперплощину, тому що маємо використовував лінійне ядро в класифікаторі . І ми також обговорювали вище, що для 2d простору гіперплощина в SVM є прямою лінією.
#Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
Вихід:
Виконуючи наведений вище код, ми отримаємо результат у вигляді:
Як ми бачимо на наведеному вище вихідному зображенні, класифікатор SVM розділив користувачів на два регіони (придбані або не придбані). Користувачі, які придбали позашляховик, знаходяться в червоній області з червоними точками розкиду. А користувачі, які не придбали позашляховик, знаходяться в зеленій області із зеленими точками розсіювання. Гіперплощина розділила два класи на куплені та не придбані змінні.