logo

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

  • K-Nearest Neighbor е един от най-простите алгоритми за машинно обучение, базиран на техниката за контролирано обучение.
  • Алгоритъмът K-NN приема сходството между новия случай/данни и наличните случаи и поставя новия случай в категорията, която е най-сходна с наличните категории.
  • K-NN алгоритъмът съхранява всички налични данни и класифицира нова точка от данни въз основа на сходството. Това означава, че когато се появят нови данни, те могат лесно да бъдат класифицирани в подходяща категория чрез използване на K-NN алгоритъм.
  • K-NN алгоритъмът може да се използва както за регресия, така и за класификация, но най-вече се използва за проблеми с класификацията.
  • K-NN е a непараметричен алгоритъм , което означава, че не прави никакви предположения за основните данни.
  • Нарича се още а алгоритъм за мързелив обучаем тъй като не се учи от набора за обучение незабавно, вместо това съхранява набора от данни и по време на класификацията изпълнява действие върху набора от данни.
  • KNN алгоритъмът във фазата на обучение просто съхранява набора от данни и когато получи нови данни, класифицира тези данни в категория, която е много подобна на новите данни.
  • Пример:Да предположим, че имаме изображение на същество, което прилича на котка и куче, но искаме да знаем дали е котка или куче. Така че за тази идентификация можем да използваме алгоритъма KNN, тъй като той работи по мярка за сходство. Нашият KNN модел ще открие сходните характеристики на новия набор от данни за изображенията на котки и кучета и въз основа на най-сходните характеристики ще го постави в категорията на котка или куче.
Алгоритъм K-най-близък съсед (KNN) за машинно обучение

Защо се нуждаем от K-NN алгоритъм?

Да предположим, че има две категории, т.е. категория A и категория B, и имаме нова точка от данни x1, така че тази точка от данни ще лежи в коя от тези категории. За да решим този тип проблем, се нуждаем от K-NN алгоритъм. С помощта на K-NN можем лесно да идентифицираме категорията или класа на определен набор от данни. Разгледайте диаграмата по-долу:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

Как работи K-NN?

Работата на K-NN може да бъде обяснена въз основа на алгоритъма по-долу:

    Етап 1:Изберете числото K на съседитеСтъпка 2:Изчислете евклидовото разстояние на K брой съседи Стъпка-3:Вземете K най-близките съседи според изчисленото евклидово разстояние.Стъпка-4:Сред тези k съседи пребройте броя на точките от данни във всяка категория.Стъпка-5:Присвоете новите точки от данни към тази категория, за която броят на съседите е максимален.Стъпка-6:Нашият модел е готов.

Да предположим, че имаме нова точка от данни и трябва да я поставим в необходимата категория. Разгледайте изображението по-долу:

методи на Java arraylist
Алгоритъм K-най-близък съсед (KNN) за машинно обучение
  • Първо, ще изберем броя на съседите, така че ще изберем k=5.
  • След това ще изчислим Евклидово разстояние между точките от данни. Евклидовото разстояние е разстоянието между две точки, което вече сме изучавали в геометрията. Може да се изчисли като:
Алгоритъм K-най-близък съсед (KNN) за машинно обучение
  • Чрез изчисляване на евклидовото разстояние получихме най-близките съседи, като трима най-близки съседи в категория A и двама най-близки съседи в категория B. Помислете за изображението по-долу:
Алгоритъм K-най-близък съсед (KNN) за машинно обучение
  • Както виждаме, 3-те най-близки съседи са от категория A, следователно тази нова точка от данни трябва да принадлежи към категория A.

Как да избера стойността на K в алгоритъма K-NN?

По-долу са някои точки, които трябва да запомните, докато избирате стойността на K в алгоритъма K-NN:

  • Няма конкретен начин за определяне на най-добрата стойност за „K“, така че трябва да опитаме някои стойности, за да намерим най-доброто от тях. Най-предпочитаната стойност за K е 5.
  • Много ниска стойност за K, като K=1 или K=2, може да бъде шумна и да доведе до ефектите на отклонения в модела.
  • Големите стойности за K са добри, но може да възникнат известни затруднения.

Предимства на алгоритъма KNN:

  • Лесно е за изпълнение.
  • Той е устойчив на шумни тренировъчни данни
  • Може да бъде по-ефективно, ако данните за обучение са големи.

Недостатъци на алгоритъма KNN:

  • Винаги трябва да се определи стойността на K, която може да е сложна известно време.
  • Цената на изчислението е висока поради изчисляването на разстоянието между точките от данни за всички проби за обучение.

Реализация на Python на алгоритъма KNN

За да направим имплементацията на Python на алгоритъма K-NN, ще използваме същия проблем и набор от данни, които сме използвали в логистичната регресия. Но тук ще подобрим производителността на модела. По-долу е описанието на проблема:

Проблем за K-NN алгоритъм: Има компания производител на автомобили, която е произвела нов SUV автомобил. Компанията иска да предостави рекламите на потребителите, които се интересуват от закупуването на този SUV. Така че за този проблем имаме набор от данни, който съдържа информация за множество потребители чрез социалната мрежа. Наборът от данни съдържа много информация, но Очаквана заплата и Възраст ще разгледаме независимата променлива и Закупена променлива е за зависимата променлива. По-долу е наборът от данни:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

Стъпки за прилагане на алгоритъма K-NN:

  • Стъпка на предварителна обработка на данни
  • Напасване на алгоритъма K-NN към комплекта за обучение
  • Прогнозиране на резултата от теста
  • Тествайте точността на резултата (Създаване на матрица за объркване)
  • Визуализиране на резултата от тестовия набор.

Стъпка на предварителна обработка на данни:

Стъпката за предварителна обработка на данни ще остане точно същата като логистичната регресия. По-долу е кодът за него:

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

Чрез изпълнение на горния код нашият набор от данни се импортира в нашата програма и се обработва добре предварително. След мащабиране на функции нашият тестов набор от данни ще изглежда така:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

От горното изходно изображение можем да видим, че нашите данни са успешно мащабирани.

    Напасване на K-NN класификатор към данните за обучение:
    Сега ще съобразим K-NN класификатора с данните за обучение. За да направим това, ще импортираме KNeighborsClassifier клас на Sklearn съседи библиотека. След като импортираме класа, ще създадем Класификатор обект на класа. Параметърът на този клас ще бъде
      n_съседи:Да се ​​дефинират необходимите съседи на алгоритъма. Обикновено са необходими 5.metric='minkowski':Това е параметърът по подразбиране и определя разстоянието между точките.p=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') 
    Прогнозиране на резултата от теста:За да предвидим резултата от тестовия набор, ще създадем a y_pred вектор, както направихме в логистичната регресия. По-долу е кодът за него:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

Изход:

Резултатът за горния код ще бъде:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение
    Създаване на матрицата на объркването:
    Сега ще създадем матрицата на объркването за нашия K-NN модел, за да видим точността на класификатора. По-долу е кодът за него:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

В горния код ние импортирахме функцията confusion_matrix и я извикахме с помощта на променливата cm.

Изход: Като изпълним горния код, ще получим матрицата по-долу:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

В горното изображение можем да видим, че има 64+29= 93 правилни прогнози и 3+4= 7 неправилни прогнози, докато при логистичната регресия имаше 11 неправилни прогнози. Така че можем да кажем, че производителността на модела е подобрена чрез използване на алгоритъма K-NN.

    Визуализиране на резултата от набора за обучение:
    Сега ще визуализираме резултата от набора за обучение за K-NN модела. Кодът ще остане същият, както в логистичната регресия, с изключение на името на графиката. По-долу е кодът за него:
 #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() 

Изход:

Като изпълним горния код, ще получим графиката по-долу:

разкъсайте картата
Алгоритъм K-най-близък съсед (KNN) за машинно обучение

Изходната графика е различна от графиката, която получихме в логистичната регресия. Може да се разбере в следните точки:

    • Както виждаме, графиката показва червената точка и зелените точки. Зелените точки са за променливата Purchased(1), а червените точки за not Purchased(0).
    • Графиката показва неправилна граница, вместо да показва каквато и да е права линия или каквато и да е крива, защото това е K-NN алгоритъм, т.е. намиране на най-близкия съсед.
    • Графиката класифицира потребителите в правилните категории, тъй като повечето от потребителите, които не са купили SUV, са в червения регион, а потребителите, които са купили SUV, са в зеления регион.
    • Графиката показва добър резултат, но все пак има някои зелени точки в червената област и червени точки в зелената област. Но това не е голям проблем, тъй като чрез този модел се предотвратяват проблеми с прекомерното оборудване.
    • Следователно нашият модел е добре обучен.
    Визуализация на резултата от тестовия набор:
    След обучението на модела сега ще тестваме резултата, като поставим нов набор от данни, т.е. тестов набор от данни. Кодът остава същият с изключение на някои малки промени: като напр x_train и y_train ще бъде заменен от x_тест и y_тест .
    По-долу е кодът за него:
 #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() 

Изход:

Алгоритъм K-най-близък съсед (KNN) за машинно обучение

Графиката по-горе показва изхода за набора от тестови данни. Както можем да видим на графиката, прогнозираният резултат е много добър, тъй като повечето от червените точки са в червената област, а повечето от зелените точки са в зелената област.

Има обаче няколко зелени точки в червения регион и няколко червени точки в зеления регион. Така че това са неправилните наблюдения, които сме наблюдавали в матрицата на объркването (7 Неправилен изход).