Schritt für Schritt zur Theorie, Implementierung in Python und Analyse mit scikit-learn über den Algorithmus, der zuvor in "Klassifikation des maschinellen Lernens" verwendet wurde. Ich werde mit lernen. Ich schreibe es zum persönlichen Lernen, daher möchte ich, dass Sie alle Fehler übersehen.
Bisher umfassen Klassifizierungsprobleme in zwei Klassen Simple Perceptron, Logistic Regression und Wir haben uns mit Support-Vektor-Maschinen (Basic und Advanced befasst. Da es sich jedoch nur um eine Klassifizierung mit zwei Klassen handelte, sollten Sie sie auf eine Klassifizierung mit mehreren Klassen ausweiten.
Anfangs dachte ich darüber nach, logistische Regression und Support-Vektor-Maschinen für mehrere Klassen zusammen zu schreiben, aber es war überraschend tiefgreifend, und es gibt viele Websites, die es nicht richtig geschrieben haben, sodass nur der theoretische Hintergrund in einem Artikel enthalten ist. Es ist geworden. Wie üblich waren die folgenden Seiten hilfreich. Vielen Dank.
Lass uns in der richtigen Reihenfolge denken.
One-vs-Rest(All) One-vs-Rest (manchmal als One-vs-All geschrieben) ist, wie der Name schon sagt, eine Methode zur Aufteilung in eine Klasse und den Rest. Um beispielsweise die drei Klassen Apfel, Zitrus und Banane zu klassifizieren, werden drei Klassifizierer (Apfel-andere), (Mican-andere) und (Bananen-andere) erstellt, wie in der folgenden Abbildung gezeigt.
Tatsächlich gibt es einen Bereich, in dem sowohl Äpfel als auch Bananen an der Grenze jedes Klassifikators entnommen werden können. In einem solchen Fall muss jedoch anhand der Ausgangsstärke jedes Klassifikators entschieden werden, welcher verwendet werden soll.
Da Sie nur so viele Klassifizierer vorbereiten müssen, wie es Klassen gibt, ist der Rechenaufwand geringer als der im Folgenden erläuterte Eins-gegen-Eins.
One-vs-One Im Gegensatz zu One-vs-Rest können Sie zwei beliebige Klassen auswählen und in zwei Klassen einteilen. Für die Anzahl der Kombinationen ist unter der Annahme, dass die Anzahl der Klassen $ n $ beträgt, ein Klassifizierer vom Typ $ n C_2 $ erforderlich. Wenn Sie beispielsweise 10 Klassen klassifizieren, war es in Ordnung, wenn in One-vs-Rest 10 Klassifizierertypen vorhanden waren. In One-vs-One sind jedoch $ _ {10} C_2 = 45 $ Klassifizierertypen erforderlich. Es wird sein. Die endgültige Klassifizierung wird von der Mehrheit jedes Klassifizierers festgelegt. Wenn Sie die Kernel-Methode für das Modell anstelle der linearen Regression verwenden, können Sie diese möglicherweise verwenden.
In Bezug auf das Scikit-Learn-Dokument scheint es tatsächlich wie folgt behandelt zu werden.
Mehrklassen-Softmax wird heutzutage häufig in neuronalen Netzen verwendet. Verwenden Sie die ** Softmax-Funktion **, um zu erfahren, welche Klasse das Modell am wahrscheinlichsten ausgibt. Bevor wir uns mit der Softmax-Funktion befassen, wollen wir zunächst über One-Hot-Codierung sprechen.
One-Hot Encoding Einfach ausgedrückt bezieht sich One-Hot-Codierung auf den Vektor ** nur einer ist 1 und der andere ist 0 **. Zum Beispiel eine bestimmte Merkmalsmenge
Obst |
---|
Apfel |
Orange |
Apfel |
Banane |
Nehme an, dass Schreiben Sie dies wie folgt um.
Obst_Apfel | Obst_Orange | Obst_Banane |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 1 |
0 | 0 | 1 |
Dieses Formular hat den Vorteil, dass es in die zuvor erwähnten One-vs-Rest (One) -Klassifikationen unterteilt werden kann und dass die Berechnung der unten beschriebenen Softmax-Funktion einfach ist. Sie können auch die Funktion get_dummies () von Pandas und die Klasse OneHotEncoder von sikit-learn verwenden.
Die Softmax-Funktion ist eine Funktion, die mehrere Ausgaben in eine Wahrscheinlichkeitsverteilung von 1 (100%) umwandelt. Die Softmax-Funktion hat die folgende Form.
y_i=\frac{e^{x_{i}}}{\sum_{j=1}^{n}e^{x_{j}}} \\
\sum_{i=1}^{n}y_i=1
$ y $ ist ein $ n $ -Dimensionsvektor, ebenso wie die Ausgabe. Wenn im vorherigen Beispiel (Apfel, Mikan, Banane) = [3,8,1] ausgegeben wird, ist die Ausgabe der Softmax-Funktion [0,7,99,2,0,1] und die Wahrscheinlichkeit von Mikan ist am höchsten. Wird sein. Übrigens ist die Zwei-Klassen-Klassifikation in der obigen Formel n = 2.
\begin{align}
y_1&=\frac{e^{x_{1}}}{e^{x_1}+e^{x_2}} \\
&=\frac{\frac{e^{x_{1}}}{e^{x_{1}}}}{\frac{e^{x_{1}}}{e^{x_{1}}}+e^{x_2-x_1}} \\
&=\frac{1}{1+e^{x_2-x_1}}
\end{align}
Es wird sein. Dies ist die Sigmoidfunktion selbst.
Die Unterscheidung der Softmax-Funktion ist
\dfrac{\partial y_i}{\partial x_j}=
\begin{cases}y_i(1-y_i)&i=j\\-y_iy_j&i\neq j\end{cases}
ist.
Die Anzahl der Klassen sei $ c $ und die Eingabe sei $ \ boldsymbol {x} = (x_0, x_1, \ cdots, x_n) $ ($ x_0 $ ist Bias). Der Parameter sei $ \ boldsymbol {W} $ mit der Größe $ (n + 1) $ × $ c $.
\boldsymbol{z}=\boldsymbol{W}^T\boldsymbol{x}
Optimieren Sie $ \ boldsymbol {W} $ mit.
Suchen Sie dazu die ** Cross-Entropy-Error-Funktion $ E $ **, ähnlich der logistischen Regression. Unter der Annahme, dass die Wahrscheinlichkeitsfunktion $ l $ ist, kann $ l $ durch eine Wahrscheinlichkeitsverteilung für alle Klassen und alle Stichproben dargestellt werden. Sei $ \ varphi_ {ij} ^ {t_ {ij}} $ die Ausgabe der Softmax-Funktion der Klasse $ j $ im $ i $ -ten Sample.
l=\prod_{i=1}^{n}\prod_{j=1}^{c}\varphi_{ij}^{t_{ij}}
Wird sein. Ich möchte die Wahrscheinlichkeit maximieren, aber ich nehme den Logarithmus von $ l $ und multipliziere ihn mit -1, um ihn zu einer entropieübergreifenden Fehlerfunktion zu machen.
\begin{align}
E&=-\log(l) \\
&=-\log\left(\prod_{i=1}^{n}\prod_{j=1}^{c}\varphi_{ij}^{t_{ij}}\right) \\
&= -\frac{1}{n}\sum_{i=1}^{n}\sum_{j=1}^{c}t_{ij}\log\varphi_{ij}
\end{align}
Ist die Verlustfunktion. Die Differenzierung der Verlustfunktion ist
\begin{align}
\frac{\partial E}{\partial w} &= -\frac{1}{n}\sum_{i=0}^n(t_{il}-\varphi_{il})x_{ij} \\
&=-\frac{1}{n}\boldsymbol{x}^T(\boldsymbol{t}-\phi)
\end{align}
Es wird sein. (Berechnung weggelassen)
Danach können Sie den Parameter $ \ boldsymbol {W} $ mithilfe der Gradientenmethode finden, um $ E $ zu minimieren.
Wir haben zusammengefasst, wie die Zwei-Klassen-Klassifizierung auf die Mehrklassen-Klassifizierung ausgedehnt werden kann. Eine besteht darin, einfach die Zwei-Klassen-Klassifizierung zu wiederholen. Die andere bestand darin, die Softmax-Funktion zu verwenden, um die Wahrscheinlichkeitsverteilung für jede Klasse zu ermitteln.
Es hat lange gedauert, weil es nicht viele Seiten gab, auf denen die Methoden in diesem Bereich detailliert zusammengefasst waren, wahrscheinlich weil sie nicht gut durchsucht wurden und die Klassifizierung mit der Softmax-Funktion ziemlich kompliziert war.
Ab dem nächsten Mal möchte ich es in Python-Code ablegen.
Recommended Posts