Dieses Mal möchte ich ein Modell für maschinelles Lernen unter Verwendung einer Support-Vektor-Maschine zusammenfassen. Der Umriss ist unten.
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.
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).
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()
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()
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.
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.
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.
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.
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)
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}
$ \ Bf x $ ist die Eingabefunktion und $ \ bf c $ ist das Zentrum der Gaußschen Funktion.
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()
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.
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