logo

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

SVM algoritam se može koristiti za Detekcija lica, klasifikacija slika, kategorizacija teksta, itd.

trostruka zima

Vrste SVM

SVM može biti dvije vrste:

    Linearni SVM:Linearni SVM koristi se za podatke koji se mogu linearno odvojiti, što znači da ako se skup podataka može klasificirati u dvije klase pomoću jedne ravne linije, tada se takvi podaci nazivaju podacima koji se mogu linearno odvojiti, a klasifikator se koristi kao Linearni SVM klasifikator.Nelinearni SVM:Nelinearni SVM koristi se za nelinearno odvojene podatke, što znači da ako se skup podataka ne može klasificirati pomoću ravne linije, tada se takvi podaci nazivaju nelinearnim podacima, a korišteni klasifikator naziva se nelinearni SVM klasifikator.

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:

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

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 .

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

Sada će SVM podijeliti skupove podataka u klase na sljedeći način. Razmotrite sliku u nastavku:

Algoritam potpornog vektorskog stroja

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:

Algoritam potpornog vektorskog stroja

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.

    Korak prethodne obrade podataka

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(&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) 

Nakon izvršenja gornjeg koda, prethodno ćemo obraditi podatke. Kod će dati skup podataka kao:

Algoritam potpornog vektorskog stroja

Skalirani izlaz za ispitni skup bit će:

Algoritam potpornog vektorskog stroja

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 # &apos;Support vector classifier&apos; classifier = SVC(kernel=&apos;linear&apos;, 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=&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) 

Izvedba modela može se promijeniti promjenom vrijednosti C (faktor regularizacije), gama i kernel .

    Predviđanje rezultata skupa testova:
    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:

Algoritam potpornog vektorskog stroja
    Stvaranje matrice zabune:
    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:

Algoritam potpornog vektorskog stroja

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.

    Vizualizacija rezultata skupa treninga:
    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((&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() 

Izlaz:

Izvršavanjem gornjeg koda dobit ćemo izlaz kao:

javascript spavanje
Algoritam potpornog vektorskog stroja

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.

    Vizualizacija rezultata skupa testova:
 #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() 

Izlaz:

Izvršavanjem gornjeg koda dobit ćemo izlaz kao:

Algoritam potpornog vektorskog stroja

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.