Tutorial Support Vektor Maschine (SVM) -->

Advertisement

Tutorial Support Vektor Maschine (SVM)

Minggu, 07 Oktober 2018

Nachdem das Statsbot-Team den Artikel über die Erkennung von Zeitreihenanomalien veröffentlicht hatte, baten uns viele Leser, ihnen von dem Support Vector Machines-Ansatz zu erzählen. Es ist Zeit aufzuholen und Ihnen SVM ohne harte Mathematik vorzustellen und nützliche Bibliotheken und Ressourcen zu teilen, um Ihnen den Einstieg zu erleichtern.
Wenn Sie maschinelles Lernen zur Klassifizierung verwendet haben, haben Sie vielleicht von Support Vector Machines (SVM) gehört. Vor etwas mehr als 50 Jahren eingeführt, haben sie sich im Laufe der Zeit weiterentwickelt und wurden auch an verschiedene andere Probleme wie Regression, Ausreißeranalyse und Ranking angepasst.
SVMs sind ein beliebtes Werkzeug im Arsenal vieler maschineller Lernpraktiker. Bei [24] 7 verwenden wir sie auch, um eine Vielzahl von Problemen zu lösen.
In diesem Beitrag werden wir versuchen, ein hohes Verständnis dafür zu erlangen, wie SVMs funktionieren. Ich konzentriere mich auf die Entwicklung von Intuition statt auf Strenge. Das bedeutet im Wesentlichen, dass wir so viel wie möglich von der Mathematik weglassen und eine starke Intuition des Arbeitsprinzips entwickeln.
Das Problem der KlassifizierungSagen Sie, es gibt einen Kurs zum maschinellen Lernen (ML), der an Ihrer Universität angeboten wird. Die Kursleiter haben beobachtet, dass die Schüler das Beste daraus machen, wenn sie in Mathe oder Statistik gut sind. Im Laufe der Zeit haben sie die Noten der eingeschriebenen Studenten in diesen Fächern aufgezeichnet. Außerdem haben sie für jeden dieser Schüler ein Etikett, das ihre Leistung im ML-Kurs darstellt: "Gut" oder "Schlecht".




Jetzt wollen sie die Beziehung zwischen Math und Stats Scores und die Leistung im ML-Kurs bestimmen. Vielleicht möchten sie basierend auf dem, was sie finden, eine Voraussetzung für die Aufnahme in den Kurs angeben.
Wie würden sie damit umgehen? Beginnen wir mit der Darstellung der Daten, die sie haben. Wir könnten eine zweidimensionale Zeichnung zeichnen, in der eine Achse die Punkte in Mathe repräsentiert, während die andere die Punkte in der Statistik darstellt. Ein Schüler mit bestimmten Punkten wird als Punkt in der Grafik angezeigt.
Die Farbe des Punktes - grün oder rot - stellt dar, wie er auf dem ML-Kurs war: "Gut" oder "Schlecht".
So könnte eine solche Handlung aussehen:
Wenn ein Schüler eine Einschreibung anfordert, bitten unsere Ausbilder sie, ihre Math- und Stats-Punkte anzugeben. Basierend auf den Daten, die sie bereits haben, würden sie eine fundierte Vermutung über ihre Leistung im ML-Kurs machen.
Was wir im Wesentlichen wollen, ist eine Art "Algorithmus", in den Sie das "Score-Tupel" des Formulars eingeben (math_score, stats_score). Es zeigt an, ob der Schüler ein roter oder grüner Punkt auf der Handlung ist (rot / grün ist alternativ als Klasse oder Label bekannt). Und natürlich verkörpert dieser Algorithmus in gewisser Weise die Muster, die in den Daten vorhanden sind, die wir bereits haben, auch bekannt als Trainingsdaten.
In diesem Fall ist es ein guter Algorithmus, eine Linie zu finden, die zwischen den roten und grünen Clustern verläuft und dann bestimmt, auf welcher Seite dieser Linie ein Score-Tupel liegt. Wir nehmen eine Seite - die grüne Seite oder die rote Seite - als einen guten Indikator für ihre wahrscheinliche Leistung im Kurs.
Die Linie hier ist unsere trennende Grenze (weil sie die Etiketten trennt) oder Klassifizierer (wir benutzen sie als Punkte klassifizieren). Die Abbildung zeigt zwei mögliche Klassifikatoren für unser Problem.
Gut gegen schlechte KlassifiziererHier ist eine interessante Frage: Beide Linien oben trennen die roten und grünen Cluster. Gibt es einen guten Grund, sich für einen anderen zu entscheiden?
Denken Sie daran, dass der Wert eines Klassifikators nicht darin liegt, wie gut er die Trainingsdaten trennt. Wir wollen schließlich, dass noch nicht sichtbare Datenpunkte (sogenannte Testdaten) klassifiziert werden. Vor diesem Hintergrund möchten wir eine Linie auswählen, die das allgemeine Muster in den Trainingsdaten erfasst, so dass die Wahrscheinlichkeit gut ist, dass es in den Testdaten gut ankommt.
Die erste Zeile oben scheint ein bisschen "schief" zu sein. In der Nähe der unteren Hälfte scheint sie zu nahe am roten Cluster zu sein, und in ihrer oberen Hälfte läuft sie zu nahe am grünen Cluster. Sicher, es trennt die Trainingsdaten perfekt, aber wenn es einen Testpunkt sieht, der etwas weiter weg von den Clustern ist, besteht eine gute Chance, dass es das Label falsch bekommt.
Die zweite Zeile hat dieses Problem nicht. Betrachten Sie zum Beispiel die Testpunkte, die als Quadrate angezeigt werden, und die Beschriftungen, die von den Klassifizierern in der folgenden Abbildung zugewiesen wurden.


 Die zweite Zeile bleibt so weit wie möglich von beiden Clustern entfernt, während die Trainingsdatentrennung richtig ist. Da es sich in der Mitte der beiden Cluster befindet, ist es weniger "riskant", gibt den Datenverteilungen für jede Klasse sozusagen einen Spielraum und verallgemeinert sich somit gut auf Testdaten.
