Support Vector Machine tai SVM on yksi suosituimmista valvotuista oppimisalgoritmeista, jota käytetään luokittelu- ja regressio-ongelmiin. Kuitenkin ensisijaisesti sitä käytetään luokitteluongelmiin koneoppimisessa.
SVM-algoritmin tavoitteena on luoda paras viiva- tai päätösraja, joka pystyy jakamaan n-ulotteisen avaruuden luokkiin, jotta voimme helposti sijoittaa uuden datapisteen oikeaan luokkaan tulevaisuudessa. Tätä parhaan päätöksen rajaa kutsutaan hypertasoksi.
SVM valitsee ääripisteet/vektorit, jotka auttavat hypertason luomisessa. Näitä ääritapauksia kutsutaan tukivektoreiksi, ja siksi algoritmia kutsutaan tukivektorikoneeksi. Harkitse alla olevaa kaaviota, jossa on kaksi eri luokkaa, jotka on luokiteltu käyttämällä päätösrajaa tai hypertasoa:
Esimerkki: SVM voidaan ymmärtää esimerkillä, jota olemme käyttäneet KNN-luokittimessa. Oletetaan, että näemme oudon kissan, jolla on myös joitain koirien piirteitä, joten jos haluamme mallin, joka tunnistaa tarkasti, onko kyseessä kissa vai koira, niin tällainen malli voidaan luoda käyttämällä SVM-algoritmia. Ensin koulutamme malliamme useilla kissojen ja koirien kuvilla, jotta se oppii kissojen ja koirien eri ominaisuuksia, ja sitten testaamme sitä tällä oudolla olennolla. Joten kun tukivektori luo päätösrajan näiden kahden datan (kissa ja koira) välille ja valitsee ääritapaukset (tukivektorit), se näkee kissan ja koiran ääritapauksen. Tukivektorien perusteella se luokittelee sen kissaksi. Harkitse alla olevaa kaaviota:
SVM-algoritmia voidaan käyttää Kasvojentunnistus, kuvien luokittelu, tekstin luokittelu, jne.
c#
SVM-tyypit
SVM voi olla kahta tyyppiä:
Hypertaso ja tukivektorit SVM-algoritmissa:
Hypertaso: Luokkien erottamiseksi n-ulotteisessa avaruudessa voi olla useita rivejä/päätösrajoja, mutta meidän on löydettävä paras päätösraja, joka auttaa luokittamaan datapisteet. Tämä paras raja tunnetaan SVM:n hypertasona.
Hypertason mitat riippuvat tietojoukossa olevista ominaisuuksista, mikä tarkoittaa, että jos ominaisuuksia on 2 (kuten kuvassa), hypertaso on suora viiva. Ja jos ominaisuuksia on 3, niin hypertaso on 2-ulotteinen taso.
Luomme aina hypertason, jolla on maksimimarginaali, mikä tarkoittaa maksimietäisyyttä datapisteiden välillä.
Tukivektorit:
Datapisteitä tai vektoreita, jotka ovat lähimpänä hypertasoa ja jotka vaikuttavat hypertason sijaintiin, kutsutaan tukivektoriksi. Koska nämä vektorit tukevat hypertasoa, kutsutaan siksi tukivektoriksi.
Miten SVM toimii?
Lineaarinen SVM:
SVM-algoritmin toiminta voidaan ymmärtää esimerkin avulla. Oletetaan, että meillä on tietojoukko, jossa on kaksi tunnistetta (vihreä ja sininen), ja tietojoukossa on kaksi ominaisuutta x1 ja x2. Haluamme luokittelijan, joka voi luokitella koordinaattiparin (x1, x2) joko vihreäksi tai siniseksi. Harkitse alla olevaa kuvaa:
Koska kyseessä on 2-d-avaruus, voimme helposti erottaa nämä kaksi luokkaa käyttämällä suoraa viivaa. Mutta voi olla useita rivejä, jotka voivat erottaa nämä luokat. Harkitse alla olevaa kuvaa:
Näin ollen SVM-algoritmi auttaa löytämään parhaan linjan tai päätösrajan; tätä parasta rajaa tai aluetta kutsutaan nimellä a hypertaso . SVM-algoritmi löytää molempien luokkien viivojen lähimmän pisteen. Näitä pisteitä kutsutaan tukivektoreiksi. Vektorien ja hypertason välistä etäisyyttä kutsutaan nimellä marginaali . Ja SVM:n tavoitteena on maksimoida tämä marginaali. The hypertaso suurimmalla marginaalilla kutsutaan optimaalinen hypertaso .
Epälineaarinen SVM:
Jos data on lineaarisesti järjestetty, voimme erottaa sen käyttämällä suoraa viivaa, mutta ei-lineaarisille tiedoille emme voi piirtää yhtä suoraa viivaa. Harkitse alla olevaa kuvaa:
Joten näiden tietopisteiden erottamiseksi meidän on lisättävä yksi ulottuvuus. Lineaariselle datalle olemme käyttäneet kahta ulottuvuutta x ja y, joten epälineaarisille tiedoille lisäämme kolmannen ulottuvuuden z. Se voidaan laskea seuraavasti:
z=x<sup>2</sup> +y<sup>2</sup>
Kun lisäät kolmannen ulottuvuuden, näytetilasta tulee alla olevan kuvan mukainen:
Joten nyt SVM jakaa tietojoukot luokkiin seuraavalla tavalla. Harkitse alla olevaa kuvaa:
Koska olemme 3-d-avaruudessa, se näyttää x-akselin suuntaiselta tasolta. Jos muunnamme sen 2d-avaruuteen z=1:llä, siitä tulee seuraava:
Tästä syystä saamme ympärysmitan, jonka säde on 1, jos kyseessä on epälineaarinen data.
Python-tukivektorikoneen toteutus
Nyt toteutamme SVM-algoritmin Pythonilla. Tässä käytämme samaa tietojoukkoa käyttäjätiedot , jota olemme käyttäneet Logistisessa regressiossa ja KNN-luokituksessa.
Tietojen esikäsittelyvaiheeseen asti koodi pysyy samana. Alla on koodi:
historia javassa
#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)
Yllä olevan koodin suorittamisen jälkeen esikäsittelemme tiedot. Koodi antaa tietojoukon seuraavasti:
Testisarjan skaalattu tulos on:
SVM-luokittimen sovittaminen harjoitussarjaan:
Nyt harjoitussarja asennetaan SVM-luokittimeen. SVM-luokituksen luomiseksi tuomme SVC luokasta alkaen Sklearn.svm kirjasto. Alla on koodi sille:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
Yllä olevassa koodissa olemme käyttäneet kernel='lineaarinen' , koska tässä luomme SVM:ää lineaarisesti erotettavalle tiedolle. Voimme kuitenkin muuttaa sen epälineaarisille tiedoille. Ja sitten sovitimme luokituksen harjoitustietojoukkoon (x_train, y_train)
Lähtö:
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)
Mallin suorituskykyä voidaan muuttaa muuttamalla arvoa C (regularisointikerroin), gamma ja ydin .
Nyt ennustamme testisarjan ulostulon. Tätä varten luomme uuden vektorin y_pred. Alla on koodi sille:
#Predicting the test set result y_pred= classifier.predict(x_test)
Saatuaan vektorin y_pred, voimme verrata tulosta y_pred ja y_testi tarkistaaksesi todellisen arvon ja ennustetun arvon välisen eron.
Lähtö: Alla on tulos testisarjan ennusteelle:
Nyt näemme SVM-luokittimen suorituskyvyn, kuinka monta virheellistä ennustetta on verrattuna Logistiseen regressioluokittimeen. Hämmennysmatriisin luomiseksi meidän on tuotava sekaannusmatriisi sklear-kirjaston toiminto. Kun funktio on tuotu, kutsumme sitä uudella muuttujalla cm . Toiminto ottaa pääasiassa kaksi parametria y_true (todelliset arvot) ja y_pred (luokittajan tavoitearvon palautus). Alla on koodi sille:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Lähtö:
Kuten yllä olevasta tuloskuvasta näemme, oikeaa ennustetta on 66+24= 90 ja oikeaa ennustetta 8+2= 10. Tästä syystä voidaan sanoa, että SVM-mallimme parani verrattuna Logistiseen regressiomalliin.
Nyt visualisoimme harjoitussarjan tuloksen, alla on sen koodi:
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()
Lähtö:
Suorittamalla yllä oleva koodi, saamme tulosteen seuraavasti:
Kuten näemme, yllä oleva tulos näyttää samalta kuin logistisen regression tulos. Tuloksessa saimme suoran hypertasona, koska meillä on käytti luokittimessa lineaarista ydintä . Ja olemme myös keskustelleet edellä, että 2d-avaruudessa hypertaso SVM:ssä on suora viiva.
#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()
Lähtö:
Suorittamalla yllä oleva koodi, saamme tulosteen seuraavasti:
Kuten yllä olevasta tuloskuvasta näemme, SVM-luokitin on jakanut käyttäjät kahteen alueeseen (ostettu tai ei ostettu). SUV:n ostaneet käyttäjät ovat punaisella alueella, jossa on punaiset hajontapisteet. Ja käyttäjät, jotka eivät ostaneet maastoautoa, ovat vihreällä alueella, jossa on vihreitä hajontapisteitä. Hypertaso on jakanut kaksi luokkaa Ostettu- ja ei-ostettu-muuttujaan.
foreach silmukan konekirjoitus