logo

Palaikykite vektorinės mašinos algoritmą

Parama Vector Machine arba SVM yra vienas iš populiariausių prižiūrimo mokymosi algoritmų, kuris naudojamas klasifikavimo ir regresijos problemoms spręsti. Tačiau pirmiausia jis naudojamas mašininio mokymosi klasifikavimo problemoms spręsti.

SVM algoritmo tikslas yra sukurti geriausią liniją arba sprendimo ribą, kuri galėtų atskirti n-matę erdvę į klases, kad ateityje galėtume lengvai įtraukti naują duomenų tašką į tinkamą kategoriją. Ši geriausio sprendimo riba vadinama hiperplokštuma.

SVM pasirenka kraštutinius taškus / vektorius, kurie padeda sukurti hiperplokštumą. Šie ekstremalūs atvejai vadinami palaikymo vektoriais, todėl algoritmas vadinamas palaikymo vektorių mašina. Apsvarstykite toliau pateiktą diagramą, kurioje yra dvi skirtingos kategorijos, klasifikuojamos naudojant sprendimo ribą arba hiperplokštumą:

Palaikykite vektorinės mašinos algoritmą

Pavyzdys: SVM galima suprasti naudojant pavyzdį, kurį naudojome KNN klasifikatoriuje. Tarkime, kad matome keistą katę, kuri taip pat turi tam tikrų šunims būdingų bruožų, todėl jei norime modelio, kuris galėtų tiksliai atpažinti, ar tai katė, ar šuo, tai tokį modelį galima sukurti naudojant SVM algoritmą. Pirmiausia apmokysime savo modelį su daugybe kačių ir šunų atvaizdų, kad jis sužinotų apie skirtingas kačių ir šunų savybes, o tada išbandysime jį su šiuo keistu padaru. Taigi palaikymo vektorius sukuria sprendimo ribą tarp šių dviejų duomenų (katės ir šuns) ir pasirenka kraštutinius atvejus (palaikymo vektorius), jis matys kraštutinį katės ir šuns atvejį. Remdamasi atramos vektoriais, ji priskirs katę. Apsvarstykite toliau pateiktą diagramą:

Palaikykite vektorinės mašinos algoritmą

Galima naudoti SVM algoritmą Veido aptikimas, vaizdų klasifikavimas, teksto skirstymas į kategorijas, ir tt

c++ prototipo funkcija

SVM tipai

SVM gali būti dviejų tipų:

    Linijinis SVM:Linijinis SVM naudojamas tiesiškai atskiriamiems duomenims, o tai reiškia, kad jei duomenų rinkinį galima suskirstyti į dvi klases naudojant vieną tiesią liniją, tokie duomenys vadinami tiesiškai atskiriamais duomenimis, o klasifikatorius naudojamas kaip linijinis SVM klasifikatorius.Netiesinis SVM:Netiesinis SVM naudojamas nelinijiškai atskirtiems duomenims, o tai reiškia, kad jei duomenų rinkinio negalima klasifikuoti naudojant tiesią liniją, tokie duomenys vadinami nelinijiniais duomenimis, o naudojamas klasifikatorius vadinamas nelinijiniu SVM klasifikatoriumi.

Hiperplokštuma ir paramos vektoriai SVM algoritme:

Hiperplane: Gali būti kelios eilutės / sprendimo ribos, kad būtų galima atskirti klases n matmenų erdvėje, tačiau turime išsiaiškinti geriausią sprendimo ribą, kuri padėtų klasifikuoti duomenų taškus. Ši geriausia riba yra žinoma kaip SVM hiperplokštuma.

Hiperplokštumos matmenys priklauso nuo duomenų rinkinyje esančių ypatybių, o tai reiškia, kad jei yra 2 ypatybės (kaip parodyta paveikslėlyje), hiperplokštuma bus tiesi linija. O jei yra 3 bruožai, tai hiperplokštuma bus 2 dimensijų plokštuma.