SVMs versuchen, die zweite Art von Linie zu finden. Wir haben den besseren Klassifikator visuell ausgewählt, aber wir müssen die zugrundeliegende Philosophie etwas genauer definieren, um sie im allgemeinen Fall anzuwenden. Hier ist eine vereinfachte Version von was SVMs tun:
Suchen Sie nach Zeilen, die die Trainingsdaten korrekt klassifizierenWählen Sie unter allen solchen Linien diejenige aus, die den größten Abstand zu den nächstgelegenen Punkten hat.Die nächsten Punkte, die diese Linie identifizieren, werden als Unterstützungsvektoren bezeichnet. Und die Region, die sie um die Linie herum definieren, wird als Marge bezeichnet.
Hier ist die zweite Zeile, die mit den Unterstützungsvektoren gezeigt wird: Punkte mit schwarzen Rändern (es gibt zwei davon) und der Rand (der schattierte Bereich).

Support Vector Machines gibt Ihnen die Möglichkeit, zwischen vielen möglichen Klassifikatoren zu wählen, so dass die Wahrscheinlichkeit, dass Sie Ihre Testdaten korrekt kennzeichnen, höher ist. Ziemlich ordentlich, oder?
Während das obige Diagramm eine Linie und Daten in zwei Dimensionen zeigt, muss angemerkt werden, dass SVMs in einer beliebigen Anzahl von Dimensionen arbeiten können; und in diesen Dimensionen finden sie das Analogon der zweidimensionalen Linie.
Zum Beispiel finden sie in drei Dimensionen eine Ebene (wir werden in Kürze ein Beispiel dafür sehen), und in höheren Dimensionen finden sie eine Hyperebene - eine Verallgemeinerung der zweidimensionalen Linie und der dreidimensionalen Ebene auf eine beliebige Anzahl von Dimensionen.
Daten, die durch eine Linie (oder im Allgemeinen eine Hyperebene) getrennt werden können, sind als linear trennbare Daten bekannt. Die Hyperebene wirkt als linearer Klassifikator.
Erlauben von FehlernWir haben uns den einfachen Fall von perfekt linear trennbaren Daten im letzten Abschnitt angeschaut. Daten aus der realen Welt sind jedoch typischerweise unordentlich. Sie werden fast immer ein paar Instanzen haben, die ein linearer Klassifikator nicht richtig machen kann.
Hier ein Beispiel für solche Daten:

