Support Vector Machine neboli SVM je jedním z nejpopulárnějších algoritmů supervizovaného učení, který se používá pro klasifikaci i regresní problémy. Primárně se však používá pro klasifikační problémy ve strojovém učení.
Cílem algoritmu SVM je vytvořit nejlepší linii nebo rozhodovací hranici, která dokáže segregovat n-rozměrný prostor do tříd, abychom mohli v budoucnu snadno zařadit nový datový bod do správné kategorie. Tato nejlepší rozhodovací hranice se nazývá nadrovina.
SVM vybírá extrémní body/vektory, které pomáhají při vytváření nadroviny. Tyto extrémní případy se nazývají podpůrné vektory, a proto se algoritmus nazývá podpůrný vektorový stroj. Zvažte níže uvedený diagram, ve kterém existují dvě různé kategorie, které jsou klasifikovány pomocí rozhodovací hranice nebo nadroviny:
Příklad: SVM lze pochopit na příkladu, který jsme použili v klasifikátoru KNN. Předpokládejme, že vidíme podivnou kočku, která má také některé rysy psů, takže pokud chceme model, který dokáže přesně identifikovat, zda je to kočka nebo pes, lze takový model vytvořit pomocí algoritmu SVM. Náš model nejprve natrénujeme se spoustou obrázků koček a psů, aby poznal různé rysy koček a psů, a poté jej otestujeme s tímto zvláštním tvorem. Takže když vektor podpory vytvoří hranici rozhodování mezi těmito dvěma daty (kočka a pes) a vybere extrémní případy (vektory podpory), uvidí extrémní případ kočky a psa. Na základě podpůrných vektorů ji klasifikuje jako kočku. Zvažte níže uvedený diagram:
Algoritmus SVM lze použít pro Detekce obličeje, klasifikace obrázků, kategorizace textu, atd.
nbsp
Typy SVM
SVM může být dvou typů:
Nadrovina a podpůrné vektory v algoritmu SVM:
Hyperplane: Pro oddělení tříd v n-rozměrném prostoru může existovat více čar/rozhodovacích hranic, ale musíme najít nejlepší rozhodovací hranici, která pomůže klasifikovat datové body. Tato nejlepší hranice je známá jako nadrovina SVM.
Rozměry nadroviny závisí na prvcích přítomných v datové sadě, což znamená, že pokud existují 2 prvky (jak je znázorněno na obrázku), pak nadrovina bude přímka. A pokud existují 3 prvky, pak nadrovina bude 2-rozměrná rovina.
Vždy vytváříme nadrovinu, která má maximální okraj, což znamená maximální vzdálenost mezi datovými body.
Podporované vektory:
Datové body nebo vektory, které jsou nejblíže nadrovině a které ovlivňují polohu nadroviny, se nazývají podpůrný vektor. Protože tyto vektory podporují nadrovinu, proto se nazývají podpůrný vektor.
Jak funguje SVM?
Lineární SVM:
Fungování algoritmu SVM lze pochopit na příkladu. Předpokládejme, že máme datovou sadu, která má dvě značky (zelenou a modrou), a datová sada má dvě funkce x1 a x2. Chceme klasifikátor, který dokáže klasifikovat pár (x1, x2) souřadnic buď zelenou, nebo modrou barvou. Zvažte následující obrázek:
Protože se jedná o 2-d prostor, tak pouhým použitím přímky můžeme tyto dvě třídy snadno oddělit. Může však existovat více řádků, které mohou tyto třídy oddělit. Zvažte následující obrázek:
Algoritmus SVM tedy pomáhá najít nejlepší linii nebo hranici rozhodování; tato nejlepší hranice nebo oblast se nazývá a nadrovina . Algoritmus SVM najde nejbližší bod čar z obou tříd. Tyto body se nazývají podpůrné vektory. Vzdálenost mezi vektory a nadrovinou se nazývá as okraj . A cílem SVM je tuto marži maximalizovat. The nadrovina s maximální marží se nazývá optimální nadrovina .
Nelineární SVM:
co je v pythonu
Pokud jsou data lineárně uspořádána, můžeme je oddělit pomocí přímky, ale pro nelineární data nemůžeme nakreslit jedinou přímku. Zvažte následující obrázek:
Abychom tedy oddělili tyto datové body, musíme přidat ještě jeden rozměr. Pro lineární data jsme použili dva rozměry x a y, takže pro nelineární data přidáme třetí rozměr z. Lze jej vypočítat takto:
z=x<sup>2</sup> +y<sup>2</sup>
Přidáním třetího rozměru se vzorový prostor změní na obrázek níže:
Nyní tedy SVM rozdělí datové sady do tříd následujícím způsobem. Zvažte následující obrázek:
Protože jsme ve 3-d prostoru, vypadá to jako rovina rovnoběžná s osou x. Pokud to převedeme ve 2d prostoru s z=1, bude to takto:
V případě nelineárních dat tedy dostaneme obvod o poloměru 1.
Implementace podpůrného vektorového stroje v Pythonu
Nyní implementujeme algoritmus SVM pomocí Pythonu. Zde použijeme stejnou datovou sadu uživatelská data , který jsme použili v Logistické regresi a KNN klasifikaci.
Do kroku předběžného zpracování dat zůstane kód stejný. Níže 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 provedení výše uvedeného kódu data předzpracujeme. Kód poskytne datovou sadu jako:
Škálovaný výstup pro testovací sadu bude:
Přizpůsobení klasifikátoru SVM k tréninkové sadě:
Nyní bude cvičná sada přizpůsobena klasifikátoru SVM. Pro vytvoření klasifikátoru SVM provedeme import SVC třídy od Sklearn.svm knihovna. Níže je pro něj uveden kód:
from sklearn.svm import SVC # 'Support vector classifier' classifier = SVC(kernel='linear', random_state=0) classifier.fit(x_train, y_train)
Ve výše uvedeném kódu jsme použili kernel='lineární' , protože zde vytváříme SVM pro lineárně oddělitelná data. U nelineárních dat jej však můžeme změnit. A pak jsme klasifikátor přizpůsobili trénovací datové sadě (x_train, y_train)
Výstup:
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 lze změnit změnou hodnoty C (regulační faktor), gama a jádro .
Nyní předpovíme výstup pro testovací sadu. Za tímto účelem vytvoříme nový vektor y_pred. Níže je pro něj uveden kód:
#Predicting the test set result y_pred= classifier.predict(x_test)
Po získání vektoru y_pred můžeme porovnat výsledek y_před a y_test pro kontrolu rozdílu mezi skutečnou hodnotou a předpokládanou hodnotou.
Výstup: Níže je uveden výstup pro predikci testovací sady:
Nyní uvidíme výkon klasifikátoru SVM, kolik nesprávných předpovědí existuje ve srovnání s klasifikátorem logistické regrese. Abychom vytvořili matici zmatků, musíme importovat zmatek_matice funkce knihovny sklearn. Po importu funkci zavoláme pomocí nové proměnné cm . Funkce přebírá především dva parametry y_true (skutečné hodnoty) a y_před (klasifikátor vrací cílovou hodnotu). Níže je pro něj uveden kód:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Výstup:
Jak můžeme vidět na výše uvedeném výstupním obrázku, existuje 66+24= 90 správných předpovědí a 8+2= 10 správných předpovědí. Můžeme tedy říci, že náš model SVM se oproti modelu logistické regrese zlepšil.
Nyní si vizualizujeme výsledek tréninkové sady, níže je její 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ýstup:
Spuštěním výše uvedeného kódu získáme výstup jako:
jak přejmenovat adresář linux
Jak vidíme, výše uvedený výstup vypadá podobně jako výstup Logistické regrese. Ve výstupu jsme dostali přímku jako nadrovinu, protože máme v klasifikátoru použil lineární jádro . A výše jsme také diskutovali o tom, že pro 2d prostor je nadrovina v SVM přímka.
#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ýstup:
Spuštěním výše uvedeného kódu získáme výstup jako:
Jak můžeme vidět na výše uvedeném výstupním obrázku, klasifikátor SVM rozdělil uživatele do dvou oblastí (zakoupeno nebo nezakoupeno). Uživatelé, kteří si zakoupili SUV, jsou v červené oblasti s červenými bodovými body. A uživatelé, kteří si SUV nezakoupili, jsou v zelené oblasti se zelenými bodovými body. Hyperplane rozdělil dvě třídy na proměnnou Zakoupené a nezakoupené.