Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 158
Nichtlineare SVM-Klassifikation
ОглавлениеAuch wenn lineare SVM-Klassifikatoren sehr effizient sind und in vielen Fällen überraschend gut funktionieren, sind viele Datensätze nicht einmal annähernd linear separierbar. Eine Möglichkeit zum Umgang mit nichtlinearen Datensätzen ist das Hinzufügen zusätzlicher Merkmale, wie etwa polynomielle Merkmale (wie in Kapitel 4); in manchen Fällen erhalten Sie dabei einen linear separierbaren Datensatz. Betrachten Sie das Diagramm auf der linken Seite von Abbildung 5-5: Es stellt einen einfachen Datensatz mit einem einzigen Merkmal x1 dar. Dieser Datensatz ist, wie Sie sehen, nichtlinear separierbar. Wenn Sie aber ein zweites Merkmal x2 = (x1)2 hinzufügen, ist der sich dabei ergebende zweidimensionale Datensatz ausgezeichnet linear separierbar.
Abbildung 5-5: Hinzufügen von Merkmalen, um einen linear separierbaren Datensatz zu erhalten
Dieser Ansatz lässt sich mit Scikit-Learn umsetzen, indem Sie eine Pipeline erstellen, die aus einem PolynomialFeatures-Transformer (wie in »Polynomielle Regression« besprochen) und anschließend einem StandardScaler sowie einem LinearSVC besteht. Probieren wir dies anhand des Datensatzes moons aus. Dabei handelt es sich um einen Spieldatensatz, bei dem die Datenpunkte als zwei ineinander verschränkte Halbkreise geformt sind (siehe Abbildung 5-6). Sie können diesen Datensatz mit der funktion make_moons() erzeugen:
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
X, y = make_moons(n_samples=100, noise=0.15)
polynomial_svm_clf = Pipeline([
("poly_features", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge"))
])
polynomial_svm_clf.fit(X, y)
Abbildung 5-6: Linearer SVM-Klassifikator mit polynomiellen Merkmalen