Wenn wir einen linearen Klassifikator verwenden, können wir die Labels natürlich nicht perfekt voneinander trennen. Wir wollen den linearen Klassifikator auch nicht komplett verwerfen, da er bis auf einige fehlerhafte Punkte für das Problem gut geeignet scheint.
Wie gehen SVMs damit um? Sie können angeben, wie viele Fehler Sie akzeptieren möchten.
Sie können Ihrer SVM einen Parameter namens "C" zuweisen. Auf diese Weise können Sie den Kompromiss zwischen folgenden Punkten vorgeben:
Einen großen Spielraum haben.Trainingsdaten richtig klassifizieren. Ein höherer Wert von C bedeutet, dass weniger Fehler in den Trainingsdaten auftreten sollen.Es muss wiederholt werden, dass dies ein Kompromiss ist. Sie erhalten eine bessere Klassifizierung der Trainingsdaten auf Kosten einer großen Marge.
Die folgenden Diagramme zeigen, wie der Klassifikator und der Rand variieren, wenn wir den Wert von C erhöhen (Stützvektoren nicht gezeigt):


Beachten Sie, wie die Linie "kippt", wenn wir den Wert von C erhöhen. Bei hohen Werten versucht sie, die Beschriftungen der meisten roten Punkte unten rechts auf den Plots aufzunehmen. Dies ist wahrscheinlich nicht das, was wir für Testdaten wollen. Die erste Kurve mit C = 0,01 scheint den allgemeinen Trend besser zu erfassen, obwohl sie im Vergleich zu höheren Werten für C eine geringere Genauigkeit der Trainingsdaten aufweist.
Und da dies ein Kompromiss ist, beachten Sie, wie die Breite der Marge schrumpft, wenn wir den Wert von C erhöhen.Im vorherigen Beispiel war die Marge ein "Niemandsland" für Punkte. Hier sehen wir, dass es nicht mehr möglich ist, sowohl eine gute Trenngrenze als auch einen zugehörigen punktfreien Rand zu haben. Einige Punkte kriechen in den Rand.
Ein wichtiges praktisches Problem besteht darin, sich für einen guten Wert von C zu entscheiden. Da Daten aus der realen Welt fast nie sauber getrennt werden können, kommt dieser Bedarf häufig vor. Wir verwenden typischerweise eine Technik wie die Kreuzvalidierung, um einen guten Wert für C auszuwählen.
Nicht linear trennbare DatenWir haben gesehen, wie Support Vector Machines systematisch perfekt / fast linear trennbare Daten handhaben. Wie geht es mit den Fällen um, in denen die Daten absolut nicht linear trennbar sind? Schließlich fallen viele reale Daten in diese Kategorie. Sicherlich kann das Finden einer Hyperebene nicht mehr funktionieren. Dies scheint bedauerlich zu sein, da SVMs bei dieser Aufgabe hervorragend sind.
Hier ist ein Beispiel für nicht linear trennbare Daten (dies ist eine Variante des berühmten XOR-Datasets), die mit dem linearen Klassifikator SVMs gefunden werden:

Du würdest zustimmen, dass das nicht gut aussieht. Wir haben nur 75% Genauigkeit bei den Trainingsdaten - das bestmögliche mit einer Linie. Und mehr noch, die Linie kommt einigen Daten sehr nahe. Die beste Genauigkeit ist nicht groß, und um dorthin zu kommen, überspannt die Linie fast ein paar Punkte.
Wir müssen es besser machen.
Hier kommt einer meiner Lieblingssachen über SVM ins Spiel. Das haben wir bisher: Wir haben eine Technik, die wirklich gut darin ist, Hyperebenen zu finden. Aber dann haben wir auch Daten, die nicht linear trennbar sind. Also, was machen wir? Projiziere die Daten in einen Raum, in dem sie linear trennbar ist und finde eine Hyperebene in diesem Raum!
Ich werde diese Idee Schritt für Schritt illustrieren.