[PYTHON] Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).

Einführung

Dieses Mal möchte ich ein Modell für maschinelles Lernen unter Verwendung einer Support-Vektor-Maschine zusammenfassen. Der Umriss ist unten.

Verstehen Sie das Konzept der Support-Vektor-Maschinen

Die Suppurt Vector Machine ist einer der Algorithmen für maschinelles Lernen, die das Modell basierend auf einem Kriterium namens "Margin Maximization" optimieren.

Abgesehen von der logistischen Regression hat es die Eigenschaft, dass eine nichtlineare Darstellung möglich ist. Diese Support-Vektor-Maschine ist ein beliebter Algorithmus (wie), da sie praktisch und einfach zu handhaben ist.

In einigen Fällen wird es als Support ** Vector ** Maschine übersetzt. Dies ist wahrscheinlich auf den Unterschied bei der Übersetzung des Vektors als "Vektor" oder "Vektor" zurückzuführen.

Was ist Unterstützungsvektor- und Randmaximierung?

Lassen Sie mich nun die Worte erklären. Der Rand ist der Abstand zwischen dem Element (△, ▲), das dem Trennzeichen am nächsten liegt (Linienformat: $ w ^ Tx + b $), das wie in der folgenden Abbildung dargestellt identifiziert wird. Und dieses Element mit dem engsten Abstand wird als Unterstützungsvektor bezeichnet.

Das Maximieren des Abstands dieses Randes ist die Optimierung dieser Unterstützungsvektormaschine (im Folgenden als SVM abgekürzt).

image.png

Versuchen Sie es mit einem nichtlinearen SVM-Klassifikator, der auf dem MakeMoons-Dataset basiert

Lineare Klassifikatoren eignen sich gut für Daten mit leicht zu trennenden Merkmalen wie den oben genannten. In der Praxis erfordern sie jedoch häufig sehr komplexe Unterteilungen. In diesem Fall müssen Sie einen nichtlinearen Klassifikator verwenden. Mit SVM ist es möglich, auf einfache Weise einen nichtlinearen Klassifikator zu erstellen und zu verwenden.

Das MakeMoons-Dataset ist ein Beispiel für eine SVM-Analyse. Dies ist ein Modul, das aus dem unten gezeigten Scicit-Lerndatensatz importiert werden kann. Sie können sogenannte mondförmige Daten zeichnen. Klassifizieren wir dies durch nichtlineare SVM.

SVM.ipynb


from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)

def plot_dataset(X, y, axes):
    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")
    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")
    plt.axis(axes)
    plt.grid(True, which='both')
    plt.xlabel(r"$x_1$", fontsize=20)
    plt.ylabel(r"$x_2$", fontsize=20, rotation=0)

plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.show()

010.png

SVM-Klassifikator mit polymorphen Kernen unterschiedlicher Dimensionen

In SVM stellt der Gradwert eine Dimension dar, und die Leistung des Klassifizierers ändert sich abhängig von diesem Dimensionswert.

SVM.ipynb


from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC

poly_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    ])
poly_kernel_svm_clf.fit(X, y)

poly100_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="poly", degree=12, coef0=100, C=5))
    ])
poly100_kernel_svm_clf.fit(X, y)

plt.figure(figsize=(11, 4))

plt.subplot(121)
plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r"$d=3, r=1, C=5$", fontsize=18)

plt.subplot(122)
plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r"$d=12, r=100, C=5$", fontsize=18)

plt.show()

011.png

Im obigen Beispiel zeigt die linke Abbildung ein dreidimensionales Beispiel und die rechte Abbildung ein 12-dimensionales Beispiel. Bei 12 Dimensionen befindet es sich in einem Zustand des Überlernens. In diesem Fall ist es daher erforderlich, die Reihenfolge des Modells zu verringern. Im Gegenteil, wenn Sie es auf 2 Dimensionen absenken, können Sie sehen, dass es nicht wie in der folgenden Abbildung gezeigt klassifiziert werden kann.

012.png

Verstehe die Pipeline des Scikit-Lernens

Eine Methode namens Pipeline, die im obigen Programm veröffentlicht wurde, wurde veröffentlicht, daher werde ich sie kurz beschreiben. Eine detaillierte Vorverarbeitung wie die Verarbeitung fehlender Werte und die Standardisierung von Werten sind erforderlich, um eine Modellvorhersage beim maschinellen Lernen durchzuführen. Derzeit ist die Pipeline von sklearn eine Methode, mit der diese Probleme bis zu einem gewissen Grad gelöst werden können.


"scaler", StandardScaler()#Standardisieren Sie den Wert (= subtrahieren Sie durch Durchschnitt und dividieren Sie durch Varianz)
"svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)#Stellen Sie den SVM-Klassifikator ein

Ich verstehe, dass es sich um die Verarbeitung handelt, die ich als Modell kompilieren möchte.

