- K-Nearest Neighbor ir viens no vienkāršākajiem mašīnmācīšanās algoritmiem, kura pamatā ir uzraudzītās mācīšanās tehnika.
- K-NN algoritms pieņem līdzību starp jauno gadījumu/datiem un pieejamajiem gadījumiem un iekļauj jauno lietu kategorijā, kas ir vislīdzīgākā pieejamajām kategorijām.
- K-NN algoritms saglabā visus pieejamos datus un klasificē jaunu datu punktu, pamatojoties uz līdzību. Tas nozīmē, ka, parādoties jauniem datiem, tos var viegli klasificēt labi komplekta kategorijā, izmantojot K-NN algoritmu.
- K-NN algoritmu var izmantot gan regresijai, gan klasifikācijai, bet galvenokārt tas tiek izmantots klasifikācijas problēmām.
- K-NN ir a neparametrisks algoritms , kas nozīmē, ka tas neizdara nekādus pieņēmumus par pamatā esošajiem datiem.
- To sauc arī par a slinka apmācāmā algoritms jo tā nemācās no apmācības kopas uzreiz, tā vietā tā saglabā datu kopu un klasifikācijas laikā veic darbību ar datu kopu.
- KNN algoritms apmācības fāzē tikai saglabā datu kopu un, kad tas iegūst jaunus datus, klasificē šos datus kategorijā, kas ir daudz līdzīga jaunajiem datiem.
Kāpēc mums ir nepieciešams K-NN algoritms?
Pieņemsim, ka ir divas kategorijas, t.i., A un B kategorija, un mums ir jauns datu punkts x1, tāpēc šis datu punkts atradīsies kurā no šīm kategorijām. Lai atrisinātu šāda veida problēmas, mums ir nepieciešams K-NN algoritms. Ar K-NN palīdzību mēs varam viegli noteikt konkrētas datu kopas kategoriju vai klasi. Apsveriet tālāk redzamo diagrammu:
Kā darbojas K-NN?
K-NN darbību var izskaidrot, pamatojoties uz tālāk norādīto algoritmu:
Pieņemsim, ka mums ir jauns datu punkts un tas jāievieto vajadzīgajā kategorijā. Apsveriet tālāk redzamo attēlu:
selēna pamati
- Pirmkārt, mēs izvēlēsimies kaimiņu skaitu, tāpēc izvēlēsimies k=5.
- Tālāk mēs aprēķināsim Eiklīda attālums starp datu punktiem. Eiklīda attālums ir attālums starp diviem punktiem, ko mēs jau esam pētījuši ģeometrijā. To var aprēķināt šādi:
- Aprēķinot Eiklīda attālumu, mēs ieguvām tuvākos kaimiņus kā trīs tuvākos kaimiņus A kategorijā un divus tuvākos kaimiņus B kategorijā. Apsveriet tālāk redzamo attēlu:
- Kā redzam, 3 tuvākie kaimiņi ir no A kategorijas, tāpēc šim jaunajam datu punktam ir jāpieder A kategorijai.
Kā izvēlēties K vērtību K-NN algoritmā?
Tālāk ir norādīti daži punkti, kas jāatceras, atlasot K vērtību K-NN algoritmā.
- Nav īpaša veida, kā noteikt “K” labāko vērtību, tāpēc mums ir jāizmēģina dažas vērtības, lai atrastu labāko no tām. Vispiemērotākā K vērtība ir 5.
- Ļoti zema K vērtība, piemēram, K = 1 vai K = 2, var būt trokšņaina un izraisīt modeļa novirzes.
- Lielas K vērtības ir labas, taču tās var radīt zināmas grūtības.
KNN algoritma priekšrocības:
- To ir vienkārši īstenot.
- Tas ir izturīgs pret trokšņainiem treniņu datiem
- Tas var būt efektīvāks, ja apmācības dati ir lieli.
KNN algoritma trūkumi:
- Vienmēr ir jānosaka K vērtība, kas kādu laiku var būt sarežģīta.
- Aprēķinu izmaksas ir augstas, jo tiek aprēķināts attālums starp datu punktiem visiem apmācības paraugiem.
KNN algoritma Python ieviešana
Lai veiktu K-NN algoritma Python ieviešanu, mēs izmantosim to pašu problēmu un datu kopu, ko izmantojām loģistikas regresijā. Bet šeit mēs uzlabosim modeļa veiktspēju. Zemāk ir problēmas apraksts:
Problēma K-NN algoritmam: Ir automašīnu ražotāja uzņēmums, kas ir izgatavojis jaunu SUV automašīnu. Uzņēmums vēlas rādīt reklāmas lietotājiem, kuri ir ieinteresēti iegādāties šo SUV. Tāpēc šai problēmai mums ir datu kopa, kas satur vairāku lietotāju informāciju, izmantojot sociālo tīklu. Datu kopā ir daudz informācijas, bet Paredzamā alga un Vecums mēs apsvērsim neatkarīgo mainīgo un Iegādāts mainīgais ir par atkarīgo mainīgo. Zemāk ir datu kopa:
K-NN algoritma ieviešanas soļi:
- Datu priekšapstrādes solis
- K-NN algoritma pielāgošana apmācības komplektam
- Pārbaudes rezultāta prognozēšana
- Rezultāta precizitātes pārbaude (apjukuma matricas izveide)
- Testa kopas rezultāta vizualizācija.
Datu pirmapstrādes solis:
Datu priekšapstrādes solis paliks tieši tāds pats kā loģistikas regresija. Zemāk ir tā kods:
# 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)
Izpildot iepriekš minēto kodu, mūsu datu kopa tiek importēta mūsu programmā un labi iepriekš apstrādāta. Pēc funkciju mērogošanas mūsu testa datu kopa izskatīsies šādi:
No iepriekš redzamā izvades attēla mēs varam redzēt, ka mūsu dati ir veiksmīgi mērogoti.
Tagad mēs pielāgosim K-NN klasifikatoru apmācības datiem. Lai to izdarītu, mēs importēsim KNeighborsClassifier klase Sklearn Kaimiņi bibliotēka. Pēc klases importēšanas mēs izveidosim Klasifikators klases objekts. Šīs klases parametrs būs
#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)
Izvade: izpildot iepriekš minēto kodu, mēs saņemsim izvadi kā:
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)
Izvade:
Iepriekš minētā koda izvade būs:
Tagad mēs izveidosim mūsu K-NN modelim Confusion Matrix, lai redzētu klasifikatora precizitāti. Zemāk ir tā kods:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Iepriekš minētajā kodā mēs esam importējuši funkciju confusion_matrix un nosaukuši to, izmantojot mainīgo cm.
Izvade: Izpildot iepriekš minēto kodu, mēs iegūsim matricu, kā norādīts tālāk:
Iepriekš redzamajā attēlā redzams, ka ir 64+29= 93 pareizas prognozes un 3+4= 7 nepareizas prognozes, savukārt loģistikas regresijā bija 11 nepareizas prognozes. Tātad var teikt, ka modeļa veiktspēja tiek uzlabota, izmantojot K-NN algoritmu.
Tagad mēs vizualizēsim treniņu komplekta rezultātu K-NN modelim. Kods paliks tāds pats kā loģistikas regresijā, izņemot diagrammas nosaukumu. Zemāk ir tā kods:
#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()
Izvade:
Izpildot iepriekš minēto kodu, mēs iegūsim zemāk redzamo grafiku:
Izvades grafiks atšķiras no grafika, ko mēs esam izveidojuši loģistikas regresijā. To var saprast tālāk norādītajos punktos:
jquery noklikšķinot
- Kā redzam, diagramma parāda sarkano punktu un zaļo punktu. Zaļie punkti ir par Pirkts(1) un Sarkanie punkti par Nav Purchased(0) mainīgo.
- Grafikā ir parādīta neregulāra robeža, nevis taisna līnija vai līkne, jo tas ir K-NN algoritms, t.i., tuvākā kaimiņa atrašana.
- Diagrammā lietotāji ir klasificēti pareizajās kategorijās, jo lielākā daļa lietotāju, kuri nav iegādājušies SUV, atrodas sarkanajā reģionā, un lietotāji, kas iegādājās SUV, atrodas zaļajā reģionā.
- Diagrammā ir redzams labs rezultāts, taču joprojām ir daži zaļie punkti sarkanajā apgabalā un sarkanie punkti zaļajā apgabalā. Taču tā nav liela problēma, jo, rīkojoties ar šo modeli, tiek novērstas problēmas ar pārmērīgu uzstādīšanu.
- Tāpēc mūsu modelis ir labi apmācīts.
Pēc modeļa apmācības mēs tagad pārbaudīsim rezultātu, ievietojot jaunu datu kopu, t.i., Testa datu kopu. Kods paliek nemainīgs, izņemot dažas nelielas izmaiņas: piemēram, x_train un y_train tiks aizstāts ar x_test un y_test .
Zemāk ir tā kods:
#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()
Izvade:
Iepriekš redzamajā diagrammā ir parādīta testa datu kopas izvade. Kā redzams grafikā, prognozētā izvade ir laba, jo lielākā daļa sarkano punktu atrodas sarkanajā reģionā un lielākā daļa zaļo punktu ir zaļajā reģionā.
Tomēr sarkanajā apgabalā ir maz zaļo punktu, bet zaļajā - daži sarkanie punkti. Tātad šie ir nepareizi novērojumi, ko esam novērojuši neskaidrības matricā (7 Nepareiza izvade).