Implementieren anderer SVM-Varianten mit Scikit-Learn von Python

Implementieren anderer SVM-Varianten mit Scikit-Learn von Python

Einleitung

Dieser Leitfaden ist der dritte und letzte Teil von drei Leitfäden zu Support Vector Machines (SVMs). In diesem Leitfaden werden wir weiter mit dem Anwendungsfall für gefälschte Banknoten arbeiten, eine kurze Zusammenfassung der allgemeinen Idee hinter SVMs geben, verstehen, was der Kernel-Trick ist, und verschiedene Arten von nichtlinearen Kerneln mit Scikit-Learn implementieren.

In der vollständigen Reihe von SVM-Leitfäden erfahren Sie neben anderen Arten von SVMs auch etwas über einfache SVM, vordefinierte SVM-Parameter, C- und Gamma-Hyperparameter und wie sie mit Grid-Suche und Kreuzvalidierung optimiert werden können.

Wenn Sie die vorherigen Leitfäden lesen möchten, können Sie einen Blick auf die ersten beiden Leitfäden werfen oder nachsehen, welche Themen Sie am meisten interessieren. Nachfolgend finden Sie eine Tabelle mit Themen, die in jedem Leitfaden behandelt werden:

  1. Implementieren von SVM und Kernel-SVM mit Scikit-Learn von Python
  • Anwendungsfall: Banknoten vergessen
  • Hintergrund von SVMs
  • Einfaches (lineares) SVM-Modell
    • Über den Datensatz
    • Importieren des Datensatzes
    • Exploring das Dataset
  • Implementieren von SVM mit Scikit-Learn
    • Aufteilen von Daten in Trainings-/Testsätze
    • Das Modell trainieren
    • Vorhersagen treffen
    • Bewertung des Modells
    • Ergebnisse interpretieren
  1. SVM-Hyperparameter verstehen
  • Der C-Hyperparameter
  • Der Gamma-Hyperparameter

3. Implementieren anderer SVM-Varianten mit Scikit-Learn von Python

  • Die allgemeine Idee von SVMs (eine Zusammenfassung)
  • Kernel (Trick) SVM
  • Implementieren von nicht-linearer Kernel-SVM mit Scikit-Learn
  • Bibliotheken importieren
    • Importieren des Datensatzes
    • Aufteilen von Daten in Merkmale (X) und Ziel (y)
    • Aufteilen von Daten in Trainings-/Testsätze
    • Training des Algorithmus
  • Polynomialer Kern
    • Vorhersagen treffen
    • Bewertung des Algorithmus
  • Gaußscher Kernel
    • Vorhersage und Bewertung
  • Sigmoider Kernel
    • Vorhersage und Bewertung
  • Vergleich der nichtlinearen Kernelleistungen

Erinnern wir uns daran, worum es bei SVM geht, bevor wir uns einige interessante SVM-Kernel-Variationen ansehen.

Die allgemeine Idee von SVMs

Im Fall von linear trennbaren Daten in zwei Dimensionen (wie in Abb. 1 gezeigt) wäre der typische Ansatz des maschinellen Lernalgorithmus zu versuchen, eine Grenze zu finden, die die Daten so teilt, dass der Fehlklassifizierungsfehler minimiert wird. Wenn Sie sich Abbildung 1 genau ansehen, stellen Sie fest, dass es mehrere Grenzen (unendlich) geben kann, die die Datenpunkte korrekt teilen. Die beiden gestrichelten Linien sowie die durchgezogene Linie sind alle gültige Klassifikationen der Daten.

Mehrere Entscheidungsgrenzen

Abb. 1: Mehrere Entscheidungsgrenzen

Wenn SVM die auswählt Entscheidungsgrenze, wählt es eine Grenze, die den Abstand zwischen sich selbst und den nächsten Datenpunkten der Klassen maximiert. Wir wissen bereits, dass die nächstgelegenen Datenpunkte die Stützvektoren sind und dass der Abstand durch beide parametrisiert werden kann C und gamma Hyperparameter.

