[PYTHON] [Maschinelles Lernen] SVM sowohl aus Scikit-Lernen als auch aus Mathematik verstehen

1. Zweck

Wenn Sie maschinelles Lernen ausprobieren möchten, kann jeder Scicit-Learn usw. verwenden, um es relativ einfach zu implementieren. Um jedoch Ergebnisse bei der Arbeit zu erzielen oder Ihr Niveau zu verbessern Sie können sehen, dass es in der Erklärung von "Ich kenne den Hintergrund nicht, aber ich habe dieses Ergebnis erhalten." Deutlich schwach ist.

Der Zweck dieses Artikels ist es, "zuerst zu versuchen, scicit-learn zu verwenden, weil die Theorie gut ist" in 2-3 und "den Hintergrund aus der Mathematik zu verstehen" in 4 und später.

2. Was ist SVM (Support Vector Machine)?

SVM ist ein Modell, das zur Klassifizierung und Regression als überwachtes Lernen verwendet werden kann. Und da es ein Gerät gibt, mit dem eine hohe Unterscheidungsleistung für nicht gelernte Daten erzielt werden kann, weist es eine hervorragende Erkennungsleistung auf. Quelle: [Wikipedia] (https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3)

Grob gesagt ist ** es tendenziell ein sehr genaues Modell, wenn neue Daten erhalten werden **.

◆ Spezifisches Beispiel

Angenommen, Sie sind Präsident einer Eventplanungsfirma. Angenommen, Sie planen eine Tour, um "seltene Katzen" als Reaktion auf den jüngsten Katzenboom (eine fiktive Kulisse) zu sehen.

キャプチャ1.PNGキャプチャ2.PNG

Da es zu viele Kandidaten für den Tourort gibt, haben Sie Daten für seltene Katzen (= A) und sogenannte normale Katzen (= B) gesammelt. Basierend auf diesen Daten werden wir ein Modell erstellen, das bestimmen kann, ob es sich um eine seltene Katze handelt, indem wir zukünftig Daten zu "Körpergröße" und "Bartlänge" eingeben, und uns auf den Ort konzentrieren, an dem festgestellt wurde, dass es eine seltene Katze gibt. Ich werde einen Plan machen.

Die Verteilung der Daten ist wie folgt.

◆ Was ist SVM?

Welche Art von Grenze wird in der oben gezeigten Verteilung wahrscheinlich zwischen Blau und Orange gezogen? Wie unten gezeigt, können die vorliegenden Daten rote und grüne Ränder enthalten. キャプチャ4.PNG

Nachdem ich nun neue Daten habe, habe ich versucht, diese zusätzlich zu zeichnen. (Daten im orangefarbenen Rahmen) キャプチャ5.PNG

In diesem Fall wird der rote Rand korrekt identifiziert, aber der grüne Rand ist eine seltene Katze (ursprünglich eine normale Katze), sodass es sich um eine falsche Identifizierung handelt.

Um solche Fehleinschätzungen zu vermeiden und den richtigen Klassifizierungsstandard zu finden, verwendet SVM das Konzept ** "Marge maximieren" **. Der Rand bezieht sich auf den Abstand zwischen dem oberen Rand (z. B. rot oder grün) und den tatsächlichen Daten. Die Idee ist, dass bei einem großen Spielraum ** "Fehleinschätzungen aufgrund geringfügiger Datenänderungen" so klein wie möglich gemacht werden können **.

キャプチャ6.PNG

Die Daten in der Nähe der Grenze sind sozusagen Daten, die es schwierig machen, zwischen "seltenen Katzen" und "normalen Katzen" zu unterscheiden. Es wäre ein Problem, wenn es viele subtile Daten gäbe. Wenn Sie also die Grenze so festlegen, dass der Abstand zwischen der Grenze und den Daten so weit wie möglich ist, kann das Risiko einer Fehleinschätzung minimiert werden.

◆ Über die Strafe

Es gibt jedoch nicht viele Grenzen, die alles zu 100% perfekt klassifizieren können. In der realen Welt kommen manchmal Daten wie Ausreißer herein, wie unten gezeigt.

キャプチャ7.PNG

Wenn Sie versuchen, eine Grenze zu zeichnen, die diesen neuen orangefarbenen Punkt genau klassifiziert, können Sie sich vorstellen, dass es sich wahrscheinlich um eine Grenze handelt, die nicht der tatsächlichen Situation entspricht. (Sog. Overlearning)

