Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через 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()
3-Class classification (k=11, weights='uniform'), 3-Class classification (k=11, weights='distance')

Заключение

Мы видим, что параметр weights влияет на границу принятия решений. Когда weights="uniform" все ближайшие соседи одинаково влияют на решение. Если же weights="distance", вес каждого соседа пропорционален величине, обратной расстоянию от этого соседа до точки запроса.

В некоторых случаях учет расстояния может улучшить модель.

Общее время выполнения скрипта: (0 минут 0.221 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_classification.ipynb

Download Python source code: plot_classification.py

Download zipped: plot_classification.zip

Похожие примеры

Сравнение метода ближайших соседей с анализом компонентов окрестности и без него

Регрессия методом ближайших соседей

Классификация методом ближайшего центроида

Поверхность принятия решений для деревьев решений, обученных на наборе данных Iris

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API