Привет, мы поймем, как работает алгоритм 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 играет ключевую роль в точности результатов.