Um ein Urteil zu fällen, das der tatsächlichen Situation entspricht, erlaubt SVM ** "eine Fehleinschätzung" **.

Es wird im nächsten Scikit-Lernabschnitt erscheinen, aber wie viel Fehlidentifikation ist erlaubt? Tatsächlich müssen wir uns entscheiden, das Modell zu bauen, das wir als "Strafe" bezeichnen.

◆ Um ...

Man kann sagen, dass SVM ein Modell ist, das die folgenden zwei ** "gutes Gefühl" ** realisiert.

・ Um Fehleinschätzungen so weit wie möglich zu vermeiden, versuchen Sie, eine Grenze zu zeichnen, die den Abstand zwischen der Grenze und den Daten, dh dem Rand, maximiert. ・ Es ist jedoch eine Fehleinschätzung zulässig, um eine Grenze zu ziehen, die der tatsächlichen Situation entspricht.

3. SVM mit scicit-learn

(1) Import der erforderlichen Bibliotheken

Importieren Sie Folgendes, um SVM auszuführen.

from sklearn.svm import SVC

#Unten finden Sie eine Bibliothek für Illustrationen, Pandas und Numpy
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

(2) Datenaufbereitung

Stellen Sie die Längen- und Bartdaten sowie die seltene, normale Klassifizierung (Richtig für seltene Katzen, Falsch für normale Katzen) als Daten wie unten gezeigt ein.

data = pd.DataFrame({
        "rare":[True,True,True,True,True,False,False,False,False,False,False,False,False],
        "scale":[20, 25, 30, 24, 28, 35, 40, 38, 55, 50, 60,32,25],
        "hige":[10, 20, 40, 18, 30, 10, 20, 30, 25, 28, 30,18,25],
    })

(3) Versuchen Sie zu veranschaulichen (wichtig)

Ich werde die Länge des Körpers, die Länge des Bartes und die seltene und gewöhnliche Klassifizierung veranschaulichen. Verwenden Sie Scicit-Learn nicht plötzlich, um die Merkmale zu erfassen, sondern versuchen Sie, Daten zu veranschaulichen.

y = data["rare"].values
x1, x2 = data["scale"].values, data["hige"].values 

#Plotdaten
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(x1[y], x2[y], 'o', color='C0', label='rare')#Blauer Punkt: y ist wahr(=Selten)
plt.plot(x1[~y], x2[~y], '^', color='C1', label='normal')#Orange Punkt: y ist falsch(=Gewöhnliche)
plt.xlabel("scale")
plt.ylabel("hige")
plt.legend(loc='best')
plt.show()
キャプチャ8.PNG

Irgendwie scheint die Grenze geschlossen zu sein.

(4) Modellbau

(I) Datenformung

Zunächst werden wir die Form der Daten anordnen, um das Modell zu erstellen.

y = data["rare"].values#Es ist das gleiche wie das oben gezeigte, also können Sie es weglassen.
X = data[["scale", "hige"]].values

Dieses Mal ist es kein Artikel über Python-Grammatik, daher werde ich die Details weglassen, aber ich werde x und y in einer Form für SVM mit Scikit-Learn anordnen.

(Ii) Modellbau

Es ist endlich die Modellbauordnung.

C = 10
clf = SVC(C=C,kernel="linear")
clf.fit(X, y) 

Das war's für ein einfaches Modell. Wir werden ein SVM-Modell in einer Variablen namens clf erstellen! Das Bild ist, dass das clf mit dem vorbereiteten X und y in der nächsten Zeile angepasst (= gelernt) wird.

◆ Über Argumente

Die Hauptargumente beim Erstellen eines SVM-Modells sind $ C $ und Kernel. ** <Über $ C $> ** Ich werde es vorerst versuchen, also werde ich die Details weglassen, aber wenn Sie den Wert von $ C $ reduzieren, wird es ein Modell sein, das eine falsche Identifizierung ermöglicht.

** <Über den Kernel> ** Die Arten von Kerenel sind "linear", "poly", "rbf", "sigmoid" und "vorberechnet". [Offizielle Referenz für Details] (https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)

