Въведение

Алгоритъмът k-най-близки съседи (k-NN) е популярен и интуитивен алгоритъм за машинно обучение, използван както за задачи за класификация, така и за регресия. Той работи на принципа, че подобни точки от данни са склонни да споделят общи свойства. В тази статия ще се задълбочим в алгоритъма k-NN стъпка по стъпка и ще проучим различни персонализации, които могат да бъдат приложени за подобряване на неговата производителност.

Стъпка 1: Разбиране на алгоритъма k-NN Алгоритъмът k-NN може да бъде обобщен в следните стъпки:

  1. Заредете набора от данни за обучение.
  2. Изберете стойността на k (броя на съседите).
  3. За всяка точка в тестовия набор от данни: a. Изчислете разстоянието между тестовата точка и всички точки в набора от данни за обучение. b. Изберете 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 алгоритъма, разгледайте следните опции за персонализиране:

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

Изборът на показател за разстояние влияе върху поведението на алгоритъма. По подразбиране е евклидово разстояние, но други опции включват Manhattan, Minkowski и т.н. Използвайте параметъра metric, за да посочите желаната метрика.

Претегляне

По подразбиране всички съседи допринасят еднакво за прогнозата. Можете обаче да присвоите тегла на съседите въз основа на тяхното разстояние. По-близките съседи могат да имат по-голямо влияние. Използвайте параметъра weights със стойности като 'uniform' или 'distance', за да контролирате схемата за претегляне.

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-Nearest Neighbors е многофункционален и интуитивен алгоритъм за машинно обучение за задачи за класификация и регресия. Като разберете стъпките на алгоритъма и приложите различни опции за персонализиране, можете да подобрите неговата производителност и да я адаптирате към различни проблемни области. Експериментирайте с различни параметри и техники, за да намерите оптималната конфигурация за вашия конкретен случай на употреба. Приятно кодиране!