logo

Поддържащ векторен машинен алгоритъм

Support Vector Machine или SVM е един от най-популярните алгоритми за контролирано обучение, който се използва за класификация, както и за проблеми с регресия. Но основно се използва за проблеми с класификацията в машинното обучение.

Целта на SVM алгоритъма е да създаде най-добрата линия или граница на решение, която може да раздели n-измерното пространство в класове, така че да можем лесно да поставим новата точка от данни в правилната категория в бъдеще. Тази най-добра граница на решение се нарича хиперравнина.

SVM избира екстремните точки/вектори, които помагат при създаването на хиперравнината. Тези екстремни случаи се наричат ​​опорни вектори и следователно алгоритъмът се нарича опорна векторна машина. Разгледайте диаграмата по-долу, в която има две различни категории, които са класифицирани с помощта на граница на решение или хиперравнина:

Поддържащ векторен машинен алгоритъм

Пример: SVM може да бъде разбран с примера, който използвахме в класификатора KNN. Да предположим, че виждаме странна котка, която също има някои характеристики на кучета, така че ако искаме модел, който може точно да идентифицира дали е котка или куче, такъв модел може да бъде създаден с помощта на SVM алгоритъма. Първо ще обучим нашия модел с много изображения на котки и кучета, за да може да научи за различните характеристики на котките и кучетата, а след това ще го тестваме с това странно създание. Тъй като поддържащият вектор създава граница на решение между тези две данни (котка и куче) и избира екстремни случаи (поддържащи вектори), той ще види екстремния случай на котка и куче. Въз основа на опорните вектори, той ще го класифицира като котка. Разгледайте диаграмата по-долу:

Поддържащ векторен машинен алгоритъм

SVM алгоритъмът може да се използва за Разпознаване на лица, класифициране на изображения, категоризиране на текст, и т.н.

списък с методи java

Видове SVM

SVM може да бъде два вида:

    Линеен SVM:Линейният SVM се използва за линейно разделими данни, което означава, че ако даден набор от данни може да бъде класифициран в два класа с помощта на една права линия, тогава такива данни се наричат ​​линейно разделими данни, а класификаторът се използва, наречен линеен SVM класификатор.Нелинеен SVM:Нелинейният SVM се използва за нелинейно разделени данни, което означава, че ако даден набор от данни не може да бъде класифициран с помощта на права линия, тогава такива данни се наричат ​​​​нелинейни данни и използваният класификатор се нарича нелинеен SVM класификатор.

Хиперравнина и поддържащи вектори в SVM алгоритъма:

Хиперплан: Може да има множество линии/граници за вземане на решения за разделяне на класовете в n-измерното пространство, но трябва да намерим най-добрата граница за вземане на решения, която помага да се класифицират точките от данни. Тази най-добра граница е известна като хиперравнина на SVM.

Размерите на хиперравнината зависят от характеристиките, налични в набора от данни, което означава, че ако има 2 характеристики (както е показано на изображението), тогава хиперравнината ще бъде права линия. И ако има 3 характеристики, тогава хиперравнината ще бъде двуизмерна равнина.

Винаги създаваме хиперравнина, която има максимално поле, което означава максималното разстояние между точките от данни.

Поддържащи вектори:

Точките от данни или векторите, които са най-близо до хиперравнината и които влияят върху позицията на хиперравнината, се наричат ​​опорен вектор. Тъй като тези вектори поддържат хиперравнината, следователно се наричат ​​опорен вектор.

Как работи SVM?

Линеен SVM:

Работата на SVM алгоритъма може да бъде разбрана с помощта на пример. Да предположим, че имаме набор от данни, който има два етикета (зелен и син), и наборът от данни има две характеристики x1 и x2. Искаме класификатор, който може да класифицира двойката (x1, x2) координати в зелено или синьо. Разгледайте изображението по-долу:

Поддържащ векторен машинен алгоритъм

Тъй като това е 2-d пространство, просто като използваме права линия, можем лесно да разделим тези два класа. Но може да има множество линии, които могат да разделят тези класове. Разгледайте изображението по-долу:

Поддържащ векторен машинен алгоритъм

