SVM-Hyperparameter verstehen

SVM-Hyperparameter verstehen

Einleitung

Dieser Leitfaden ist der zweite Teil von drei Leitfäden zu Support Vector Machines (SVMs). In diesem Leitfaden werden wir weiter am Anwendungsfall für gefälschte Banknoten arbeiten, verstehen, welche SVM-Parameter bereits von Scikit-learn festgelegt werden, was C- und Gamma-Hyperparameter sind und wie sie mithilfe von Kreuzvalidierung und Rastersuche optimiert werden können.

In der vollständigen Reihe von SVM-Leitfäden lernen Sie neben SVM-Hyperparametern auch etwas über einfache SVM, ein Konzept namens Kernel-Trick, und erkunden Sie andere Arten von SVMs.

Wenn Sie alle Leitfäden lesen möchten, schauen Sie sich den ersten Leitfaden an oder sehen Sie, welche Sie am meisten interessieren. Nachfolgend finden Sie eine Tabelle mit Themen, die in den einzelnen Leitfäden behandelt werden:

  1. Implementieren von SVM und Kernel-SVM mit Scikit-Learn von Python
  • Anwendungsfall: Banknoten vergessen
  • Hintergrund von SVMs
  • Einfaches (lineares) SVM-Modell
    • Über den Datensatz
    • Importieren des Datensatzes
    • Exploring das Dataset
  • Implementieren von SVM mit Scikit-Learn
    • Aufteilen von Daten in Trainings-/Testsätze
    • Das Modell trainieren
    • Vorhersagen treffen
    • Bewertung des Modells
    • Ergebnisse interpretieren

2. SVM-Hyperparameter verstehen

  • Der C-Hyperparameter
  • Der Gamma-Hyperparameter

3. Implementieren anderer SVM-Varianten mit Scikit-Learn von Python (kommt bald!)

  • Die allgemeine Idee von SVMs (eine Zusammenfassung)
  • Kernel (Trick) SVM
  • Implementieren von nichtlinearer Kernel-SVM mit Scikit-Learn
  • Bibliotheken importieren
    • Importieren des Datensatzes
    • Aufteilen von Daten in Merkmale (X) und Ziel (y)
    • Aufteilen von Daten in Trainings-/Testsätze
    • Training des Algorithmus
  • Polynomialer Kern
    • Vorhersagen treffen
    • Bewertung des Algorithmus
  • Gaußscher Kernel
    • Vorhersage und Bewertung
  • Sigmoider Kernel
    • Vorhersage und Bewertung
  • Vergleich der nichtlinearen Kernelleistungen

Lassen Sie uns lernen, wie man eine Kreuzvalidierung implementiert und eine Hyperparameter-Abstimmung durchführt.

SVM-Hyperparameter

Um alle bereits von Scikit-learn eingestellten Modellparameter und ihre Standardwerte anzuzeigen, können wir die verwenden get_params() Verfahren:

svc.get_params()

Diese Methode zeigt Folgendes an:

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

Beachten Sie, dass bereits insgesamt 15 Hyperparameter festgelegt sind, da der SVM-Algorithmus viele Variationen aufweist. Wir haben den linearen Kern verwendet, um eine lineare Funktion zu erhalten, aber es gibt auch Kerne, die andere Arten von Funktionen beschreiben, und diese Kerne werden auf unterschiedliche Weise parametrisiert.

Diese Variationen machen das Modell flexibler und geeigneter, um eine Trennung zwischen verschiedenen Formen von Daten zu finden. Wenn wir eine Linie ziehen können, um unsere Klassen zu trennen, dann a linearer Kernel wird eine gute Option sein, wenn wir eine Kurve brauchen, dann a Polynom Kernel könnte die beste Wahl sein, wenn unsere Daten kreisförmige Formen haben, dann a Radialbasisfunktion or RBF Kernel passt besser zu den Daten, wenn es Werte über und unter einem Schwellenwert gibt, a Sigmoid Kernel könnte die Klassen besser trennen. Aus dem, was wir in unseren Daten untersucht haben, scheint es, dass entweder ein RBF oder ein Polynomkern geeigneter wäre als ein linearer Kern.

Nachdem wir nun eine Vorstellung davon haben, dass es 4 Arten von verschiedenen Kernelfunktionen gibt, können wir zu den Parametern zurückkehren. Wenn der SVM-Algorithmus versucht, eine Trennung zwischen Klassen zu finden, haben wir bereits verstanden, dass er eine Klassifizierung erstellt Marge zwischen den Stützvektoren und der Trennlinie (oder Kurve).

