logo

Támogatja a Vector gépi algoritmust

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:

Támogatja a Vector gépi algoritmust

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:

Támogatja a Vector gépi algoritmust

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:

    Lineáris SVM:A lineáris SVM-et lineárisan elválasztható adatokhoz használják, ami azt jelenti, hogy ha egy adathalmaz egyetlen egyenes vonal használatával két osztályba sorolható, akkor az ilyen adatokat lineárisan elválasztható adatoknak, az osztályozót pedig Lineáris SVM osztályozónak nevezik.Nemlineáris SVM:A nemlineáris SVM-et nemlineárisan elválasztott adatokhoz használják, ami azt jelenti, hogy ha egy adatkészletet nem lehet egyenes vonallal besorolni, akkor az ilyen adatokat nemlineáris adatoknak, a használt osztályozót pedig nemlineáris SVM osztályozónak nevezik.

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:

Támogatja a Vector gépi algoritmust

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:

Támogatja a Vector gépi algoritmust

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 .

Támogatja a Vector gépi algoritmust

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
Támogatja a Vector gépi algoritmust

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:

Támogatja a Vector gépi algoritmust

Tehát most az SVM a következő módon osztja fel az adatkészleteket osztályokra. Vegye figyelembe az alábbi képet:

Támogatja a Vector gépi algoritmust

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:

Támogatja a Vector gépi algoritmust

Í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.

    Adatok előfeldolgozási lépése

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(&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) 

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:

Támogatja a Vector gépi algoritmust

A tesztkészlet skálázott kimenete a következő lesz:

Támogatja a Vector gépi algoritmust

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 # &apos;Support vector classifier&apos; classifier = SVC(kernel=&apos;linear&apos;, 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=&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) 

A modell teljesítménye az érték változtatásával módosítható C (regularizációs tényező), gamma és kernel .

    A tesztsorozat eredményének előrejelzése:
    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:

Támogatja a Vector gépi algoritmust
    A zavaros mátrix létrehozása:
    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:

Támogatja a Vector gépi algoritmust

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.

    Az edzéskészlet eredményének megjelenítése:
    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((&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() 

Kimenet:

A fenti kód végrehajtásával a következő kimenetet kapjuk:

Támogatja a Vector gépi algoritmust

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.

    A tesztkészlet eredményének megjelenítése:
 #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() 

Kimenet:

java regexben

A fenti kód végrehajtásával a következő kimenetet kapjuk:

Támogatja a Vector gépi algoritmust

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.