logo

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

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ů:

    Lineární SVM:Lineární SVM se používá pro lineárně oddělitelná data, což znamená, že pokud lze datovou sadu klasifikovat do dvou tříd pomocí jedné přímky, pak se taková data označují jako lineárně oddělitelná data a klasifikátor se používá jako lineární klasifikátor SVM.Nelineární SVM:Nelineární SVM se používá pro nelineárně oddělená data, což znamená, že pokud soubor dat nelze klasifikovat pomocí přímky, pak se taková data označují jako nelineární data a použitý klasifikátor se nazývá Nelineární klasifikátor SVM.

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:

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

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 .

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

Nyní tedy SVM rozdělí datové sady do tříd následujícím způsobem. Zvažte následující obrázek:

Podpora vektorového strojového algoritmu

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:

Podpora vektorového strojového algoritmu

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.

    Krok předběžného zpracování dat

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

Po provedení výše uvedeného kódu data předzpracujeme. Kód poskytne datovou sadu jako:

Podpora vektorového strojového algoritmu

Škálovaný výstup pro testovací sadu bude:

Podpora vektorového strojového algoritmu

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

Výkon modelu lze změnit změnou hodnoty C (regulační faktor), gama a jádro .

    Předpovídání výsledku testovací sady:
    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:

Podpora vektorového strojového algoritmu
    Vytvoření matice zmatků:
    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:

Podpora vektorového strojového algoritmu

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.

    Vizualizace výsledku tréninkové sady:
    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((&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() 

Výstup:

Spuštěním výše uvedeného kódu získáme výstup jako:

jak přejmenovat adresář linux
Podpora vektorového strojového algoritmu

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.

    Vizualizace výsledku testovací sady:
 #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() 

Výstup:

Spuštěním výše uvedeného kódu získáme výstup jako:

Podpora vektorového strojového algoritmu

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