A Support Vector Machine vagy SVM az egyik legnépszerűbb felügyelt tanulási algoritmus, amelyet osztályozási és regressziós problémákra is használnak. Azonban elsősorban a gépi tanulás osztályozási problémáira használják.
Az SVM algoritmus célja a legjobb vonal vagy döntési határ létrehozása, amely képes az n-dimenziós teret osztályokba bontani, hogy a jövőben könnyen a megfelelő kategóriába sorolhassuk az új adatpontot. Ezt a legjobb döntési határt hipersíknak nevezzük.
Az SVM kiválasztja azokat a szélső pontokat/vektorokat, amelyek segítenek a hipersík létrehozásában. Ezeket a szélsőséges eseteket támogatási vektoroknak nevezzük, és ezért az algoritmust Support Vector Machine-nek nevezik. Tekintsük az alábbi diagramot, amelyen két különböző kategória van, amelyek döntési határ vagy hipersík alapján vannak besorolva:
Példa: Az SVM azzal a példával érthető meg, amelyet a KNN osztályozóban használtunk. Tételezzük fel, hogy látunk egy furcsa macskát, amely a kutyára jellemző tulajdonságokkal is rendelkezik, tehát ha olyan modellt akarunk, amely pontosan azonosítani tudja, hogy macskáról vagy kutyáról van-e szó, akkor az SVM algoritmussal létrehozható egy ilyen modell. Először sok macskáról és kutyáról készült képpel képezzük ki modellünket, hogy megismerje a macskák és kutyák különböző tulajdonságait, majd teszteljük ezzel a furcsa lénnyel. Tehát mivel a támogatási vektor döntési határt hoz létre e két adat (macska és kutya) között, és extrém eseteket választ (támogató vektorok), a macska és a kutya szélsőséges esetét fogja látni. A támogatási vektorok alapján macskának fogja minősíteni. Tekintsük az alábbi diagramot:
SVM algoritmus használható Arcfelismerés, képosztályozás, szöveg kategorizálás, stb.
Rekha színész
Az SVM típusai
Az SVM kétféle lehet:
Hipersík és támogató vektorok az SVM algoritmusban:
Hipersík: Több sor/döntési határ is lehet az osztályok n-dimenziós térben történő elkülönítésére, de meg kell találnunk a legjobb döntési határt, amely segít az adatpontok osztályozásában. Ezt a legjobb határvonalat az SVM hipersíkjaként ismerik.
A hipersík méretei az adatkészletben lévő jellemzőktől függenek, ami azt jelenti, hogy ha 2 jellemző van (ahogyan a képen látható), akkor a hipersík egy egyenes lesz. És ha 3 jellemző van, akkor a hipersík egy 2 dimenziós sík lesz.
Mindig létrehozunk egy hipersíkot, amelynek van egy maximális margója, ami az adatpontok közötti maximális távolságot jelenti.
Támogató vektorok:
Azokat az adatpontokat vagy vektorokat, amelyek a legközelebb vannak a hipersíkhoz, és amelyek befolyásolják a hipersík helyzetét, támogatási vektornak nevezzük. Mivel ezek a vektorok támogatják a hipersíkot, ezért támogatási vektornak nevezik.
Hogyan működik az SVM?
Lineáris SVM:
Az SVM algoritmus működését egy példa segítségével érthetjük meg. Tegyük fel, hogy van egy adatkészletünk, amely két címkével (zöld és kék) rendelkezik, és az adatkészletnek két jellemzője van: x1 és x2. Olyan osztályozót akarunk, amely az (x1, x2) koordinátapárt zöld vagy kék színnel tudja osztályozni. Vegye figyelembe az alábbi képet:
Tehát mivel 2-d térről van szó, csak egy egyenes használatával könnyen szétválaszthatjuk ezt a két osztályt. De több sor is elválaszthatja ezeket az osztályokat. Vegye figyelembe az alábbi képet:
Ezért az SVM algoritmus segít megtalálni a legjobb vonalat vagy döntési határt; ezt a legjobb határt vagy régiót a hipersík . Az SVM algoritmus mindkét osztályból megkeresi a vonalak legközelebbi pontját. Ezeket a pontokat támaszvektoroknak nevezzük. A vektorok és a hipersík közötti távolságot ún árrés . Az SVM célja pedig ennek az árrésnek a maximalizálása. A hipersík maximális margóval az úgynevezett optimális hipersík .
Nem-lineáris SVM:
Ha az adatok lineárisan vannak elrendezve, akkor egyenes vonallal elválaszthatjuk őket, de nem lineáris adatok esetén nem rajzolhatunk egyetlen egyenest sem. Vegye figyelembe az alábbi képet:
hogyan konvertálhat stringet integer java-ba
Tehát az adatpontok elkülönítéséhez még egy dimenziót kell hozzáadnunk. Lineáris adatokhoz két x és y dimenziót használtunk, ezért a nem lineáris adatokhoz egy harmadik z dimenziót adunk hozzá. A következőképpen számolható:
z=x<sup>2</sup> +y<sup>2</sup>
A harmadik dimenzió hozzáadásával a mintatér az alábbi képen látható lesz:
Tehát most az SVM a következő módon osztja fel az adatkészleteket osztályokra. Vegye figyelembe az alábbi képet:
Mivel a 3-d térben vagyunk, ezért úgy néz ki, mint az x tengellyel párhuzamos sík. Ha 2d térben z=1-gyel konvertáljuk, akkor a következő lesz:
Így nemlineáris adatok esetén 1 sugarú kerületet kapunk.
A támogató vektorgép Python megvalósítása
Most az SVM algoritmust fogjuk megvalósítani Python segítségével. Itt ugyanazt az adatkészletet fogjuk használni felhasználói adat , amelyet a logisztikai regresszióban és a KNN osztályozásban használtunk.
Az Adat-előfeldolgozási lépésig a kód változatlan marad. Alul a 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)
A fenti kód végrehajtása után az adatokat előfeldolgozzuk. A kód a következőképpen adja meg az adatkészletet:
A tesztkészlet skálázott kimenete a következő lesz:
Az SVM osztályozó felszerelése az oktatókészlethez:
Most az oktatókészlet az SVM osztályozóhoz lesz illesztve. Az SVM osztályozó létrehozásához importálni fogjuk SVC osztályból Sklearn.svm könyvtár. Alább található a kódja hozzá:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
A fenti kódban használtuk kernel='lineáris' , mivel itt SVM-et hozunk létre a lineárisan elválasztható adatokhoz. Nemlineáris adatokra azonban módosíthatjuk. Ezután illesztettük az osztályozót a képzési adatkészlethez (x_train, y_train)
Kimenet:
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)
A modell teljesítménye az érték változtatásával módosítható C (regularizációs tényező), gamma és kernel .
Most megjósoljuk a tesztkészlet kimenetét. Ehhez létrehozunk egy új y_pred vektort. Alább található a kódja hozzá:
#Predicting the test set result y_pred= classifier.predict(x_test)
Miután megkaptuk az y_pred vektort, összehasonlíthatjuk az eredményt y_pred és y_teszt hogy ellenőrizze a tényleges és a becsült érték közötti különbséget.
Kimenet: Az alábbiakban látható a tesztkészlet előrejelzésének kimenete:
Most látni fogjuk az SVM osztályozó teljesítményét, hogy hány hibás előrejelzés van a logisztikai regressziós osztályozóhoz képest. A zavaros mátrix létrehozásához importálnunk kell a confusion_mátrix a sklearn könyvtár funkciója. A függvény importálása után egy új változó segítségével hívjuk meg cm . A függvény főként két paramétert vesz igénybe y_true ( a tényleges értékek) és y_pred (az osztályozó által visszaadott célérték). Alább található a kódja hozzá:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Kimenet:
Amint a fenti kimeneti képen láthatjuk, 66+24= 90 helyes előrejelzés és 8+2= 10 helyes előrejelzés létezik. Ezért elmondhatjuk, hogy az SVM modellünk javult a logisztikus regressziós modellhez képest.
Most vizualizáljuk az edzéssorozat eredményét, alább található a kódja:
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()
Kimenet:
A fenti kód végrehajtásával a következő kimenetet kapjuk:
Amint látjuk, a fenti kimenet hasonló a logisztikai regresszió kimenetéhez. A kimenetben az egyenest hipersíkként kaptuk, mert van lineáris kernelt használt az osztályozóban . Azt is fentebb tárgyaltuk, hogy a 2d térben az SVM hipersíkja egy egyenes.
#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()
Kimenet:
java regexben
A fenti kód végrehajtásával a következő kimenetet kapjuk:
Ahogy a fenti kimeneti képen is láthatjuk, az SVM osztályozó két régióra osztotta a felhasználókat (Vásárolt vagy Nem vásárolt). Azok a felhasználók, akik megvásárolták az SUV-t, a piros tartományban vannak a piros szórási pontokkal. Azok a felhasználók pedig, akik nem vásárolták meg a SUV-t, a zöld régióban vannak, ahol a zöld szórási pontok találhatók. A hipersík a két osztályt Megvásárolt és nem vásárolt változókra osztotta.