Dieser Rand ist gewissermaßen wie ein Puffer zwischen der Trennlinie und den Punkten. Die Randgröße kann variieren, wenn der Rand ist kleinere, gibt es weniger Platz für Punkte, die außerhalb des Rands liegen, wodurch die Trennung zwischen den Klassen klarer wird, sodass mehr Proben vorhanden sind richtig klassifiziert, umgekehrt, wenn die Marge ist größer, die Trennung zwischen den Klassen ist weniger klar, und es können mehr Proben sein falsch klassifiziert. Mit anderen Worten, ein kleinerer Spielraum bedeutet korrekter klassifizierte Proben und auch mehr starr Klassifikator, während ein größerer Spielraum mehr falsch klassifizierte Proben anzeigt, aber mehr flexibel Klassifizierer.

Wenn diese Ränder ausgewählt werden, ist der Parameter, der sie bestimmt, der C Parameters.

Der C-Hyperparameter

Das C Parameter ist umgekehrt proportional zur Randgröße, das bedeutet, dass die größer der Wert C, der kleinere die Marge und umgekehrt die kleinere der Wert C, der größer der Abstand. Der C -Parameter zusammen mit jedem Kernel verwendet werden kann, teilt er dem Algorithmus mit, um wie viel eine Fehlklassifizierung jedes Trainingsmusters vermieden werden soll, weshalb er auch als bezeichnet wird Regulierung. Unsere lineare Kernel-SVM hat a verwendet C von 1.0, was a ist grosse Wert und gibt a kleiner Rand.

SVM-Hyperparameter verstehen PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Wir können mit a experimentieren kleinere Wert von 'C' und verstehen in der Praxis, was mit a passiert größere Marge. Dazu erstellen wir einen neuen Klassifikator, svc_c, und ändern Sie nur den Wert von C zu 0.0001. Wiederholen wir auch die fit und predict Schritte:

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

Jetzt können wir uns die Ergebnisse für die Testdaten ansehen:

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

Dies gibt aus:

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

SVM-Hyperparameter verstehen PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Durch die Verwendung eines kleineren C und einen größeren Spielraum zu erhalten, ist der Klassifikator flexibler geworden und weist mehr Klassifikationsfehler auf. Im Klassifizierungsbericht können wir sehen, dass die f1-score, zuvor 0.99 für beide Klassen, ist auf 0.88 für Klasse 0 und auf 0.84 für Klasse 1 gesunken. In der Konfusionsmatrix ging das Modell von 2 auf 6 falsch positive Ergebnisse und von 2 auf 31 falsch negative Ergebnisse.

Wir können das auch wiederholen predict Schritt und sehen Sie sich die Ergebnisse an, um zu prüfen, ob bei der Verwendung von Zugdaten immer noch eine Überanpassung vorliegt:

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

Das führt zu:

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

SVM-Hyperparameter verstehen PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Betrachtet man die Ergebnisse mit einem kleineren C und Zugdaten können wir sehen, dass sich die Überanpassung verbessert hat, aber da die meisten Metriken für Zugdaten immer noch höher sind, scheint es, dass die Überanpassung nicht gelöst wurde. Also einfach wechseln C -Parameter nicht ausreichte, um das Modell flexibler zu machen und seine Verallgemeinerung zu verbessern.

Note: Der Versuch, ein Gleichgewicht zwischen einer Funktion zu finden, die zu weit von den Daten entfernt ist, zu fest ist oder zu stark ist hohe Vorspannung oder es ist das Gegenteil, eine Funktion, die zu nahe an den Daten liegt, zu flexibel ist oder eine hat hohe Varianz wird üblicherweise als bezeichnet Bias-Varianz-Kompromiss. Das Finden dieses Gleichgewichts ist nicht trivial, aber wenn es erreicht ist, gibt es keine Unter- oder Überanpassung des Modells an die Daten. Um die Varianz zu reduzieren und eine Überanpassung zu verhindern, können die Daten gleichmäßig verkleinert werden, um sie regelmäßiger und einfacher zu machen, wenn eine Funktion erhalten wird, die sie beschreibt. Das ist der Parameter C tut, wenn es in SVM verwendet wird, deshalb wird es auch genannt L2-Regularisierung or Ridge-Regression.

Bis zu diesem Punkt haben wir die Margen in SVM verstanden und wie sie sich auf das Gesamtergebnis des Algorithmus auswirken, aber wie sieht es mit der Linie (oder Kurve) aus, die die Klassen trennt? Diese Linie ist die Entscheidungsgrenze. Da wir bereits wissen, dass die Margen einen Einfluss auf die Flexibilität der Entscheidungsgrenze gegenüber Fehlern haben, können wir uns jetzt einen weiteren Parameter ansehen, der sich ebenfalls auf die Entscheidungsgrenze auswirkt.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Note: Die Entscheidungsgrenze kann auch als a bezeichnet werden Hyperebene. Eine Hyperebene ist ein geometrisches Konzept, das sich auf die Anzahl der Dimensionen eines Raums minus eins (dims-1) bezieht. Wenn der Raum zweidimensional ist, z. B. eine Ebene mit x- und y-Koordinaten, sind die eindimensionalen Linien (oder Kurven) die Hyperebenen. Da die Anzahl der im Modell verwendeten Spalten seine Ebenendimensionen sind, finden wir im Kontext des maschinellen Lernens, wenn wir mit 2 Spalten und einem SVM-Klassifikator arbeiten, eine dreidimensionale Hyperebene, die zwischen den Klassen trennt.

