Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 157
Soft-Margin-Klassifikation
ОглавлениеWenn wir voraussetzen, dass sich sämtliche Datenpunkte abseits der Straße und auf der richtigen Straßenseite befinden, nennt man dies Hard-Margin-Klassifikation. Bei der Hard-Margin-Klassifikation treten aber zwei Probleme auf: Erstens funktioniert sie nur, wenn die Daten linear separierbar sind. Zweitens ist sie recht anfällig für Ausreißer. Abbildung 5-3 zeigt den Iris-Datensatz mit nur einem zusätzlichen Ausreißer: Auf der linken Seite ist das Finden eines strengen Margins unmöglich, auf der rechten führt der zusätzliche Punkt zu einer deutlich anderen Trennlinie als der in Abbildung 5-1 ohne den Ausreißer, und das Modell verallgemeinert deshalb nicht so gut.
Abbildung 5-3: Anfälligkeit der Hard-Margin-Klassifikation für Ausreißer
Um diesen Schwierigkeiten aus dem Weg zu gehen, ist ein etwas flexibleres Modell vorzuziehen. Dabei gilt es, eine gute Balance zwischen der größtmöglichen Straßenbreite und einer begrenzten Anzahl von Margin-Verletzungen (also Datenpunkten, die mitten auf der Straße oder sogar auf der falschen Seite landen) herzustellen. Dies bezeichnet man als Soft-Margin-Klassifikation.
Beim Erstellen eines SVM-Modells mit Scikit-Learn können wir eine Reihe von Hyperparametern angeben. C ist einer davon. Setzen wir ihn auf einen niedrigen Wert, landen wir bei dem Modell, das in Abbildung 5-4 links zu sehen ist. Mit einem hohen Wert erhalten wir das Modell auf der rechten Seite. Verletzungen des Margins sind schlecht. Es ist im Allgemeinen besser, nur wenige von ihnen zu haben. In diesem Fall besitzt das Modell auf der linken Seite viele Verletzungen des Margins, wird aber vermutlich besser verallgemeinern.
Abbildung 5-4: Breiterer Margin (links) gegenüber weniger Margin-Verletzungen (rechts)
Wenn Ihr SVM-Modell overfittet, können Sie es durch Senken des C-Werts regularisieren. |
Das folgende Codebeispiel mit Scikit-Learn lädt den Iris-Datensatz, skaliert die Merkmale und trainiert anschließend ein lineares SVM-Modell (mithilfe der Klasse LinearSVC und C=1 sowie der in Kürze erklärten Funktion Hinge Loss), um Blumen der Art Iris virginica zu erkennen:
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)] # Länge, Breite der Kronblätter
y = (iris["target"] == 2).astype(np.float64) # Iris virginica
svm_clf = Pipeline([
("scaler", StandardScaler()),
("linear_svc", LinearSVC(C=1, loss="hinge")),
])
svm_clf.fit(X, y)
Das dabei erhaltene Modell sehen Sie auf der linken Seite von Abbildung 5-4.
Anschließend können Sie mit dem Modell wie bisher Vorhersagen vornehmen:
>>> svm_clf.predict([[5.5, 1.7]])
array([1.])
Im Gegensatz zu Klassifikatoren, die mit der logistischen Regression arbeiten, geben SVM-Klassifikatoren keine Wahrscheinlichkeiten für die einzelnen Kategorien aus. |
Statt der Klasse LinearSVC könnten Sie auch die Klasse SVC mit einem linearen Kernel verwenden. Beim Erstellen des SVC-Modells würden wir SVC(kernel="linear", C=1) schreiben. Eine weitere Möglichkeit bietet die Klasse SGDClassifier mit SGD Classifier(loss="hinge", alpha=1/(m*C)). Diese verwendet das stochastische Gradientenverfahren (siehe Kapitel 4), um einen linearen SVM-Klassifikator zu trainieren. Sie konvergiert nicht so schnell wie die Klasse LinearSVC, ist dafür aber beim Verarbeiten riesiger Datenmengen, die sich nicht im Speicher unterbringen lassen (Out-of-Core-Training), sowie bei Online-Klassifikationsaufgaben nützlich.
Die Klasse LinearSVC regularisiert den Bias-Term, daher sollten Sie den Trainingsdatensatz durch Subtrahieren des Mittelwerts zunächst zentrieren. Dies geschieht automatisch, wenn Sie die Daten mit dem StandardScaler skalieren. Außerdem sollten Sie dafür sorgen, dass der Hyperparameter loss auf "hinge" gesetzt ist, da dies nicht der Standardeinstellung entspricht. Um schließlich eine kürzere Rechenzeit zu erreichen, sollten Sie den Hyperparameter dual auf False setzen, es sei denn, es gibt mehr Merkmale als Trainingsdatenpunkte (wir werden uns in diesem Kapitel noch mit Dualität beschäftigen). |