Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.
Классификация методом ближайших соседей
В этом примере показано, как использовать KNeighborsClassifier. Мы обучаем такой классификатор на наборе данных Iris и наблюдаем, как меняется граница принятия решений в зависимости от параметра weights.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Загрузка данных
В этом примере мы используем набор данных Iris. Мы разделяем данные на обучающую и тестовую выборки.
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris = load_iris(as_frame=True) X = iris.data[["sepal length (cm)", "sepal width (cm)"]] y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
Классификатор методом k ближайших соседей
Мы хотим использовать классификатор методом k ближайших соседей, учитывающий окрестность из 11 точек данных. Поскольку наша модель k ближайших соседей использует евклидово расстояние для поиска ближайших соседей, важно предварительно масштабировать данные. Более подробную информацию см. в примере Важность масштабирования признаков.
Поэтому мы используем Pipeline, чтобы сначала применить масштабирование, а затем использовать классификатор.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
clf = Pipeline(
steps=[("scaler", StandardScaler()), ("knn", KNeighborsClassifier(n_neighbors=11))]
)
Граница принятия решений
Теперь мы обучаем два классификатора с разными значениями параметра weights. Мы строим границу принятия решений для каждого классификатора вместе с исходным набором данных, чтобы увидеть различия.
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
_, axs = plt.subplots(ncols=2, figsize=(12, 5))
for ax, weights in zip(axs, ("uniform", "distance")):
clf.set_params(knn__weights=weights).fit(X_train, y_train)
disp = DecisionBoundaryDisplay.from_estimator(
clf,
X_test,
response_method="predict",
plot_method="pcolormesh",
xlabel=iris.feature_names[0],
ylabel=iris.feature_names[1],
shading="auto",
alpha=0.5,
ax=ax,
)
cmap = mpl.colors.ListedColormap(disp.multiclass_colors_)
scatter = disp.ax_.scatter(
X.iloc[:, 0], X.iloc[:, 1], c=y, cmap=cmap, edgecolors="k"
)
disp.ax_.legend(
scatter.legend_elements()[0],
iris.target_names,
loc="lower right",
title="Classes",
)
_ = disp.ax_.set_title(
f"3-Class classification\n(k={clf[-1].n_neighbors}, weights={weights!r})"
)
plt.show()

Заключение
Мы видим, что параметр weights влияет на границу принятия решений. Когда weights="uniform" все ближайшие соседи одинаково влияют на решение. Если же weights="distance", вес каждого соседа пропорционален величине, обратной расстоянию от этого соседа до точки запроса.
В некоторых случаях учет расстояния может улучшить модель.
Общее время выполнения скрипта: (0 минут 0.221 секунды)
Похожие примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/neighbors/plot_classification.html