Überblick über die Referenzvektormethode des Algorithmus für maschinelles Lernen (SVM)

  • Tutorial

Vorwort




In diesem Artikel werden wir einige Aspekte von SVM untersuchen:

  • theoretische Komponente der SVM;
  • Wie funktioniert der Algorithmus bei Stichproben, die nicht linear in Klassen unterteilt werden können?
  • Beispiel für die Verwendung von Python und Implementierung eines Algorithmus in der SciKit Learn-Bibliothek.

In den folgenden Artikeln werde ich versuchen, über die mathematische Komponente dieses Algorithmus zu sprechen.

Wie Sie wissen, werden maschinelle Lernaufgaben in zwei Hauptkategorien unterteilt: Klassifizierung und Regression. Abhängig davon, vor welcher dieser Aufgaben wir stehen und welchen Datensatz wir für diese Aufgabe haben, wählen wir den zu verwendenden Algorithmus aus.

Die Support Vector Machines Method oder SVM (von der englischen Support Vector Machines) ist ein linearer Algorithmus, der bei Klassifizierungs- und Regressionsproblemen verwendet wird. Dieser Algorithmus ist in der Praxis weit verbreitet und kann sowohl lineare als auch nichtlineare Probleme lösen. Das Wesen der "Maschinen" von Support-Vektoren ist einfach: Der Algorithmus erstellt eine Linie oder Hyperebene, die die Daten in Klassen unterteilt.

Theorie


Die Hauptaufgabe des Algorithmus besteht darin, die korrekteste Linie oder Hyperebene zu finden, wobei die Daten in zwei Klassen unterteilt werden. SVM ist ein Algorithmus, der Daten am Eingang empfängt und eine solche Trennlinie zurückgibt.

Betrachten Sie das folgende Beispiel. Angenommen, wir haben einen Datensatz und möchten die roten Quadrate von den blauen Kreisen klassifizieren und trennen (sagen wir positiv und negativ). Das Hauptziel bei dieser Aufgabe wird es sein, die „ideale“ Linie zu finden, die diese beiden Klassen trennt.



Finden Sie die perfekte Linie oder Hyperebene, die den Datensatz in blaue und rote Klassen unterteilt.

Auf den ersten Blick ist es nicht so schwierig, oder?

Aber wie Sie sehen, gibt es keine eindeutige Linie, die ein solches Problem lösen könnte. Wir können unendlich viele Zeilen aufnehmen, die diese beiden Klassen trennen können. Wie genau findet SVM die "ideale" Linie und was ist in ihrem Verständnis "ideal"?

Schauen Sie sich das folgende Beispiel an und überlegen Sie, welche der beiden Linien (gelb oder grün) die beiden Klassen am besten trennt und zur Beschreibung von „ideal“ passt.



Welche Linie trennt den Datensatz Ihrer Meinung nach besser?

Wenn Sie die gelbe Linie gewählt haben, gratuliere ich Ihnen: Dies ist die Linie, die der Algorithmus wählen würde. In diesem Beispiel können wir intuitiv verstehen, dass die gelbe Linie die beiden Klassen besser trennt und entsprechend klassifiziert als die grüne.

Bei der grünen Linie befindet sie sich zu nahe an der roten Klasse. Obwohl sie alle Objekte des aktuellen Datensatzes korrekt klassifiziert hat, wird eine solche Zeile nicht verallgemeinert - sie verhält sich nicht so gut wie ein unbekannter Datensatz. Die Aufgabe, eine verallgemeinerte Trennung zwischen zwei Klassen zu finden, ist eine der Hauptaufgaben des maschinellen Lernens.

Wie SVM die beste Linie findet


Der SVM-Algorithmus ist so konzipiert, dass er nach Punkten in der Grafik sucht, die sich direkt an der nächstgelegenen Trennlinie befinden. Diese Punkte werden Stützvektoren genannt. Dann berechnet der Algorithmus den Abstand zwischen den Stützvektoren und der Teilungsebene. Dies ist die Distanz, die als Lücke bezeichnet wird. Das Hauptziel des Algorithmus ist es, den Abstand zu maximieren. Die beste Hyperebene wird als eine solche Hyperebene angesehen, für die diese Lücke so groß wie möglich ist.



Ziemlich einfach, oder? Betrachten Sie das folgende Beispiel mit einem komplexeren Datensatz, der nicht linear unterteilt werden kann.



Offensichtlich kann dieser Datensatz nicht linear aufgeteilt werden. Wir können keine gerade Linie zeichnen, die diese Daten klassifizieren würde. Dieser Datensatz kann jedoch linear unterteilt werden, indem eine zusätzliche Dimension hinzugefügt wird, die wir als Z-Achse bezeichnen. Stellen Sie sich vor, die Koordinaten auf der Z-Achse unterliegen der folgenden Einschränkung:

$ z = x² + y² $


Somit wird die Ordinate Z vom Quadrat des Abstandes des Punktes zum Beginn der Achse dargestellt.
Das Folgende ist eine Visualisierung desselben Datensatzes auf der Z-Achse.



Jetzt können die Daten linear geteilt werden. Angenommen, die Magentalinie trennt die Daten z = k, wobei k eine Konstante ist. Wenn

$ z = x² + y² $

dann

$ k = x² + y² $

- Kreisformel. Auf diese Weise können wir unseren linearen Teiler mit dieser Transformation auf die ursprüngliche Anzahl von Probendimensionen zurückprojizieren.



