logo

К-Неарест Неигхбор(КНН) алгоритам за машинско учење

  • К-Неарест Неигхбор је један од најједноставнијих алгоритама машинског учења заснованог на техници надгледаног учења.
  • К-НН алгоритам претпоставља сличност између новог случаја/података и доступних случајева и ставља нови случај у категорију која је најсличнија доступним категоријама.
  • К-НН алгоритам чува све доступне податке и класификује нову тачку података на основу сличности. То значи да када се појаве нови подаци онда се могу лако класификовати у категорију бунара коришћењем К-НН алгоритма.
  • К-НН алгоритам се може користити за регресију као и за класификацију, али се углавном користи за проблеме класификације.
  • К-НН је а непараметарски алгоритам , што значи да не даје никакве претпоставке о основним подацима.
  • Такође се назива а алгоритам за лењи ученик јер не учи из скупа за обуку одмах, уместо тога складишти скуп података и у време класификације врши акцију на скупу података.
  • КНН алгоритам у фази обуке само чува скуп података и када добије нове податке, онда те податке класификује у категорију која је много слична новим подацима.
  • Пример:Претпоставимо да имамо слику створења које изгледа слично мачки и псу, али желимо да знамо да ли је то мачка или пас. Дакле, за ову идентификацију можемо користити КНН алгоритам, јер ради на мери сличности. Наш КНН модел ће пронаћи сличне карактеристике новог скупа података сликама мачака и паса и на основу најсличнијих карактеристика ставиће га у категорију мачака или паса.
К-Неарест Неигхбор(КНН) алгоритам за машинско учење

Зашто нам је потребан К-НН алгоритам?

Претпоставимо да постоје две категорије, односно, категорија А и категорија Б, и имамо нову тачку података к1, тако да ће ова тачка података лежати у којој од ових категорија. Да бисмо решили ову врсту проблема, потребан нам је К-НН алгоритам. Уз помоћ К-НН, можемо лако идентификовати категорију или класу одређеног скупа података. Размотрите дијаграм испод:

К-Неарест Неигхбор(КНН) алгоритам за машинско учење

Како К-НН функционише?

Рад К-НН се може објаснити на основу следећег алгоритма:

    Корак 1:Изаберите број К суседаКорак 2:Израчунајте еуклидско растојање од К број комшија Корак 3:Узмите К најближих суседа према израчунатој еуклидској удаљености.Корак 4:Међу ових к суседа, пребројите број тачака података у свакој категорији.Корак 5:Доделите нове тачке података оној категорији за коју је број суседа максималан.Корак 6:Наш модел је спреман.

Претпоставимо да имамо нову тачку података и морамо је ставити у тражену категорију. Размотрите слику испод:

јава иницијализује низ
К-Неарест Неигхбор(КНН) алгоритам за машинско учење
  • Прво ћемо изабрати број суседа, па ћемо изабрати к=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) 

Извршавањем горњег кода, наш скуп података се увози у наш програм и добро се претходно обрађује. Након скалирања карактеристика наш скуп података за тестирање ће изгледати овако:

К-Неарест Неигхбор(КНН) алгоритам за машинско учење

Из горње излазне слике можемо видети да су наши подаци успешно скалирани.

    Прилагођавање К-НН класификатора подацима о обуци:
    Сада ћемо уклопити К-НН класификатор у податке о обуци. Да бисмо то урадили ми ћемо увести КНеигхборсЦлассифиер класа Склеарн Неигхбоурс библиотека. Након увоза класе, креираћемо Класификатор објекат класе. Параметар ове класе ће бити
      н_комшије:За дефинисање потребних суседа алгоритма. Обично је потребно 5.метриц='минковски':Ово је подразумевани параметар и он одређује растојање између тачака.п=2:То је еквивалентно стандардној еуклидској метрици.
    А онда ћемо класификатор уклопити у податке о обуци. Испод је код за то:
 #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 Нетачан излаз).