KNN (K nächster Nachbar). Eine Methode zur Klassendiskriminierung. Die Trainingsdaten werden auf dem Vektorraum aufgezeichnet, und wenn unbekannte Daten erhalten werden, werden alle K Stücke in der Reihenfolge der Entfernung von den unbekannten Daten erfasst, und die Klasse, zu der die Daten gehören, wird durch eine Mehrheitsentscheidung geschätzt.
Im Fall der folgenden Abbildung ist der Fluss der Klassendiskriminierung beispielsweise wie folgt. 1 Zeichnen Sie bekannte Daten (Trainingsdaten) als gelbe und violette Kreise. 2 Entscheiden Sie die Anzahl von K. Wie K = 3. 3 Wenn ein roter Stern als unbekannte Daten erhalten wird, erfassen Sie drei von den nächstgelegenen Punkten. 4 Schätzen Sie die Klasse, zu der die drei Klassen gehören. Dieses Mal wird geschätzt, dass der unbekannte rote Stern zur Klasse B gehört.
Bereiten Sie den Iris-Datensatz mit sklearn vor.
{get_iris_dataset.py}
from sklearn.datasets import load_iris
iris= load_iris() #Iris-Datenerfassung
X = iris.data #Erklärende Variable(Variablen für die Klassenschätzung)
Y = iris.target #Objektive Variable(Klassenwert)
#Konvertieren Sie Irisdaten in DataFrame
iris_data = DataFrame(X, columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'])
iris_target = DataFrame(Y, columns=['Species'])
# iris_Da das Ziel ein Wert zwischen 0 und 2 ist, ist es schwer zu verstehen. Konvertieren Sie es daher in Ayames Namen
def flower(num):
"""Namenskonvertierungsfunktion"""
if num == 0:
return 'Setosa'
elif num == 1:
return 'Veriscolour'
else:
return 'Virginica'
iris_target['Species'] = iris_target['Species'].apply(flower)
iris = pd.concat([iris_data, iris_target], axis=1)
{describe_iris.py}
iris.head()
の長さと幅のデータ
Koppeln Sie das Grundstück mit Seaboan und sehen Sie sich die Übersicht nach Klassen an
{desplay_each_data.py}
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline
sns.pairplot(iris, hue = 'Species', size =2) # hue:Aufgeteilt nach angegebenen Daten
Setosa [blauer Punkt] scheint leicht zu klassifizieren zu sein. Veriscolour [grüner Punkt] und Virginia [roter Punkt] können nach Blütenblattlänge klassifiziert werden? Eindruck über.
Führen Sie KNN mit sklearn aus.
{do_knn.py}
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split #Für Zug- und Testaufteilung
#Datenvorbereitung für Zug und Test. Prüfung_Geben Sie das Verhältnis der Testdaten zur Größe an. zufällig_Stellen Sie für den Status den Startwert entsprechend ein.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.4, random_state=3)
knn = KNeighborsClassifier(n_neighbors=6) #Instanzgenerierung. n_neighbors:Anzahl von K.
knn.fit(X_train, Y_train) #Ausführung der Modellerstellung
Y_pred = knn.predict(X_test) #Vorausschauende Ausführung
#Importieren Sie die Bibliothek und führen Sie sie zur Genauigkeitsprüfung aus
from sklearn import metrics
metrics.accuracy_score(Y_test, Y_pred) #Messung der Vorhersagegenauigkeit
> 0.94999999999999996
Genauigkeit von ca. 95%.
Die Genauigkeit ändert sich abhängig von der Anzahl der K. → Ich weiß nicht, welches K verwendet werden soll, daher ändere ich K auf verschiedene Arten und zeichne ein Diagramm mit Änderungen der Genauigkeit.
{create_graph_knn_accracy_change_k.py}
accuracy = []
for k in range(1, 90):
knn = KNeighborsClassifier(n_neighbors=k) #Instanzgenerierung.
knn.fit(X_train, Y_train) #Ausführung der Modellerstellung
Y_pred = knn.predict(X_test) #Vorausschauende Ausführung
accuracy.append(metrics.accuracy_score(Y_test, Y_pred)) #Präzisionslagerung
plt.plot(k_range, accuracy)
Das Ergebnis einer 90-fachen Drehung
K = 3? Ist genug. Wenn es 30 überschreitet, verschlechtert sich die Genauigkeit. Da diesmal nur 90 Trainingsdaten vorliegen, gibt es nur etwa 30 Trainingsdaten pro Klasse. Wenn die Anzahl von K 30 überschreitet und alle Daten der richtigen Antwortklasse enthalten sind, können nur verschiedene Klassen in der nächsten Umgebung erfasst werden, sodass erwartet wird, dass die Genauigkeit immer schlechter wird.
Recommended Posts