- K-Nearest Neighbor — один із найпростіших алгоритмів машинного навчання, заснований на техніці керованого навчання.
- Алгоритм K-NN передбачає подібність між новим випадком/даними та доступними випадками та поміщає новий випадок у категорію, яка найбільш схожа на доступні категорії.
- Алгоритм K-NN зберігає всі доступні дані та класифікує нову точку даних на основі подібності. Це означає, що коли з’являються нові дані, їх можна легко класифікувати в категорію добре набору за допомогою алгоритму K-NN.
- Алгоритм K-NN можна використовувати як для регресії, так і для класифікації, але переважно він використовується для задач класифікації.
- K-NN - це a непараметричний алгоритм , що означає, що він не робить жодних припущень щодо базових даних.
- Його також називають a алгоритм ледачого учня оскільки він не навчається з навчального набору відразу, замість цього він зберігає набір даних і під час класифікації виконує дію з набором даних.
- Алгоритм KNN на етапі навчання просто зберігає набір даних, а коли він отримує нові дані, класифікує ці дані в категорію, яка дуже схожа на нові дані.
Для чого нам потрібен алгоритм K-NN?
Припустімо, що є дві категорії, тобто категорія A та категорія B, і ми маємо нову точку даних x1, тож ця точка даних належатиме до якої з цих категорій. Щоб розв’язати задачу такого типу, нам потрібен алгоритм K-NN. За допомогою K-NN ми можемо легко визначити категорію чи клас певного набору даних. Розгляньте схему нижче:
Як працює K-NN?
Роботу K-NN можна пояснити на основі наведеного нижче алгоритму:
Припустимо, у нас є нова точка даних, і нам потрібно помістити її в потрібну категорію. Розгляньте зображення нижче:
рядок у char java
- По-перше, ми виберемо кількість сусідів, тому ми виберемо 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: Існує компанія-виробник автомобілів, яка виготовила новий позашляховик. Компанія хоче надати рекламу користувачам, які зацікавлені в покупці цього позашляховика. Отже, для цієї проблеми ми маємо набір даних, який містить інформацію про кількох користувачів у соціальній мережі. Набір даних містить багато інформації, але Орієнтовна зарплата і Вік ми розглянемо для незалежної змінної і Придбана змінна для залежної змінної. Нижче наведено набір даних:
Кроки для реалізації алгоритму 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 до навчальних даних. Для цього ми імпортуємо Класифікатор KNighbors клас Sklearn Neighbors бібліотека. Після імпортування класу ми створимо Класифікатор об'єкт класу. Параметром цього класу буде
#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)
Вихід:
unix створити каталог
Вихід для наведеного вище коду буде таким:
Тепер ми створимо матрицю плутанини для нашої моделі 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, тобто пошук найближчого сусіда.
- На графіку класифіковано користувачів за правильними категоріями, оскільки більшість користувачів, які не купили позашляховик, знаходяться в червоній області, а ті, хто купив позашляховик, – у зеленій.
- Графік показує хороший результат, але все ж є деякі зелені точки в червоній області та червоні точки в зеленій області. Але це не є великою проблемою, оскільки ця модель запобігає переобладнанню.
- Отже, наша модель добре навчена.
Після навчання моделі ми перевіримо результат, додавши новий набір даних, тобто тестовий набір даних. Код залишається тим самим, за винятком деяких незначних змін: наприклад x_train і y_train буде замінено на x_test і y_test .
Нижче наведено його код:
#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 Неправильний вихід).