Bei der Berechnung dieser Entscheidungsgrenze wählt der Algorithmus aus, wie viele Punkte zu berücksichtigen sind und wie weit der Spielraum gehen kann – dies konfiguriert ein Spielraummaximierungsproblem. Bei der Lösung dieses Problems der Randmaximierung verwendet SVM die Unterstützungsvektoren (wie in Abb. 2 zu sehen) und versucht herauszufinden, was optimale Werte sind, die den Randabstand größer halten, während mehr Punkte entsprechend der verwendeten Funktion korrekt klassifiziert werden trennen Sie die Daten.

Entscheidungsgrenze mit Unterstützungsvektoren

Abb. 2: Entscheidungsgrenze mit Unterstützungsvektoren

Aus diesem Grund unterscheidet sich SVM von anderen Klassifizierungsalgorithmen, da es nicht nur eine Entscheidungsgrenze findet, sondern am Ende die optimale Entscheidungsgrenze findet.

Hinter dem Auffinden der Unterstützungsvektoren, dem Berechnen des Spielraums zwischen der Entscheidungsgrenze und den Unterstützungsvektoren und dem Maximieren dieses Spielraums steckt eine komplexe Mathematik, die von Statistiken und Berechnungsmethoden abgeleitet ist. Dieses Mal werden wir nicht in die Details gehen, wie sich die Mathematik abspielt.

Es ist immer wichtig, tiefer einzutauchen und sicherzustellen, dass maschinelle Lernalgorithmen kein mysteriöser Zauber sind, obwohl Sie zu diesem Zeitpunkt nicht alle mathematischen Details zu kennen, Sie nicht daran hindern konnten, den Algorithmus auszuführen und Ergebnisse zu erzielen.

Hinweis: Nachdem wir nun den algorithmischen Prozess zusammengefasst haben, ist klar, dass der Abstand zwischen den Datenpunkten die Entscheidungsgrenze beeinflusst, die SVM aus diesem Grund wählt. Skalierung der Daten ist normalerweise erforderlich, wenn ein SVM-Klassifikator verwendet wird. Versuchen Sie es mit Die Standard-Scaler-Methode von Scikit-learn um Daten vorzubereiten und dann die Codes erneut auszuführen, um zu sehen, ob es einen Unterschied in den Ergebnissen gibt.

Kernel (Trick) SVM

Im vorherigen Abschnitt haben wir uns an die allgemeine Idee von SVM erinnert und sie organisiert – wir haben gesehen, wie sie verwendet werden kann, um die optimale Entscheidungsgrenze für linear trennbare Daten zu finden. Bei nichtlinear trennbaren Daten, wie sie in Abb. 3 dargestellt sind, wissen wir jedoch bereits, dass eine Gerade nicht als Entscheidungsgrenze verwendet werden kann.

Nichtlinear trennbare Daten

Abb. 3: Nichtlinear trennbare Daten

Stattdessen können wir die eingangs besprochene modifizierte Version von SVM namens Kernel SVM verwenden.

Grundsätzlich wird die Kernel-SVM die nichtlinear trennbaren Daten niedrigerer Dimensionen in ihre entsprechende Form in höheren Dimensionen projizieren. Das ist ein Trick, denn bei der Projektion nichtlinear trennbarer Daten in höhere Dimensionen verändert sich die Datenform so, dass sie trennbar werden. Wenn Sie beispielsweise über 3 Dimensionen nachdenken, könnten die Datenpunkte jeder Klasse am Ende einer anderen Dimension zugeordnet werden, wodurch sie trennbar werden. Eine Möglichkeit, die Datendimensionen zu erhöhen, kann darin bestehen, sie zu potenzieren. Auch hier ist komplexe Mathematik involviert, aber Sie müssen sich darüber keine Gedanken machen, um SVM zu verwenden. Stattdessen können wir die Scikit-Learn-Bibliothek von Python verwenden, um die nichtlinearen Kernel auf die gleiche Weise zu implementieren und zu verwenden, wie wir die linearen verwendet haben.

Implementieren von nicht-linearer Kernel-SVM mit Scikit-Learn

In diesem Abschnitt verwenden wir denselben Datensatz, um anhand der vier uns bereits bekannten Merkmale vorherzusagen, ob eine Banknote echt oder gefälscht ist.

Sie werden sehen, dass die restlichen Schritte typische maschinelle Lernschritte sind und nur sehr wenig Erklärung benötigen, bis wir den Teil erreichen, in dem wir unsere nichtlinearen Kernel-SVMs trainieren.

