logo

Алгоритм K-найближчого сусіда (KNN) для машинного навчання

  • K-Nearest Neighbor — один із найпростіших алгоритмів машинного навчання, заснований на техніці керованого навчання.
  • Алгоритм K-NN передбачає подібність між новим випадком/даними та доступними випадками та поміщає новий випадок у категорію, яка найбільш схожа на доступні категорії.
  • Алгоритм K-NN зберігає всі доступні дані та класифікує нову точку даних на основі подібності. Це означає, що коли з’являються нові дані, їх можна легко класифікувати в категорію добре набору за допомогою алгоритму K-NN.
  • Алгоритм K-NN можна використовувати як для регресії, так і для класифікації, але переважно він використовується для задач класифікації.
  • K-NN - це a непараметричний алгоритм , що означає, що він не робить жодних припущень щодо базових даних.
  • Його також називають 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:Наша модель готова.

Припустимо, у нас є нова точка даних, і нам потрібно помістити її в потрібну категорію. Розгляньте зображення нижче:

рядок у char java
Алгоритм 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: Існує компанія-виробник автомобілів, яка виготовила новий позашляховик. Компанія хоче надати рекламу користувачам, які зацікавлені в покупці цього позашляховика. Отже, для цієї проблеми ми маємо набір даних, який містить інформацію про кількох користувачів у соціальній мережі. Набір даних містить багато інформації, але Орієнтовна зарплата і Вік ми розглянемо для незалежної змінної і Придбана змінна для залежної змінної. Нижче наведено набір даних:

Алгоритм 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 до навчальних даних. Для цього ми імпортуємо Класифікатор KNighbors клас Sklearn Neighbors бібліотека. Після імпортування класу ми створимо Класифікатор об'єкт класу. Параметром цього класу буде
      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) 

Вихід:

unix створити каталог

Вихід для наведеного вище коду буде таким:

Алгоритм 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, тобто пошук найближчого сусіда.
    • На графіку класифіковано користувачів за правильними категоріями, оскільки більшість користувачів, які не купили позашляховик, знаходяться в червоній області, а ті, хто купив позашляховик, – у зеленій.
    • Графік показує хороший результат, але все ж є деякі зелені точки в червоній області та червоні точки в зеленій області. Але це не є великою проблемою, оскільки ця модель запобігає переобладнанню.
    • Отже, наша модель добре навчена.
    Візуалізація результату тестового набору:
    Після навчання моделі ми перевіримо результат, додавши новий набір даних, тобто тестовий набір даних. Код залишається тим самим, за винятком деяких незначних змін: наприклад 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() 

Вихід:

Алгоритм K-найближчого сусіда (KNN) для машинного навчання

Наведений вище графік показує результат тестового набору даних. Як ми бачимо на графіку, прогнозований результат є хорошим, оскільки більшість червоних точок знаходяться в червоній області, а більшість зелених точок – у зеленій.

Однак є кілька зелених точок у червоній області та кілька червоних точок у зеленій області. Отже, це неправильні спостереження, які ми помітили в матриці плутанини (7 Неправильний вихід).