Введение

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

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

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

О наборе данных:

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

Требования:

Для реализации алгоритма K-ближайших соседей в Python нам понадобятся следующие библиотеки:

- pandas: для обработки и анализа данных.

- scikit-learn (sklearn): для алгоритмов машинного обучения и показателей оценки.

- matplotlib: для визуализации данных.

- Seaborn: для создания матрицы путаницы.

Выполнение:

Сначала мы импортируем необходимые библиотеки и загружаем набор данных Iris:

import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
# Create a DataFrame from the dataset
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
df['flower_name'] = df.target.apply(lambda x: iris.target_names[x])
Next, we split the dataset into training and testing sets:
from sklearn.model_selection import train_test_split
X = df.drop(['target', 'flower_name'], axis='columns')
y = df.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

Затем мы создаем классификатор K-ближайших соседей и подгоняем его к обучающим данным:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(X_train, y_train)
We can evaluate the model's accuracy on the test data:
accuracy = knn.score(X_test, y_test)
print("Accuracy:", accuracy)

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

new_data = [[4.8, 3.0, 1.5, 0.3]]
predicted_class = knn.predict(new_data)
print("Predicted class:", predicted_class)

Чтобы визуализировать производительность модели, мы можем построить матрицу путаницы:

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns
y_pred = knn.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(cm, annot=True)
plt.xlabel('Predicted')
plt.ylabel('Truth')

Наконец, мы можем распечатать отчет о классификации, который обеспечивает точность, полноту и оценку F1 для каждого класса:

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

Заключение:

В этой статье мы узнали, как реализовать алгоритм K ближайших соседей в Python с использованием набора данных Iris. Мы рассмотрели шаги от загрузки данных до оценки модели, включая обучение классификатора, создание прогнозов, визуализацию результатов с использованием матрицы путаницы и печать отчета о классификации. Алгоритм K-ближайших соседей — это универсальный и интуитивно понятный алгоритм, который можно применять к различным задачам классификации. Стоит изучить различные значения K и поэкспериментировать с разными наборами данных, чтобы понять его поведение и производительность.