Bibliotheken importieren

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

Importieren des Datensatzes

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

Aufteilen von Daten in Merkmale (X) und Ziel (y)

X = bankdata.drop('class', axis=1)
y = bankdata['class']

Aufteilen von Daten in Trainings-/Testsätze

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Training des Algorithmus

Um die Kernel-SVM zu trainieren, verwenden wir dieselbe SVC Klasse der Scikit-Learn's svm Bibliothek. Der Unterschied liegt im Wert für den Kernel-Parameter der SVC Klasse.

Bei der einfachen SVM haben wir als Wert für den Kernelparameter „linear“ verwendet. Wie wir jedoch bereits erwähnt haben, können wir für die Kernel-SVM Gauß-, Polynom-, Sigmoid- oder berechenbare Kernel verwenden. Wir werden Polynom-, Gauß- und Sigmoid-Kernel implementieren und uns die endgültigen Metriken ansehen, um zu sehen, welche zu unseren Klassen mit einer höheren Metrik passt.

1. Polynomialer Kern

In der Algebra ist ein Polynom ein Ausdruck der Form:

$$
2a*b^3 + 4a – 9
$$

Dies hat Variablen, wie z a und b, Konstanten, in unserem Beispiel, 9 und Koeffizienten (Konstanten begleitet von Variablen), wie z 2 und 4dem „Vermischten Geschmack“. Seine 3 wird als Grad des Polynoms betrachtet.

Es gibt Datentypen, die am besten beschrieben werden können, wenn eine Polynomfunktion verwendet wird. Hier wird der Kernel unsere Daten einem Polynom zuordnen, für das wir den Grad auswählen. Je höher der Grad, desto mehr versucht die Funktion, näher an die Daten heranzukommen, sodass die Entscheidungsgrenze flexibler (und anfälliger für Überanpassung) ist – je niedriger der Grad, desto unflexibler.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Also, für die Umsetzung der Polynomialer Kern, neben der Auswahl der poly Kernel übergeben wir auch einen Wert für den degree Parameter der SVC Klasse. Unten ist der Code:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

Vorhersagen treffen

Nachdem wir den Algorithmus trainiert haben, besteht der nächste Schritt darin, Vorhersagen zu den Testdaten zu treffen.

Wie wir es zuvor getan haben, können wir dazu das folgende Skript ausführen:

y_pred_poly = svclassifier.predict(X_test)

Bewertung des Algorithmus

Wie üblich besteht der letzte Schritt darin, Auswertungen über den Polynomkern vorzunehmen. Da wir den Code für den Klassifizierungsbericht und die Konfusionsmatrix einige Male wiederholt haben, wandeln wir ihn in eine Funktion um, die display_results nach Erhalt der jeweiligen Unterlagen y_test, y_pred und Titel der Verwirrungsmatrix von Seaborn mit cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

Jetzt können wir die Funktion aufrufen und die mit dem Polynomkern erhaltenen Ergebnisse betrachten:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

Die Ausgabe sieht folgendermaßen aus:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Implementieren anderer SVM-Varianten mit Pythons Scikit-Learn PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Jetzt können wir die gleichen Schritte für Gaußsche und Sigmoidkerne wiederholen.

2. Gaußscher Kern

Um den Gaußschen Kernel zu verwenden, müssen wir nur 'rbf' als Wert für die angeben kernel Parameter der SVC-Klasse:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

Wenn Sie diesen Kernel weiter untersuchen, können Sie ihn auch mit der Rastersuche mit anderen kombinieren C und gamma Werte.

Vorhersage und Bewertung

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

Die Ausgabe der Gaussian Kernel SVM sieht so aus:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

Implementieren anderer SVM-Varianten mit Pythons Scikit-Learn PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

3. Sigmoider Kernel

Lassen Sie uns schließlich einen Sigmoid-Kernel für die Implementierung von Kernel-SVM verwenden. Sehen Sie sich das folgende Skript an:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

Um den Sigmoid-Kernel zu verwenden, müssen Sie 'sigmoid' als Wert für die angeben kernel Parameter der SVC Klasse.

Vorhersage und Bewertung

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

