Spec-Zone.ru › scikit-learn

Примечание

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

Заключение

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

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_classification.ipynb

Download Python source code: plot_classification.py

Download zipped: plot_classification.zip

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

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

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

Кэширование ближайших соседей

Главный компонентный анализ (PCA) на наборе данных ирисов

© 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

Spec-Zone.ru

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