Следователно алгоритъмът SVM помага да се намери най-добрата линия или граница на решение; тази най-добра граница или регион се нарича a хиперравнина . SVM алгоритъмът намира най-близката точка на линиите от двата класа. Тези точки се наричат ​​опорни вектори. Разстоянието между векторите и хиперравнината се нарича като марж . И целта на SVM е да увеличи максимално този марж. The хиперравнина с максимален марж се нарича оптимална хиперравнина .

Поддържащ векторен машинен алгоритъм

Нелинеен SVM:

Ако данните са линейно подредени, тогава можем да ги разделим с помощта на права линия, но за нелинейни данни не можем да начертаем нито една права линия. Разгледайте изображението по-долу:

Поддържащ векторен машинен алгоритъм

Така че, за да разделим тези точки от данни, трябва да добавим още едно измерение. За линейни данни сме използвали две измерения x и y, така че за нелинейни данни ще добавим трето измерение z. Може да се изчисли като:

 z=x<sup>2</sup> +y<sup>2</sup> 

Чрез добавяне на третото измерение, примерното пространство ще стане като изображението по-долу:

Поддържащ векторен машинен алгоритъм

Така че сега SVM ще раздели наборите от данни на класове по следния начин. Разгледайте изображението по-долу:

Поддържащ векторен машинен алгоритъм

Тъй като сме в 3-d пространство, следователно изглежда като равнина, успоредна на оста x. Ако го преобразуваме в 2d пространство с z=1, тогава ще стане като:

Поддържащ векторен машинен алгоритъм

Следователно получаваме обиколка с радиус 1 в случай на нелинейни данни.

Внедряване на Python на опорна векторна машина

настройка на пътя на 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(&apos;user_data.csv&apos;) #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 # &apos;Support vector classifier&apos; classifier = SVC(kernel=&apos;linear&apos;, random_state=0) classifier.fit(x_train, y_train) 

В горния код сме използвали ядро='линеен' , тъй като тук създаваме SVM за линейно разделими данни. Можем обаче да го променим за нелинейни данни. И след това монтирахме класификатора към набора от данни за обучение (x_train, y_train)

Изход:

 Out[8]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=&apos;ovr&apos;, degree=3, gamma=&apos;auto_deprecated&apos;, kernel=&apos;linear&apos;, max_iter=-1, probability=False, random_state=0, shrinking=True, tol=0.001, verbose=False) 

Производителността на модела може да бъде променена чрез промяна на стойността на C (коефициент на регулиране), гама и ядро .

    Прогнозиране на резултата от тестовия набор:
    Сега ще предвидим изхода за тестовия набор. За целта ще създадем нов вектор y_pred. По-долу е кодът за него:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

След като получим вектора y_pred, можем да сравним резултата от y_пред и y_test за проверка на разликата между действителната стойност и прогнозираната стойност.

Изход: По-долу е изходът за прогнозата на тестовия набор:

Поддържащ векторен машинен алгоритъм
    Създаване на матрицата на объркването:
    Сега ще видим ефективността на SVM класификатора, колко неправилни прогнози има в сравнение с класификатора на логистичната регресия. За да създадем матрицата на объркване, трябва да импортираме объркваща_матрица функция на библиотеката sklearn. След като импортираме функцията, ще я извикаме с нова променлива см . Функцията приема главно два параметъра y_true (действителните стойности) и y_пред (целевата стойност, върната от класификатора). По-долу е кодът за него:
 #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((&apos;red&apos;, &apos;green&apos;))) 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((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Training set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

Изход:

Като изпълним горния код, ще получим резултата като:

atoi c
Поддържащ векторен машинен алгоритъм

Както виждаме, горният изход изглежда подобен на изхода на логистичната регресия. В резултата получихме правата като хиперравнина, защото имаме използва линейно ядро ​​в класификатора . И също така обсъдихме по-горе, че за 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((&apos;red&apos;,&apos;green&apos; ))) 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((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Test set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

Изход:

Като изпълним горния код, ще получим резултата като:

Поддържащ векторен машинен алгоритъм

Както можем да видим в горното изходно изображение, SVM класификаторът е разделил потребителите на два региона (закупени или незакупени). Потребителите, които са закупили SUV, са в червения регион с червените разпръснати точки. А потребителите, които не са закупили SUV, са в зеления регион със зелени точки на разсейване. Хиперравнината е разделила двата класа на купени и незакупени променливи.