logo

Atbalstiet vektora mašīnu algoritmu

Atbalsta vektora mašīnu jeb SVM ir viens no populārākajiem uzraudzītās mācīšanās algoritmiem, ko izmanto klasifikācijas, kā arī regresijas problēmu risināšanai. Tomēr galvenokārt to izmanto klasifikācijas problēmām mašīnmācībā.

SVM algoritma mērķis ir izveidot labāko līniju vai lēmumu robežu, kas var sadalīt n-dimensiju telpu klasēs, lai mēs nākotnē varētu viegli ievietot jauno datu punktu pareizajā kategorijā. Šo labākā lēmuma robežu sauc par hiperplānu.

SVM izvēlas galējos punktus/vektori, kas palīdz izveidot hiperplānu. Šos ekstremālos gadījumus sauc par atbalsta vektoriem, un tāpēc algoritms tiek saukts par atbalsta vektoru mašīnu. Apsveriet tālāk redzamo diagrammu, kurā ir divas dažādas kategorijas, kas klasificētas, izmantojot lēmuma robežu vai hiperplakni:

Atbalstiet vektora mašīnu algoritmu

Piemērs: SVM var saprast ar piemēru, ko esam izmantojuši KNN klasifikatorā. Pieņemsim, ka mēs redzam dīvainu kaķi, kuram ir arī dažas suņu pazīmes, tāpēc, ja mēs vēlamies modeli, kas var precīzi noteikt, vai tas ir kaķis vai suns, tad šādu modeli var izveidot, izmantojot SVM algoritmu. Vispirms mēs apmācīsim savu modeli ar daudziem kaķu un suņu attēliem, lai tas varētu uzzināt par dažādām kaķu un suņu iezīmēm, un pēc tam mēs to pārbaudīsim ar šo dīvaino būtni. Tā kā atbalsta vektors izveido lēmuma robežu starp šiem diviem datiem (kaķis un suns) un izvēlas ekstremālos gadījumus (atbalsta vektorus), tas redzēs galējo kaķa un suņa gadījumu. Pamatojoties uz atbalsta vektoriem, tas klasificēs to kā kaķi. Apsveriet tālāk redzamo diagrammu:

Atbalstiet vektora mašīnu algoritmu

Var izmantot SVM algoritmu Sejas noteikšana, attēlu klasifikācija, teksta kategorizēšana, utt.

vesels skaitlis līdz virknei Java

SVM veidi

SVM var būt divu veidu:

    Lineārs SVM:Lineārais SVM tiek izmantots lineāri atdalāmiem datiem, kas nozīmē, ja datu kopu var klasificēt divās klasēs, izmantojot vienu taisnu līniju, tad šādus datus sauc par lineāri atdalāmiem datiem, bet klasifikatoru izmanto par Lineāro SVM klasifikatoru.Nelineārs SVM:Nelineārais SVM tiek izmantots nelineāri atdalītiem datiem, kas nozīmē, ja datu kopu nevar klasificēt, izmantojot taisnu līniju, tad šādus datus sauc par nelineāriem datiem un izmantoto klasifikatoru sauc par nelineāro SVM klasifikatoru.

Hiperplakne un atbalsta vektori SVM algoritmā:

Hiperplāns: Var būt vairākas līnijas/lēmuma robežas, lai atdalītu klases n-dimensiju telpā, taču mums ir jānoskaidro labākā lēmuma pieņemšanas robeža, kas palīdz klasificēt datu punktus. Šī labākā robeža ir pazīstama kā SVM hiperplakne.

Hiperplaknes izmēri ir atkarīgi no datu kopā esošajiem elementiem, kas nozīmē, ja ir 2 līdzekļi (kā parādīts attēlā), tad hiperplakne būs taisna līnija. Un, ja ir 3 pazīmes, tad hiperplāna būs 2 dimensiju plakne.

Mēs vienmēr izveidojam hiperplakni ar maksimālo rezervi, kas nozīmē maksimālo attālumu starp datu punktiem.

Atbalsta vektori:

Datu punkti vai vektori, kas atrodas vistuvāk hiperplaknei un ietekmē hiperplaknes pozīciju, tiek saukti par atbalsta vektoru. Tā kā šie vektori atbalsta hiperplakni, tos sauc par atbalsta vektoru.

Kā darbojas SVM?

Lineārs SVM:

SVM algoritma darbību var saprast, izmantojot piemēru. Pieņemsim, ka mums ir datu kopa, kurā ir divi tagi (zaļš un zils), un datu kopai ir divas funkcijas x1 un x2. Mēs vēlamies klasifikatoru, kas var klasificēt koordinātu pāri (x1, x2) zaļā vai zilā krāsā. Apsveriet tālāk redzamo attēlu:

Atbalstiet vektora mašīnu algoritmu

Tā kā tā ir 2 d telpa, tāpēc, izmantojot tikai taisnu līniju, mēs varam viegli atdalīt šīs divas klases. Bet var būt vairākas rindas, kas var atdalīt šīs klases. Apsveriet tālāk redzamo attēlu:

Atbalstiet vektora mašīnu algoritmu

Tādējādi SVM algoritms palīdz atrast labāko līniju vai lēmuma robežu; šo labāko robežu vai reģionu sauc par a hiperplāns . SVM algoritms atrod tuvāko punktu līniju no abām klasēm. Šos punktus sauc par atbalsta vektoriem. Attālumu starp vektoriem un hiperplakni sauc par starpība . Un SVM mērķis ir palielināt šo rezervi. The hiperplāns ar maksimālo rezervi sauc par optimāla hiperplāna .

Atbalstiet vektora mašīnu algoritmu

Nelineārs SVM:

Ja dati ir lineāri sakārtoti, tad tos varam atdalīt, izmantojot taisni, bet nelineāriem datiem nevar uzzīmēt vienu taisni. Apsveriet tālāk redzamo attēlu:

Atbalstiet vektora mašīnu algoritmu

Tātad, lai atdalītu šos datu punktus, mums jāpievieno vēl viena dimensija. Lineāriem datiem mēs esam izmantojuši divas dimensijas x un y, tāpēc nelineāriem datiem pievienosim trešo dimensiju z. To var aprēķināt šādi:

ja vēl bash čaulā
 z=x<sup>2</sup> +y<sup>2</sup> 

Pievienojot trešo dimensiju, parauga telpa kļūs tāda, kā parādīts attēlā:

Atbalstiet vektora mašīnu algoritmu

Tātad tagad SVM sadalīs datu kopas klasēs šādā veidā. Apsveriet tālāk redzamo attēlu:

Atbalstiet vektora mašīnu algoritmu

Tā kā mēs atrodamies trīsdimensiju telpā, tā izskatās kā plakne, kas ir paralēla x asij. Ja mēs to pārveidosim 2d telpā ar z=1, tad tas kļūs šādi:

Atbalstiet vektora mašīnu algoritmu

Tādējādi mēs iegūstam rādiusa 1 apkārtmēru nelineāru datu gadījumā.

Python atbalsta vektora mašīnas ieviešana

Tagad mēs ieviesīsim SVM algoritmu, izmantojot Python. Šeit mēs izmantosim to pašu datu kopu lietotāja_dati , ko esam izmantojuši loģistikas regresijā un KNN klasifikācijā.

    Datu priekšapstrādes solis

Līdz datu pirmapstrādes solim kods paliks nemainīgs. Zemāk ir kods:

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

Pēc iepriekš minētā koda izpildes mēs veiksim datu priekšapstrādi. Kods sniegs datu kopu šādi:

Atbalstiet vektora mašīnu algoritmu

Testa komplekta mērogotā izvade būs:

Atbalstiet vektora mašīnu algoritmu

SVM klasifikatora pielāgošana treniņu komplektam:

Tagad apmācības komplekts tiks aprīkots ar SVM klasifikatoru. Lai izveidotu SVM klasifikatoru, mēs importēsim SVC klase no Sklearn.svm bibliotēka. Zemāk ir tā kods:

 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) 

Iepriekš minētajā kodā mēs esam izmantojuši kernel='lineārs' , jo šeit mēs veidojam SVM lineāri atdalāmiem datiem. Tomēr mēs varam to mainīt nelineāriem datiem. Un tad mēs pielāgojām klasifikatoru apmācības datu kopai (x_train, y_train)

Izvade:

 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) 

Modeļa veiktspēju var mainīt, mainot vērtību C (regularizācijas koeficients), gamma un kodols .

    Testa komplekta rezultāta prognozēšana:
    Tagad mēs prognozēsim testa komplekta izvadi. Šim nolūkam mēs izveidosim jaunu vektoru y_pred. Zemāk ir tā kods:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Pēc y_pred vektora iegūšanas mēs varam salīdzināt rezultātu y_pred un y_test lai pārbaudītu atšķirību starp faktisko vērtību un prognozēto vērtību.

Izvade: Zemāk ir izvade testa kopas prognozēšanai:

Atbalstiet vektora mašīnu algoritmu
    Sajaukšanas matricas izveide:
    Tagad mēs redzēsim SVM klasifikatora veiktspēju, cik daudz nepareizu prognožu ir salīdzinājumā ar loģistikas regresijas klasifikatoru. Lai izveidotu neskaidrības matricu, mums ir jāimportē neskaidrības_matrica sklear bibliotēkas funkcija. Pēc funkcijas importēšanas mēs to izsauksim, izmantojot jaunu mainīgo cm . Funkcijai galvenokārt ir nepieciešami divi parametri y_true ( faktiskās vērtības) un y_pred (klasifikatora mērķa vērtības atdeve). Zemāk ir tā kods:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

Izvade:

Atbalstiet vektora mašīnu algoritmu

Kā redzams iepriekš redzamajā izvades attēlā, ir 66+24= 90 pareizas prognozes un 8+2= 10 pareizas prognozes. Tāpēc mēs varam teikt, ka mūsu SVM modelis ir uzlabojies, salīdzinot ar loģistikas regresijas modeli.

    Apmācības komplekta rezultāta vizualizēšana:
    Tagad mēs vizualizēsim treniņu komplekta rezultātu, zemāk ir tā kods:
 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() 

Izvade:

Izpildot iepriekš minēto kodu, mēs saņemsim izvadi kā:

Atbalstiet vektora mašīnu algoritmu

Kā redzam, iepriekš minētā izvade izskatās līdzīga loģistikas regresijas izvadei. Izvadā mēs saņēmām taisnu līniju kā hiperplānu, jo mums tā ir klasifikatorā izmantoja lineāro kodolu . Un mēs arī iepriekš apspriedām, ka 2D telpai SVM hiperplakne ir taisna līnija.

    Testa komplekta rezultāta vizualizācija:
 #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() 

Izvade:

Izpildot iepriekš minēto kodu, mēs saņemsim izvadi kā:

Atbalstiet vektora mašīnu algoritmu

Kā redzams iepriekš redzamajā izvades attēlā, SVM klasifikators ir sadalījis lietotājus divos reģionos (Purchased vai Not buyed). Lietotāji, kuri iegādājās SUV, atrodas sarkanajā apgabalā ar sarkanajiem izkliedes punktiem. Un lietotāji, kuri nav iegādājušies SUV, atrodas zaļajā reģionā ar zaļajiem izkliedes punktiem. Hiperplakne ir sadalījusi abas klases mainīgajā: Pirkts un Nepirkts.

kurš ir Fredijs Merkūrijs