Введение
Алгоритм k-ближайших соседей (k-NN) — это популярный и интуитивно понятный алгоритм машинного обучения, используемый как для задач классификации, так и для задач регрессии. Он работает по принципу, согласно которому сходные точки данных, как правило, имеют общие свойства. В этой статье мы шаг за шагом углубимся в алгоритм k-NN и рассмотрим различные настройки, которые можно применить для повышения его производительности.
Шаг 1: Понимание алгоритма k-NN Алгоритм k-NN можно обобщить в виде следующих шагов:
- Загрузите обучающий набор данных.
- Выберите значение k (количество соседей).
- Для каждой точки в тестовом наборе данных: a. Рассчитайте расстояние между контрольной точкой и всеми точками в наборе обучающих данных. б. Выберите k ближайших соседей на основе вычисленных расстояний. в. Назначьте контрольную точку мажоритарному классу (классификация) или вычислите среднее значение (регрессия) k-ближайших соседей. д. Повторите шаги a-c для всех контрольных точек.
- Оцените производительность алгоритма, используя соответствующие показатели.
Шаг 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-ближайших соседей — это универсальный и интуитивно понятный алгоритм машинного обучения для задач классификации и регрессии. Понимая шаги алгоритма и применяя различные параметры настройки, вы можете повысить его производительность и адаптировать его к различным проблемным областям. Поэкспериментируйте с различными параметрами и методами, чтобы найти оптимальную конфигурацию для вашего конкретного случая использования. Удачного кодирования!