Website-Suche

K-Nearest Neighbors (KNN) in Python


K-nächste Nachbarn (kNN) ist eine überwachte Machine-Learning-Technik, die sowohl für Klassifikations- als auch für Regressionsaufgaben verwendet werden kann. Ich betrachte KNN als einen Algorithmus, der aus dem tatsächlichen Leben stammt. Menschen neigen dazu, von den Menschen um sie herum beeinflusst zu werden.

Die Idee hinter dem K-Nearest Neighbours-Algorithmus

Unser Verhalten wird von den Freunden geprägt, mit denen wir aufgewachsen sind. Auch unsere Eltern formen unsere Persönlichkeiten auf verschiedene Weise. Wenn man unter Menschen aufwächst, die Sport mögen, ist es sehr wahrscheinlich, dass man am Ende Sport liebt. Es gibt natürlich Ausnahmen. KNN funktioniert ähnlich.

  1. Wenn du einen engen Freund hast und die meiste Zeit mit ihm/ihr verbringst, wirst du ähnliche Interessen haben und die gleichen Dinge lieben. Das ist kNN mit k=1.
  2. Wenn du ständig mit einer Gruppe von 5 abhängst, hat jeder in der Gruppe einen Einfluss auf dein Verhalten und du wirst letztendlich den Durchschnitt von 5 werden. Das ist kNN mit k=5.

Der kNN-Klassifikator identifiziert die Klasse eines Datenpunkts unter Verwendung des Mehrheitsvotings-Prinzips. Wenn k auf 5 eingestellt ist, werden die Klassen der 5 nächstgelegenen Punkte untersucht. Die Vorhersage erfolgt entsprechend der vorherrschenden Klasse. Ähnlich nimmt die kNN-Regression den Durchschnittswert der 5 nächstgelegenen Standorte.

Beobachten wir Menschen, die nah beieinander sind, aber wie werden Datenpunkte als nahe betrachtet? Die Entfernung zwischen Datenpunkten wird gemessen. Es gibt verschiedene Techniken zur Schätzung der Distanz. Die euklidische Distanz (Minkowski-Distanz mit p=2) ist eines der am häufigsten verwendeten Distanzmaßstäbe. Die Grafik unten erklärt, wie man die euklidische Distanz zwischen zwei Punkten in einem 2-dimensionalen Raum berechnet. Sie wird durch das Quadrat der Differenz zwischen den x- und y-Koordinaten der Standorte bestimmt.

Euklidische Distanz

Implementierung des KNN-Algorithmus in Python

Lass uns nun in die Implementierung von KNN in Python einsteigen. Wir werden die Schritte durchgehen, um dir zu helfen, den Code zu zerlegen und ihn besser zu verstehen.

1. Die Module importieren

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

2. Erstellen eines Datensatzes

Scikit-learn verfügt über viele Werkzeuge zur Erstellung synthetischer Datensätze, die sich hervorragend zum Testen von Machine-Learning-Algorithmen eignen. Ich werde die Methode make_blobs verwenden.

X, y = make_blobs(n_samples = 500, n_features = 2, centers = 4,cluster_std = 1.5, random_state = 4)

Dieser Code generiert einen Datensatz von 500 Proben, die in vier Klassen mit insgesamt zwei Merkmalen unterteilt sind. Mit den zugehörigen Parametern können Sie schnell die Anzahl der Proben, Merkmale und Klassen ändern. Wir können auch die Verteilung jeder Gruppe (oder Klasse) ändern.

3. Visualisiere den Datensatz

plt.style.use('seaborn')
plt.figure(figsize = (10,10))
plt.scatter(X[:,0], X[:,1], c=y, marker= '*',s=100,edgecolors='black')
plt.show()

Datenvisualisierung KNN

4. Aufteilung der Daten in Trainings- und Testdatensätze

Es ist entscheidend, einen Datensatz in Trainings- und Testsets für jede überwachte Machine-Learning-Methode zu partitionieren. Zuerst trainieren wir das Modell und testen es dann an verschiedenen Teilen des Datensatzes. Wenn wir die Daten nicht trennen, testen wir das Modell lediglich mit Daten, die es bereits kennt. Mit der Methode train_test_split können wir die Tests einfach trennen.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

Mit den Optionen für die Trainingsgröße und die Testgröße können wir bestimmen, wie viel der ursprünglichen Daten für die Trainings- und Testmengen verwendet wird. Die standardmäßige Trennung beträgt 75 % für die Trainingsmenge und 25 % für die Testmenge.

5. KNN-Klassifizierer-Implementierung

