Ответ
KNN (k-ближайших соседей) — это алгоритм для задач классификации и регрессии, основанный на метриках близости. Он не строит явную модель во время обучения, а «запоминает» всю обучающую выборку.
Алгоритм работы:
- Вычисление расстояний: Для нового объекта вычисляются расстояния до всех точек обучающей выборки. Чаще всего используется Евклидово расстояние, но могут применяться Манхэттенское, косинусное и другие метрики.
- Выбор соседей: Выбираются
kобъектов с наименьшими расстояниями. - Принятие решения:
- Для классификации: Присваивается класс, наиболее часто встречающийся среди
kсоседей (мажоритарное голосование). - Для регрессии: Вычисляется среднее (или медиана) значений целевой переменной соседей.
- Для классификации: Присваивается класс, наиболее часто встречающийся среди
Пример классификации с использованием scikit-learn:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# Масштабирование данных критически важно для KNN
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Создание и обучение модели
model = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
model.fit(X_train_scaled, y_train)
# Предсказание
predictions = model.predict(X_test_scaled)
Ключевые особенности и настройки:
- Чувствительность к масштабу: Обязательна нормализация или стандартизация признаков.
- Выбор
k: Слишком малоеk(например, 1) ведет к переобучению и высокой чувствительности к шуму. Слишком большоеkсглаживает модель и может привести к недообучению. Оптимальноеkподбирается через кросс-валидацию. - Вычислительная сложность: Предсказание медленное на больших данных, так как требует вычисления расстояний до всех обучающих примеров. Для ускорения используются структуры данных вроде KD-деревьев или шаровых деревьев.
- Вес соседей: Часто используется взвешенное голосование, где голос ближайшего соседа имеет больший вес.