Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow. Aurélien Géron
den Kerneltrick unterstützt.2 Die zeitliche Komplexität liegt meist zwischen O(m2 × n) und O(m3 × n). Leider bedeutet dies, dass der Algorithmus bei großen Trainingsdatensätzen (z.B. Hunderttausenden von Datenpunkten) unsäglich langsam wird. Dieser Algorithmus ist bestens für komplexe, aber kleine und mittelgroße Trainingsdatensätze geeignet. Er skaliert jedoch gut mit der Anzahl Merkmale, insbesondere bei dünn besetzten Merkmalen (wenn also jeder Datenpunkt nur wenige Merkmale ungleich null aufweist). In diesem Fall skaliert der Algorithmus in etwa mit der durchschnittlichen Anzahl von Nicht-null-Merkmalen pro Datenpunkt. Tabelle 5-1 vergleicht die Klassen zur SVM-Klassifikation in Scikit-Learn miteinander.
Tabelle 5-1: Vergleich der Klassen zur SVM-Klassifikation in Scikit-Learn
SVM-Regression
Wie bereits erwähnt, ist der SVM-Algorithmus recht flexibel: Er ermöglicht nicht nur die lineare und nichtlineare Klassifikation, sondern auch die lineare und nichtlineare Regression. Um SVMs zur Regression statt zur Klassifikation zu verwenden, wird ein umgekehrtes Ziel verfolgt: Anstatt die breitestmögliche Straße zwischen zwei Kategorien zu fitten und Verletzungen dieser Grenze zu minimieren, versucht die SVM-Regression, so viele Datenpunkte wie möglich auf der Straße zu platzieren und Grenzverletzungen (diesmal Datenpunkte abseits der Straße) zu minimieren. Die Breite der Straße wird über den Hyperparameter ε gesteuert. Abbildung 5-10 zeigt zwei lineare SVM-Regressionsmodelle, die mit zufälligen linearen Daten trainiert wurden, das eine mit breitem Margin (ε = 1,5) und das andere mit schmalem Margin (ε = 0,5).
Das Hinzufügen von weiteren Trainingsdatenpunkten innerhalb des Margins beeinflusst die Vorhersagen des Modells nicht; man bezeichnet dieses Modell daher als ε-insensitiv.
Abbildung 5-10: SVM-Regression
Sie können die lineare SVM-Regression mit der Scikit-Learn-Klasse LinearSVR durchführen. Der folgende Code erstellt das auf der linken Seite von Abbildung 5-10 dargestellte Modell (die Trainingsdaten müssen dazu skaliert und zentriert sein):
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)
Zum Bearbeiten nichtlinearer Regressionsaufgaben können Sie ein Kernel-SVM-Modell verwenden. Beispielsweise zeigt Abbildung 5-11 eine SVM-Regression mit einem polynomiellen Kernel 2. Grades auf einem zufälligen quadratischen Trainingsdatensatz. Im linken Diagramm gibt es wenig Regularisierung (ein großer Wert für C) und im rechten Diagramm sehr viel mehr Regularisierung (ein kleiner Wert für C).
Abbildung 5-11: SVM-Regression mit einem polynomiellen Kernel 2. Grades
Der folgende Code erstellt das auf der linken Seite von Abbildung 5-11 dargestellte Modell. Dazu wird die Scikit-Learn-Klasse SVR verwendet (die den Kerneltrick unterstützt).
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)
Die Klasse SVR ist das Pendant zur Klasse SVC für Regressionsaufgaben, und die Klasse LinearSVR ist das Pendant zur Klasse LinearSVC. Die Klasse LinearSVR skaliert linear mit der Größe des Trainingsdatensatzes (wie die Klasse LinearSVC), die Klasse SVR wird dagegen mit einem wachsenden Trainingsdatensatz sehr langsam (wie die Klasse SVC).
|
SVMs lassen sich auch zum Erkennen von Ausreißern einsetzen; Details dazu finden Sie in der Dokumentation zu Scikit-Learn. |
Hinter den Kulissen
In diesem Abschnitt erklären wir, wie SVMs Vorhersagen treffen und wie ihr Trainingsalgorithmus funktioniert. Wir beginnen mit linearen SVM-Klassifikatoren. Wenn Sie Machine Learning einfach nur ausprobieren möchten, können Sie diesen Abschnitt ruhig überspringen, mit den Übungen am Ende des Kapitels weitermachen und hierher zurückkehren, sobald Sie SVMs besser verstehen möchten.
Zu Beginn müssen wir einige Schreibweisen klären: In Kapitel 4 haben wir alle Modellparameter im Vektor θ platziert, darunter den Bias-Term θ0 und die Gewichte der Eingabemerkmale θ1 bis θn und haben allen Datenpunkten die Bias-Eingabe x0 = 1 hinzugefügt. In diesem Kapitel werden wir eine andere, bei SVMs bequemere (und üblichere) Notation verwenden: Den Bias-Term bezeichnen wir als b und den Vektor mit den Gewichten der Merkmale als w. Wir müssen diesmal zum Merkmalsvektor kein Bias-Merkmal hinzufügen.
Entscheidungsfunktion und Vorhersagen
Der lineare SVM-Klassifikator sagt die Kategorie eines neuen Datenpunkts x vorher, indem er einfach die Entscheidungsfunktion wTx + b = w1 x1 + … + wn xn + b berechnet: Ist das Ergebnis positiv, wird als Ergebnis ŷ die positive Kategorie (1) vorhergesagt, andernfalls die negative Kategorie (0); siehe Formel 5-2.
Formel 5-2: Vorhersage eines linearen SVM-Klassifikators
Abbildung 5-12 zeigt die Entscheidungsfunktion, die dem Modell auf der linken Seite von Abbildung 5-4 entspricht: Es ist eine zweidimensionale Ebene, da dieser Datensatz zwei Merkmale besitzt (Breite und Länge der Kronblätter). Die Entscheidungsgrenze ist die Menge aller Punkte, bei denen die Entscheidungsfunktion gleich 0 ist: Sie ist die Schnittmenge zweier Ebenen und damit eine Gerade (als dicke durchgezogene Linie dargestellt).3
Abbildung 5-12: Entscheidungsfunktion für den Iris-Datensatz
Die gestrichelten Linien stehen für Punkte, bei denen die Entscheidungsfunktion 1 oder –1 beträgt: Sie befinden sich parallel und im gleichen Abstand zur Entscheidungsgrenze und bilden einen Rand (Margin) um sie herum. Beim Trainieren eines linearen SVM-Klassifikators wird nach einem Wert für w und b gesucht, für den dieser Margin so breit wie