- K-Nearest Neighbor on yksi yksinkertaisimmista koneoppimisalgoritmeista, jotka perustuvat valvottuun oppimiseen.
- K-NN-algoritmi olettaa uuden tapauksen/tietojen ja saatavilla olevien tapausten samankaltaisuuden ja sijoittaa uuden tapauksen luokkaan, joka muistuttaa eniten saatavilla olevia luokkia.
- K-NN-algoritmi tallentaa kaikki saatavilla olevat tiedot ja luokittelee uuden datapisteen samankaltaisuuden perusteella. Tämä tarkoittaa, että kun uutta tietoa ilmaantuu, se voidaan helposti luokitella hyvin sarjaan K-NN-algoritmin avulla.
- K-NN-algoritmia voidaan käyttää sekä regressioon että luokitukseen, mutta useimmiten sitä käytetään luokitteluongelmiin.
- K-NN on a ei-parametrinen algoritmi , mikä tarkoittaa, että se ei tee mitään oletuksia taustalla olevista tiedoista.
- Sitä kutsutaan myös a laiska oppijan algoritmi koska se ei opi heti opetusjoukosta, vaan se tallentaa tietojoukon ja luokitteluhetkellä suorittaa tietojoukolle toiminnon.
- KNN-algoritmi harjoitusvaiheessa vain tallentaa tietojoukon ja kun se saa uutta tietoa, se luokittelee tiedot luokkaan, joka on paljon samanlainen kuin uudet tiedot.
Miksi tarvitsemme K-NN-algoritmin?
Oletetaan, että on kaksi luokkaa, eli luokka A ja luokka B, ja meillä on uusi datapiste x1, joten tämä tietopiste sijaitsee missä näistä luokista. Tämän tyyppisen ongelman ratkaisemiseksi tarvitsemme K-NN-algoritmin. K-NN:n avulla voimme helposti tunnistaa tietyn tietojoukon kategorian tai luokan. Harkitse alla olevaa kaaviota:
Miten K-NN toimii?
K-NN:n toiminta voidaan selittää alla olevan algoritmin perusteella:
Oletetaan, että meillä on uusi tietopiste ja meidän on asetettava se vaadittuun luokkaan. Harkitse alla olevaa kuvaa:
käänteinen merkkijono java
- Ensin valitsemme naapureiden lukumäärän, joten valitsemme k=5.
- Seuraavaksi laskemme Euklidinen etäisyys datapisteiden välillä. Euklidinen etäisyys on kahden pisteen välinen etäisyys, jota olemme jo tutkineet geometriassa. Se voidaan laskea seuraavasti:
- Laskemalla euklidisen etäisyyden saimme lähimmät naapurit kolmena lähimpänä naapurina kategoriassa A ja kahdeksi lähimmäksi naapuriksi kategoriassa B. Tarkastellaan seuraavaa kuvaa:
- Kuten näemme, 3 lähintä naapuria ovat luokasta A, joten tämän uuden datapisteen on kuuluttava luokkaan A.
Kuinka valita K:n arvo K-NN-algoritmissa?
Alla on joitain kohtia, jotka on muistettava valittaessa K:n arvoa K-NN-algoritmissa:
- Ei ole erityistä tapaa määrittää parasta arvoa 'K':lle, joten meidän on kokeiltava joitain arvoja löytääksemme niistä parhaan. Suosituin K:n arvo on 5.
- Hyvin pieni K:n arvo, kuten K=1 tai K=2, voi olla meluisa ja johtaa poikkeavien vaikutuksiin mallissa.
- Suuret K:n arvot ovat hyviä, mutta niissä voi olla vaikeuksia.
KNN-algoritmin edut:
- Se on helppo toteuttaa.
- Se kestää meluisia harjoitustietoja
- Se voi olla tehokkaampaa, jos harjoitustieto on suuri.
KNN-algoritmin haitat:
- On aina määritettävä K:n arvo, joka voi olla monimutkainen jonkin aikaa.
- Laskentakustannukset ovat korkeat, koska datapisteiden välinen etäisyys lasketaan kaikille harjoitusnäytteille.
KNN-algoritmin Python-toteutus
K-NN-algoritmin Python-toteutuksen tekemiseen käytämme samaa ongelmaa ja tietojoukkoa, joita olemme käyttäneet Logistic Regressionissa. Mutta tässä parannamme mallin suorituskykyä. Alla ongelman kuvaus:
K-NN-algoritmin ongelma: On autonvalmistajayritys, joka on valmistanut uuden SUV-auton. Yritys haluaa näyttää mainoksia käyttäjille, jotka ovat kiinnostuneita ostamaan kyseisen maastoauton. Joten tätä ongelmaa varten meillä on tietojoukko, joka sisältää useiden käyttäjien tietoja sosiaalisen verkoston kautta. Aineisto sisältää paljon tietoa, mutta Arvioitu palkka ja Ikä tarkastelemme riippumatonta muuttujaa ja Ostettu muuttuja on riippuvalle muuttujalle. Alla on tietojoukko:
K-NN-algoritmin käyttöönottovaiheet:
- Tietojen esikäsittelyvaihe
- K-NN-algoritmin sovittaminen harjoitussarjaan
- Testin tuloksen ennustaminen
- Tuloksen testin tarkkuus (sekaannusmatriisin luominen)
- Testisarjan tuloksen visualisointi.
Tietojen esikäsittelyvaihe:
Datan esikäsittelyvaihe pysyy täsmälleen samana kuin logistinen regressio. Alla on koodi sille:
# 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)
Suorittamalla yllä oleva koodi, tietojoukkomme tuodaan ohjelmaamme ja esikäsitellään hyvin. Ominaisuuden skaalauksen jälkeen testitietojoukomme näyttää tältä:
Yllä olevasta tuloskuvasta voimme nähdä, että tietomme on skaalattu onnistuneesti.
Nyt sovitetaan K-NN luokitin harjoitustietoihin. Tätä varten tuomme KNeighbors-luokitus luokkaa Sklearn naapurit kirjasto. Luokan tuonnin jälkeen luomme Luokitin luokan kohde. Tämän luokan parametri on
#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)
Lähtö: Suorittamalla yllä oleva koodi, saamme tulosteen seuraavasti:
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)
Lähtö:
Yllä olevan koodin tulos on:
Nyt luomme K-NN-mallillemme hämmennysmatriisin nähdäksemme luokittelijan tarkkuuden. Alla on koodi sille:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Yllä olevassa koodissa olemme tuoneet confusion_matrix-funktion ja kutsuneet sitä muuttujalla cm.
Lähtö: Suorittamalla yllä oleva koodi, saamme matriisin seuraavasti:
Yllä olevassa kuvassa näemme 64+29= 93 oikeaa ennustetta ja 3+4=7 väärää ennustetta, kun taas Logistic Regressionissa oli 11 väärää ennustetta. Voidaan siis sanoa, että mallin suorituskykyä parannetaan käyttämällä K-NN-algoritmia.
Nyt visualisoimme harjoitussarjan tuloksen K-NN mallille. Koodi pysyy samana kuin Logistic Regressionissa, paitsi kaavion nimi. Alla on koodi sille:
#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()
Lähtö:
atoi c
Suorittamalla yllä oleva koodi, saamme alla olevan kaavion:
Tuloskaavio eroaa graafista, jonka olemme käyttäneet Logistic Regressionissa. Se voidaan ymmärtää alla olevista kohdista:
- Kuten näemme, kaavio näyttää punaisen pisteen ja vihreän pisteen. Vihreät pisteet ovat Ostettu(1) ja punaiset pisteet not Purchased(0) -muuttujalle.
- Kaavio näyttää epäsäännöllisen rajan suoran tai käyrän sijaan, koska se on K-NN-algoritmi, eli lähimmän naapurin löytäminen.
- Kaavio on luokitellut käyttäjät oikeisiin luokkiin, sillä suurin osa käyttäjistä, jotka eivät ostaneet maastoautoa, ovat punaisella alueella ja SUV:n ostaneet käyttäjät vihreällä alueella.
- Kaavio näyttää hyvää tulosta, mutta silti punaisella alueella on vihreitä pisteitä ja vihreällä alueella punaisia pisteitä. Mutta tämä ei ole suuri ongelma, koska tekemällä tämä malli estetään liiallistumisesta.
- Siksi mallimme on hyvin koulutettu.
Mallin harjoittelun jälkeen testaamme nyt tulosta asettamalla uuden datajoukon eli Test dataset. Koodi pysyy samana lukuun ottamatta pieniä muutoksia: esim x_train ja y_train korvataan x_test ja y_test .
Alla on koodi sille:
#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()
Lähtö:
Yllä oleva kaavio näyttää testidatajoukon tulosteen. Kuten kaaviosta näemme, ennustettu tulos on hyvä, koska suurin osa punaisista pisteistä on punaisella alueella ja suurin osa vihreistä pisteistä on vihreällä alueella.
Punaisella alueella on kuitenkin vähän vihreitä pisteitä ja vihreällä alueella muutamia punaisia pisteitä. Nämä ovat siis vääriä havaintoja, jotka olemme havainneet sekaannusmatriisissa (7 Väärä tulos).