Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python

Einführung

Nach Kapitel 4, Ausführungsbeispiel für Erste Mustererkennung Wird in Python reproduziert. Diesmal ist Kapitel 5 "k Nächste-Nachbar-Methode (kNN-Methode)".

Wir haben jedoch die Reproduktion des Ausführungsbeispiels unter Verwendung der handgeschriebenen ETL1-Zahlendatenbank (Ausführungsbeispiel 5.1, Ausführungsbeispiel 5.2, Abbildung 5.9 (a)) abgebrochen, da es einen Teil gibt, in dem die Daten zufällig abgetastet werden. .. .. Die Betriebsumgebung des beschriebenen Codes ist numpy 1.16.2, pandas 0.24.2, scikit-learn 0.20.3.

Ausführungsbeispiel 5.2 Finden Sie die optimale Anzahl von Nachbarn k

Die k-Nearest-Neighbour-Methode (kNN-Methode) ist eine Identifikationsmethode, bei der k Templates in der nächsten Umgebung einer Stichprobe entnommen werden und die Stichprobe zu der Klasse gehört, zu der sie am meisten gehören. Unten ist der Code.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
from sklearn.preprocessing import StandardScaler

--k Implementierung der Methode des nächsten Nachbarn

class kNearestNeiborsClassifier:
    def __init__(self, k=5):
        self._k = k
        self._templates = None
        self._classes = None
    
    def fit(self, templates, classes):
        self._templates = templates
        self._classes = classes
    
    def predict(self, X):
        pred = np.zeros(len(X))
        for i in range(len(X)): #Verarbeiten Sie jede Probe mit einer for-Anweisung, um die Lesbarkeit sicherzustellen
            distance = np.sum((X[i, :] - self._templates)**2, axis=1) #Berechnen Sie den euklidischen Abstand zwischen X und der Vorlage
            idx = np.argsort(distance)[:self._k] #Ermitteln Sie den Index von k Formen mit dem kürzesten Abstand zu X.
            _, count = np.unique(self._classes[idx], return_counts=True) #Berechnen Sie die Anzahl der Vorlagen, die zu jeder Klasse gehören, aus k Vorlagen
            cls = np.where(count == np.max(count))[0] #Identifizieren Sie die Klasse, die die Anzahl der Vorlagen maximiert, zu denen sie gehört
            if len(cls) == 1:
                pred[i] =  cls[0] #Wenn eine Klasse die größte Anzahl von Vorlagen hat, zu denen sie gehört, geben Sie diese Klasse zurück
            else:
                pred[i] =  np.nan #Wenn es mehrere Klassen gibt, die die Anzahl der Vorlagen maximieren, zu denen sie gehören, wird np abgelehnt..Gibt nan zurück
        return pred
    
    def error_rate(self, y_true, y_pred):
        return np.sum(((y_true==1)&(y_pred==0))|((y_true==0)&(y_pred==1)))/len(y_pred) #Berechnen Sie die Fehlerrate, indem Sie Ablehnungen ausschließen
    
    def reject_rate(self, y_pred):
        return np.sum(np.isnan(y_pred))/len(y_pred) #Ablehnungsrate

Die Daten stammen aus R-Datensätzen.

pima_train = pd.read_csv('https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/MASS/Pima.tr.csv')
pima_test = pd.read_csv('https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/MASS/Pima.te.csv')

--Berechnen Sie die Fehlerrate mit der Holdout-Methode

#Trainingsdaten (X._train, Y_Zug) und Verifizierungsdaten (X)_test, Y_Test-Vorbereitungen
sc = StandardScaler()
X_train = sc.fit_transform(pima_train.drop(['Unnamed: 0', 'type'], axis=1))
Y_train = pima_train['type'].map({'Yes':1, 'No':0}).values

X_test = sc.transform(pima_test.drop(['Unnamed: 0', 'type'], axis=1))
Y_test = pima_test['type'].map({'Yes':1, 'No':0}).values

#Berechnen Sie die Fehlerrate, wenn k (nur ungerade Zahl) geändert wird
hold_out_error_rate_list = np.empty((0,2), int)
for k in range(1, 120, 2):
    knn = kNearestNeiborsClassifier(k=k)
    knn.fit(X_train, Y_train)
    Y_pred = knn.predict(X_test)
    error_rate = knn.error_rate(y_true=Y_test, y_pred=Y_pred)
    hold_out_error_rate_list = np.append(hold_out_error_rate_list, np.array([[k, error_rate]]), axis=0)

--Berechnen Sie die Fehlerrate mit der Ein-Ausschluss-Methode

#Datenaufbereitung
pima = pd.concat([pima_train, pima_test])
sc = StandardScaler()
X = sc.fit_transform(pima.drop(['Unnamed: 0', 'type'], axis=1))
Y = pima['type'].map({'Yes':1, 'No':0}).values

#Berechnen Sie die Fehlerrate, wenn k (nur ungerade Zahl) geändert wird
leave_one_out_error_rate_list = np.empty((0,2), int)
for k in range(1, 120, 2):
    error_list = []
    for i in range(len(X)):
        idx = np.ones(len(X), dtype=bool)
        idx[i] = False #Das Index i-Beispiel wird nicht für das Training verwendet
        
        knn = kNearestNeiborsClassifier(k=k)
        knn.fit(X[idx], Y[idx]) #Lernen Sie mit anderen Beispielen als Index i
        
        Y_pred = knn.predict(X[i].reshape([1, -1]))
        error = knn.error_rate(y_true=Y[i], y_pred=Y_pred) #Validiert mit Beispielindex i
        error_list.append(error)
    error_rate = np.mean(error_list)
    leave_one_out_error_rate_list = np.append(leave_one_out_error_rate_list, np.array([[k, error_rate]]), axis=0)
