Алгоритм KNN - поиск ближайших соседей
Введение
Алгоритм K-ближайших соседей (KNN) - это тип контролируемого алгоритма машинного обучения, который может использоваться как для классификации, так и для задач прогнозирования регрессии. Однако он в основном используется для задач прогнозирования классификации в промышленности. Следующие два свойства хорошо определяют KNN:
Lazy learning algorithm - KNN - это алгоритм ленивого обучения, потому что он не имеет специальной фазы обучения и использует все данные для обучения при классификации.
Non-parametric learning algorithm - KNN также является непараметрическим алгоритмом обучения, потому что он ничего не предполагает о базовых данных.
Работа алгоритма KNN
Алгоритм K-ближайших соседей (KNN) использует «сходство признаков» для прогнозирования значений новых точек данных, что дополнительно означает, что новой точке данных будет присвоено значение в зависимости от того, насколько близко она соответствует точкам в обучающем наборе. Мы можем понять его работу с помощью следующих шагов -
Step 1- Для реализации любого алгоритма нужен набор данных. Итак, на первом этапе KNN мы должны загрузить обучающие, а также тестовые данные.
Step 2- Далее нам нужно выбрать значение K, т.е. ближайшие точки данных. K может быть любым целым числом.
Step 3 - Для каждой точки в тестовых данных сделайте следующее -
3.1- Рассчитайте расстояние между тестовыми данными и каждой строкой обучающих данных с помощью любого метода, а именно: Евклидова, Манхэттенского или Хэммингового расстояния. Наиболее часто используемый метод расчета расстояния - евклидов.
3.2 - Теперь по значению расстояния отсортируйте их в порядке возрастания.
3.3 - Затем он выберет верхние K строк из отсортированного массива.
3.4 - Теперь он назначит класс контрольной точке на основе наиболее частого класса этих строк.
Step 4 - Конец
пример
Ниже приведен пример для понимания концепции K и работы алгоритма KNN.
Предположим, у нас есть набор данных, который можно построить следующим образом:
Теперь нам нужно классифицировать новую точку данных с черной точкой (в точке 60,60) на синий или красный класс. Мы предполагаем, что K = 3, т.е. он найдет три ближайших точки данных. Это показано на следующей диаграмме -
На приведенной выше диаграмме мы видим трех ближайших соседей точки данных, отмеченных черной точкой. Среди этих трех два из них относятся к красному классу, поэтому черная точка также будет присвоена красному классу.
Реализация на Python
Как мы знаем, алгоритм K-ближайших соседей (KNN) может использоваться как для классификации, так и для регрессии. Ниже приведены рецепты в Python для использования KNN в качестве классификатора, а также регрессора.
KNN как классификатор
Сначала начнем с импорта необходимых пакетов Python -
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Затем загрузите набор данных iris по его веб-ссылке следующим образом:
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
Затем нам нужно назначить имена столбцов набору данных следующим образом:
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
Теперь нам нужно прочитать набор данных в фреймворке pandas следующим образом:
dataset = pd.read_csv(path, names=headernames)
dataset.head()
слно. | длина чашелистика | ширина чашелистика | длина лепестка | ширина лепестка | Класс |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0,2 | Ирис-сетоса |
1 | 4.9 | 3.0 | 1.4 | 0,2 | Ирис-сетоса |
2 | 4,7 | 3.2 | 1.3 | 0,2 | Ирис-сетоса |
3 | 4.6 | 3.1 | 1.5 | 0,2 | Ирис-сетоса |
4 | 5.0 | 3,6 | 1.4 | 0,2 | Ирис-сетоса |
Предварительная обработка данных будет выполняться с помощью следующих строк скрипта -
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
Далее мы разделим данные на тренировочную и тестовую. Следующий код разделит набор данных на 60% данных обучения и 40% данных тестирования.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)
Далее масштабирование данных будет выполнено следующим образом -
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Затем обучите модель с помощью класса sklearn KNeighborsClassifier следующим образом:
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=8)
classifier.fit(X_train, y_train)
Наконец-то нам нужно сделать прогноз. Это можно сделать с помощью следующего скрипта -
y_pred = classifier.predict(X_test)
Затем распечатайте результаты следующим образом -
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)
Вывод
Confusion Matrix:
[[21 0 0]
[ 0 16 0]
[ 0 7 16]]
Classification Report:
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 21
Iris-versicolor 0.70 1.00 0.82 16
Iris-virginica 1.00 0.70 0.82 23
micro avg 0.88 0.88 0.88 60
macro avg 0.90 0.90 0.88 60
weighted avg 0.92 0.88 0.88 60
Accuracy: 0.8833333333333333
KNN как Регрессор
Во-первых, начните с импорта необходимых пакетов Python -
import numpy as np
import pandas as pd
Затем загрузите набор данных iris по его веб-ссылке следующим образом:
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
Затем нам нужно назначить имена столбцов набору данных следующим образом:
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
Теперь нам нужно прочитать набор данных в фреймворке pandas следующим образом:
data = pd.read_csv(url, names=headernames)
array = data.values
X = array[:,:2]
Y = array[:,2]
data.shape
output:(150, 5)
Затем импортируйте KNeighborsRegressor из sklearn, чтобы соответствовать модели -
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors=10)
knnr.fit(X, y)
Наконец, мы можем найти MSE следующим образом -
print ("The MSE is:",format(np.power(y-knnr.predict(X),2).mean()))
Вывод
The MSE is: 0.12226666666666669
Плюсы и минусы KNN
Плюсы
Это очень простой алгоритм для понимания и интерпретации.
Это очень полезно для нелинейных данных, потому что в этом алгоритме нет предположений о данных.
Это универсальный алгоритм, поскольку мы можем использовать его как для классификации, так и для регрессии.
Он имеет относительно высокую точность, но существуют модели обучения с учителем лучше, чем KNN.
Минусы
В вычислительном отношении это немного затратный алгоритм, потому что он хранит все данные обучения.
Требуется большой объем памяти по сравнению с другими алгоритмами контролируемого обучения.
Прогнозирование медленное в случае большого N.
Он очень чувствителен к масштабу данных, а также к несущественным функциям.
Приложения KNN
Ниже приведены некоторые из областей, в которых KNN может успешно применяться:
Банковская система
KNN можно использовать в банковской системе для прогнозирования того, подходит ли физическое лицо для утверждения кредита? Есть ли у этого человека характеристики, аналогичные характеристикам неплательщика?
Расчет кредитных рейтингов
Алгоритмы KNN могут использоваться для определения кредитного рейтинга человека путем сравнения с людьми, имеющими аналогичные черты характера.
Политика
С помощью алгоритмов KNN мы можем разделить потенциального избирателя на различные классы, такие как «проголосует», «не проголосует», «проголосует за конгресс партии», «проголосует за партию« BJP ».
Другие области, в которых может использоваться алгоритм KNN, - это распознавание речи, обнаружение рукописного ввода, распознавание изображений и распознавание видео.