- K-Nearest Neighbor je jedním z nejjednodušších algoritmů strojového učení založených na technice supervizovaného učení.
- Algoritmus K-NN předpokládá podobnost mezi novým případem/daty a dostupnými případy a zařadí nový případ do kategorie, která je nejvíce podobným dostupným kategoriím.
- Algoritmus K-NN ukládá všechna dostupná data a klasifikuje nový datový bod na základě podobnosti. To znamená, že když se objeví nová data, lze je snadno zařadit do kategorie well suite pomocí algoritmu K-NN.
- Algoritmus K-NN lze použít pro regresi i pro klasifikaci, ale většinou se používá pro klasifikační problémy.
- K-NN je a neparametrický algoritmus , což znamená, že nevytváří žádné předpoklady o podkladových datech.
- Nazývá se také a algoritmus líného žáka protože se neučí z trénovací sady okamžitě, místo toho uloží datovou sadu a v době klasifikace provede akci na datové sadě.
- Algoritmus KNN ve fázi tréninku pouze ukládá datovou sadu a když získá nová data, klasifikuje tato data do kategorie, která je velmi podobná novým datům.
Proč potřebujeme algoritmus K-NN?
Předpokládejme, že existují dvě kategorie, tj. kategorie A a kategorie B, a máme nový datový bod x1, takže tento datový bod bude ležet ve které z těchto kategorií. K vyřešení tohoto typu problému potřebujeme K-NN algoritmus. Pomocí K-NN můžeme snadno identifikovat kategorii nebo třídu konkrétní datové sady. Zvažte níže uvedený diagram:
Jak K-NN funguje?
Fungování K-NN lze vysvětlit na základě níže uvedeného algoritmu:
Předpokládejme, že máme nový datový bod a musíme jej zařadit do požadované kategorie. Zvažte následující obrázek:
obrácený řetězec v jazyce Java
- Nejprve zvolíme počet sousedů, tedy zvolíme k=5.
- Dále spočítáme Euklidovská vzdálenost mezi datovými body. Euklidovská vzdálenost je vzdálenost mezi dvěma body, kterou jsme již studovali v geometrii. Lze jej vypočítat takto:
- Výpočtem euklidovské vzdálenosti jsme získali nejbližší sousedy, jako tři nejbližší sousedy v kategorii A a dva nejbližší sousedy v kategorii B. Uvažujme níže uvedený obrázek:
- Jak vidíme, 3 nejbližší sousedé jsou z kategorie A, proto tento nový datový bod musí patřit do kategorie A.
Jak vybrat hodnotu K v algoritmu K-NN?
Níže jsou uvedeny některé body, které je třeba pamatovat při výběru hodnoty K v algoritmu K-NN:
- Neexistuje žádný konkrétní způsob, jak určit nejlepší hodnotu pro „K“, takže musíme vyzkoušet některé hodnoty, abychom z nich našli to nejlepší. Nejvýhodnější hodnota pro K je 5.
- Velmi nízká hodnota K, jako je K=1 nebo K=2, může být hlučná a vést k účinkům odlehlých hodnot v modelu.
- Velké hodnoty pro K jsou dobré, ale mohou narazit na určité potíže.
Výhody algoritmu KNN:
- Je to jednoduché na implementaci.
- Je odolný vůči hlučným tréninkovým datům
- Může být efektivnější, pokud jsou tréninková data velká.
Nevýhody algoritmu KNN:
- Vždy je potřeba určit hodnotu K, která může být nějakou dobu složitá.
- Náklady na výpočet jsou vysoké kvůli výpočtu vzdálenosti mezi datovými body pro všechny trénovací vzorky.
Python implementace algoritmu KNN
K implementaci algoritmu K-NN v Pythonu použijeme stejný problém a datovou sadu, kterou jsme použili v Logistické regresi. Zde ale vylepšíme výkon modelu. Níže je popis problému:
Problém pro algoritmus K-NN: Existuje automobilka, která vyrobila nové SUV. Společnost chce dát reklamy uživatelům, kteří mají zájem o koupi tohoto SUV. Takže pro tento problém máme datovou sadu, která obsahuje více informací o uživatelích prostřednictvím sociální sítě. Datový soubor obsahuje mnoho informací, ale Odhadovaná mzda a Stáří budeme uvažovat pro nezávislou proměnnou a Zakoupená proměnná je pro závisle proměnnou. Níže je datová sada:
Kroky k implementaci algoritmu K-NN:
- Krok předběžného zpracování dat
- Přizpůsobení algoritmu K-NN tréninkové sadě
- Předpovídání výsledku testu
- Otestujte přesnost výsledku (Vytvoření matice zmatků)
- Vizualizace výsledku testovací sady.
Krok předběžného zpracování dat:
Krok předběžného zpracování dat zůstane přesně stejný jako Logistická regrese. Níže je pro něj uveden kód:
# 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)
Spuštěním výše uvedeného kódu je naše datová sada importována do našeho programu a dobře předzpracována. Po škálování funkcí bude naše testovací datová sada vypadat takto:
Z výše uvedeného výstupního obrázku můžeme vidět, že naše data jsou úspěšně škálována.
Nyní přizpůsobíme klasifikátor K-NN tréninkovým datům. K tomu budeme importovat KNeighborsClassifier třída Sklearn Neighbors knihovna. Po importu třídy vytvoříme Klasifikátor předmět třídy. Parametr této třídy bude
#Fitting K-NN classifier to the training set from sklearn.neighbors import KNeighborsClassifier classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 ) classifier.fit(x_train, y_train)
Výstup: Spuštěním výše uvedeného kódu získáme výstup jako:
Out[10]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')
#Predicting the test set result y_pred= classifier.predict(x_test)
Výstup:
Výstup pro výše uvedený kód bude:
Nyní vytvoříme Confusion Matrix pro náš model K-NN, abychom viděli přesnost klasifikátoru. 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)
Ve výše uvedeném kódu jsme importovali funkci confusion_matrix a zavolali ji pomocí proměnné cm.
operační systém linux
Výstup: Spuštěním výše uvedeného kódu získáme matici, jak je uvedeno níže:
Na obrázku výše vidíme, že existuje 64+29= 93 správných předpovědí a 3+4= 7 nesprávných předpovědí, zatímco v Logistické regresi bylo 11 nesprávných předpovědí. Můžeme tedy říci, že výkon modelu je zlepšen použitím algoritmu K-NN.
Nyní si vizualizujeme výsledek trénovací sady pro model K-NN. Kód zůstane stejný jako v Logistické regresi, kromě názvu grafu. Níže je pro něj uveden kód:
#Visulaizing the trianing set result 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('K-NN Algorithm (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 níže uvedený graf:
Výstupní graf se liší od grafu, který jsme objevili v Logistické regresi. Dá se to pochopit v následujících bodech:
- Jak vidíme, graf ukazuje červený bod a zelený bod. Zelené body jsou za proměnnou Zakoupeno(1) a Červené body za nezakoupeno(0).
- Graf ukazuje nepravidelnou hranici namísto zobrazení jakékoli přímky nebo jakékoli křivky, protože se jedná o K-NN algoritmus, tj. hledání nejbližšího souseda.
- Graf zařadil uživatele do správných kategorií, protože většina uživatelů, kteří si SUV nekoupili, je v červené oblasti a uživatelé, kteří si koupili SUV, jsou v zelené oblasti.
- Graf ukazuje dobrý výsledek, ale přesto jsou některé zelené body v červené oblasti a červené body v zelené oblasti. Ale to není žádný velký problém, protože tímto modelem se zabrání problémům s přemontováním.
- Náš model je tedy dobře vyškolen.
Po trénování modelu nyní otestujeme výsledek vložením nové datové sady, tedy testovací datové sady. Kód zůstává stejný až na některé drobné změny: jako např x_train a y_train bude nahrazeno x_test a y_test .
Níže je pro něj uveden kód:
#Visualizing 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('K-NN algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
Výstup:
Výše uvedený graf ukazuje výstup pro sadu testovacích dat. Jak můžeme vidět na grafu, předpokládaný výstup je dobrý, protože většina červených bodů je v červené oblasti a většina zelených bodů je v zelené oblasti.
V červené oblasti je však málo zelených bodů a v zelené oblasti několik červených bodů. Takže toto jsou nesprávná pozorování, která jsme pozorovali ve zmatkové matici (7 Nesprávný výstup).