Nearest Neighbors Klassifikation#

Dieses Beispiel zeigt, wie KNeighborsClassifier verwendet wird. Wir trainieren einen solchen Klassifikator auf dem Iris-Datensatz und beobachten den Unterschied in der Entscheidungsgrenze, der sich aus dem Parameter weights ergibt.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Daten laden#

In diesem Beispiel verwenden wir den Iris-Datensatz. Wir teilen die Daten in einen Trainings- und einen Testdatensatz auf.

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-nearest neighbors Klassifikator#

Wir möchten einen K-nearest neighbors Klassifikator verwenden, der eine Nachbarschaft von 11 Datenpunkten berücksichtigt. Da unser K-nearest neighbors Modell die euklidische Distanz verwendet, um die nächsten Nachbarn zu finden, ist es wichtig, die Daten vorher zu skalieren. Weitere Informationen finden Sie im Beispiel mit dem Titel Bedeutung der Feature-Skalierung.

Daher verwenden wir eine Pipeline, um einen Skalierer vorzuschalten, bevor wir unseren Klassifikator verwenden.

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))]
)

Entscheidungsgrenze#

Nun passen wir zwei Klassifikatoren mit unterschiedlichen Werten des Parameters weights an. Wir plotten die Entscheidungsgrenze jedes Klassifikators sowie den ursprünglichen Datensatz, um den Unterschied zu beobachten.

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')

Schlussfolgerung#

Wir beobachten, dass der Parameter weights einen Einfluss auf die Entscheidungsgrenze hat. Wenn weights="uniform" haben alle nächsten Nachbarn den gleichen Einfluss auf die Entscheidung. Wohingegen bei weights="distance" das Gewicht jedes Nachbarn proportional zum Kehrwert der Distanz von diesem Nachbarn zum Abfragepunkt ist.

In einigen Fällen kann die Berücksichtigung der Distanz das Modell verbessern.

Gesamtlaufzeit des Skripts: (0 Minuten 0,184 Sekunden)

Verwandte Beispiele

Nearest Neighbors Regression

Nearest Neighbors Regression

Vergleich von Nächsten Nachbarn mit und ohne Neighborhood Components Analysis

Vergleich von Nächsten Nachbarn mit und ohne Neighborhood Components Analysis

Caching nächster Nachbarn

Caching nächster Nachbarn

Principal Component Analysis (PCA) auf dem Iris-Datensatz

Principal Component Analysis (PCA) auf dem Iris-Datensatz

Galerie generiert von Sphinx-Gallery