Danach werden wir ein kNN-Klassifizierungsobjekt erstellen. Ich entwickle zwei Klassifizierer mit k-Werten von 1 und 5, um die Relevanz des k-Werts zu demonstrieren. Die Modelle werden dann mit einem Trainingssatz trainiert. Der k-Wert wird mit dem Argument n_neighbors gewählt. Er muss nicht ausdrücklich angegeben werden, da der Standardwert 5 ist.

knn5 = KNeighborsClassifier(n_neighbors = 5)
knn1 = KNeighborsClassifier(n_neighbors=1)

6. Vorhersagen für die KNN-Klassifikatoren

Dann prognostizieren wir im Testset die Zielwerte und vergleichen sie mit den tatsächlichen Werten.

knn5.fit(X_train, y_train)
knn1.fit(X_train, y_train)

y_pred_5 = knn5.predict(X_test)
y_pred_1 = knn1.predict(X_test)

7. Vorhersage der Genauigkeit für beide k-Werte

from sklearn.metrics import accuracy_score
print("Accuracy with k=5", accuracy_score(y_test, y_pred_5)*100)
print("Accuracy with k=1", accuracy_score(y_test, y_pred_1)*100)

Die Genauigkeit der Werte für k ergibt sich wie folgt:

Accuracy with k=5 93.60000000000001
Accuracy with k=1 90.4

8. Vorhersagen visualisieren

Lassen Sie uns den Testdatensatz und die vorhergesagten Werte mit k=5 und k=1 betrachten, um den Einfluss der k-Werte zu sehen.

plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_5, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=5", fontsize=20)

plt.subplot(1,2,2)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_1, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=1", fontsize=20)
plt.show()

Vorhersagen mit KNN visualisieren

Wie man den besten k-Wert für die Implementierung von KNN findet

  1. k=1: Das Modell ist zu eng gefasst und nicht richtig generalisiert. Es hat auch eine hohe Empfindlichkeit gegenüber Rauschen. Das Modell sagt neue, zuvor unbekannte Datenpunkte mit hoher Genauigkeit im Trainingsdatensatz voraus, ist jedoch ein schlechter Prädiktor für frische, zuvor nicht gesehene Datenpunkte. Infolgedessen haben wir wahrscheinlich ein überangepasstes Modell.
  2. k=100: Das Modell ist sowohl bei den Trainings- als auch bei den Testsätzen zu allgemein und unzuverlässig. Unteranpassung ist der Begriff für diese Situation.

Einschränkungen des KNN-Algorithmus

KNN ist ein unkomplizierter Algorithmus, den man leicht verstehen kann. Er basiert nicht auf einem internen maschinellen Lernmodell, um Vorhersagen zu treffen. KNN ist eine Klassifizierungsmethode, die einfach wissen muss, wie viele Kategorien es gibt, um zu funktionieren (eine oder mehrere). Das bedeutet, dass es schnell bewerten kann, ob eine neue Kategorie hinzugefügt werden sollte, ohne wissen zu müssen, wie viele andere es gibt.

Der Nachteil dieser Einfachheit ist, dass sie ungewöhnliche Dinge (wie neue Krankheiten) nicht vorhersagen kann, was KNN nicht erreichen kann, da es nicht weiß, wie häufig ein seltenes Element in einer gesunden Bevölkerung vorkommen würde.

Obwohl KNN eine hohe Genauigkeit im Testset erreicht, ist es langsamer und teurer in Bezug auf Zeit und Speicher. Es benötigt eine erhebliche Menge an Speicher, um das gesamte Trainingsdatenset für Vorhersagen zu speichern. Darüber hinaus sind die Eigenschaften im Datensatz mit großen Größenordnungen aufgrund der großen Empfindlichkeit der euklidischen Distanz immer dominanter als diejenigen mit kleinen Größenordnungen.

Letztendlich sollten wir angesichts all dessen, was wir bisher besprochen haben, im Hinterkopf behalten, dass KNN für hochdimensionale Datensätze nicht ideal ist.

Schlussfolgerung

Hoffentlich haben Sie jetzt ein besseres Verständnis des KNN-Algorithmus. Wir haben verschiedene Ideen betrachtet, wie KNN den gesamten Datensatz speichert, um Vorhersagen zu erzeugen.

KNN ist einer von mehreren faulen Lernalgorithmen, die kein Lernmodell verwenden, um Vorhersagen zu treffen. Indem die Ähnlichkeit zwischen einer eingehenden Beobachtung und den bereits verfügbaren Daten gemittelt wird, erstellt KNN Vorhersagen in Echtzeit (just in time).

Danke fürs Lesen!