Der Gamma-Hyperparameter

Es können unendliche Entscheidungsgrenzen gewählt werden, einige dieser Grenzen werden die Klassen trennen und andere nicht. Sollten bei der Auswahl einer effektiven Entscheidungsgrenze die ersten 10 nächstgelegenen Punkte jeder Klasse berücksichtigt werden? Oder sollten mehr Punkte berücksichtigt werden, einschließlich der weit entfernten Punkte? In SVM wird diese Auswahl des Bereichs durch einen anderen Hyperparameter definiert, gamma.

Like C, gamma ist etwas umgekehrt proportional zu seiner Entfernung. Der höher sein Wert, der Am nächsten sind die Punkte, die für die Entscheidungsgrenze betrachtet werden, und die niedrigste gamma, der weiter Punkte werden auch für die Wahl der Entscheidungsgrenze berücksichtigt.

SVM-Hyperparameter verstehen PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Eine weitere Auswirkung von Gamma ist, dass je höher sein Wert ist, desto näher der Umfang der Entscheidungsgrenze an die Punkte um ihn herum rückt, wodurch er gezackter und anfälliger für Überanpassung wird – und je niedriger sein Wert, desto glatter und regelmäßiger ist die Entscheidungsgrenze Die Oberfläche wird auch weniger anfällig für Überanpassung. Dies gilt für jede Hyperebene, kann jedoch leichter beobachtet werden, wenn Daten in höheren Dimensionen getrennt werden. In manchen Dokumentationen gamma kann auch bezeichnet werden als sigma.

SVM-Hyperparameter verstehen PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Bei unserem Modell beträgt der Standardwert von gamma wurde scale. Wie es in der zu sehen ist Scikit-learn SVC-Dokumentation, es bedeutet, dass sein Wert ist:

$$
gamma = (1/ text{n_features} * X.var())
$$

or

$$
gamma = (1/ text{number_of_features} * text{features_variance})
$$

In unserem Fall müssen wir die Varianz von berechnen X_train, multipliziere es mit 4 und dividiere das Ergebnis durch 1. Wir können dies mit dem folgenden Code tun:

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

Dies gibt aus:

gamma: 0.013924748072859962

Es gibt auch eine andere Möglichkeit, den Wert von zu betrachten gamma, indem auf das Objekt des Klassifikators zugegriffen wird gamma Parameter mit ._gamma:

svc._gamma 

Wir können sehen, dass die gamma in unserem Klassifikator verwendet wurde, war niedrig, sodass auch weiter entfernte Punkte berücksichtigt wurden.

Note: Wie wir gesehen haben, C und gamma sind wichtig für einige Definitionen des Modells. Ein weiterer Hyperparameter, random_state, wird in Scikit Learn oft verwendet, um Daten-Shuffling oder einen zufälligen Seed für Modelle zu garantieren, sodass wir immer die gleichen Ergebnisse haben, aber das ist bei SVMs etwas anders. Besonders die random_state hat nur Auswirkungen, wenn ein anderer Hyperparameter, probability, ist auf wahr gesetzt. Dies liegt daran, dass die Daten gemischt werden, um Wahrscheinlichkeitsschätzungen zu erhalten. Wenn wir keine Wahrscheinlichkeitsschätzungen für unsere Klassen wünschen und die Wahrscheinlichkeit auf „false“ gesetzt ist, werden SVMs random_state Parameter hat keine Auswirkungen auf die Modellergebnisse.

Es gibt keine Regel zur Auswahl von Werten für Hyperparameter wie C und Gamma – es hängt davon ab, wie lange und welche Ressourcen zum Experimentieren mit verschiedenen Hyperparameterwerten verfügbar sind, welche Transformationen an den Daten vorgenommen werden können und welche Ergebnisse erwartet werden . Die übliche Art, nach den Hyperparameterwerten zu suchen, besteht darin, jeden der vorgeschlagenen Werte durch a zu kombinieren Rastersuche zusammen mit einer Prozedur, die diese Hyperparameterwerte anwendet und Metriken für verschiedene Teile der aufgerufenen Daten erhält Kreuzvalidierung. In Scikit-learn ist dies bereits als implementiert GridSearchCV (Lebenslauf aus Kreuzvalidierung) Methode.