Hier werden wir "linear" und "rbf" vorstellen. Verwenden Sie linear, um die Grenze linear (Ebene) zu zeichnen, und verwenden Sie rbf (nichtlineare Kernelfunktion), um die Grenze nicht linear zu zeichnen. Das Ergebnis ändert sich je nachdem, welches Sie auswählen.

(5) Veranschaulichen Sie das konstruierte Modell

Lassen Sie uns nun diese Grenze im obigen Streudiagramm veranschaulichen.

fig,ax = plt.subplots(figsize=(6,4))
#Datenpunkte anzeigen
ax.scatter(X[:,0], X[:,1], c=y)
                                                                                                                                                                   
#Ordnen Sie 100 Werte in x-Koordinatenrichtung an
x = np.linspace(np.min(X[:,0]), np.max(X[:,0]), 10)
#Ordnen Sie 100 Werte in y-Koordinatenrichtung an
y = np.linspace(np.min(X[:,1]), np.max(X[:,1]), 10)
#x,Mit der x-Koordinate von 10000 Punkten, die y kombinieren,Array von y-Koordinaten
x_g, y_g = np.meshgrid(x, y)
#np,c_Verbinden Sie die beiden Koordinaten mit,Weitergabe an SVM
z_g = clf.predict(np.c_[x_g.ravel(), y_g.ravel()])
#z_g ist eine Spalte des Arrays, dient jedoch zur Anzeige im Diagramm(100, 100)Kehren Sie zur Form von zurück
z_g = z_g.reshape(x_g.shape)

#Randfärbung
ax.contourf(x_g,y_g,z_g,cmap=plt.cm.coolwarm, alpha=0.8);

#Anzeige am Ende
plt.show()
キャプチャ9.PNG

Infolge der Modellkonstruktion wurde die Grenze wie oben gezeigt geschlossen. Wenn danach neue Daten eingehen, werden sie als normale Katze klassifiziert, wenn sie im blauen Bereich dargestellt werden, und wenn sie im roten Bereich dargestellt werden, werden sie als seltene Katze klassifiziert.

Übrigens, wenn der in (4) ◆ Argumente eingeführte Kernel rbf ist, ist die Grenze wie folgt. キャプチャ10.PNG

Es ist eine ganz andere Grenze! In diesem Fall habe ich das Gefühl, dass linear die Grenzen der Daten besser zeichnet. Verwenden wir also linear für den Kernel.

(6) In der realen Welt ...

Es macht keinen Sinn, ein Modell fertig zu stellen. In der realen Welt ist es wichtig, dieses Vorhersagemodell zu verwenden, um bei der Erfassung neuer Katzendaten zwischen selten und normal zu unterscheiden.

Sie haben zwei andere Arten von Informationen erhalten und die Daten aufgeschrieben. Speichern Sie es in einer Variablen namens z, wie unten gezeigt.

z = pd.DataFrame({
        "scale":[28, 45],
        "hige":[25, 20],
    })
z2 = z[["scale", "hige"]].values

Vergleicht man diese Daten mit der Abbildung mit der linearen Grenze, so scheint es, dass das erste Tier wahrscheinlich als rot (selten = wahr) und das zweite Tier als blau (normal = falsch) klassifiziert ist. Lassen Sie uns eine Vorhersage machen.

y_est = clf.predict(z2)

Auf diese Weise zeigt y_est das Ergebnis als ([True, False]) an, sodass Sie sehen können, dass es gemäß der Grenzlinie klassifiziert ist.

4. SVM aus der Mathematik verstehen

Übrigens habe ich bis zu 3 versucht, den Ablauf des Aufbaus eines SVM-Modells mithilfe von Scicit-Learn → Illustration → Vorhersage der Seltenheit und Normalität von zwei anderen Katzen zu implementieren. Hier möchte ich klarstellen, wie das SVM-Modell dieses Flusses mathematisch berechnet wird.

(1) Über die Maximierung der Marge

Ich werde auf die unter "2. Was ist SVM (Support Vector Machine)" beschriebene Randmaximierung eingehen. Ich erklärte, dass der Teil, in dem der Abstand zwischen dem Punkt und der Grenze der einzelnen Daten am größten ist, die optimale Grenzlinie ist, aber was für einen Zustand bedeutet das?

キャプチャ6.PNG

◆ Dreidimensionale Visualisierung

