K-ближайшие соседи (K-NN) — это контролируемый алгоритм машинного обучения, который можно использовать как для задач классификации, так и для задач регрессии. Основная идея K-NN состоит в том, чтобы классифицировать или прогнозировать значение новой точки данных, сравнивая ее с k ближайшими соседями в обучающем наборе данных.
В классификации K-NN выходная переменная является категориальной. Алгоритм работает, находя k ближайших соседей к новой точке данных в обучающем наборе данных, а затем назначая класс, наиболее распространенный среди k соседей, в качестве прогнозируемого класса новой точки данных. В регрессии K-NN выходная переменная непрерывна. Алгоритм работает, находя k ближайших соседей, а затем беря среднее (для простого K-NN) или взвешенное среднее (для взвешенного K-NN) их выходных переменных в качестве прогнозируемого значения новой точки данных.
K-NN может быть реализован с помощью следующих шагов:
- Выберите значение k (количество соседей для рассмотрения).
- Рассчитайте расстояние между новой точкой данных и всеми точками в обучающем наборе данных.
- Расположите расстояния в порядке возрастания.
- Выберите k ближайших соседей.
- Назначьте класс или прогнозируемое значение на основе класса большинства или среднего значения k соседей.
Взвешенный K-NN присваивает разные веса каждому из k ближайших соседей в зависимости от их расстояния до новой точки данных. Чем ближе сосед, тем выше его вес. Прогнозируемое значение затем вычисляется как взвешенное среднее выходных переменных k соседей.
Существуют различные меры расстояния, которые можно использовать в K-NN, включая евклидово расстояние, манхэттенское расстояние и расстояние Минковского. Евклидово расстояние является наиболее часто используемой мерой расстояния в K-NN. Он рассчитывается как квадратный корень из суммы квадратов разностей между координатами двух точек.
Определение подходящего значения k является важным фактором в K-NN. Небольшое значение k может привести к переоснащению, а большое значение k может привести к недообучению. Обычно оптимальное значение k выбирается с помощью перекрестной проверки.
В бинарной классификации K-NN работает хорошо, когда между двумя классами существует четкая граница. В многоклассовой классификации K-NN можно использовать с различными стратегиями, такими как «один против всех» или «один против одного». В режиме «один против всех» каждый класс рассматривается как положительный класс, а остальные — как отрицательные классы. В режиме «один против одного» учитываются все пары классов, и для каждой пары обучается отдельный классификатор K-NN.
В Python K-NN можно реализовать с помощью библиотеки scikit-learn. Вот пример того, как реализовать K-NN в Python для классификации:
from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # Load the dataset dataset = load_data() # Split the dataset into training and test sets X_train, X_test, y_train, y_test = train_test_split(dataset.data, dataset.target, test_size=0.3, random_state=42) # Create a K-NN classifier with k=5 knn = KNeighborsClassifier(n_neighbors=5) # Train the classifier on the training set knn.fit(X_train, y_train) # Predict the classes of the test set y_pred = knn.predict(X_test) # Print the accuracy score print("Accuracy:", knn.score(X_test, y_test))
В этом примере загружается набор данных, разбивается на обучающий и тестовый наборы, создается классификатор K-NN с k = 5, обучается классификатор на обучающем наборе и прогнозируются классы тестового набора. Наконец, он печатает оценку точности классификатора.
Ниже приведены изображения k = 1, 5 и 15 для игрушечного набора данных.