Поиск по сайту:

K-ближайшие соседи (KNN) в Python


K-ближайшие соседи (kNN) — это контролируемый метод машинного обучения, который можно использовать как для решения задач классификации, так и для регрессии. Я рассматриваю KNN как алгоритм, происходящий из реальной жизни. Люди склонны поддаваться влиянию окружающих.

Идея алгоритма K-ближайших соседей

Наше поведение формируют товарищи, с которыми мы выросли. Наши родители также по-разному формируют нашу личность. Если вы выросли среди людей, которые любят спорт, весьма вероятно, что в конечном итоге вы полюбите спорт. Есть, конечно, исключения. KNN работает аналогично.

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

Классификатор kNN идентифицирует класс точки данных, используя принцип голосования большинства. Если k установлено равным 5, проверяются классы 5 ближайших точек. Прогноз делается по преобладающему классу. Точно так же регрессия kNN принимает среднее значение 5 ближайших местоположений.

Наблюдаем ли мы людей, которые близки, но как точки данных считаются близкими? Измеряется расстояние между точками данных. Существуют различные методы оценки расстояния. Евклидово расстояние (расстояние Минковского с p=2) является одним из наиболее часто используемых измерений расстояния. На приведенном ниже рисунке показано, как вычислить евклидово расстояние между двумя точками в двумерном пространстве. Он определяется с помощью квадрата разницы между координатами x и y местоположений.

Реализация алгоритма KNN в Python

Давайте теперь перейдем к реализации KNN в Python. Мы рассмотрим шаги, которые помогут вам разбить код и лучше понять его.

1. Импорт модулей

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

2. Создание набора данных

В Scikit-learn есть множество инструментов для создания синтетических наборов данных, которые отлично подходят для тестирования алгоритмов машинного обучения. Я собираюсь использовать метод make blobs.

X, y = make_blobs(n_samples = 500, n_features = 2, centers = 4,cluster_std = 1.5, random_state = 4)

Этот код генерирует набор данных из 500 образцов, разделенных на четыре класса с двумя характеристиками. Используя связанные параметры, вы можете быстро изменить количество выборок, характеристик и классов. Мы также можем изменить распределение каждого кластера (или класса).

3. Визуализируйте набор данных

plt.style.use('seaborn')
plt.figure(figsize = (10,10))
plt.scatter(X[:,0], X[:,1], c=y, marker= '*',s=100,edgecolors='black')
plt.show()

4. Разделение данных на наборы данных для обучения и тестирования

Крайне важно разделить набор данных на обучающие и тестовые наборы для каждого контролируемого метода машинного обучения. Сначала мы обучаем модель, а затем тестируем ее на различных частях набора данных. Если мы не разделяем данные, мы просто тестируем модель на уже известных ей данных. Используя метод train_test_split, мы можем просто разделить тесты.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

С параметрами размера поезда и размера теста мы можем определить, какая часть исходных данных используется для наборов поездов и тестов соответственно. Разделение по умолчанию составляет 75 % для набора поездов и 25 % для тестового набора.

5. Реализация классификатора KNN

После этого мы создадим объект классификатора kNN. Я разрабатываю два классификатора со значениями k, равными 1 и 5, чтобы продемонстрировать релевантность значения k. Затем модели обучаются с использованием набора поездов. Значение k выбирается с помощью аргумента n_neighbors. Его не нужно указывать явно, поскольку значение по умолчанию равно 5.

knn5 = KNeighborsClassifier(n_neighbors = 5)
knn1 = KNeighborsClassifier(n_neighbors=1)

6. Прогнозы для классификаторов KNN

Затем в тестовом наборе мы прогнозируем целевые значения и сравниваем их с фактическими значениями.

knn5.fit(X_train, y_train)
knn1.fit(X_train, y_train)

y_pred_5 = knn5.predict(X_test)
y_pred_1 = knn1.predict(X_test)

7. Предскажите точность для обоих значений k

from sklearn.metrics import accuracy_score
print("Accuracy with k=5", accuracy_score(y_test, y_pred_5)*100)
print("Accuracy with k=1", accuracy_score(y_test, y_pred_1)*100)

Точность значений k получается следующей:

Accuracy with k=5 93.60000000000001
Accuracy with k=1 90.4

8. Визуализируйте прогнозы

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

plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_5, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=5", fontsize=20)

plt.subplot(1,2,2)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_1, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=1", fontsize=20)
plt.show()

Как найти лучшее значение k для реализации KNN

  1. k=1: модель слишком узкая и недостаточно обобщенная. Он также имеет высокую чувствительность к шуму. Модель предсказывает новые, ранее неизвестные точки данных с высокой степенью точности в наборе поездов, но плохо предсказывает свежие, ранее неизвестные точки данных. В результате мы, скорее всего, получим модель переобучения.
  2. k=100: модель слишком широкая и ненадежная как для обучения, так и для тестов. Это обстоятельство называется недообучением.

Ограничения алгоритма KNN

KNN — это простой для понимания алгоритм. Он не полагается на какую-либо внутреннюю модель машинного обучения для создания прогнозов. KNN — это метод классификации, которому просто нужно знать, сколько категорий для работы (одну или несколько). Это означает, что он может быстро оценить, следует ли добавить новую категорию, не зная, сколько других существует.

Недостаток этой простоты заключается в том, что она не может предвидеть необычные вещи (например, новые болезни), чего не может сделать KNN, поскольку она не знает, какова будет распространенность редкого элемента в здоровом населении.

Хотя KNN достигает высокой точности на тестовом наборе, он медленнее и дороже с точки зрения времени и памяти. Требуется значительный объем памяти, чтобы хранить весь набор обучающих данных для прогнозирования. Кроме того, поскольку евклидово расстояние очень чувствительно к величинам, характеристики в наборе данных с большими величинами всегда будут перевешивать характеристики с малыми величинами.

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

Заключение

Надеюсь, теперь вы лучше понимаете алгоритм KNN. Мы рассмотрели множество идей о том, как KNN сохраняет полный набор данных для создания прогнозов.

KNN — один из нескольких алгоритмов ленивого обучения, которые не используют модель обучения для прогнозирования. Усредняя сходство между входящим наблюдением и уже доступными данными, KNN создает прогнозы на лету (как раз вовремя).

Спасибо за чтение!