Support Vector Machine alebo SVM je jedným z najpopulárnejších algoritmov supervidovaného učenia, ktorý sa používa na klasifikáciu, ako aj na regresné problémy. Primárne sa však používa na klasifikačné problémy v strojovom učení.
Cieľom algoritmu SVM je vytvoriť najlepšiu čiaru alebo hranicu rozhodovania, ktorá dokáže segregovať n-rozmerný priestor do tried, aby sme mohli v budúcnosti jednoducho zaradiť nový dátový bod do správnej kategórie. Táto najlepšia rozhodovacia hranica sa nazýva nadrovina.
SVM vyberá extrémne body/vektory, ktoré pomáhajú pri vytváraní nadroviny. Tieto extrémne prípady sa nazývajú podporné vektory, a preto sa algoritmus nazýva podporný vektorový stroj. Zvážte nižšie uvedený diagram, v ktorom sú dve rôzne kategórie, ktoré sú klasifikované pomocou rozhodovacej hranice alebo nadroviny:
Príklad: SVM možno pochopiť pomocou príkladu, ktorý sme použili v klasifikátore KNN. Predpokladajme, že vidíme zvláštnu mačku, ktorá má tiež nejaké znaky psov, takže ak chceme model, ktorý dokáže presne identifikovať, či je to mačka alebo pes, tak takýto model možno vytvoriť pomocou algoritmu SVM. Náš model najprv natrénujeme na množstve obrázkov mačiek a psov, aby sa dozvedel o rôznych črtách mačiek a psov, a potom ho otestujeme s týmto zvláštnym stvorením. Takže ako vektor podpory vytvorí hranicu rozhodovania medzi týmito dvoma údajmi (mačka a pes) a vyberie extrémne prípady (vektory podpory), uvidí extrémny prípad mačky a psa. Na základe podporných vektorov ju zaradí medzi mačku. Zvážte nasledujúci diagram:
Algoritmus SVM možno použiť na Detekcia tváre, klasifikácia obrázkov, kategorizácia textu, atď.
statické kľúčové slovo v jazyku Java
Typy SVM
SVM môže byť dvoch typov:
Nadrovina a podporné vektory v algoritme SVM:
Hyperplane: Na oddelenie tried v n-rozmernom priestore môže existovať viacero čiar/rozhodovacích hraníc, ale musíme nájsť najlepšiu hranicu rozhodnutia, ktorá pomôže klasifikovať dátové body. Táto najlepšia hranica je známa ako nadrovina SVM.
Rozmery nadroviny závisia od prvkov prítomných v množine údajov, čo znamená, že ak existujú 2 prvky (ako je znázornené na obrázku), nadrovina bude priamka. A ak existujú 3 prvky, potom nadrovina bude 2-rozmerná rovina.
Vždy vytvoríme nadrovinu, ktorá má maximálny okraj, čo znamená maximálnu vzdialenosť medzi dátovými bodmi.
Podporné vektory:
Dátové body alebo vektory, ktoré sú najbližšie k nadrovine a ktoré ovplyvňujú polohu nadroviny, sa nazývajú podporný vektor. Pretože tieto vektory podporujú nadrovinu, preto sa nazývajú podporný vektor.
Ako funguje SVM?
Lineárne SVM:
Fungovanie algoritmu SVM možno pochopiť pomocou príkladu. Predpokladajme, že máme množinu údajov, ktorá má dve značky (zelenú a modrú) a množina údajov má dve funkcie x1 a x2. Chceme klasifikátor, ktorý dokáže klasifikovať pár (x1, x2) súradníc buď zelenou alebo modrou. Zvážte nasledujúci obrázok:
Takže keďže ide o 2-d priestor, pomocou priamej čiary môžeme tieto dve triedy ľahko oddeliť. Môže však existovať viacero riadkov, ktoré môžu tieto triedy oddeliť. Zvážte nasledujúci obrázok:
Algoritmus SVM teda pomáha nájsť najlepšiu líniu alebo hranicu rozhodnutia; táto najlepšia hranica alebo oblasť sa nazýva a nadrovina . Algoritmus SVM nájde najbližší bod čiar z oboch tried. Tieto body sa nazývajú podporné vektory. Vzdialenosť medzi vektormi a nadrovinou sa nazýva ako marža . A cieľom SVM je maximalizovať túto maržu. The nadrovina s maximálnou maržou sa nazýva optimálna nadrovina .
Nelineárne SVM:
Ak sú údaje usporiadané lineárne, môžeme ich oddeliť pomocou priamky, ale pre nelineárne údaje nemôžeme nakresliť jednu priamku. Zvážte nasledujúci obrázok:
Aby sme teda oddelili tieto dátové body, musíme pridať ešte jeden rozmer. Pre lineárne údaje sme použili dva rozmery x a y, takže pre nelineárne údaje pridáme tretí rozmer z. Dá sa vypočítať ako:
z=x<sup>2</sup> +y<sup>2</sup>
Pridaním tretieho rozmeru sa vzorový priestor zmení na obrázok nižšie:
Takže teraz SVM rozdelí množiny údajov do tried nasledujúcim spôsobom. Zvážte nasledujúci obrázok:
Keďže sme v 3-d priestore, vyzerá to ako rovina rovnobežná s osou x. Ak to prevedieme v 2d priestore so z=1, bude to takto:
V prípade nelineárnych údajov teda dostaneme obvod s polomerom 1.
Implementácia podporného vektorového stroja v jazyku Python
Herečka Sai Pallavi
Teraz implementujeme algoritmus SVM pomocou Pythonu. Tu použijeme rovnaký súbor údajov použivateľské dáta , ktoré sme použili v Logistickej regresii a KNN klasifikácii.
Do kroku predbežného spracovania údajov zostane kód rovnaký. Nižšie je uvedený kód:
#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 vykonaní vyššie uvedeného kódu údaje predbežne spracujeme. Kód poskytne súbor údajov ako:
Škálovaný výstup pre testovaciu súpravu bude:
Pripojenie klasifikátora SVM k tréningovej sade:
Teraz sa tréningová súprava nasadí na klasifikátor SVM. Na vytvorenie klasifikátora SVM vykonáme import SVC triedy od Sklearn.svm knižnica. Nižšie je uvedený kód:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
Vo vyššie uvedenom kóde sme použili kernel='linear' , keďže tu vytvárame SVM pre lineárne oddeliteľné dáta. Môžeme ho však zmeniť pre nelineárne dáta. A potom sme klasifikátor prispôsobili množine tréningových údajov (x_train, y_train)
Výkon:
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)
Výkon modelu je možné zmeniť zmenou hodnoty C (regulačný faktor), gama a jadro .
Teraz predpovedáme výstup pre testovaciu sadu. Na tento účel vytvoríme nový vektor y_pred. Nižšie je uvedený kód:
#Predicting the test set result y_pred= classifier.predict(x_test)
Po získaní vektora y_pred môžeme porovnať výsledok y_pred a y_test na kontrolu rozdielu medzi skutočnou hodnotou a predpokladanou hodnotou.
Výkon: Nižšie je uvedený výstup pre predikciu testovacej sady:
Teraz uvidíme výkonnosť klasifikátora SVM, koľko nesprávnych predpovedí existuje v porovnaní s klasifikátorom logistickej regresie. Aby sme vytvorili maticu zmätku, musíme importovať zmätená_matica funkcie knižnice sklearn. Po importovaní funkcie ju zavoláme pomocou novej premennej cm . Funkcia má hlavne dva parametre y_true (skutočné hodnoty) a y_pred (klasifikátor vráti cieľovú hodnotu). Nižšie je uvedený kód:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Výkon:
Ako môžeme vidieť na vyššie uvedenom výstupnom obrázku, existuje 66+24= 90 správnych predpovedí a 8+2= 10 správnych predpovedí. Preto môžeme povedať, že náš model SVM sa zlepšil v porovnaní s modelom logistickej regresie.
Teraz si vizualizujeme výsledok tréningového setu, nižšie je jeho kód:
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()
Výkon:
Spustením vyššie uvedeného kódu dostaneme výstup ako:
vodoznak vo worde
Ako vidíme, vyššie uvedený výstup vyzerá podobne ako výstup logistickej regresie. Vo výstupe sme dostali priamku ako nadrovinu, pretože máme v klasifikátore použil lineárne jadro . A tiež sme vyššie diskutovali o tom, že pre 2d priestor je nadrovina v SVM priamka.
#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()
Výkon:
Spustením vyššie uvedeného kódu dostaneme výstup ako:
Ako môžeme vidieť na vyššie uvedenom výstupnom obrázku, klasifikátor SVM rozdelil používateľov do dvoch oblastí (zakúpené alebo nezakúpené). Používatelia, ktorí si kúpili SUV, sú v červenej oblasti s červenými bodmi rozptylu. A používatelia, ktorí si SUV nekúpili, sú v zelenej oblasti so zelenými bodmi rozptylu. Hyperlietadlo rozdelilo dve triedy na premennú Zakúpené a nezakúpené.