Als Ergebnis können wir einen nichtlinearen Datensatz klassifizieren, indem wir ihm eine zusätzliche Dimension hinzufügen und ihn dann mithilfe einer mathematischen Transformation in seine ursprüngliche Form zurückversetzen. Es ist jedoch nicht bei allen Datensätzen genauso einfach, eine solche Transformation in Gang zu setzen. Glücklicherweise löst die Implementierung dieses Algorithmus in der sklearn-Bibliothek dieses Problem für uns.

Hyperebene


Nachdem wir uns mit der Logik des Algorithmus vertraut gemacht haben, fahren wir mit der formalen Definition einer Hyperebene fort:

Eine Hyperebene ist eine n-1-dimensionale Unterebene in einem n-dimensionalen euklidischen Raum, der den Raum in zwei separate Teile unterteilt.

Stellen Sie sich zum Beispiel vor, dass unsere Linie als eindimensionaler euklidischer Raum dargestellt wird (d. H. Unser Datensatz liegt auf einer geraden Linie). Wählen Sie einen Punkt auf dieser Linie. Dieser Punkt teilt den Datensatz, in unserem Fall die Linie, in zwei Teile. Die Linie hat einen Takt und der Punkt hat 0 Takte. Daher ist ein Punkt eine Hyperebene einer Linie.

Für den zweidimensionalen Datensatz, den wir zuvor getroffen haben, war die Trennlinie dieselbe Hyperebene. Einfach ausgedrückt, für einen n-dimensionalen Raum gibt es eine n-1-dimensionale Hyperebene, die diesen Raum in zwei Teile unterteilt.

CODE

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])

Punkte werden als Array von X und die Klassen, zu denen sie gehören, als Array von y dargestellt.
Jetzt werden wir unser Modell mit diesem Beispiel trainieren. In diesem Beispiel setze ich den linearen Parameter des "Core" -Klassifikators (Kernel).

from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf = SVC.fit(X, y)

Klassenvorhersage eines neuen Objekts

prediction = clf.predict([[0,6]])

Parametereinstellung


Parameter sind die Argumente, die Sie beim Erstellen des Klassifikators übergeben. Im Folgenden habe ich einige der wichtigsten benutzerdefinierten SVM-Parameter aufgeführt:

„C“ Mit

diesem Parameter können Sie die feine Linie zwischen „Glätte“ und der Genauigkeit der Klassifizierung von Objekten im Trainingssatz anpassen. Je höher der C-Wert, desto mehr Trainingsmusterobjekte werden korrekt klassifiziert.



In diesem Beispiel gibt es mehrere Entscheidungsschwellen, die wir für diese bestimmte Stichprobe definieren können. Beachten Sie die direkte Entscheidungsschwelle (in der Grafik als grüne Linie dargestellt). Es ist ganz einfach, und aus diesem Grund wurden mehrere Objekte falsch klassifiziert. Diese falsch klassifizierten Punkte werden in den Daten als Ausreißer bezeichnet.

Wir können die Parameter auch so einstellen, dass wir am Ende eine stärker gekrümmte Linie (hellblaue Entscheidungsschwelle) erhalten, die absolut alle Trainingsmusterdaten korrekt klassifiziert. In diesem Fall sind die Chancen, dass unser Modell neue Daten verallgemeinern und gleich gute Ergebnisse liefern kann, natürlich katastrophal gering. Wenn Sie also versuchen, beim Training des Modells Genauigkeit zu erzielen, sollten Sie direkt auf etwas Gleichmäßigeres zielen. Je höher die "C" -Nummer, desto stärker ist die Hyperebene in Ihrem Modell verwickelt, desto höher ist jedoch die Anzahl der korrekt klassifizierten Objekte im Trainingssatz. Daher ist es wichtig, die Modellparameter für einen bestimmten Datensatz zu „verdrehen“, um eine Umschulung zu vermeiden und gleichzeitig eine hohe Genauigkeit zu erzielen.

Gamma

In der offiziellen Dokumentation der SciKit Learn-Bibliothek heißt es, dass das Gamma bestimmt, inwieweit jedes der Elemente im Datensatz einen Einfluss auf die Bestimmung der „Ideallinie“ hat. Je niedriger das Gamma, desto mehr Elemente, auch diejenigen, die weit genug von der Trennlinie entfernt sind, nehmen an der Auswahl dieser Linie teil. Wenn das Gamma hoch ist, "verlässt" sich der Algorithmus nur auf die Elemente, die der Linie selbst am nächsten sind.
Wenn der Gammapegel zu hoch eingestellt ist, nehmen nur die Elemente, die der Linie am nächsten liegen, am Entscheidungsprozess an der Position der Linie teil. Dies hilft dabei, Ausreißer in den Daten zu ignorieren. Der SVM-Algorithmus ist so konzipiert, dass die Punkte, die am nächsten beieinander liegen, bei der Entscheidungsfindung mehr Gewicht haben. Mit der richtigen Einstellung von „C“ und „Gamma“ kann jedoch ein optimales Ergebnis erzielt werden, das eine linearere Hyperebene erzeugt, die Ausreißer ignoriert und daher verallgemeinerbar ist.

Fazit


Ich hoffe aufrichtig, dass dieser Artikel Ihnen geholfen hat, die Grundlagen der Arbeit von SVM oder der Referenzvektormethode zu verstehen. Ich erwarte von Ihnen Kommentare und Ratschläge. In nachfolgenden Veröffentlichungen werde ich auf die mathematische Komponente von SVM und Optimierungsprobleme eingehen.

Quellen:
Offizielle SVM-Dokumentation in SciKit Learn TowardsDataScience-
Blog
Siraj Raval: Unterstützung für Vector Machines Einführung
in den Udacity-Kurs zum maschinellen Lernen Video zu SVM: Gamma
Wikipedia: SVM

Jetzt auch beliebt: