Привет, мы поймем, как работает алгоритм knn, и после этого увидим практический пример набора данных для оценки автомобилей с помощью python и sci-kit learn.

Давайте разберемся, что такое алгоритм KNN - K Nearest Neighbours. Это алгоритм, который используется как для решения задач классификации, так и для решения задач регрессии. Вам дается точка данных «x» для прогнозирования его класса. KNN просто вычисляет свое расстояние от k точек данных ближайших соседей, и большинство соседей, попадающих в класс, принадлежит точке данных класса «x».

Давайте разберемся на примере. У нас есть набор данных 2 классов с классами A, B, как показано на рисунке ниже, точки данных распределены. Звездочка - это точка, для которой нам нужно предсказать класс.

Скажем, пока мы присвоили k = 3. Это означает, что для Star мы рассмотрим 3 соседей, измерим расстояние от них до этих 3 точек и решим, точки какого класса ближе к Star. Мы видим, что точки класса B ближе к звезде.

Как выбрать значение k и как оно влияет на точность?

Скажем, в предыдущем примере, если мы установили k = 6, звезда принадлежит классу A, поскольку точки данных A измеряют меньшее расстояние до звезды, чем точки B. Поскольку визуально мы можем различить звезду, которая больше принадлежит A, чем B. Следовательно, выбор k должен быть оптимальным.

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

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

KNN - это ленивое обучение и непараметрическое решение

Почему это ленивое обучение? Что ж, не только потому, что это очень просто, но и не учит никакой различительной функции в процессе. Он просто считывает и запоминает данные. В отличие от логистической регрессии или любых других параметрических алгоритмов, он не изучает никаких значений коэффициентов. Следовательно, он относится к категории непараметрических алгоритмов.

Ниже приведены различные типы дистанции, которые вы можете использовать в KNN:

Давайте посмотрим, как реализовать KNN с помощью scikit learn. Мы будем использовать набор данных оценки автомобилей, доступный на UCI: https://archive.ics.uci.edu/ml/datasets/Car+Evaluation.

Импортируйте данные:

импортировать панд как pd

url = ‘https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data'
names = [‘buying’, ‘maint’, ‘doors’,’persons’,’lug_boot’,’safety’,’target’]
df = pd.read_csv(url, names = names)

Давайте посмотрим на набор данных.

print(df.shape)
print(df.head(5).T)

Мы видим 1728 строк, 7 столбцов. Значения во всех столбцах кажутся категориальными. Вы можете попробовать распечатать все уникальные значения столбца, используя df [col_name] .unique ().

(1728, 7)
              0      1      2      3      4
buying    vhigh  vhigh  vhigh  vhigh  vhigh
maint     vhigh  vhigh  vhigh  vhigh  vhigh
doors         2      2      2      2      2
persons       2      2      2      2      2
lug_boot  small  small  small    med    med
safety      low    med   high    low    med
target    unacc  unacc  unacc  unacc  unacc

Сохраните целевой столбец в переменной и перетащите его из основного df для дальнейшей обработки.

y = new_df['target']
df = df.drop(['target'],axis = 1)

Поскольку нам нужно обучить данные и сделать нашу модель для лучшего понимания данных, мы будем кодировать категориальные данные с помощью pandas api-getdummies ()

new_df = pd.get_dummies(new_df)
print(new_df.head(5).T)

Мы видим, что столбцы преобразуются в закодированную категориальную форму:

                0  1  2  3  4
buying_high     0  0  0  0  0
buying_low      0  0  0  0  0
buying_med      0  0  0  0  0
buying_vhigh    1  1  1  1  1
maint_high      0  0  0  0  0
maint_low       0  0  0  0  0
maint_med       0  0  0  0  0
maint_vhigh     1  1  1  1  1
doors_2         1  1  1  1  1
doors_3         0  0  0  0  0
doors_4         0  0  0  0  0
doors_5more     0  0  0  0  0
persons_2       1  1  1  1  1
persons_4       0  0  0  0  0
persons_more    0  0  0  0  0
lug_boot_big    0  0  0  0  0
lug_boot_med    0  0  0  1  1
lug_boot_small  1  1  1  0  0
safety_high     0  0  1  0  0
safety_low      1  0  0  1  0
safety_med      0  1  0  0  1

Теперь наша модель сможет лучше его обработать. Затем разделите данные на обучение, набор для проверки

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(new_df,y,random_state = 0,test_size = 0.20)

Вот наш код для алгоритма KNN:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
model2=KNeighborsClassifier(n_neighbors=5) // knn with k = 5
model2.fit(x_train,y_train)
print(model2.score(x_train,y_train)) // accuracy on train set
k_pred= model2.predict(x_test) /// predicting on test

print(accuracy_score(y_test,k_pred))

Точность для k = 3:

0.9450072358900145 // train accuracy
0.861271676300578  // test accuracy

Точность для k = 5:

0.947178002894356 // training accuracy
0.8728323699421965 // test accuracy

Точность для k = 7:

0.9507959479015919  // training accuracy
0.9017341040462428  // test accuracy

Мы можем видеть, что точность увеличивается с увеличением значения k.

Вывод: KNN - это непараметрический алгоритм, используемый в задачах обучения с учителем. Оптимальное значение k играет ключевую роль в точности результатов.