plt.scatter(hold_out_error_rate_list[:, 0], hold_out_error_rate_list[:, 1], label='hold out')
plt.scatter(leave_one_out_error_rate_list[:, 0], leave_one_out_error_rate_list[:, 1], label='leave one out')
plt.legend()
plt.xlabel('k')
plt.ylabel('error rate')
plt.show()

5-9b.png

Ausführungsbeispiel 5.3 Bayes'sche Fehlerschätzung

#Berechnen Sie die Holdout-Fehlerrate, wenn k (ungerade) geändert wird
odd_error_rate_list = np.empty((0,2), int)
for k in range(1, 62, 2):
    knn = kNearestNeiborsClassifier(k=k)
    knn.fit(X_train, Y_train)
    Y_pred = knn.predict(X_test)
    error_rate = knn.error_rate(y_true=Y_test, y_pred=Y_pred)
    odd_error_rate_list = np.append(odd_error_rate_list, np.array([[k, error_rate]]), axis=0)

#Berechnen Sie die Holdout-Fehlerrate, wenn k (gerade) geändert wird
even_error_rate_list = np.empty((0,2), int)
for k in range(2, 62, 2):
    knn = kNearestNeiborsClassifier(k=k)
    knn.fit(X_train, Y_train)
    Y_pred = knn.predict(X_test)
    error_rate = knn.error_rate(y_true=Y_test, y_pred=Y_pred)
    even_error_rate_list = np.append(even_error_rate_list, np.array([[k, error_rate]]), axis=0)
plt.scatter(odd_error_rate_list[:, 0], odd_error_rate_list[:, 1], label='odd')
plt.scatter(even_error_rate_list[:, 0], even_error_rate_list[:, 1], label='even')
plt.legend()
plt.xlabel('k')
plt.ylabel('error rate')
plt.show()

5-12a.png

reject_rate_list = np.empty((0,2), int)
for k in range(2, 62, 2):
    knn = kNearestNeiborsClassifier(k=k)
    knn.fit(X_train, Y_train)
    Y_pred = knn.predict(X_test)
    reject_rate = knn.reject_rate(y_pred=Y_pred)
    reject_rate_list = np.append(reject_rate_list, np.array([[k, reject_rate]]), axis=0)
plt.scatter(reject_rate_list[:, 0], reject_rate_list[:, 1])
plt.xlabel('k')
plt.ylabel('reject rate')
plt.show()

5-12b.png

abschließend

Ich habe versucht, das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python auszuführen. Wenn Sie Codefehler oder effizientere Implementierungsmethoden haben, würden wir uns freuen, wenn Sie eine Bearbeitungsanforderung stellen könnten.

Recommended Posts

Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
Überprüfen Sie das Verhalten des Zerstörers in Python
[Hikari-Python] Kapitel 07-02 Ausnahmebehandlung (Kontinuierliche Ausführung des Programms durch Ausnahmebehandlung)
Das Ergebnis der Installation von Python auf Anaconda
Auf der Suche nach dem schnellsten FizzBuzz in Python
Praktisches Beispiel für hexagonale Architektur in Python
Ein Beispiel für die Antwort auf die Referenzfrage der Studiensitzung. Mit Python.
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Der Inhalt des Python-Tutorials (Kapitel 5) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 4) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 2) ist in einem Aufzählungszeichen zusammengefasst.
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Der Inhalt des Python-Tutorials (Kapitel 8) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 1) ist in einem Aufzählungszeichen zusammengefasst.
Kopieren Sie die Liste in Python
Der Inhalt des Python-Tutorials (Kapitel 10) ist in einem Aufzählungszeichen zusammengefasst.
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Der Inhalt des Python-Tutorials (Kapitel 6) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 3) ist in einem Aufzählungszeichen zusammengefasst.
der Zen von Python
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
So ermitteln Sie die Anzahl der Stellen in Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Ruby, Python-Codefragment Ausführung der Auswahl in Emacs
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Implementieren Sie die Lösung der Riccati-Algebra in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Den Inhalt der Daten in Python nicht kennen
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Rufen Sie die URL des HTTP-Umleitungsziels in Python ab
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Überprüfen Sie die atrophische Natur der Wahrscheinlichkeitsverteilung in Python
[Python] Kapitel 01-02 Über Python (Ausführung und Installation der Entwicklungsumgebung)
[Beispiel für eine Python-Verbesserung] In 2 Wochen wurden die Grundlagen von Python auf einer kostenlosen Website erlernt
[Maschinelles Lernen] "Erkennung von Abnormalitäten und Erkennung von Änderungen" Zeichnen wir die Abbildung von Kapitel 1 in Python.
Auf dem Weg zum Ruhestand von Python2
Finde Fehler in Python
Objektäquivalenzbeurteilung in Python
Reproduzieren Sie die euklidische Methode der gegenseitigen Teilung in Python
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Die Kraft der Pandas: Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
[Memo] Das Geheimnis kumulativer Zuweisungsanweisungen in Python-Funktionen