logo

Algoritem podpornega vektorskega stroja

Podporni vektorski stroj ali SVM je eden najbolj priljubljenih algoritmov za nadzorovano učenje, ki se uporablja za probleme klasifikacije in regresije. Vendar pa se uporablja predvsem za težave s klasifikacijo v strojnem učenju.

Cilj algoritma SVM je ustvariti najboljšo linijo ali mejo odločitve, ki lahko loči n-dimenzionalni prostor v razrede, tako da lahko novo podatkovno točko v prihodnosti preprosto uvrstimo v pravilno kategorijo. Ta meja najboljše odločitve se imenuje hiperravnina.

SVM izbere skrajne točke/vektorje, ki pomagajo pri ustvarjanju hiperravnine. Ti skrajni primeri se imenujejo podporni vektorji, zato se algoritem imenuje podporni vektorski stroj. Razmislite o spodnjem diagramu, v katerem sta dve različni kategoriji, ki sta razvrščeni z uporabo odločitvene meje ali hiperravnine:

Algoritem podpornega vektorskega stroja

primer: SVM lahko razumemo s primerom, ki smo ga uporabili v klasifikatorju KNN. Recimo, da vidimo nenavadno mačko, ki ima tudi nekatere značilnosti psov, torej če želimo model, ki lahko natančno prepozna, ali je mačka ali pes, je takšen model mogoče ustvariti z uporabo algoritma SVM. Naš model bomo najprej usposobili z veliko slikami mačk in psov, da bo lahko spoznal različne lastnosti mačk in psov, nato pa ga bomo preizkusili s tem nenavadnim bitjem. Torej, ko podporni vektor ustvarja odločitveno mejo med tema dvema podatkoma (mačka in pes) in izbere skrajne primere (podporne vektorje), bo videl skrajni primer mačke in psa. Na podlagi podpornih vektorjev ga bo uvrstil med mačke. Razmislite o spodnjem diagramu:

Algoritem podpornega vektorskega stroja

Algoritem SVM se lahko uporablja za Zaznavanje obrazov, klasifikacija slik, kategorizacija besedila, itd.

pridruži se posodobitvi mysql

Vrste SVM

SVM je lahko dveh vrst:

    Linearni SVM:Linearni SVM se uporablja za linearno ločljive podatke, kar pomeni, da če je nabor podatkov mogoče razvrstiti v dva razreda z uporabo ene ravne črte, se taki podatki imenujejo linearno ločljivi podatki, klasifikator pa se uporablja kot linearni klasifikator SVM.Nelinearni SVM:Nelinearni SVM se uporablja za nelinearno ločene podatke, kar pomeni, da če nabora podatkov ni mogoče razvrstiti z uporabo ravne črte, se takšni podatki imenujejo nelinearni podatki, uporabljeni klasifikator pa se imenuje nelinearni klasifikator SVM.

Hiperravnina in podporni vektorji v algoritmu SVM:

Hiperplan: Za ločevanje razredov v n-dimenzionalnem prostoru je lahko več vrstic/odločitvenih meja, vendar moramo poiskati najboljšo odločitveno mejo, ki pomaga razvrstiti podatkovne točke. Ta najboljša meja je znana kot hiperravnina SVM.

Dimenzije hiperravnine so odvisne od značilnosti, ki so prisotne v naboru podatkov, kar pomeni, da če obstajata 2 značilnosti (kot je prikazano na sliki), bo hiperravnina ravna črta. In če obstajajo 3 lastnosti, bo hiperravnina dvodimenzionalna ravnina.

Vedno ustvarimo hiperravnino, ki ima največji rob, kar pomeni največjo razdaljo med podatkovnima točkama.

Podporni vektorji:

Podatkovne točke ali vektorji, ki so najbližje hiperravnini in vplivajo na položaj hiperravnine, se imenujejo nosilni vektor. Ker ti vektorji podpirajo hiperravnino, se zato imenujejo nosilni vektor.

Kako deluje SVM?

Linearni SVM:

Delovanje algoritma SVM je mogoče razumeti na primeru. Recimo, da imamo nabor podatkov z dvema oznakama (zeleno in modro), nabor podatkov pa ima dve funkciji x1 in x2. Želimo klasifikator, ki lahko razvrsti par (x1, x2) koordinat v zeleno ali modro. Razmislite o spodnji sliki:

Algoritem podpornega vektorskega stroja

Torej, ker gre za 2-d prostor, lahko ta dva razreda enostavno ločimo le z uporabo ravne črte. Lahko pa obstaja več vrstic, ki lahko ločijo te razrede. Razmislite o spodnji sliki:

Algoritem podpornega vektorskega stroja

Zato algoritem SVM pomaga najti najboljšo črto ali mejo odločitve; ta najboljša meja ali regija se imenuje a hiperravnina . Algoritem SVM poišče najbližjo točko premic iz obeh razredov. Te točke imenujemo nosilni vektorji. Razdalja med vektorji in hiperravnino se imenuje kot marža . In cilj SVM je povečati to maržo. The hiperravnina z največjo maržo se imenuje optimalna hiperravnina .

Algoritem podpornega vektorskega stroja

Nelinearni SVM:

Če so podatki linearno urejeni, jih lahko ločimo z ravno črto, pri nelinearnih podatkih pa ne moremo narisati ene same ravne črte. Razmislite o spodnji sliki:

Algoritem podpornega vektorskega stroja

Če želimo ločiti te podatkovne točke, moramo dodati še eno dimenzijo. Za linearne podatke smo uporabili dve dimenziji x in y, zato bomo za nelinearne podatke dodali tretjo dimenzijo z. Lahko se izračuna kot:

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

Z dodajanjem tretje dimenzije bo vzorčni prostor postal kot na spodnji sliki:

Algoritem podpornega vektorskega stroja

Zdaj bo SVM nabore podatkov razdelil v razrede na naslednji način. Razmislite o spodnji sliki:

Algoritem podpornega vektorskega stroja

Ker smo v 3-d prostoru, je videti kot ravnina, vzporedna z osjo x. Če ga pretvorimo v 2d prostor z z=1, potem bo postal:

Algoritem podpornega vektorskega stroja

Tako dobimo obseg polmera 1 v primeru nelinearnih podatkov.

Izvedba podpornega vektorskega stroja v Pythonu

Zdaj bomo implementirali algoritem SVM z uporabo Pythona. Tukaj bomo uporabili isti nabor podatkov uporabniški_podatki , ki smo jih uporabili pri logistični regresiji in klasifikaciji KNN.

    Korak predhodne obdelave podatkov

Do koraka predhodne obdelave podatkov bo koda ostala enaka. Spodaj je koda:

 #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) 

Po izvedbi zgornje kode bomo podatke predhodno obdelali. Koda bo dala nabor podatkov kot:

Algoritem podpornega vektorskega stroja

Prilagojeni rezultat za testni niz bo:

1 milijon v številkah
Algoritem podpornega vektorskega stroja

Prilagajanje klasifikatorja SVM vadbenemu nizu:

Sedaj bo komplet za usposabljanje prilagojen klasifikatorju SVM. Za ustvarjanje klasifikatorja SVM bomo uvozili SVC razred od Sklearn.svm knjižnica. Spodaj je koda zanj:

 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) 

V zgornji kodi smo uporabili kernel='linearno' , saj tukaj ustvarjamo SVM za linearno ločljive podatke. Lahko pa ga spremenimo za nelinearne podatke. Nato smo klasifikator prilagodili naboru podatkov o usposabljanju (x_train, y_train)

Izhod:

 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) 

Učinkovitost modela je mogoče spremeniti s spremembo vrednosti C (faktor regulacije), gama in jedro .

aritmetično logična enota
    Napovedovanje rezultata testnega niza:
    Zdaj bomo napovedali izhod za testni niz. Za to bomo ustvarili nov vektor y_pred. Spodaj je koda zanj:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Ko dobimo vektor y_pred, lahko primerjamo rezultat y_pred in y_test za preverjanje razlike med dejansko in predvideno vrednostjo.

Izhod: Spodaj je rezultat za napoved testnega niza:

Algoritem podpornega vektorskega stroja
    Ustvarjanje matrike zmede:
    Zdaj bomo videli delovanje klasifikatorja SVM, koliko nepravilnih napovedi je v primerjavi s klasifikatorjem logistične regresije. Če želite ustvariti matriko zmede, moramo uvoziti matrika_zmede funkcijo knjižnice sklearn. Po uvozu funkcije jo bomo poklicali z novo spremenljivko cm . Funkcija ima predvsem dva parametra y_true (dejanske vrednosti) in y_pred (ciljna vrednost, ki jo vrne klasifikator). Spodaj je koda zanj:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

Izhod:

Algoritem podpornega vektorskega stroja

Kot lahko vidimo na zgornji izhodni sliki, je 66+24= 90 pravilnih napovedi in 8+2= 10 pravilnih napovedi. Zato lahko rečemo, da se je naš model SVM izboljšal v primerjavi z modelom logistične regresije.

    Vizualizacija rezultata vadbenega sklopa:
    Zdaj bomo vizualizirali rezultat vadbenega niza, spodaj je koda zanj:
 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() 

Izhod:

Z izvedbo zgornje kode bomo dobili izhod kot:

Algoritem podpornega vektorskega stroja

Kot lahko vidimo, je zgornji rezultat videti podoben izhodu logistične regresije. V izhodu smo dobili premico kot hiperravnino, ker imamo uporabil linearno jedro v klasifikatorju . Zgoraj smo razpravljali tudi o tem, da je za 2d prostor hiperravnina v SVM ravna črta.

    Vizualizacija rezultata testnega niza:
 #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() 

Izhod:

Z izvedbo zgornje kode bomo dobili izhod kot:

Algoritem podpornega vektorskega stroja

Kot lahko vidimo na zgornji izhodni sliki, je klasifikator SVM razdelil uporabnike v dve regiji (Kupljeno ali Nekupljeno). Uporabniki, ki so kupili SUV, so v rdečem območju z rdečimi razpršenimi točkami. In uporabniki, ki niso kupili SUV, so v zelenem območju z zelenimi razpršenimi točkami. Hiperravnina je dva razreda razdelila na spremenljivko Kupljeno in Nekupljeno.