- „K-Nearest Neighbor“ yra vienas iš paprasčiausių mašininio mokymosi algoritmų, paremtų prižiūrimo mokymosi technika.
- K-NN algoritmas daro prielaidą, kad naujas atvejis / duomenys yra panašūs į turimus atvejus, ir priskiria naują atvejį į kategoriją, kuri yra labiausiai panaši į turimas kategorijas.
- K-NN algoritmas išsaugo visus turimus duomenis ir pagal panašumą klasifikuoja naują duomenų tašką. Tai reiškia, kad atsiradus naujiems duomenims, naudojant K-NN algoritmą, juos galima lengvai klasifikuoti į gerai rinkinio kategoriją.
- K-NN algoritmas gali būti naudojamas regresijai ir klasifikacijai, tačiau dažniausiai jis naudojamas klasifikavimo problemoms spręsti.
- K-NN yra a neparametrinis algoritmas , o tai reiškia, kad ji nedaro jokių prielaidų dėl pagrindinių duomenų.
- Jis taip pat vadinamas a tinginio besimokančiojo algoritmas nes iš karto nesimoko iš mokymo rinkinio, o išsaugo duomenų rinkinį ir klasifikavimo metu atlieka veiksmą su duomenų rinkiniu.
- KNN algoritmas mokymo etape tiesiog išsaugo duomenų rinkinį ir, gavęs naujų duomenų, klasifikuoja tuos duomenis į kategoriją, kuri yra labai panaši į naujus duomenis.
Kodėl mums reikia K-NN algoritmo?
Tarkime, kad yra dvi kategorijos, t. y. A ir B kategorija, ir turime naują duomenų tašką x1, todėl šis duomenų taškas bus kurioje iš šių kategorijų. Norėdami išspręsti tokio tipo problemas, mums reikia K-NN algoritmo. Naudodami K-NN galime lengvai nustatyti konkretaus duomenų rinkinio kategoriją ar klasę. Apsvarstykite toliau pateiktą diagramą:
Kaip veikia K-NN?
K-NN veikimą galima paaiškinti remiantis toliau pateiktu algoritmu:
Tarkime, kad turime naują duomenų tašką ir turime jį įtraukti į reikiamą kategoriją. Apsvarstykite toliau pateiktą vaizdą:
skaityti iš csv failo java
- Pirmiausia pasirinksime kaimynų skaičių, taigi pasirinksime k=5.
- Toliau apskaičiuosime Euklido atstumas tarp duomenų taškų. Euklido atstumas yra atstumas tarp dviejų taškų, kurį jau ištyrėme geometrijoje. Jį galima apskaičiuoti taip:
- Apskaičiavę Euklido atstumą gavome artimiausius kaimynus, kaip tris artimiausius kaimynus A kategorijoje ir du artimiausius kaimynus B kategorijoje. Apsvarstykite toliau pateiktą vaizdą:
- Kaip matome, 3 artimiausi kaimynai yra iš A kategorijos, todėl šis naujas duomenų taškas turi priklausyti A kategorijai.
Kaip pasirinkti K reikšmę K-NN algoritme?
Toliau pateikiami keli punktai, kuriuos reikia atsiminti renkantis K reikšmę K-NN algoritme:
- Nėra konkretaus būdo nustatyti geriausią „K“ vertę, todėl turime išbandyti kai kurias vertes, kad rastume geriausią iš jų. Labiausiai pageidaujama K reikšmė yra 5.
- Labai maža K vertė, pvz., K = 1 arba K = 2, gali būti triukšminga ir sukelti modelio nuokrypių poveikį.
- Didelės K reikšmės yra geros, tačiau gali kilti tam tikrų sunkumų.
KNN algoritmo pranašumai:
- Tai paprasta įgyvendinti.
- Jis atsparus triukšmingiems treniruočių duomenims
- Tai gali būti efektyvesnė, jei treniruočių duomenys yra dideli.
KNN algoritmo trūkumai:
- Visada reikia nustatyti K reikšmę, kuri tam tikrą laiką gali būti sudėtinga.
- Skaičiavimo kaina yra didelė, nes skaičiuojamas atstumas tarp visų mokymo pavyzdžių duomenų taškų.
KNN algoritmo Python įgyvendinimas
Norėdami atlikti K-NN algoritmo Python įgyvendinimą, naudosime tą pačią problemą ir duomenų rinkinį, kurį naudojome Logistinėje regresijoje. Bet čia mes pagerinsime modelio veikimą. Žemiau yra problemos aprašymas:
K-NN algoritmo problema: Yra automobilių gamintojo įmonė, pagaminusi naują SUV automobilį. Bendrovė nori pateikti skelbimus vartotojams, norintiems įsigyti tą visureigį. Taigi šiai problemai spręsti turime duomenų rinkinį, kuriame yra kelių vartotojų informacija per socialinį tinklą. Duomenų rinkinyje yra daug informacijos, tačiau Numatomas atlyginimas ir Amžius apsvarstysime nepriklausomą kintamąjį ir Nupirktas kintamasis yra priklausomam kintamajam. Žemiau yra duomenų rinkinys:
K-NN algoritmo įgyvendinimo veiksmai:
- Duomenų išankstinio apdorojimo žingsnis
- K-NN algoritmo pritaikymas mokymo rinkiniui
- Testo rezultato numatymas
- Rezultato tikslumo patikrinimas (sumišimo matricos kūrimas)
- Testo rinkinio rezultato vizualizavimas.
Išankstinio duomenų apdorojimo veiksmas:
Išankstinio duomenų apdorojimo veiksmas išliks toks pat, kaip ir Logistinė regresija. Žemiau yra jo kodas:
# 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)
Vykdant aukščiau pateiktą kodą, mūsų duomenų rinkinys importuojamas į mūsų programą ir gerai iš anksto apdorojamas. Po funkcijų mastelio mūsų bandymo duomenų rinkinys atrodys taip:
Iš aukščiau pateikto išvesties vaizdo matome, kad mūsų duomenys sėkmingai pakeisti.
Dabar K-NN klasifikatorių pritaikysime prie treniruočių duomenų. Norėdami tai padaryti, importuosime KeighborsClassifier klasė Sklearn kaimynai biblioteka. Importavę klasę sukursime Klasifikatorius klasės objektas. Šios klasės parametras bus
#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)
Išvestis: Vykdydami aukščiau pateiktą kodą, išvestį gausime kaip:
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)
Išvestis:
Aukščiau pateikto kodo išvestis bus tokia:
Dabar savo K-NN modeliui sukursime painiavos matricą, kad pamatytume klasifikatoriaus tikslumą. Žemiau yra jo kodas:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Aukščiau pateiktame kode importavome funkciją confusion_matrix ir pavadinome ją naudodami kintamąjį cm.
Išvestis: Vykdydami aukščiau pateiktą kodą, gausime matricą, kaip nurodyta toliau:
java skyriklis
Aukščiau pateiktame paveikslėlyje matome, kad yra 64 + 29 = 93 teisingos prognozės ir 3 + 4 = 7 neteisingos prognozės, o Logistinėje regresijoje buvo 11 neteisingų prognozių. Taigi galime teigti, kad modelio veikimas pagerinamas naudojant K-NN algoritmą.
Dabar vizualizuosime K-NN modelio treniruočių rinkinio rezultatą. Kodas išliks toks pat, kaip ir Logistic Regression, išskyrus grafiko pavadinimą. Žemiau yra jo kodas:
#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()
Išvestis:
Vykdydami aukščiau pateiktą kodą, gausime žemiau pateiktą grafiką:
Išvesties grafikas skiriasi nuo grafiko, kurį atlikome Logistinėje regresijoje. Tai galima suprasti toliau pateiktuose punktuose:
- Kaip matome, diagrama rodo raudoną ir žalią tašką. Žali taškai skirti kintamajam Pirktas(1), o raudoni taškai nenupirktam(0).
- Diagrama rodo netaisyklingą ribą, o ne bet kokią tiesią liniją ar bet kokią kreivę, nes tai yra K-NN algoritmas, ty artimiausio kaimyno radimas.
- Diagramoje naudotojai suskirstyti į tinkamas kategorijas, nes dauguma vartotojų, kurie nepirko visureigio, yra raudonajame regione, o naudotojai, įsigiję visureigį, yra žaliajame regione.
- Diagrama rodo gerus rezultatus, bet vis tiek yra keletas žalių taškų raudonoje srityje ir raudonų taškų žalioje srityje. Tačiau tai nėra didelė problema, nes naudojant šį modelį išvengiama per didelio pritaikymo problemų.
- Taigi mūsų modelis yra gerai apmokytas.
Po modelio apmokymo dabar patikrinsime rezultatą įdėdami naują duomenų rinkinį, t. y. Bandymo duomenų rinkinį. Kodas išlieka toks pat, išskyrus kai kuriuos nedidelius pakeitimus: pvz x_train ir y_train bus pakeistas x_testas ir y_testas .
Žemiau yra jo kodas:
#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()
Išvestis:
Aukščiau pateikta diagrama rodo bandymo duomenų rinkinio išvestį. Kaip matome diagramoje, prognozuojama produkcija yra gerai, nes dauguma raudonų taškų yra raudonoje srityje, o dauguma žalių taškų yra žaliame.
Tačiau raudonoje srityje yra keletas žalių taškų, o žaliame - keletas raudonų taškų. Taigi tai yra neteisingi pastebėjimai, kuriuos pastebėjome painiavos matricoje (7 Neteisinga išvestis).