Support Vector Machine ili SVM jedan je od najpopularnijih algoritama za nadzirano učenje, koji se koristi za probleme klasifikacije kao i regresije. Međutim, prvenstveno se koristi za probleme klasifikacije u strojnom učenju.
Cilj SVM algoritma je stvoriti najbolju liniju ili granicu odluke koja može razdvojiti n-dimenzionalni prostor u klase tako da možemo jednostavno staviti novu podatkovnu točku u ispravnu kategoriju u budućnosti. Ova granica najbolje odluke naziva se hiperravnina.
SVM odabire ekstremne točke/vektore koji pomažu u stvaranju hiperravnine. Ovi ekstremni slučajevi nazivaju se potporni vektori, pa se stoga algoritam naziva potporni vektorski stroj. Razmotrite donji dijagram u kojem postoje dvije različite kategorije koje su klasificirane korištenjem granice odluke ili hiperravnine:
Primjer: SVM se može razumjeti na primjeru koji smo koristili u KNN klasifikatoru. Pretpostavimo da vidimo čudnu mačku koja također ima neke karakteristike pasa, pa ako želimo model koji može točno identificirati je li mačka ili pas, pa se takav model može kreirati pomoću SVM algoritma. Prvo ćemo istrenirati naš model s mnogo slika mačaka i pasa kako bi mogao naučiti o različitim značajkama mačaka i pasa, a zatim ćemo ga testirati s tim čudnim stvorenjem. Kako vektor podrške stvara granicu odluke između ova dva podatka (mačka i pas) i odabire ekstremne slučajeve (vektore podrške), vidjet će ekstremni slučaj mačke i psa. Na temelju vektora potpore klasificirati će ga kao mačku. Razmotrite dijagram u nastavku:
SVM algoritam se može koristiti za Detekcija lica, klasifikacija slika, kategorizacija teksta, itd.
trostruka zima
Vrste SVM
SVM može biti dvije vrste:
Hiperravnina i nosivi vektori u SVM algoritmu:
Hiperplan: Može postojati više linija/granica odlučivanja za odvajanje klasa u n-dimenzionalnom prostoru, ali moramo pronaći najbolju granicu odlučivanja koja pomaže u klasifikaciji podatkovnih točaka. Ova najbolja granica poznata je kao hiperravnina SVM-a.
Dimenzije hiperravnine ovise o značajkama prisutnim u skupu podataka, što znači da ako postoje 2 značajke (kao što je prikazano na slici), tada će hiperravnina biti ravna linija. A ako postoje 3 značajke, tada će hiperravnina biti dvodimenzionalna ravnina.
Uvijek stvaramo hiperravninu koja ima maksimalnu marginu, što znači najveću udaljenost između podatkovnih točaka.
Potporni vektori:
Podatkovne točke ili vektori koji su najbliži hiperravnini i koji utječu na položaj hiperravnine nazivaju se Vektor potpore. Budući da ovi vektori podupiru hiperravninu, stoga se nazivaju potporni vektor.
Kako radi SVM?
Linearni SVM:
Rad SVM algoritma može se razumjeti pomoću primjera. Pretpostavimo da imamo skup podataka koji ima dvije oznake (zelenu i plavu), a skup podataka ima dvije značajke x1 i x2. Želimo klasifikator koji može klasificirati par (x1, x2) koordinata u zelenu ili plavu boju. Razmotrite sliku u nastavku:
Dakle, kako je to 2-d prostor, samo pomoću ravne linije, možemo lako razdvojiti ove dvije klase. Ali može postojati više linija koje mogu odvojiti ove klase. Razmotrite sliku u nastavku:
Stoga, SVM algoritam pomaže pronaći najbolju liniju ili granicu odluke; ova najbolja granica ili regija naziva se a hiperravnina . SVM algoritam pronalazi najbližu točku linija iz obje klase. Te se točke nazivaju potporni vektori. Udaljenost između vektora i hiperravnine naziva se as margina . A cilj SVM-a je maksimalno povećati ovu maržu. The hiperravnina s maksimalnom marginom naziva se optimalna hiperravnina .
Nelinearni SVM:
arhitektura košnica
Ako su podaci linearno raspoređeni, tada ih možemo razdvojiti pomoću ravne crte, ali za nelinearne podatke ne možemo nacrtati jednu ravnu crtu. Razmotrite sliku u nastavku:
Da bismo razdvojili ove podatkovne točke, moramo dodati još jednu dimenziju. Za linearne podatke koristili smo dvije dimenzije x i y, tako da ćemo za nelinearne podatke dodati treću dimenziju z. Može se izračunati kao:
z=x<sup>2</sup> +y<sup>2</sup>
Dodavanjem treće dimenzije, prostor uzorka postat će kao na slici ispod:
Sada će SVM podijeliti skupove podataka u klase na sljedeći način. Razmotrite sliku u nastavku:
Budući da se nalazimo u 3-d prostoru, on izgleda kao ravnina paralelna s x-osi. Ako ga pretvorimo u 2d prostor sa z=1, tada će postati:
Stoga dobivamo opseg polumjera 1 u slučaju nelinearnih podataka.
Python implementacija stroja potpornih vektora
Sada ćemo implementirati SVM algoritam koristeći Python. Ovdje ćemo koristiti isti skup podataka korisnički podaci , koje smo koristili u logističkoj regresiji i KNN klasifikaciji.
Do koraka predobrade podataka kod će ostati isti. Ispod je kôd:
#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)
Nakon izvršenja gornjeg koda, prethodno ćemo obraditi podatke. Kod će dati skup podataka kao:
Skalirani izlaz za ispitni skup bit će:
Prilagodba SVM klasifikatora skupu za obuku:
Sada će set za obuku biti prilagođen SVM klasifikatoru. Da bismo stvorili SVM klasifikator, uvest ćemo SVC razred od Sklearn.svm knjižnica. Ispod je kod za to:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
U gornjem kodu koristili smo kernel='linearno' , budući da ovdje stvaramo SVM za podatke koji se mogu linearno odvojiti. Međutim, možemo ga promijeniti za nelinearne podatke. Zatim smo prilagodili klasifikator skupu podataka za obuku (x_train, y_train)
Izlaz:
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)
Izvedba modela može se promijeniti promjenom vrijednosti C (faktor regularizacije), gama i kernel .
Sada ćemo predvidjeti izlaz za testni skup. Za to ćemo kreirati novi vektor y_pred. Ispod je kod za to:
#Predicting the test set result y_pred= classifier.predict(x_test)
Nakon dobivanja vektora y_pred, možemo usporediti rezultat y_pred i y_test za provjeru razlike između stvarne i predviđene vrijednosti.
Izlaz: Ispod je izlaz za predviđanje skupa testova:
Sada ćemo vidjeti izvedbu SVM klasifikatora i koliko ima netočnih predviđanja u usporedbi s klasifikatorom logističke regresije. Da bismo stvorili matricu zabune, moramo uvesti matrica_konfuzije funkcija knjižnice sklearn. Nakon uvoza funkcije, pozvat ćemo je pomoću nove varijable cm . Funkcija uglavnom uzima dva parametra y_istinito (stvarne vrijednosti) i y_pred (ciljanu vrijednost vraća klasifikator). Ispod je kod za to:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Izlaz:
Kao što možemo vidjeti na gornjoj izlaznoj slici, postoji 66+24= 90 točnih predviđanja i 8+2= 10 točnih predviđanja. Stoga možemo reći da se naš SVM model poboljšao u usporedbi s logističkim regresijskim modelom.
Sada ćemo vizualizirati rezultat skupa treninga, ispod je kod za to:
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()
Izlaz:
Izvršavanjem gornjeg koda dobit ćemo izlaz kao:
javascript spavanje
Kao što vidimo, gornji izlaz izgleda sličan izlazu logističke regresije. U izlazu smo dobili ravnu liniju kao hiperravninu jer imamo koristio linearnu jezgru u klasifikatoru . Također smo gore raspravljali da je za 2d prostor hiperravnina u SVM ravna linija.
#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()
Izlaz:
Izvršavanjem gornjeg koda dobit ćemo izlaz kao:
Kao što možemo vidjeti na gornjoj izlaznoj slici, SVM klasifikator podijelio je korisnike u dvije regije (Kupljeni ili Nekupljeni). Korisnici koji su kupili SUV nalaze se u crvenoj regiji s crvenim raspršenim točkama. Korisnici koji nisu kupili SUV nalaze se u zelenoj regiji sa zelenim točkama raspršenosti. Hiperravnina je podijelila dvije klase na varijablu Kupljeno i Nekupljeno.