Das Folgende ist eine leicht dreidimensionale Neufassung des bisher gezeigten Streudiagramms.

キャプチャ11.PNG

Wenn Sie sich die grüne Ebene, die durch den roten Rand oben verläuft, als Rand vorstellen, können Sie sich vorstellen, dass durch Ändern der ** "Neigung" ** dieser Ebene der Rand (= Abstand zwischen den Daten und dem Rand) geändert wird. Ist es?

Wenn beispielsweise die Neigung dieser Ebene steil ist, ist der Rand kleiner, wie unten gezeigt.

キャプチャ12.PNG

Im Gegenteil, wenn die Neigung der Ebene sanft gemacht wird, wird der Rand groß, wie unten gezeigt.

キャプチャ13.PNG

Mit anderen Worten, ** "die Daten können sauber klassifiziert werden" und "die Steigung der Ebene, die durch die Entscheidungsgrenze verläuft, ist so gering wie möglich" ist die optimale Randbedingung **.

◆ Randformel

Was bedeutet dann ** "die Neigung der Ebene, die die Entscheidungsgrenze passiert, so sanft wie möglich" **? Ich werde es weiter veranschaulichen.

キャプチャ14.PNG

Ich habe versucht, den Blick auf die Grenzfläche von der Seite zu zeigen. Diese Formel wird ausgedrückt als $ w_1x_1 + w_2x_2 $.