Mes visada sukuriame hiperplokštumą, kuri turi didžiausią paraštę, o tai reiškia didžiausią atstumą tarp duomenų taškų.

Paramos vektoriai:

Duomenų taškai arba vektoriai, esantys arčiausiai hiperplokštumos ir turintys įtakos hiperplokštumos vietai, vadinami palaikymo vektoriumi. Kadangi šie vektoriai palaiko hiperplokštumą, vadinasi, paramos vektoriumi.

Kaip veikia SVM?

Linijinis SVM:

SVM algoritmo veikimą galima suprasti naudojant pavyzdį. Tarkime, kad turime duomenų rinkinį, kuriame yra dvi žymos (žalia ir mėlyna), o duomenų rinkinys turi dvi funkcijas x1 ir x2. Norime klasifikatoriaus, kuris galėtų klasifikuoti koordinačių porą (x1, x2) žalia arba mėlyna spalva. Apsvarstykite toliau pateiktą vaizdą:

Palaikykite vektorinės mašinos algoritmą

Taigi, tai yra 2-d erdvė, todėl tiesiog naudodami tiesią liniją galime lengvai atskirti šias dvi klases. Tačiau šias klases gali atskirti kelios eilutės. Apsvarstykite toliau pateiktą vaizdą:

Palaikykite vektorinės mašinos algoritmą

Taigi, SVM algoritmas padeda rasti geriausią liniją arba sprendimo ribą; ši geriausia riba arba sritis vadinama a hiperplokštuma . SVM algoritmas suranda artimiausią abiejų klasių linijų tašką. Šie taškai vadinami atramos vektoriais. Atstumas tarp vektorių ir hiperplokštumos vadinamas kaip marža . Ir SVM tikslas yra maksimaliai padidinti šią maržą. The hiperplokštuma su didžiausia marža vadinama optimali hiperplokštuma .

Palaikykite vektorinės mašinos algoritmą

Netiesinis SVM:

Jei duomenys išdėstyti tiesiškai, galime juos atskirti naudodami tiesią liniją, bet netiesiniams duomenims negalime nubrėžti vienos tiesios linijos. Apsvarstykite toliau pateiktą vaizdą:

Palaikykite vektorinės mašinos algoritmą

Taigi, norėdami atskirti šiuos duomenų taškus, turime pridėti dar vieną aspektą. Linijiniams duomenims naudojome du matmenis x ir y, todėl nelinijiniams duomenims pridėsime trečią matmenį z. Jį galima apskaičiuoti taip:

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

Pridėjus trečiąjį matmenį, pavyzdinė erdvė taps tokia, kaip toliau pateiktame paveikslėlyje:

latekso matrica
Palaikykite vektorinės mašinos algoritmą

Taigi dabar SVM suskirstys duomenų rinkinius į klases tokiu būdu. Apsvarstykite toliau pateiktą vaizdą:

Palaikykite vektorinės mašinos algoritmą

Kadangi esame 3-d erdvėje, tai atrodo kaip plokštuma, lygiagreti x ašiai. Jei konvertuosime jį į 2d erdvę su z = 1, tada jis bus toks:

Palaikykite vektorinės mašinos algoritmą

Taigi netiesinių duomenų atveju gauname 1 spindulio apskritimą.

„Python“ palaikymo vektorinės mašinos įgyvendinimas

Dabar mes įdiegsime SVM algoritmą naudodami Python. Čia naudosime tą patį duomenų rinkinį vartotojo_duomenys , kurį naudojome logistinėje regresijoje ir KNN klasifikacijoje.

    Duomenų išankstinio apdorojimo žingsnis

Iki išankstinio duomenų apdorojimo veiksmo kodas išliks toks pat. Žemiau yra kodas:

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

Įvykdę aukščiau pateiktą kodą, iš anksto apdorosime duomenis. Kodas duos duomenų rinkinį taip:

Palaikykite vektorinės mašinos algoritmą

Bandomojo rinkinio mastelio išvestis bus tokia:

Palaikykite vektorinės mašinos algoritmą

SVM klasifikatoriaus pritaikymas treniruočių rinkiniui:

Dabar treniruočių rinkinys bus pritaikytas prie SVM klasifikatoriaus. Norėdami sukurti SVM klasifikatorių, importuosime SVC klasė nuo Sklearn.svm biblioteka. Žemiau yra jo kodas:

 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) 

Aukščiau pateiktame kode mes naudojome kernel='linijinis' , nes čia kuriame SVM tiesiškai atskiriamiems duomenims. Tačiau mes galime jį pakeisti nelinijiniams duomenims. Tada mes pritaikėme klasifikatorių prie mokymo duomenų rinkinio (x_train, y_train)

iškviesti js funkciją iš html

Išvestis:

 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) 

Modelio veikimas gali būti pakeistas keičiant vertę C (reguliavimo koeficientas), gama ir branduolys .

    Bandymo rinkinio rezultato numatymas:
    Dabar mes prognozuosime bandymo rinkinio išvestį. Tam sukursime naują vektorių y_pred. Žemiau yra jo kodas:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Gavę vektorių y_pred, galime palyginti rezultatą y_pred ir y_testas patikrinti skirtumą tarp tikrosios ir numatomos vertės.

Išvestis: Žemiau pateikiama bandymo rinkinio prognozavimo išvestis:

Palaikykite vektorinės mašinos algoritmą
    Supainiojimo matricos kūrimas:
    Dabar pamatysime SVM klasifikatoriaus našumą, kiek yra neteisingų prognozių, palyginti su logistikos regresijos klasifikatoriumi. Norėdami sukurti painiavos matricą, turime importuoti painiavos_matrica sklear bibliotekos funkcija. Importavę funkciją, ją iškviesime naudodami naują kintamąjį cm . Funkcijai daugiausia reikia dviejų parametrų y_true ( faktinės vertės) ir y_pred (klasifikatoriaus tikslinė vertė). Žemiau yra jo kodas:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

Išvestis:

Palaikykite vektorinės mašinos algoritmą

Kaip matome aukščiau esančiame išvesties paveikslėlyje, yra 66 + 24 = 90 teisingų prognozių ir 8 + 2 = 10 teisingų prognozių. Todėl galime teigti, kad mūsų SVM modelis pagerėjo lyginant su logistinės regresijos modeliu.

    Treniruočių rinkinio rezultato vizualizavimas:
    Dabar pavaizduosime treniruočių rinkinio rezultatą, žemiau yra jo kodas:
 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() 

Išvestis:

Vykdydami aukščiau pateiktą kodą, išvestį gausime kaip:

Palaikykite vektorinės mašinos algoritmą

Kaip matome, aukščiau pateikta išvestis atrodo panaši į logistinės regresijos išvestį. Išvestyje mes gavome tiesę kaip hiperplokštumą, nes turime klasifikatoriuje naudojo linijinį branduolį . Taip pat aukščiau aptarėme, kad 2d erdvėje hiperplokštuma SVM yra tiesi linija.

    Testo rinkinio rezultato vizualizavimas:
 #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() 

Išvestis:

Vykdydami aukščiau pateiktą kodą, išvestį gausime kaip:

Palaikykite vektorinės mašinos algoritmą

Kaip matome aukščiau esančiame išvesties paveikslėlyje, SVM klasifikatorius suskirstė vartotojus į du regionus (Pirkta arba Nepirkta). Visureigį įsigiję vartotojai yra raudonoje srityje su raudonais taškais. O naudotojai, kurie neįsigijo visureigio, yra žaliajame regione su žaliais sklaidos taškais. Hiperplanas suskirstė dvi klases į Pirktas ir neįsigytas kintamuosius.