[PYTHON] Was passiert, wenn ich die Hyperparameter von SVM (RBF-Kernel) ändere?

Überblick

SVM (Support Vector Machine) ist als maschinelles Lernverfahren mit hoher Klassifizierungsgenauigkeit bekannt. Für eine höhere Klassifizierungsgenauigkeit in SVM müssen Hyperparameter aus Trainingsdaten bestimmt werden. In diesem Artikel werde ich erklären, wie sich die Entscheidungsgrenze durch Anpassen der Hyperparameter von SVM unter Verwendung des RBF-Kernels (Gaußscher Kernel) ändert.

Hyperparameter zu entscheiden

Passen Sie für SVM mit RBF-Kernel die folgenden beiden Hyperparameter an.

Über Kostenparameter

SVM ist eine Methode zum Bestimmen der Superplane, die den Satz von Datenpunkten trennt, die dem Feature-Space zugeordnet sind. Die Menge der Punkte im Feature-Space ist jedoch nicht immer trennbar. In der folgenden Abbildung ist es beispielsweise nicht möglich, eine gerade Linie zu zeichnen, die die beiden Symboltypen perfekt voneinander trennt. na.PNG

Betrachten wir nun eine Fehlklassifizierung, zeichnen Sie eine gerade Linie und teilen Sie die Punktmenge. Zeichnen Sie beispielsweise in der vorherigen Abbildung eine gerade Linie, wie unten gezeigt, um die beiden Symboltypen zu trennen. miss.PNG

Der Kostenparameter $ C $ ist ein Parameter, der bestimmt, wie viel Fehlklassifizierung toleriert wird. $ C $ erscheint in der Gleichung für das von SVM gelöste sekundäre Planungsproblem.

\min_{\beta}\frac{1}{2}\|\beta\|^2+C\sum_{i=1}^{N}\xi_i

Bestimmen Sie die Hyperebene so, dass ein kleineres $ C $ eine Fehlklassifizierung zulässt und ein größeres $ C $ keine Fehlklassifizierung toleriert.

Informationen zu RBF-Kernelparametern

RBF-Kernel-Parameter: $ \ gamma $ wird in der folgenden RBF-Kernelformel angezeigt.

K(x, x')=\exp(-\gamma\|x-x'\|^2)

Wie in dem später beschriebenen Experiment gezeigt wird, ist die Entscheidungsgrenze umso komplexer, je kleiner der Wert von $ \ gamma $ ist, je einfacher die Entscheidungsgrenze ist und je größer der Wert ist.

Experiment

