Support Vector Machine sau SVM este unul dintre cei mai populari algoritmi de învățare supravegheată, care este folosit pentru probleme de clasificare și regresie. Cu toate acestea, în primul rând, este folosit pentru probleme de clasificare în învățare automată.
Scopul algoritmului SVM este de a crea cea mai bună linie sau graniță de decizie care poate segrega spațiul n-dimensional în clase, astfel încât să putem pune cu ușurință noul punct de date în categoria corectă în viitor. Această limită de decizie cea mai bună se numește hiperplan.
SVM alege punctele/vectorii extreme care ajută la crearea hiperplanului. Aceste cazuri extreme sunt numite vectori de suport și, prin urmare, algoritmul este denumit mașină vectorială de suport. Luați în considerare diagrama de mai jos în care există două categorii diferite care sunt clasificate folosind o limită de decizie sau un hiperplan:
Exemplu: SVM poate fi înțeles cu exemplul pe care l-am folosit în clasificatorul KNN. Să presupunem că vedem o pisică ciudată care are și unele trăsături ale câinilor, așa că dacă dorim un model care să identifice cu precizie dacă este o pisică sau un câine, un astfel de model poate fi creat folosind algoritmul SVM. Mai întâi ne vom antrena modelul cu o mulțime de imagini cu pisici și câini, astfel încât acesta să poată afla despre diferite caracteristici ale pisicilor și câinilor, apoi îl testăm cu această creatură ciudată. Deci, deoarece vectorul suport creează o graniță de decizie între aceste două date (pisică și câine) și alege cazuri extreme (vectori de sprijin), va vedea cazul extrem al pisicii și câinelui. Pe baza vectorilor suport, o va clasifica ca o pisică. Luați în considerare diagrama de mai jos:
Algoritmul SVM poate fi utilizat pentru Detectarea feței, clasificarea imaginilor, clasificarea textului, etc.
vba
Tipuri de SVM
SVM poate fi de două tipuri:
Hiperplan și vectori de suport în algoritmul SVM:
Hiperplan: Pot exista mai multe linii/limite de decizie pentru a segrega clasele în spațiul n-dimensional, dar trebuie să aflăm cea mai bună limită de decizie care ajută la clasificarea punctelor de date. Această limită este cunoscută sub numele de hiperplanul SVM.
Dimensiunile hiperplanului depind de caracteristicile prezente în setul de date, ceea ce înseamnă că dacă există 2 caracteristici (așa cum se arată în imagine), atunci hiperplanul va fi o linie dreaptă. Și dacă există 3 caracteristici, atunci hiperplanul va fi un plan cu 2 dimensiuni.
Creăm întotdeauna un hiperplan care are o marjă maximă, ceea ce înseamnă distanța maximă dintre punctele de date.
Vectori suport:
Punctele de date sau vectorii care sunt cel mai aproape de hiperplan și care afectează poziția hiperplanului sunt denumiți ca suport Vector. Deoarece acești vectori susțin hiperplanul, deci numit vector suport.
Cum funcționează SVM?
SVM liniar:
Funcționarea algoritmului SVM poate fi înțeleasă folosind un exemplu. Să presupunem că avem un set de date care are două etichete (verde și albastru), iar setul de date are două caracteristici x1 și x2. Vrem un clasificator care poate clasifica perechea (x1, x2) de coordonate fie în verde, fie în albastru. Luați în considerare imaginea de mai jos:
Deci, deoarece este spațiu 2-d, folosind doar o linie dreaptă, putem separa cu ușurință aceste două clase. Dar pot exista mai multe linii care pot separa aceste clase. Luați în considerare imaginea de mai jos:
Prin urmare, algoritmul SVM ajută la găsirea celei mai bune linii sau limite de decizie; această limită sau regiune cea mai bună este numită a hiperplan . Algoritmul SVM găsește cel mai apropiat punct al liniilor din ambele clase. Aceste puncte se numesc vectori suport. Distanța dintre vectori și hiperplan se numește ca marginea . Și scopul SVM este de a maximiza această marjă. The hiperplan cu marja maxima se numeste hiperplan optim .
SVM non-liniar:
Dacă datele sunt aranjate liniar, atunci le putem separa folosind o linie dreaptă, dar pentru datele neliniare, nu putem desena o singură linie dreaptă. Luați în considerare imaginea de mai jos:
Deci, pentru a separa aceste puncte de date, trebuie să mai adăugăm o dimensiune. Pentru datele liniare, am folosit două dimensiuni x și y, deci pentru datele neliniare, vom adăuga o a treia dimensiune z. Se poate calcula ca:
z=x<sup>2</sup> +y<sup>2</sup>
Prin adăugarea celei de-a treia dimensiuni, spațiul eșantion va deveni ca imaginea de mai jos:
Deci, acum, SVM va împărți seturile de date în clase în felul următor. Luați în considerare imaginea de mai jos:
Deoarece ne aflăm în spațiul 3-d, deci arată ca un plan paralel cu axa x. Dacă îl convertim în spațiu 2d cu z=1, atunci va deveni astfel:
Prin urmare, obținem o circumferință cu raza 1 în cazul datelor neliniare.
powershell mai mic sau egal cu
Implementarea Python a mașinii de suport Vector
Acum vom implementa algoritmul SVM folosind Python. Aici vom folosi același set de date datele utilizatorului , pe care l-am folosit în regresia logistică și clasificarea KNN.
Până la etapa de preprocesare a datelor, codul va rămâne același. Mai jos este codul:
#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)
După executarea codului de mai sus, vom preprocesa datele. Codul va oferi setul de date ca:
Ieșirea scalată pentru setul de testare va fi:
Potrivirea clasificatorului SVM la setul de antrenament:
Acum setul de antrenament va fi montat la clasificatorul SVM. Pentru a crea clasificatorul SVM, vom importa SVC clasa de la Sklearn.svm bibliotecă. Mai jos este codul pentru acesta:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
În codul de mai sus, am folosit kernel='liniar' , deoarece aici creăm SVM pentru date separabile liniar. Cu toate acestea, îl putem schimba pentru date neliniare. Și apoi am adaptat clasificatorul la setul de date de antrenament (x_train, y_train)
Ieșire:
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)
Performanța modelului poate fi modificată prin modificarea valorii lui C (factor de regularizare), gamma și nucleu .
Acum, vom prezice rezultatul pentru setul de testare. Pentru aceasta, vom crea un nou vector y_pred. Mai jos este codul pentru acesta:
#Predicting the test set result y_pred= classifier.predict(x_test)
După obținerea vectorului y_pred, putem compara rezultatul y_pred și y_test pentru a verifica diferența dintre valoarea reală și valoarea estimată.
Ieșire: Mai jos este rezultatul pentru predicția setului de testare:
Acum vom vedea performanța clasificatorului SVM că câte predicții incorecte există în comparație cu clasificatorul de regresie logistică. Pentru a crea matricea de confuzie, trebuie să importam fișierul matrice_confuzie funcția bibliotecii sklearn. După importarea funcției, o vom apela folosind o nouă variabilă cm . Funcția preia doi parametri, în principal y_adevărat (valorile reale) și y_pred (valoarea vizată returnată de clasificator). Mai jos este codul pentru acesta:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Ieșire:
După cum putem vedea în imaginea de mai sus, există 66+24= 90 de predicții corecte și 8+2= 10 predicții corecte. Prin urmare, putem spune că modelul nostru SVM sa îmbunătățit în comparație cu modelul de regresie logistică.
imagini de reducere
Acum vom vizualiza rezultatul setului de antrenament, mai jos este codul pentru acesta:
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()
Ieșire:
Prin executarea codului de mai sus, vom obține rezultatul ca:
După cum putem vedea, rezultatul de mai sus pare similar cu rezultatul regresiei logistice. În rezultat, am primit linia dreaptă ca hiperplan deoarece avem a folosit un nucleu liniar în clasificator . Și am mai discutat mai sus că pentru spațiul 2d, hiperplanul în SVM este o linie dreaptă.
#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()
Ieșire:
Prin executarea codului de mai sus, vom obține rezultatul ca:
După cum putem vedea în imaginea de ieșire de mai sus, clasificatorul SVM a împărțit utilizatorii în două regiuni (Achiziționat sau Necumpărat). Utilizatorii care au achiziționat SUV-ul se află în regiunea roșie cu punctele de dispersie roșii. Iar utilizatorii care nu au achiziționat SUV-ul se află în regiunea verde cu puncte de dispersie verzi. Hiperplanul a împărțit cele două clase în variabile Cumpărat și neachiziționat.