Wie bereits erwähnt, bedeutet der maximale Spielraum, dass die Steigung (= Steigung) der Ebene, die durch die Entscheidungsgrenze verläuft, so sanft wie möglich wird. Die Tatsache, dass die Steigung (= Steigung) am sanftesten ist, bedeutet, dass selbst wenn Sie $ x_1 $ oder $ x_2 $ ein wenig bewegen, der Effekt auf $ w_1x_1 + w_2x_2 $ gering ist (= die Steigung ist sanft, sodass sich der Wert von $ x $ geringfügig ändert. Selbst wenn Sie es verschieben, ändert sich der Wert des gesamten Ausdrucks nicht wesentlich. Das heißt, "** $ w_1, w_2 $ sind klein **".

Wenn dies in eine Formel umgewandelt wird, ist es wie folgt, aber da das Verstehen der Norm notwendig und kompliziert ist, um die Bedeutung dieser Formel zu verstehen, sind an diesem Punkt "$ w_1 $ und $ w_2 $ der Grenzlinienformel so klein wie möglich. Es wird so berechnet, dass es wird. "

||w||_2^2← Wenn dies minimiert wird, wird der Spielraum maximiert

(2) Strafe

Die Grundidee endet mit (1), aber wie unter "◆ Strafe" in "2. Was ist SVM (Support Vector Machine)" erwähnt, werden einige Missverständnisse gemacht, damit die Klassifizierung entsprechend der tatsächlichen Situation durchgeführt werden kann. Erlaube einem anderen. Wie viel Fehleinschätzung ist erlaubt? Der Grad wird Strafe genannt. Die Strafformel wird wie folgt ausgedrückt, und $ ξ $ wird als Scharnierverlustfunktion bezeichnet. C(\sum_{i=1}^n ξi)

$ C $ hat die gleiche Bedeutung wie das in (ii) Modellkonstruktion beschriebene Argument, aber je größer dieses $ C $ ist, desto fehlerhafter wird der Ausdruck (= wenn er zu groß ist, ist es leichter zu überlernen). Wenn Sie diese Formel gründlich verstehen möchten, müssen Sie sie gründlich verstehen, daher werde ich sie diesmal diesem Punkt überlassen. (Es kann später separat gebaut werden, aber ich möchte es auch hier zusammenfassen)

(3) Zusammenfassend ...

Aus (1) und (2) wird SVM berechnet, um die folgenden Zielfunktionen so klein wie möglich zu machen. Intuitiv ** versuche ich, die Neigung der Grenzfläche so klein wie möglich zu halten, "um den Rand zu maximieren", aber wie viel Fehleinschätzung ist zulässig, um entsprechend der tatsächlichen Situation zu klassifizieren? Zusätzlich zum Strafzeitraum von wird die Grenzflächenformel so eingestellt, dass sich die Gesamtbalance gut anfühlt. ** ** **

||w||_2^2 +
C(\sum_{i=1}^n ξi)

5. Zusammenfassung

Was haben Sie gedacht. SVM erfordert ein mathematisches Verständnis des Hintergrunds mehr als einfache Regression und logistische Regression, daher kann ich es nicht so tief beschreiben, aber ich hoffe, dass das bisherige Verständnis dazu beitragen wird, das Verständnis zu vertiefen als zuvor. ..

Recommended Posts

[Maschinelles Lernen] SVM sowohl aus Scikit-Lernen als auch aus Mathematik verstehen
[Maschinelles Lernen] Entscheidungsbäume aus Scikit-Lernen und Mathematik verstehen
[Maschinelles Lernen] Verständnis der logistischen Regression sowohl durch Scikit-Lernen als auch durch Mathematik
[Maschinelles Lernen] Verstehen der linearen einfachen Regression sowohl aus Scikit-Lernen als auch aus Mathematik
[Maschinelles Lernen] Verstehen der linearen multiplen Regression sowohl aus Scikit-Lernen als auch aus Mathematik
[Maschinelles Lernen] Unkorrelation aus der Mathematik verstehen
SVM versucht maschinelles Lernen mit Scikit-Learn
Überblick über maschinelle Lerntechniken, die aus Scikit-Learn gelernt wurden
Einfaches maschinelles Lernen mit Scikit-Learn und Flask ✕ Web App
Praktisches maschinelles Lernen mit Scikit-Learn und TensorFlow-TensorFlow gab auf-
[Maschinelles Lernen] Zufällige Gesamtstruktur verstehen
Maschinelles Lernen und mathematische Optimierung
Erstellen Sie mit VirtualBox und Ubuntu eine Scikit-Lernumgebung für maschinelles Lernen
[Maschinelles Lernen] Verstehen Sie aus der Mathematik, dass Standardisierung zu einem Durchschnitt von 0 und einer Standardabweichung von 1 führt.
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
[Maschinelles Lernen] Verstehen Sie aus der Mathematik, warum der Korrelationskoeffizient zwischen -1 und 1 liegt.
Maschinelles Lernen ① SVM-Zusammenfassung (Support Vector Machine)
Klassifikation und Regression beim maschinellen Lernen
Organisation von Plattformen für maschinelles Lernen und tiefes Lernen
[Lesehinweis] Praktisches maschinelles Lernen mit Scikit-Learn, Keras und TensorFlow Kapitel 1
[Maschinelles Lernen] OOB (Out-Of-Bag) und sein Verhältnis
Aktienkursprognose mit maschinellem Lernen (Scikit-Learn)
[Maschinelles Lernen] LDA-Themenklassifizierung mit Scikit-Learn
Verwenden Sie die API-Gruppe A3RT für maschinelles Lernen aus Python
Persönliche Notizen und Links zum maschinellen Lernen ① (Maschinelles Lernen)
Zusammenfassung der Klassifizierung und Implementierung von Algorithmen für maschinelles Lernen
Erstellen einer Umgebung für Python und maschinelles Lernen (macOS)
"OpenCV-Python Tutorials" und "Praktisches maschinelles Lernsystem"
Maschinelles Lernen
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Studieren Sie maschinelles Lernen und Informatik. Ressourcenliste
Maschinelles Lernen ab 0 für theoretische Physikstudenten # 1
Numerai Turnier-Fusion von traditionellen Quants und maschinellem Lernen-
Hinweise zum maschinellen Lernen (von Zeit zu Zeit aktualisiert)
Algorithmus für maschinelles Lernen (von der Klassifizierung in zwei Klassen bis zur Klassifizierung in mehreren Klassen)
Maschinelles Lernen von Grund auf neu (maschinelles Lernen mit Kaggle)
Maschinelles Lernen Aufteilung der Trainingsdaten und Lernen / Vorhersage / Verifizierung
[Übersetzung] scikit-learn 0.18 Einführung in maschinelles Lernen durch Tutorial scikit-learn
Maschinelles Lernen ab 0 für theoretische Physikstudenten # 2
[Python] Sortieren Sie Äpfel und Birnen anhand einer Support Vector Machine (SVM) nach Pixelwerten.
Vorhersage offensiver und defensiver Attribute anhand des Yugioh-Kartennamens - Yugiou Data Science 3. Maschinelles Lernen