Ответ
В алгоритме k ближайших соседей (k-NN) параметр k напрямую управляет сложностью модели и балансом между смещением (bias) и разбросом (variance).
Зависимость от k:
- Малое k (например, k=1):
- Низкий Bias: Модель очень гибкая, точно следует за обучающими данными, включая шум.
- Высокая Variance: Решение сильно зависит от каждой конкретной точки, граница решений очень извилистая. Высокий риск переобучения (overfitting).
- Большое k (например, k=50):
- Высокий Bias: Модель становится жёсткой. Предсказание — это усреднение по многим соседям, что сглаживает границу решений и игнорирует локальные особенности.
- Низкая Variance: Решение более стабильно и менее чувствительно к отдельным выбросам. Риск недообучения (underfitting).
Визуализация и пример кода:
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
X, y = make_moons(noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# Сравнение моделей с разным k
for k in [1, 10, 50]:
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
test_score = model.score(X_test, y_test)
print(f"k={k}: Train Acc={train_score:.3f}, Test Acc={test_score:.3f}")
# Результат: с ростом k accuracy на обучении падает (bias растёт),
# а на тесте сначала растёт (variance падает), потом может упасть (bias слишком велик).
Правило: Оптимальное k находят через кросс-валидацию, оно балансирует между underfitting и overfitting.