Eine Support Vector Machine ist ein lineares maschinelles Lernmodell für Klassifizierungs- und Regressionsprobleme. Erfahren Sie, wie es funktioniert und wie Sie es in Python implementieren.
Support Vector Machine (SVM) ist ein lineares Modell für Klassifizierungs- und Regressionsprobleme . Ein Support Vector Machine-Algorithmus erstellt eine Linie oder eine Hyperebene, die Daten in Klassen unterteilt. Er kann lineare und nichtlineare Probleme lösen und eignet sich gut für viele praktische Herausforderungen.
Ich werde einen Überblick über SVMs geben. Ich werde über die Theorie hinter SVMs, ihre Anwendung für nichtlinear trennbare Datensätze und die Implementierung von SVMs in Python sprechen .
Was ist eine Support Vector Machine?
SVMs finden eine Trennlinie (oder Hyperebene) zwischen Daten zweier Klassen. Dabei handelt es sich um einen Algorithmus, der die Daten als Eingabe verwendet und eine Linie ausgibt, die diese Klassen, wenn möglich, trennt.
Angenommen, Sie haben einen Datensatz wie unten dargestellt und müssen die roten Rechtecke von den blauen Ellipsen klassifizieren, also die positiven von den negativen. Ihre Aufgabe besteht darin, eine Ideallinie zu finden, die diesen Datensatz in zwei Klassen trennt, rot und blau.
Nicht zu anspruchsvoll, oder?
Es gibt jedoch keine eindeutige Linie, die diese Aufgabe erfüllt. Tatsächlich gibt es unendlich viele Linien, die diese beiden Klassen trennen können. Wie findet SVM also die ideale Linie?
Lassen Sie uns einige mögliche Kandidaten untersuchen und es selbst herausfinden.
Wir haben hier zwei Kandidaten, die grün gefärbte Linie und die gelb gefärbte Linie. Welche Linie trennt Ihrer Meinung nach die Daten am besten?
Wenn Sie die gelbe Linie ausgewählt haben, dann herzlichen Glückwunsch, denn das ist die Linie, nach der wir suchen. In diesem Fall ist es visuell recht intuitiv, dass die gelbe Linie besser klassifiziert. Aber wir brauchen etwas Konkretes, um unsere Linie zu fixieren.
Die grüne Linie im Bild oben liegt recht nah an der roten Klasse. Obwohl sie den Datensatz klassifiziert, handelt es sich nicht um eine verallgemeinerte Linie, und beim maschinellen Lernen besteht unser Ziel darin, einen verallgemeinerten Separator zu erhalten.
Wie Support Vector Machines die optimale Hyperebene finden
Gemäß dem SVM-Algorithmus finden wir die Punkte, die der Linie aus beiden Klassen am nächsten liegen. Diese Punkte werden Support-Vektoren genannt. Nun berechnen wir den Abstand zwischen der Linie und den Support-Vektoren. Dieser Abstand wird als Rand bezeichnet. Unser Ziel ist es, den Rand zu maximieren. Die Hyperebene, für die der Rand maximal ist, ist die optimale Hyperebene.
SVM versucht, eine Entscheidungsgrenze so zu erstellen, dass die Trennung zwischen den beiden Klassen, dieser Straße, so groß wie möglich ist.
Scheint einfach, oder? Betrachten wir einen komplexeren Datensatz, der nicht linear trennbar ist.
Wie Support Vector Machines eine Hyperebene in höheren Dimensionen berechnen
Diese Daten sind eindeutig nicht linear trennbar. Wir können keine gerade Linie zeichnen, die diese Daten klassifizieren könnte. Aber die Daten können in einer höheren Dimension in linear trennbare Daten umgewandelt werden. Fügen wir eine weitere Dimension hinzu und nennen sie eine Z-Achse. Die Koordinaten auf der Z-Achse unterliegen der Einschränkung: z = x²+y².
Grundsätzlich ist die Z-Koordinate das Quadrat der Entfernung des Punkts vom Ursprung. Lassen Sie uns die Daten auf der Z-Achse darstellen.
Jetzt sind die Daten linear trennbar. Die violette Linie, die die Daten in einer höheren Dimension trennt, sei z=k, wobei k eine Konstante ist. Da , z=x²+y²erhalten wir x² + y² = k, was eine Kreisgleichung ist. Daher können wir diesen linearen Separator mithilfe dieser Transformation aus einer höheren Dimension zurück auf seine ursprünglichen Dimensionen projizieren.
Wir können Daten klassifizieren, indem wir ihnen eine zusätzliche Dimension hinzufügen, sodass sie linear trennbar werden, und dann die Entscheidungsgrenze mithilfe einer mathematischen Transformation auf die ursprünglichen Dimensionen zurückprojizieren. Aber die richtige Transformation für einen bestimmten Datensatz zu finden, ist nicht so einfach. Glücklicherweise können wir für diese Aufgabe Kernels in der SVM-Implementierung von Sklearn verwenden.
Was ist eine Hyperebene in einer Support Vector Machine?
Eine Hyperebene in einem n-dimensionalen euklidischen Raum ist eine flache, n-1-dimensionale Teilmenge dieses Raums, die den Raum in zwei getrennte Teile teilt.
Nehmen wir beispielsweise an, eine Linie sei unser eindimensionaler euklidischer Raum, unsere Datensätze liegen auf einer Linie. Wählen Sie nun einen Punkt auf der Linie, dieser Punkt teilt die Linie in zwei Teile. Die Linie hat eine Dimension, während der Punkt null Dimensionen hat. Ein Punkt ist also eine Hyperebene der Linie.
Bei zwei Dimensionen haben wir gesehen, dass die Trennlinie die Hyperebene ist. Ähnlich verhält es sich bei drei Dimensionen: Eine Ebene mit zwei Dimensionen teilt den 3D-Raum in zwei Teile und fungiert als Hyperebene. Bei einem Raum mit n Dimensionen haben wir eine Hyperebene mit n-1 Dimensionen, die ihn in zwei Teile teilt creative director.
So implementieren Sie Support Vector Machine in Python
Wir haben unsere Punkte in X und die Klassen, zu denen sie gehören, in Y. Jetzt trainieren wir unser SVM-Modell mit dem obigen Datensatz. Für dieses Beispiel habe ich einen linearen Kernel verwendet.
So sagen Sie die Klasse eines neuen Datensatzes voraus:
So legen Sie Tuning-Parameter für die Support Vector Machine fest
Parameter sind Argumente, die Sie beim Erstellen Ihres Klassifikators übergeben. Die folgenden Parameter sind für SVM wichtig:
1. Legen Sie den Wert für C fest
Es steuert den Kompromiss zwischen glatten Entscheidungsgrenzen und der korrekten Klassifizierung von Trainingspunkten. Ein großer Wert von c bedeutet, dass Sie mehr Trainingspunkte richtig erhalten.
Glatte Entscheidungsgrenze vs. korrekte Klassifizierung aller Punkte
Betrachten Sie die obige Abbildung. Es gibt eine Reihe von Entscheidungsgrenzen, die wir für diesen Datensatz ziehen können. Eine gerade, grün gefärbte Entscheidungsgrenze ist recht einfach, geht jedoch mit der Fehlklassifizierung einiger Punkte einher. Diese Fehlklassifizierungen werden als Ausreißer bezeichnet.
Wir können auch etwas wesentlich Wellenförmigeres erstellen, die himmelblau gefärbte Entscheidungsgrenze, die alle Trainingspunkte enthält. Der Nachteil bei etwas so Kompliziertem und Verwickeltem wie diesem ist natürlich, dass es sich nicht ganz so gut auf unseren Testsatz verallgemeinern lässt. Wenn Sie also auf Genauigkeit achten, kann etwas Einfacheres und Geradlinigeres tatsächlich die bessere Wahl sein. Ein großer c-Wert bedeutet, dass Sie beim Versuch, alle Punkte unterzubringen, kompliziertere Entscheidungskurven erhalten. Herauszufinden, wie sehr Sie eine glatte Entscheidungsgrenze im Vergleich zu einer Genauigkeit wünschen, ist Teil der Kunst des maschinellen Lernens. Probieren Sie also verschiedene c-Werte für Ihren Datensatz aus, um die perfekt ausgeglichene Kurve zu erhalten und eine Überanpassung zu vermeiden.
2. Stellen Sie den Wert für Gamma ein
Dies definiert, wie weit der Einfluss eines einzelnen Trainingsbeispiels reicht. Ein niedriger Wert bedeutet, dass jeder Punkt eine große Reichweite hat, während ein hoher Gammawert bedeutet, dass jeder Punkt eine geringe Reichweite hat.
Wenn Gamma einen sehr hohen Wert hat, hängt die Entscheidungsgrenze nur von den Punkten ab, die sehr nahe an der Linie liegen, was dazu führt, dass einige der Punkte ignoriert werden, die sehr weit von der Entscheidungsgrenze entfernt sind. Dies liegt daran, dass die näheren Punkte mehr Gewicht erhalten und eine wellige Kurve entsteht, wie in der vorherigen Grafik dargestellt. Wenn der Gammawert hingegen niedrig ist, erhalten selbst die weit entfernten Punkte beträchtliches Gewicht und wir erhalten eine linearere Kurve.
Ich hoffe, dieser Blogbeitrag hat zum Verständnis von SVMs beigetragen