Введение

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

Шаг 1: Понимание алгоритма k-NN Алгоритм k-NN можно обобщить в виде следующих шагов:

  1. Загрузите обучающий набор данных.
  2. Выберите значение k (количество соседей).
  3. Для каждой точки в тестовом наборе данных: a. Рассчитайте расстояние между контрольной точкой и всеми точками в наборе обучающих данных. б. Выберите k ближайших соседей на основе вычисленных расстояний. в. Назначьте контрольную точку мажоритарному классу (классификация) или вычислите среднее значение (регрессия) k-ближайших соседей. д. Повторите шаги a-c для всех контрольных точек.
  4. Оцените производительность алгоритма, используя соответствующие показатели.

Шаг 2: Реализация алгоритма k-NN Давайте реализуем алгоритм k-NN на Python, используя библиотеку scikit-learn:

from sklearn.neighbors import KNeighborsClassifier

# Load the dataset
X_train = ...  # Training features
y_train = ...  # Training labels
X_test = ...   # Test features

# Create a k-NN classifier
knn = KNeighborsClassifier(n_neighbors=k)  # Set the number of neighbors (k)

# Train the classifier
knn.fit(X_train, y_train)

# Predict the labels for the test dataset
y_pred = knn.predict(X_test)

Шаг 3: Параметры настройки Чтобы повысить производительность и гибкость алгоритма k-NN, рассмотрите следующие параметры настройки:

Метрика расстояния

Выбор метрики расстояния влияет на поведение алгоритма. По умолчанию используется евклидово расстояние, но другие варианты включают Манхэттен, Минковский и т. д. Используйте параметр metric, чтобы указать желаемую метрику.

Взвешивание

По умолчанию все соседи вносят одинаковый вклад в прогноз. Однако вы можете назначить веса соседям в зависимости от их расстояния. Ближайшие соседи могут иметь большее влияние. Используйте параметр weights с такими значениями, как «равномерность» или «расстояние», чтобы управлять схемой взвешивания.

from sklearn.neighbors import KNeighborsClassifier

# Create a k-NN classifier with Manhattan distance
knn = KNeighborsClassifier(n_neighbors=k, metric='manhattan')

Масштабирование функций

Поскольку k-NN полагается на расчеты расстояния, важно масштабировать функции. Нормализуйте или стандартизируйте функции, чтобы убедиться, что они имеют одинаковые диапазоны. Используйте соответствующие методы масштабирования из scikit-learn, такие как MinMaxScaler или StandardScaler.

from sklearn.preprocessing import MinMaxScaler

# Scale the features using Min-Max scaling
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Create a k-NN classifier with scaled features
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_scaled, y_train)
y_pred = knn.predict(X_test_scaled)

Выбор оптимального k

Значение k существенно влияет на производительность алгоритма k-NN. Меньшее k может привести к переоснащению, а большее k может привести к большему смещению. Поэкспериментируйте с различными значениями k и выберите то, которое обеспечивает наилучшую производительность для вашего набора данных. Такие методы, как перекрестная проверка, могут помочь в выборе оптимального k.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

# Define a range of k values to test
param_grid = {'n_neighbors': [3, 5, 7, 9, 11]}

# Create a k-NN classifier
knn = KNeighborsClassifier()

# Use GridSearchCV to find the best k
grid_search = GridSearchCV(knn, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# Retrieve the best k and its corresponding score
best_k = grid_search.best_params_['n_neighbors']
best_score = grid_search.best_score_

Обработка несбалансированных данных:

Если набор данных несбалансирован, когда один класс имеет значительно больше экземпляров, чем другие, это может привести к смещению прогнозов. Рассмотрите возможность использования таких методов, как избыточная выборка, недостаточная выборка или метод избыточной выборки синтетического меньшинства (SMOTE), чтобы сбалансировать набор данных перед применением k-NN.

from imblearn.over_sampling import SMOTE

# Apply SMOTE to oversample the minority class
smote = SMOTE()
X_train_oversampled, y_train_oversampled = smote.fit_resample(X_train, y_train)

# Create a k-NN classifier with oversampled data
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_oversampled, y_train_oversampled)
y_pred = knn.predict(X_test)

Улучшение задач регрессии с помощью пользовательской функции медианы

from sklearn.neighbors import KNeighborsRegressor
import numpy as np

# Load the dataset
X_train = ...  # Training features
y_train = ...  # Training labels
X_test = ...   # Test features

# Create a k-NN regressor
knn = KNeighborsRegressor(n_neighbors=k)

# Train the regressor
knn.fit(X_train, y_train)

# Predict the labels for the test dataset
y_pred = knn.predict(X_test)

# Define a custom average function (median)
def custom_average(neighbors):
    return np.median(neighbors)

# Create a k-NN regressor with the custom average function
knn_custom = KNeighborsRegressor(n_neighbors=k, metric='euclidean', weights='distance')
knn_custom.effective_metric_ = custom_average

# Train the regressor with the custom average function
knn_custom.fit(X_train, y_train)

# Predict the labels for the test dataset using the custom average function
y_pred_custom = knn_custom.predict(X_test)

В приведенном выше коде мы определяем пользовательскую среднюю функцию с именем custom_average, которая вычисляет медиану меток ближайших соседей. Затем мы создаем регрессор k-NN knn_custom с набором параметров n_neighbors, metric и weights. Мы переопределяем атрибут effective_metric_ регрессора, чтобы использовать нашу пользовательскую функцию среднего значения. Наконец, мы обучаем и прогнозируем, используя этот пользовательский регрессор k-NN.

Не забудьте адаптировать код к вашему конкретному набору данных и требованиям.

Заключение

Алгоритм k-ближайших соседей — это универсальный и интуитивно понятный алгоритм машинного обучения для задач классификации и регрессии. Понимая шаги алгоритма и применяя различные параметры настройки, вы можете повысить его производительность и адаптировать его к различным проблемным областям. Поэкспериментируйте с различными параметрами и методами, чтобы найти оптимальную конфигурацию для вашего конкретного случая использования. Удачного кодирования!