Pas à pas sur la théorie, l'implémentation en python et l'analyse à l'aide de scikit-learn sur l'algorithme précédemment repris dans "Classification of Machine Learning" J'étudierai avec. Je l'écris pour un apprentissage personnel, alors j'aimerais que vous oubliez toute erreur.
Jusqu'à présent, les problèmes de classification à deux classes incluent Simple Perceptron, Logistic Regression, et Nous avons traité des machines vectorielles de support (Basic et Advanced). Cependant, comme il ne s'agissait que d'une classification à deux classes, envisageons de les étendre à une classification multi-classes.
Au début, je pensais écrire ensemble des machines vectorielles de régression logistique et de support multi-classes, mais c'était étonnamment profond et il y a beaucoup de sites qui n'ont pas écrit correctement, donc seul le contexte théorique est dans un article. Il est devenu. Comme d'habitude, les sites suivants ont été utiles. Merci beaucoup.
Pensons dans l'ordre.
One-vs-Rest(All) One-vs-Rest (parfois écrit comme One-vs-All), comme son nom l'indique, est une méthode de division en une classe et le reste. À titre d'exemple, afin de classer les trois classes de pomme, d'agrumes et de banane, nous allons créer trois classificateurs (pomme-autre), (mican-autre) et (banane-autre) comme le montre la figure ci-dessous.
En fait, il existe une zone où les pommes et les bananes peuvent être prises à la limite de chaque classificateur, mais dans un tel cas, il est nécessaire d'utiliser la puissance de sortie de chaque classificateur pour décider lequel utiliser.
Étant donné que vous devez seulement préparer autant de classificateurs que de classes, la quantité de calcul est inférieure à celle expliquée ci-après.
One-vs-One Contrairement à One-vs-Rest, vous pouvez choisir deux classes quelconques et les classer en deux classes. Quant au nombre de combinaisons, en supposant que le nombre de classes est $ n $, un classificateur de type $ n C_2 $ est requis. Par exemple, lors de la classification de 10 classes, One-vs-Rest nécessite 10 types de classificateurs, mais One-vs-One nécessite $ _ {10} C_2 = 45 $ types de classificateurs. Ce sera. Le classement final est décidé à la majorité de chaque classificateur. Si vous utilisez la méthode du noyau pour le modèle au lieu de la régression linéaire, il semble que vous puissiez l'utiliser.
En fait, en se référant au document scikit-learn, il semble qu'il soit traité comme suit.
Le softmax multi-classes est souvent utilisé dans les réseaux de neurones de nos jours. Utilisez la ** fonction Softmax ** pour savoir quelle classe est la plus susceptible de générer le modèle. Avant de discuter de la fonction softmax, parlons d'abord de l'encodage à chaud.
One-Hot Encoding Pour faire simple, One-Hot Encoding fait référence au vecteur **, un seul vaut 1 et l'autre est 0 **. Pour donner un exemple, une certaine quantité de caractéristiques
fruit |
---|
Pomme |
Orange |
Pomme |
banane |
Supposer que Réécrivez ceci comme suit.
fruit_Pomme | fruit_Orange | fruit_banane |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 1 |
0 | 0 | 1 |
Ce formulaire présente l'avantage de pouvoir être divisé selon les classifications One-vs-Rest (One) mentionnées précédemment, et d'être facile à utiliser pour le calcul de la fonction Softmax décrite ci-dessous. Vous pouvez également utiliser la fonction get_dummies () de Pandas et la classe [OneHotEncoder] de sikit-learn (https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html).
La fonction softmax est une fonction qui convertit plusieurs sorties en une distribution de probabilité totalisant 1 (100%). La fonction softmax a la forme suivante.
y_i=\frac{e^{x_{i}}}{\sum_{j=1}^{n}e^{x_{j}}} \\
\sum_{i=1}^{n}y_i=1
$ y $ est un vecteur de dimension $ n $, tout comme la sortie. Dans l'exemple précédent, si (pomme, mikan, banane) = [3,8,1] est sorti, le résultat de la fonction softmax est [0.7,99.2,0.1], et la possibilité de mikan est la plus élevée. Sera. À propos, la classification à deux classes est n = 2 dans la formule ci-dessus.
\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}
Ce sera. C'est la fonction sigmoïde elle-même.
La différenciation de la fonction softmax est
\dfrac{\partial y_i}{\partial x_j}=
\begin{cases}y_i(1-y_i)&i=j\\-y_iy_j&i\neq j\end{cases}
est.
Soit le nombre de classes $ c $ et l'entrée $ \ boldsymbol {x} = (x_0, x_1, \ cdots, x_n) $ ($ x_0 $ est un biais). Soit le paramètre $ \ boldsymbol {W} $ de la taille $ (n + 1) $ × $ c $.
\boldsymbol{z}=\boldsymbol{W}^T\boldsymbol{x}
Optimisez $ \ boldsymbol {W} $ avec.
Pour ce faire, recherchez la ** fonction d'erreur d'entropie croisée $ E $ **, similaire à la régression logistique. En supposant que la fonction de vraisemblance est $ l $, $ l $ peut être représenté par une distribution de probabilité pour toutes les classes et tous les échantillons. Soit $ \ varphi_ {ij} ^ {t_ {ij}} $ la sortie de la fonction softmax de la classe $ j $ dans l'exemple $ i $ ème.
l=\prod_{i=1}^{n}\prod_{j=1}^{c}\varphi_{ij}^{t_{ij}}
Sera. Je veux maximiser la probabilité, mais prenez le logarithme de $ l $ et multipliez-le par -1 pour en faire une fonction d'erreur d'entropie croisée.
\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}
Est la fonction de perte. La différenciation de la fonction de perte est
\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}
Ce sera. (Calcul omis)
Après cela, vous pouvez trouver le paramètre $ \ boldsymbol {W} $ en utilisant la méthode du gradient pour minimiser $ E $.
Nous avons résumé comment étendre la classification à deux classes à la classification à plusieurs classes. La première consiste simplement à répéter la classification à deux classes. L'autre était d'utiliser la fonction softmax pour trouver la distribution de probabilité pour chaque classe.
Cela a pris beaucoup de temps car il n'y avait pas beaucoup de pages qui résumaient les méthodes dans ce domaine en détail, probablement parce qu'elles n'étaient pas bien recherchées, et la classification à l'aide de la fonction Softmax était assez compliquée.
À partir de la prochaine fois, j'aimerais le déposer dans le code Python.
Recommended Posts