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:
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 SVM se lahko uporablja za Zaznavanje obrazov, klasifikacija slik, kategorizacija besedila, itd.
pridruži se posodobitvi mysql
Vrste SVM
SVM je lahko dveh vrst:
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:
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:
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 .
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:
Č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:
Zdaj bo SVM nabore podatkov razdelil v razrede na naslednji način. Razmislite o spodnji sliki:
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:
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.
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('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)
Po izvedbi zgornje kode bomo podatke predhodno obdelali. Koda bo dala nabor podatkov kot:
Prilagojeni rezultat za testni niz bo:
1 milijon v številkah
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 # 'Support vector classifier' classifier = SVC(kernel='linear', 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='ovr', degree=3, gamma='auto_deprecated', kernel='linear', 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
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:
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:
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.
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(('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()
Izhod:
Z izvedbo zgornje kode bomo dobili izhod kot:
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.
#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()
Izhod:
Z izvedbo zgornje kode bomo dobili izhod kot:
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.