- K-Nearest Neighbor е един от най-простите алгоритми за машинно обучение, базиран на техниката за контролирано обучение.
- Алгоритъмът K-NN приема сходството между новия случай/данни и наличните случаи и поставя новия случай в категорията, която е най-сходна с наличните категории.
- K-NN алгоритъмът съхранява всички налични данни и класифицира нова точка от данни въз основа на сходството. Това означава, че когато се появят нови данни, те могат лесно да бъдат класифицирани в подходяща категория чрез използване на K-NN алгоритъм.
- K-NN алгоритъмът може да се използва както за регресия, така и за класификация, но най-вече се използва за проблеми с класификацията.
- K-NN е a непараметричен алгоритъм , което означава, че не прави никакви предположения за основните данни.
- Нарича се още а алгоритъм за мързелив обучаем тъй като не се учи от набора за обучение незабавно, вместо това съхранява набора от данни и по време на класификацията изпълнява действие върху набора от данни.
- KNN алгоритъмът във фазата на обучение просто съхранява набора от данни и когато получи нови данни, класифицира тези данни в категория, която е много подобна на новите данни.
Защо се нуждаем от K-NN алгоритъм?
Да предположим, че има две категории, т.е. категория A и категория B, и имаме нова точка от данни x1, така че тази точка от данни ще лежи в коя от тези категории. За да решим този тип проблем, се нуждаем от K-NN алгоритъм. С помощта на K-NN можем лесно да идентифицираме категорията или класа на определен набор от данни. Разгледайте диаграмата по-долу:
Как работи K-NN?
Работата на K-NN може да бъде обяснена въз основа на алгоритъма по-долу:
Да предположим, че имаме нова точка от данни и трябва да я поставим в необходимата категория. Разгледайте изображението по-долу:
методи на Java arraylist
- Първо, ще изберем броя на съседите, така че ще изберем k=5.
- След това ще изчислим Евклидово разстояние между точките от данни. Евклидовото разстояние е разстоянието между две точки, което вече сме изучавали в геометрията. Може да се изчисли като:
- Чрез изчисляване на евклидовото разстояние получихме най-близките съседи, като трима най-близки съседи в категория A и двама най-близки съседи в категория B. Помислете за изображението по-долу:
- Както виждаме, 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-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-NN класификатора с данните за обучение. За да направим това, ще импортираме KNeighborsClassifier клас на Sklearn съседи библиотека. След като импортираме класа, ще създадем Класификатор обект на класа. Параметърът на този клас ще бъде
#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)
Изход:
Резултатът за горния код ще бъде:
Сега ще създадем матрицата на объркването за нашия K-NN модел, за да видим точността на класификатора. По-долу е кодът за него:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
В горния код ние импортирахме функцията confusion_matrix и я извикахме с помощта на променливата cm.
Изход: Като изпълним горния код, ще получим матрицата по-долу:
В горното изображение можем да видим, че има 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()
Изход:
Като изпълним горния код, ще получим графиката по-долу:
разкъсайте картата
Изходната графика е различна от графиката, която получихме в логистичната регресия. Може да се разбере в следните точки:
- Както виждаме, графиката показва червената точка и зелените точки. Зелените точки са за променливата 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()
Изход:
Графиката по-горе показва изхода за набора от тестови данни. Както можем да видим на графиката, прогнозираният резултат е много добър, тъй като повечето от червените точки са в червената област, а повечето от зелените точки са в зелената област.
Има обаче няколко зелени точки в червения регион и няколко червени точки в зеления регион. Така че това са неправилните наблюдения, които сме наблюдавали в матрицата на объркването (7 Неправилен изход).