Um eine Rastersuche mit Kreuzvalidierung durchzuführen, müssen wir die importieren GridSearchCV, definieren Sie ein Wörterbuch mit den Werten von Hyperparametern, mit denen experimentiert wird, z. B. den Typ von kernel, der Bereich für CUnd für gamma, erstellen Sie eine Instanz der SVC, definiere das score oder Metrik wird zur Bewertung verwendet (hier entscheiden wir uns, sowohl die Genauigkeit als auch den Abruf zu optimieren, also verwenden wir f1-score), die Anzahl der Unterteilungen, die in den Daten zum Ausführen der Suche vorgenommen werden cv – Der Standardwert ist 5, aber es ist eine gute Praxis, mindestens 10 zu verwenden – hier verwenden wir 5 Datenfaltungen, um es beim Vergleich der Ergebnisse klarer zu machen.

Das GridSearchCV hat eine fit Methode, die unsere Zugdaten empfängt und sie weiter in Zug- und Testsätze für die Kreuzvalidierung aufteilt. Wir können einstellen return_train_score auf true setzen, um die Ergebnisse zu vergleichen und sicherzustellen, dass keine Überanpassung vorliegt.

Dies ist der Code für die Rastersuche mit Kreuzvalidierung:

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

Dieser Code gibt aus:

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

Nachdem wir die Hyperparametersuche durchgeführt haben, können wir die verwenden best_estimator_, best_params_ und best_score_ Eigenschaften, um das beste Modell, die besten Parameterwerte und den höchsten f1-Wert zu erhalten:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

Das führt zu:

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

Unsere anfängliche Vermutung aus der Betrachtung der Daten bestätigend, hat das beste Modell keinen linearen Kern, sondern einen nichtlinearen, RBF.

Hinweis: Bei weiteren Untersuchungen ist es interessant, dass Sie mehr nichtlineare Kernel in die Gittersuche einbeziehen.

Beide C und gamma den Wert 1 haben, und die f1-score ist sehr hoch, 0.99. Da der Wert hoch ist, sehen wir uns an, ob es eine Überanpassung gab, indem wir einen Blick auf die durchschnittlichen Test- und Trainingsergebnisse werfen, die wir zurückgegeben haben cv_results_ Objekt:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

Die Durchschnittsnoten waren:

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

Wenn wir uns die Durchschnittswerte ansehen, können wir sehen, dass der höchste Wert, 0.99791667, zweimal vorkommt, und in beiden Fällen war der Wert in den Zugdaten 1. Dies zeigt an, dass die Überanpassung anhält. Von hier aus wäre es interessant, zur Datenaufbereitung zurückzukehren und zu verstehen, ob es sinnvoll ist, die Daten zu normalisieren, eine andere Art der Datentransformation durchzuführen und auch neue Features mit Feature Engineering zu erstellen.

Wir haben gerade eine Technik gesehen, um die Modell-Hyperparameter zu finden, und wir haben bereits etwas über lineare Trennbarkeit, Unterstützungsvektoren, Entscheidungsgrenzen, Maximierung von Rändern und Kernel-Tricks erwähnt. SVM ist ein komplexer Algorithmus, normalerweise mit vielen mathematischen Konzepten und kleinen anpassbaren Teilen, die angepasst werden müssen, um als Ganzes zusammenzukommen.

Lassen Sie uns kombinieren, was wir bisher gesehen haben, fassen wir zusammen, wie alle Teile von SVM funktionieren, und werfen wir dann einen Blick auf einige der anderen Kernel-Implementierungen zusammen mit ihren Ergebnissen.

Zusammenfassung

In diesem Artikel haben wir die Standardparameter hinter der SVM-Implementierung von Scikit-Learn verstanden. Wir haben verstanden, was C- und Gamma-Parameter sind und wie sich die Änderung jedes einzelnen auf das SVM-Modell auswirken kann.

Wir haben auch etwas über die Rastersuche gelernt, um nach den besten C- und Gamma-Werten zu suchen und Kreuzvalidierungen zu verwenden, um unsere Ergebnisse besser zu verallgemeinern und sicherzustellen, dass es keine Form von Datenlecks gibt.

Das Durchführen einer Hyperparameter-Abstimmung mit Rastersuche und Kreuzvalidierung ist eine gängige Praxis in der Datenwissenschaft, daher empfehle ich Ihnen dringend, die Techniken zu implementieren, den Code auszuführen und die Verknüpfungen zwischen den Hyperparameterwerten und den Änderungen in den SVM-Vorhersagen zu sehen.

Zeitstempel:

Mehr von Stapelmissbrauch