Да! Это так просто. Давайте поэкспериментируем с наборами данных, чтобы наглядно представить, как изменяется граница принятия решения при изменении «k».

Давай сделаем небольшой обзор ...

Что такое К-НН? Как это работает?

Алгоритм K Nearest Neighbor (KNN) - очень простой, понятный, универсальный и один из лучших алгоритмов машинного обучения. В классификации k-NN выходом является принадлежность к классу. Объект классифицируется множеством голосов его соседей, причем объект назначается классу, наиболее распространенному среди его ближайших k соседей (k - положительное целое число, обычно небольшое). Если k = 1, то объект просто присваивается классу этого единственного ближайшего соседа.

В KNN K - количество ближайших соседей. Решающим фактором является количество соседей. K обычно является нечетным числом, если количество классов равно 2. Когда K = 1, алгоритм известен как алгоритм ближайшего соседа. Это самый простой случай.
Предположим, P1 - это точка, для которой нужно спрогнозировать метку.

KNN состоит из трех основных шагов.
1. Рассчитайте расстояние.
2. Найдите k ближайших соседей.
3. Голосуйте за классы.

Важность K

Вы не можете выбрать случайное значение для k. Весь алгоритм основан на значении k. Даже небольшие изменения k могут привести к большим изменениям. Как и большинство алгоритмов машинного обучения, K в KNN является гиперпараметром. Вы можете рассматривать K как управляющую переменную для модели прогнозирования.

В этом блоге мы увидим, как меняется граница принятия решения с k. Для этого я буду использовать разные типы наборов данных об игрушках. Вы можете легко скачать все эти наборы данных по указанной ниже ссылке.



Понимание наборов данных

  1. U - образный

В этом наборе данных мы можем заметить, что классы имеют форму взаимосвязанной U. Это нелинейный набор данных.
Синие точки относятся к классу 0, а оранжевые точки - к классу 1.

2. Два набора концентрических окружностей.

В этом наборе данных мы видим, что точки образуют два набора концентрических окружностей. Это нелинейный набор данных.
Синие точки относятся к классу 0, а оранжевые точки - к классу 1.

3. XOR

Этот набор данных напоминает k-карту с двумя переменными XOR. Это нелинейный линейный набор данных.

Синие точки относятся к классу -1, а оранжевые точки относятся к классу 1.

4. Линейно разделимые

Это линейный набор данных, в котором точки могут быть линейно разделены.

Синие точки относятся к классу 0, а оранжевые точки относятся к классу 1.

5. Выбросы

В этом наборе данных мы можем заметить, что есть точки выбросов из обоих классов. Мы увидим, как наличие выбросов может повлиять на границу принятия решения. Это линейный набор данных.
Синие точки относятся к классу 0, а оранжевые точки - к классу 1.

Теперь, когда мы знаем, как выглядит наш внешний вид, мы продолжим и посмотрим, как граница принятия решения изменяется в зависимости от значения k. здесь я беру 1,5,20,30,40 и 60 в качестве значений k. Вы можете попробовать с любым набором значений

Для начала давайте импортируем библиотеки.

import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets, neighbors
from mlxtend.plotting import plot_decision_regions

Требуется следующая основная функция.

def knn_comparison(data, k):
 x = data[[‘X’,’Y’]].values
 y = data[‘class’].astype(int).values
 clf = neighbors.KNeighborsClassifier(n_neighbors=k)
 clf.fit(x, y)
# Plotting decision region
 plot_decision_regions(x, y, clf=clf, legend=2)
# Adding axes annotations
 plt.xlabel(‘X’)
 plt.ylabel(‘Y’)
 plt.title(‘Knn with K=’+ str(k))
 plt.show()

Вы можете заметить, что это всего лишь одна строка кода, которая все делает -
clf = neighbors.KNeighborsClassifier (n_neighbors = k)

Это так просто и элегантно. Теперь нам просто нужно загрузить наш CSV-файл и передать его этой функции вместе с k. Мы сделаем это для всех наборов данных один за другим.

Давайте погрузимся в…

1. U-образный

data1 = pd.read_csv(‘ushape.csv’)
for i in [1,5,20,30,40,80]:
    knn_comparison(data1, i)

2. Два набора концентрических окружностей.

data2 = pd.read_csv(‘concertriccir2.csv’)
for i in [1,5,20,30,40,60]:
    knn_comparison(data2, i)

3. XOR

data3 = pd.read_csv(‘xor.csv’)
for i in [1,5,20,30,40,60]:
   knn_comparison(data3, i)

4. Линейно разделимые

data4 = pd.read_csv(‘linearsep.csv’)
for i in [1,5,20,30,40,60]:
    knn_comparison(data4, i)

5. Выбросы

data5 = pd.read_csv(‘outlier.csv’)
for i in [1, 5,20,30,40,60]:
    knn_comparison(data5, i)

Наблюдения:

Во всех наборах данных мы можем наблюдать, что когда k = 1, мы переоснащаем модель. То есть, каждая точка классифицируется правильно, вы можете подумать, что это хорошо, а, как говорится, «слишком много - слишком плохо», переобучение по существу означает, что наша модель слишком хорошо обучается до такой степени, что это отрицательно влияет на модель.

Во всех наборах данных мы можем наблюдать, что когда k = 60 (большое число), мы не соответствуем модели. Недостаточная подгонка относится к модели, которая не может ни моделировать обучающие данные, ни обобщать на новые данные. Недооцененная модель машинного обучения не подходит. В случае набора данных с выбросами для k = 60 наша модель неплохо справилась. Как мы можем это сказать? Поскольку мы знаем, что эти точки являются выбросами, а данные линейно разделимы, но это не всегда так, мы не можем быть уверены. Также в наборе данных XOR значение k не сильно влияет на модель, в отличие от других моделей.

Исследования показали, что не существует оптимального значения гиперпараметра (k), подходящего для всех типов наборов данных. У каждого набора данных есть свои требования. В случае малого k шум будет иметь большее влияние на результат, а большое k сделает его вычислительно дорогостоящим. Исследования также показали, что малое k является наиболее гибким подходом, который будет иметь низкое смещение, но большое отклонение и большое k будут иметь более гладкую границу решения, что означает меньшую дисперсию, но более высокое смещение.

Переоснащение и недостаточное оснащение - две основные причины низкой производительности алгоритмов машинного обучения.

Заключение:

Когда K мало, мы ограничиваем область данного прогноза и заставляем наш классификатор быть «слепым» к общему распределению. Небольшое значение K обеспечивает наиболее гибкую подгонку с низким смещением, но большим разбросом. Графически наша граница принятия решения будет более неровной, как мы наблюдали выше. С другой стороны, более высокий K дает в среднем больше очков в каждом прогнозе и, следовательно, более устойчив к выбросам. Большие значения K будут иметь более гладкие границы решения, что означает меньшую дисперсию, но повышенную систематическую ошибку.

использованная литература

  1. Www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn
  2. Scott.fortmann-roe.com/docs/BiasVariance.html
  3. Rasbt.github.io/mlxtend/user_guide/plotting/plot_decision_regions/#references

Чего же ты ждешь? Продолжайте экспериментировать с наборами данных !!