- К-Неарест Неигхбор је један од најједноставнијих алгоритама машинског учења заснованог на техници надгледаног учења.
- К-НН алгоритам претпоставља сличност између новог случаја/података и доступних случајева и ставља нови случај у категорију која је најсличнија доступним категоријама.
- К-НН алгоритам чува све доступне податке и класификује нову тачку података на основу сличности. То значи да када се појаве нови подаци онда се могу лако класификовати у категорију бунара коришћењем К-НН алгоритма.
- К-НН алгоритам се може користити за регресију као и за класификацију, али се углавном користи за проблеме класификације.
- К-НН је а непараметарски алгоритам , што значи да не даје никакве претпоставке о основним подацима.
- Такође се назива а алгоритам за лењи ученик јер не учи из скупа за обуку одмах, уместо тога складишти скуп података и у време класификације врши акцију на скупу података.
- КНН алгоритам у фази обуке само чува скуп података и када добије нове податке, онда те податке класификује у категорију која је много слична новим подацима.
Зашто нам је потребан К-НН алгоритам?
Претпоставимо да постоје две категорије, односно, категорија А и категорија Б, и имамо нову тачку података к1, тако да ће ова тачка података лежати у којој од ових категорија. Да бисмо решили ову врсту проблема, потребан нам је К-НН алгоритам. Уз помоћ К-НН, можемо лако идентификовати категорију или класу одређеног скупа података. Размотрите дијаграм испод:
Како К-НН функционише?
Рад К-НН се може објаснити на основу следећег алгоритма:
Претпоставимо да имамо нову тачку података и морамо је ставити у тражену категорију. Размотрите слику испод:
јава иницијализује низ
- Прво ћемо изабрати број суседа, па ћемо изабрати к=5.
- Затим ћемо израчунати Еуклидско растојање између тачака података. Еуклидско растојање је растојање између две тачке, које смо већ проучавали у геометрији. Може се израчунати као:
- Израчунавањем еуклидске удаљености добили смо најближе суседе, као три најближа суседа у категорији А и два најближа суседа у категорији Б. Размотрите слику испод:
- Као што видимо, 3 најближа суседа су из категорије А, стога ова нова тачка података мора припадати категорији А.
Како одабрати вредност К у К-НН алгоритму?
Испод су неке тачке које треба запамтити док бирате вредност К у К-НН алгоритму:
- Не постоји посебан начин да се одреди најбоља вредност за 'К', тако да морамо да испробамо неке вредности да бисмо нашли најбоље од њих. Најпожељнија вредност за К је 5.
- Веома ниска вредност за К, као што је К=1 или К=2, може бити бучна и довести до ефеката одступања у моделу.
- Велике вредности за К су добре, али може наићи на потешкоће.
Предности КНН алгоритма:
- Једноставан је за имплементацију.
- Отпоран је на бучне податке о обуци
- Може бити ефикасније ако су подаци о обуци велики.
Недостаци КНН алгоритма:
- Увек треба одредити вредност К која може бити сложена неко време.
- Трошкови прорачуна су високи због израчунавања удаљености између тачака података за све узорке за обуку.
Питхон имплементација КНН алгоритма
Да бисмо урадили Питхон имплементацију К-НН алгоритма, користићемо исти проблем и скуп података које смо користили у Логистичкој регресији. Али овде ћемо побољшати перформансе модела. Испод је опис проблема:
Проблем за К-НН алгоритам: Постоји компанија за производњу аутомобила која је произвела нови СУВ аутомобил. Компанија жели да да рекламе корисницима који су заинтересовани за куповину тог СУВ-а. Дакле, за овај проблем имамо скуп података који садржи више корисничких информација путем друштвене мреже. Скуп података садржи много информација, али Процењена плата и Старост размотрићемо за независну променљиву и Купљена варијабла је за зависну променљиву. Испод је скуп података:
Кораци за имплементацију К-НН алгоритма:
- Корак претходне обраде података
- Подешавање К-НН алгоритма у скуп за обуку
- Предвиђање резултата теста
- Тестирајте тачност резултата (матрица стварања конфузије)
- Визуелизација резултата тестног скупа.
Корак претходне обраде података:
Корак претходне обраде података остаће потпуно исти као и логистичка регресија. Испод је код за то:
# 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)
Извршавањем горњег кода, наш скуп података се увози у наш програм и добро се претходно обрађује. Након скалирања карактеристика наш скуп података за тестирање ће изгледати овако:
Из горње излазне слике можемо видети да су наши подаци успешно скалирани.
Сада ћемо уклопити К-НН класификатор у податке о обуци. Да бисмо то урадили ми ћемо увести КНеигхборсЦлассифиер класа Склеарн Неигхбоурс библиотека. Након увоза класе, креираћемо Класификатор објекат класе. Параметар ове класе ће бити
#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)
Излаз: Извођењем горњег кода добићемо излаз као:
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)
Излаз:
Излаз за горњи код ће бити:
Сада ћемо креирати матрицу конфузије за наш К-НН модел да бисмо видели тачност класификатора. Испод је код за то:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
У горњи код смо увезли функцију цонфусион_матрик и позвали је помоћу променљиве цм.
Излаз: Извршавањем горњег кода, добићемо матрицу као у наставку:
На горњој слици можемо видети да има 64+29= 93 тачна предвиђања и 3+4= 7 нетачних предвиђања, док је у логистичкој регресији било 11 нетачних предвиђања. Дакле, можемо рећи да су перформансе модела побољшане коришћењем К-НН алгоритма.
Сада ћемо визуализовати резултат скупа обуке за К-НН модел. Код ће остати исти као што смо урадили у Логистичкој регресији, осим имена графикона. Испод је код за то:
#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()
Излаз:
Извршавањем горњег кода, добићемо доњи графикон:
шта је мавен
Излазни граф се разликује од графа који смо имали у логистичкој регресији. То се може разумети у следећим тачкама:
- Као што видимо, графикон приказује црвену и зелену тачку. Зелене тачке су за променљиву Купљено(1), а црвене за променљиву Некупљено(0).
- Графикон приказује неправилну границу уместо да приказује било коју праву линију или било коју криву јер је то К-НН алгоритам, тј. проналажење најближег суседа.
- Графикон је разврстао кориснике у исправне категорије пошто је већина корисника који нису купили СУВ у црвеном региону, а корисници који су купили СУВ у зеленом региону.
- Графикон показује добар резултат, али ипак постоје неке зелене тачке у црвеном и црвене тачке у зеленом региону. Али ово није велики проблем јер се овим моделом спречавају проблеми преоптерећивања.
- Дакле, наш модел је добро обучен.
Након обуке модела, сада ћемо тестирати резултат постављањем новог скупа података, односно скупа података за тестирање. Код остаје исти осим неких мањих измена: као нпр к_воз и и_воз биће замењен са к_тест и и_тест .
Испод је код за то:
#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()
Излаз:
Горњи графикон приказује излаз за скуп података теста. Као што можемо видети на графикону, предвиђени излаз је добар јер је већина црвених тачака у црвеном, а већина зелених тачака у зеленој.
Међутим, постоји неколико зелених тачака у црвеном региону и неколико црвених тачака у зеленом региону. Дакле, ово су нетачна запажања која смо приметили у матрици конфузије (7 Нетачан излаз).