Die Ausgabe der Kernel-SVM mit Sigmoid-Kernel sieht so aus:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Implementieren anderer SVM-Varianten mit Pythons Scikit-Learn PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Vergleich der nichtlinearen Kernelleistungen

Wenn wir kurz die Leistung der verschiedenen Arten von nichtlinearen Kerneln vergleichen, könnte es scheinen, dass der Sigmoid-Kernel die niedrigsten Metriken hat, also die schlechteste Leistung.

Unter den Gaußschen und Polynomkernen können wir sehen, dass der Gaußsche Kern eine perfekte Vorhersagerate von 100 % erreicht hat – was normalerweise verdächtig ist und auf eine Überanpassung hindeuten kann, während der Polynomkern 68 Instanzen der Klasse 1 falsch klassifiziert hat.

Daher gibt es keine feste Regel, welcher Kernel in jedem Szenario oder in unserem aktuellen Szenario am besten abschneidet, ohne weiter nach Hyperparametern zu suchen, die Form jeder Funktion zu verstehen, die Daten zu untersuchen und die Trainings- und Testergebnisse zu vergleichen, um zu sehen, ob der Algorithmus funktioniert verallgemeinert.

Es geht darum, alle Kernel zu testen und den Kernel mit der Kombination aus Parametern und Datenaufbereitung auszuwählen, die die erwarteten Ergebnisse entsprechend dem Kontext Ihres Projekts liefern.

Weiter gehen – Handheld-End-to-End-Projekt

Ihre neugierige Natur macht Lust auf mehr? Wir empfehlen Ihnen, sich unsere anzuschauen Geführtes Projekt: „Hauspreisvorhersage zum Anfassen – Maschinelles Lernen in Python“.

Implementieren anderer SVM-Varianten mit Pythons Scikit-Learn PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

In diesem geführten Projekt lernen Sie, wie Sie leistungsstarke traditionelle maschinelle Lernmodelle sowie Deep-Learning-Modelle erstellen, Ensemble Learning verwenden und Meta-Lernende schulen, um Immobilienpreise anhand einer Reihe von Scikit-Learn- und Keras-Modellen vorherzusagen.

Unter Verwendung von Keras, der Deep-Learning-API, die auf Tensorflow aufbaut, experimentieren wir mit Architekturen, bauen ein Ensemble aus gestapelten Modellen auf und trainieren a Meta-Lerner neuronales Netzwerk (Level-1-Modell), um den Preis eines Hauses zu ermitteln.

Deep Learning ist erstaunlich – aber bevor Sie darauf zurückgreifen, sollten Sie auch versuchen, das Problem mit einfacheren Techniken zu lösen, z. B. mit seichtes Lernen Algorithmen. Unsere Basisleistung basiert auf a Random-Forest-Regression Algorithmus. Darüber hinaus untersuchen wir die Erstellung von Ensembles von Modellen durch Scikit-Learn mithilfe von Techniken wie z Absacken und Abstimmung.

Dies ist ein End-to-End-Projekt, und wie alle Machine Learning-Projekte beginnen wir mit – mit Explorative Datenanalyse, Gefolgt von Datenvorverarbeitung und schlussendlich Flach bauen und Deep-Learning-Modelle um die Daten anzupassen, die wir zuvor untersucht und bereinigt haben.

Zusammenfassung

In diesem Artikel haben wir eine kurze Zusammenfassung von SVMs erstellt, uns mit dem Kernel-Trick befasst und verschiedene Arten von nichtlinearen SVMs implementiert.

Ich schlage vor, dass Sie jeden Kernel implementieren und weitermachen. Sie können die Mathematik untersuchen, die verwendet wurde, um jeden der verschiedenen Kernel zu erstellen, warum sie erstellt wurden und die Unterschiede in Bezug auf ihre Hyperparameter. Auf diese Weise lernen Sie die Techniken kennen und erfahren, welche Art von Kernel je nach Kontext und verfügbaren Daten am besten anzuwenden ist.

Ein klares Verständnis dafür zu haben, wie jeder Kernel funktioniert und wann er verwendet werden sollte, wird Ihnen auf Ihrer Reise definitiv helfen. Lassen Sie uns wissen, wie die Fortschritte verlaufen und viel Spaß beim Programmieren!

Zeitstempel:

Mehr von Stapelmissbrauch