Dieses Mal werden wir die Implementierung von Support-Vektor-Maschinen (Klassifizierung) zusammenfassen.
Fahren Sie mit den nächsten 7 Schritten fort.
Importieren Sie zunächst die erforderlichen Module.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#Modul zum Lesen des Datensatzes
from sklearn.datasets import load_iris
#Modul zur Standardisierung (verteilte Normalisierung)
from sklearn.preprocessing import StandardScaler
#Modul, das Trainingsdaten und Testdaten trennt
from sklearn.model_selection import train_test_split
#Unterstützungsvektor Ein Modul, das eine Maschine ausführt
from sklearn.svm import SVC
#Modul zur Bewertung der Klassifizierung
from sklearn.metrics import classification_report
Dieses Mal werden wir den Iris-Datensatz für die binäre Klassifizierung verwenden.
Holen Sie sich zuerst die Daten, standardisieren Sie sie und teilen Sie sie dann auf.
#Laden des Iris-Datensatzes
iris = load_iris()
#Teilen Sie in objektive Variable und erklärende Variable
X, y = iris.data[:100, [0, 2]], iris.target[:100]
#Standardisierung (verteilte Normalisierung)
std = StandardScaler()
X = std.fit_transform(X)
#Teilen Sie in Trainingsdaten und Testdaten
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
Um eine binäre Klassifizierung durchzuführen, wird der Datensatz bis zur 100. Zeile angegeben (nur Setosa / Versicolor). Wir haben auch die erklärenden Variablen auf zwei eingegrenzt, um die Darstellung zu vereinfachen. (Sepal Länge / nur Blütenblattlänge)
Bei der Standardisierung beispielsweise wird der Einfluss der Merkmalsgrößen (erklärende Variablen) groß, wenn es zweistellige und vierstellige Merkmalsgrößen gibt.
Die Skala wird ausgerichtet, indem der Durchschnitt für alle Merkmalsgrößen auf 0 und die Varianz auf 1 gesetzt wird.
Zeichnen wir die Daten, bevor wir sie nach SVM klassifizieren.
#Erstellen von Zeichnungsobjekten und Nebenhandlungen
fig, ax = plt.subplots()
#Setosa Handlung
ax.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1],
marker = 'o', label = 'Setosa')
#Versicolor Handlung
ax.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1],
marker = 'x', label = 'Versicolor')
#Einstellungen für die Achsenbeschriftung
ax.set_xlabel('Sepal Length')
ax.set_ylabel('Petal Length')
#Legendeneinstellungen
ax.legend(loc = 'best')
plt.show()
Diagramm mit Merkmalen, die Setosa entsprechen (y_train == 0) (0: Sepal Länge auf der horizontalen Achse, 1: Blütenblattlänge auf der vertikalen Achse) Plot mit Merkmalen (0: Sepal Länge auf der horizontalen Achse, 1: Blütenblattlänge auf der vertikalen Achse) entsprechend Versicolor (y_train == 1)
Ausgabeergebnis
Erstellen Sie zunächst eine SVM-Ausführungsfunktion (Instanz) und wenden Sie sie auf die Trainingsdaten an.
#Erstellen Sie eine Instanz
svc = SVC(kernel = 'linear', C = 1e6)
#Erstellen Sie ein Modell aus Trainingsdaten
svc.fit(X_train, y_train)
Diesmal ist eine lineare Trennung bereits möglich (durch eine gerade Linie getrennt), daher wird das Argument auf kernel = 'linear' gesetzt.
C ist ein Hyperparameter, den Sie selbst anpassen, während Sie die Ausgabewerte und Diagramme betrachten.
Da konnte ich aus den Trainingsdaten ein Modell der Support-Vektor-Maschine erstellen Zeichnen und überprüfen Sie, wie die Klassifizierung erfolgt.
Die erste Hälfte entspricht genau dem Code im obigen Streudiagramm.
#Erstellen von Zeichnungsobjekten und Nebenhandlungen
fig, ax = plt.subplots()
#Setosa Handlung
ax.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1],
marker = 'o', label = 'Setosa')
#Versicolor Handlung
ax.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1],
marker = 'x', label = 'Versicolor')
ax.set_xlabel('Sepal Length')
ax.set_ylabel('Petal Length')
ax.legend(loc = 'upper left')
#Von hier an können Sie es so einfügen, wie es ist, und es jedes Mal verwenden, auch wenn es sich um andere Daten handelt. (Eine Feineinstellung des Zahlenwerts ist erforderlich.)
#Geben Sie den Plotbereich der Entscheidungsgrenze an (gerade Linie).
xmin = -2.0
xmax = 2.5
ymin = -1.5
ymax = 1.8
#Zeichnen Sie Entscheidungsgrenzen und -ränder
xx, yy = np.meshgrid(np.linspace(xmin, xmax, 100), np.linspace(ymin, ymax, 100))
xy = np.vstack([xx.ravel(), yy.ravel()]).T
p = svc.decision_function(xy).reshape(100, 100)
ax.contour(xx, yy, p, colors = 'k', levels = [-1, 0, 1], alpha = 1,
linestyles = ['--', '-', '--'])
#Plotunterstützungsvektor
ax.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1],
s = 250, facecolors = 'none', edgecolors = 'black')
plt.show()
Alpha: Gerade Dichte s: Größe des Stützvektors (○)
Ausgabeergebnis
Nachdem das Modell vollständig ist, lassen Sie uns die Klassifizierung vorhersagen.
#Klassifizierungsergebnisse vorhersagen
y_pred = svc.predict(X_test)
#Geben Sie den vorhergesagten Wert und den richtigen Antwortwert aus
print(y_pred)
print(y_test)
Ausgabeergebnis
#Vergleichen Sie den vorhergesagten Wert mit dem richtigen Antwortwert
y_pred: [0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1]
y_test: [0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1]
0:Setosa 1:Versicolor
In diesem Fall können Sie sehen, dass alle übereinstimmen (richtige Antwort).
Da es sich diesmal um eine Klassifizierung (binäre Klassifizierung) handelt, werden wir sie anhand der Genauigkeitsrate, der Rückrufrate und des F-Werts unter Verwendung einer Verwirrungsmatrix bewerten.
#Gibt die Genauigkeitsrate, die Rückrufrate und den F-Wert aus
print(classification_report(y_test, y_pred))
Ausgabeergebnis
Aus dem oben Gesagten konnten wir die Klassifizierung in Setosa und Versicolor bewerten.
In SVM erstellen und bewerten wir das Modell basierend auf den obigen Schritten 1 bis 7.
Dieses Mal habe ich für Anfänger nur die Implementierung (Code) zusammengefasst. Mit Blick auf das Timing in der Zukunft möchte ich einen Artikel über Theorie (mathematische Formel) schreiben.
Danke fürs Lesen.
Referenzen: Neues Lehrbuch zur Datenanalyse mit Python (Hauptlehrmaterial für den Test zur Analyse der Zertifizierung von Python 3-Ingenieuren)
Recommended Posts