Примечание
Перейти к концу, чтобы загрузить весь пример кода. или запустить этот пример в браузере через JupyterLite или Binder
Классификация ближайших соседей
Этот пример демонстрирует, как использовать KNeighborsClassifier. Мы обучаем такой классификатор на наборе данных ирисов и наблюдаем разницу в границе решений, полученной относительно параметра weights.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Загрузка данных
В этом примере мы используем набор данных ирисов. Мы разделяем данные на обучающий и тестовый наборы.
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.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,
)
scatter = disp.ax_.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, edgecolors="k")
disp.ax_.legend(
scatter.legend_elements()[0],
iris.target_names,
loc="lower left",
title="Classes",
)
_ = disp.ax_.set_title(
f"3-Class classification\n(k={clf[-1].n_neighbors}, weights={weights!r})"
)
plt.show()

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