Probieren Sie den Gauss RBF Kernel aus

Jetzt werden wir eine der SVM-Klassifizierungsmethoden verwenden, die als Gauss RBF-Kernelmethode bezeichnet wird. Alle Wörter waren schwer zu verstehen, daher möchte ich die Bedeutung jedes Wortes verstehen.

Was ist eine Kernelfunktion?

Zunächst zu den Kernelfunktionen. Dies ist eine sehr wichtige Funktion für die nichtlineare Darstellung, die ich zuvor im MakeMoons-Beispiel leichtfertig verwendet habe. Wie in der folgenden Abbildung dargestellt, wird der Prozess, der eine Ebene haben kann, die durch Erhöhen der Dimensionen linear getrennt werden kann (in der Praxis wird er als Superebene bezeichnet, da er drei oder mehr Dimensionen hat) **, als Kernelfunktion bezeichnet. Anruf.

image.png

Die Regression mit dieser Kernelfunktion wird als Kernelregression bezeichnet. Die Formel, die die Kernel-Regression ausdrückt, lautet wie folgt.

f({\bf x}) = \sum_{i=1}^{N} \alpha_i k({\bf x}^{(i)}, {\bf x})

$ \ Alpha_i $ ist der Koeffizient, den Sie optimieren möchten, und $ k ({\ bf x} ^ {(i)}, {\ bf x}) $ wird als Kernelfunktion bezeichnet. Es gibt verschiedene Arten dieser Kernelfunktion. Das Folgende ist eine davon, eine Kernelfunktion, die als Gaußscher Kernel bezeichnet wird.

k({\bf x}, {\bf x}') = exp(-\beta \|{\bf x} - {\bf x}'\|^2)

||x-x'||Ist Norm: Zeigt die Entfernung an.\betaIst\beta>0Es ist ein echter Hyperparameter, der erfüllt und von der Person bestimmt wird, die das Modell verwendet.

Was ist RBF?

Es heißt Radial Basis Function und auf Japanisch Radial Basis Function. Es scheint verschiedene Funktionen zu geben, die zu diesem RBF werden, aber die am häufigsten verwendete heißt Gauß-Funktion.

φ(\bf x)=(\bf x - \bf c)^T \frac {(\bf x - \bf c)}{2σ^2}

001.jpg

$ \ Bf x $ ist die Eingabefunktion und $ \ bf c $ ist das Zentrum der Gaußschen Funktion.

Lassen Sie uns implementieren

SVM.ipynb


from sklearn.svm import SVC

gamma1, gamma2 = 0.1, 5
C1, C2 = 0.001, 1000
hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)

svm_clfs = []
for gamma, C in hyperparams:
    rbf_kernel_svm_clf = Pipeline([
            ("scaler", StandardScaler()),
            ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))
        ])
    rbf_kernel_svm_clf.fit(X, y)
    svm_clfs.append(rbf_kernel_svm_clf)

plt.figure(figsize=(11, 11))

for i, svm_clf in enumerate(svm_clfs):
    plt.subplot(221 + i)
    plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])
    plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
    gamma, C = hyperparams[i]
    plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)

plt.show()

013.png

Es ist notwendig, sowohl γ als auch C als Hyperparameter zu bestimmen, aber es ist ersichtlich, dass ein Überlernen auftritt, wenn die Werte für jeden zu groß sind.

Am Ende

Während SVM ein sehr einfach zu verwendendes Modell ist, ist die dahinter stehende mathematische Theorie sehr tiefgreifend.

Diesmal habe ich auf diesen Artikel verwiesen.

Lineare Methode und Kernel-Methode (Regressionsanalyse) https://qiita.com/wsuzume/items/09a59036c8944fd563ff

Das vollständige Programm ist hier gespeichert. https://github.com/Fumio-eisan/SVM_20200417

Recommended Posts

Ich habe versucht, die Support-Vektor-Maschine sorgfältig zu verstehen (Teil 1: Ich habe den Polynom / RBF-Kernel am Beispiel von MakeMoons ausprobiert).
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Verstehen Sie die Funktion der Faltung am Beispiel der Bildverarbeitung
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Ich habe versucht, von Postman aus mit Cisco Guest Shell als API-Server zu arbeiten
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
Es war schwierig, Kernel-Tricks in Support-Vektor-Maschinen zu verstehen (Teil 2: Kernel-Regression, Ridge-Regression usw.)
[Git] Ich habe versucht, anhand eines konkreten Beispiels zu verstehen, wie man Git Stash verwendet.
Ich möchte ssh mit dem Befehl expected automatisieren! Teil 2
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
(Python) Erwarteter Wert ・ Ich habe versucht, die Monte-Carlo-Probenahme sorgfältig zu verstehen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, den auf Papier gestempelten Stempel mit OpenCV zu digitalisieren
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen