logo

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

  • 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.
  • Esimerkki:Oletetaan, että meillä on kuva olennosta, joka näyttää kissalta ja koiralta, mutta haluamme tietää, onko se kissa tai koira. Joten tähän tunnistamiseen voimme käyttää KNN-algoritmia, koska se toimii samankaltaisuusmittauksella. KNN-mallimme löytää uuden tietojoukon samankaltaiset piirteet kissojen ja koirien kuvien kanssa ja sijoittaa sen samankaltaisimpien ominaisuuksien perusteella joko kissa- tai koiraluokkaan.
K-lähin naapuri (KNN) -algoritmi koneoppimiseen

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:

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

Miten K-NN toimii?

K-NN:n toiminta voidaan selittää alla olevan algoritmin perusteella:

    Vaihe 1:Valitse naapureiden numero KVaihe 2:Laske euklidinen etäisyys K määrä naapureita Vaihe 3:Ota K lähimmät naapurit lasketun euklidisen etäisyyden mukaan.Vaihe 4:Laske näiden k naapurin joukosta datapisteiden lukumäärä kussakin luokassa.Vaihe 5:Määritä uudet tietopisteet siihen luokkaan, jossa naapurin lukumäärä on suurin.Vaihe 6:Mallimme on valmis.

Oletetaan, että meillä on uusi tietopiste ja meidän on asetettava se vaadittuun luokkaan. Harkitse alla olevaa kuvaa:

käänteinen merkkijono java
K-lähin naapuri (KNN) -algoritmi koneoppimiseen
  • 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:
K-lähin naapuri (KNN) -algoritmi koneoppimiseen
  • 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:
K-lähin naapuri (KNN) -algoritmi koneoppimiseen
  • 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-lähin naapuri (KNN) -algoritmi koneoppimiseen

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

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

Yllä olevasta tuloskuvasta voimme nähdä, että tietomme on skaalattu onnistuneesti.

    K-NN-luokituksen sovittaminen harjoitustietoihin:
    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
      n_naapurit:Määrittää algoritmin tarvittavat naapurit. Yleensä se kestää 5.metric='minkowski':Tämä on oletusparametri, ja se määrittää pisteiden välisen etäisyyden.p=2:Se vastaa tavallista euklidista metriikkaa.
    Ja sitten sovitamme luokituksen harjoitustietoihin. Alla on koodi sille:
 #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') 
    Testin tuloksen ennustaminen:Testisarjan tuloksen ennustamiseksi luomme a y_pred vektori kuten teimme Logistic Regressionissa. Alla on koodi sille:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Lähtö:

Yllä olevan koodin tulos on:

K-lähin naapuri (KNN) -algoritmi koneoppimiseen
    Hämmennysmatriisin luominen:
    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:

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

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.

    Harjoittelusarjan tuloksen visualisointi:
    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:

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

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.
    Testisarjan tuloksen visualisointi:
    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ö:

K-lähin naapuri (KNN) -algoritmi koneoppimiseen

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