Zeichnen wir eine Entscheidungsgrenze, wenn $ C $ und $ \ gamma $ auf Extremwerte gesetzt sind. $ C $ wurde auf $ 2 ^ {-5} $ und $ 2 ^ {15} $ gesetzt, und $ \ gamma $ wurde auf $ 2 ^ {-15} $ bzw. $ 2 ^ 3 $ gesetzt. Verwenden Sie die in scikit-learn (0.15) implementierte SVM. (Intern [LIBSVM](http: // www. csie.ntu.edu.tw/~cjlin/libsvm/) wird verwendet.) Verwenden Sie iris für den Datensatz. iris ist ein Datensatz, der 3 Klassenbeschriftungen und 4 Funktionen enthält. Dieses Mal werden nur 2 Klassenbeschriftungen und 2 Funktionen verwendet. Um das Problem zu erschweren, fügen wir jeder der beiden Funktionen Rauschen hinzu.

Quellcode

# -*- coding: utf-8 -*-

import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
from itertools import product

if __name__ == '__main__':
    iris = datasets.load_iris()
    #Die ersten beiden Funktionen,Verwenden Sie die ersten beiden Klassenbezeichnungen
    X = iris.data[:100, :2]
    #Fügen Sie Funktionen Rauschen hinzu
    E = np.random.uniform(0, 1.0, size=np.shape(X))
    X += E
    y = iris.target[:100]
    #Maschenschrittgröße
    h = 0.02
    #Kostenparameter
    Cs = [2 ** -5, 2 ** 15]
    #RBF-Kernelparameter
    gammas = [2 ** -15, 2 ** 3]
    
    svms = [svm.SVC(C=C, gamma=gamma).fit(X, y) for C, gamma in product(Cs, gammas)]
    titles = ["C: small, gamma: small", "C: small, gamma: large",
        "C: large, gamma: small", "C: large, gamma: large"]
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    
    for i, clf in enumerate(svms):
        plt.subplot(2, 2, i + 1)
        plt.subplots_adjust(wspace=0.4, hspace=0.4)
        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
        Z = Z.reshape(xx.shape)
        plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
        plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
        plt.xlabel("Sepal length")
        plt.ylabel("Sepal width")
        plt.xlim(xx.min(), xx.max())
        plt.ylim(yy.min(), yy.max())
        plt.xticks(())
        plt.yticks(())
        plt.title(titles[i])
    plt.show()

Ausführungsergebnis

plot.png

Die horizontale Achse und die vertikale Achse repräsentieren jeweils zwei Merkmalsgrößen. Wenn $ C $ klein ist, gibt es viele Fehlklassifizierungspunkte im Entscheidungsbereich, während wenn $ C $ groß ist, es nur wenige Fehlklassifizierungspunkte im Entscheidungsbereich gibt. Die Entscheidungsgrenze, wenn $ \ gamma $ klein ist, ist eine einfache Entscheidungsgrenze (gerade Linie), während die Entscheidungsgrenze, wenn $ \ gamma $ groß ist, eine komplizierte Form hat.

Andere

Das Anpassen von $ C $ und $ \ gamma $ scheint bei Verwendung eines linearen Kernels etwas Ähnliches wie die Entscheidungsgrenzen zu ergeben. Wenn Sie sich über die Kernelauswahl nicht sicher sind, scheint es in Ordnung zu sein, wenn Sie den RBF-Kernel verwenden, aber es wird einige Zeit dauern, bis die Parameter eingestellt sind. (´ ・ ω ・ `)

Recommended Posts

Was passiert, wenn ich die Hyperparameter von SVM (RBF-Kernel) ändere?
Was für ein Kernel ist dieser Kernel?
Was passiert, wenn ich die Hyperparameter von SVM (RBF-Kernel) ändere?
Machen wir einen Jupyter-Kernel
Was ich getan habe, um Python-Speicher zu speichern
Was tun, wenn ein PermissionError in tempfile.mkstemp auftritt?
[Frage] Was passiert, wenn Sie% in Python verwenden?
Ich habe beim Clustering mit k-means versagt, aber was soll ich tun (Implementierung des Kernels k-means)
Verändert TensorFlow das Bild des tiefen Lernens? Was ich dachte, nachdem ich ein wenig berührt hatte
Was passiert, wenn ein Amateur 100 Sprachverarbeitungsklopfen ausführt?
Überprüfen Sie im Voraus, was passiert, wenn der Befehl ausgeführt wird
Was ich bei der Analyse der Daten des Ingenieurmarktes gesehen habe
Ändern Sie das Thema von Jupyter
Wenn ich die virtuelle Umgebung von conda starte, bricht die Eingabeaufforderung von bash zusammen
Ich habe es herausgefunden, indem ich die Bewertungen der Website für Jobwechsel analysiert habe! ??
Animieren Sie, was im Frequenzraum passiert, wenn die Nyquist-Frequenz überschritten wird
Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Ändern Sie den Hintergrund von Ubuntu (GNOME)
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
H29.2.27 ~ 3.5 Zusammenfassung meiner Arbeit
Ändern Sie das Suffix von django-filter / DateFromToRangeFilter
Was ich getan habe, um die Luftfeuchtigkeit und Temperatur des Archivs zu verfolgen
Wenn Sie den HTTP-Header des Testclients von Flask ändern möchten
Eine Erinnerung an das, was ich beim Starten von Atcoder mit Python feststeckte