logo

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

  • 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.
  • Příklad:Předpokládejme, že máme představu tvora, který vypadá podobně jako kočka a pes, ale chceme vědět, zda je to kočka nebo pes. Takže pro tuto identifikaci můžeme použít algoritmus KNN, protože pracuje na míře podobnosti. Náš model KNN najde podobné vlastnosti nového souboru dat jako obrázky koček a psů a na základě nejpodobnějších vlastností jej zařadí do kategorie kočky nebo psy.
Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

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:

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

Jak K-NN funguje?

Fungování K-NN lze vysvětlit na základě níže uvedeného algoritmu:

    Krok 1:Vyberte číslo K sousedůKrok 2:Vypočítejte euklidovskou vzdálenost K počet sousedů Krok 3:Vezměte K nejbližších sousedů podle vypočítané euklidovské vzdálenosti.Krok 4:Mezi těmito k sousedy spočítejte počet datových bodů v každé kategorii.Krok 5:Přiřaďte nové datové body té kategorii, pro kterou je počet sousedů maximální.Krok 6:Náš model je připraven.

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
Algoritmus K-Nearest Neighbor (KNN) pro strojové učení
  • 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:
Algoritmus K-Nearest Neighbor (KNN) pro strojové učení
  • 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:
Algoritmus K-Nearest Neighbor (KNN) pro strojové učení
  • 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:

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

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:

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

Z výše uvedeného výstupního obrázku můžeme vidět, že naše data jsou úspěšně škálována.

    Přizpůsobení klasifikátoru K-NN k tréninkovým datům:
    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
      n_neighbors:Definovat požadované sousedy algoritmu. Obvykle to trvá 5.metric='minkowski':Toto je výchozí parametr a rozhoduje o vzdálenosti mezi body.p=2:Je ekvivalentní standardní euklidovské metrice.
    A pak klasifikátor přizpůsobíme trénovacím datům. Níže je pro něj uveden kód:
 #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') 
    Předpovídání výsledku testu:Abychom předpověděli výsledek testovací sady, vytvoříme a y_před vektor, jako jsme to udělali v Logistické regresi. Níže je pro něj uveden kód:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Výstup:

Výstup pro výše uvedený kód bude:

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení
    Vytvoření Matice zmatení:
    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:

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

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.

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

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

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

Algoritmus K-Nearest Neighbor (KNN) pro strojové učení

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