Si vous voulez essayer l'apprentissage automatique, n'importe qui peut utiliser scicit-learn, etc. pour l'implémenter relativement facilement. Cependant, afin d'obtenir des résultats au travail ou d'améliorer votre niveau Vous pouvez voir qu'il est clairement faible dans l'explication de «Je ne connais pas le contexte, mais j'ai obtenu ce résultat».
Le but de cet article est "d'essayer d'utiliser d'abord scicit-learn car la théorie est bonne" en 2-3 et de "comprendre le contexte des mathématiques" en 4 et plus tard.
Je viens d'une école littéraire privée, donc je ne suis pas bon en mathématiques. J'ai essayé de l'expliquer d'une manière facile à comprendre, même pour ceux qui ne sont pas bons en mathématiques autant que possible.
Des articles similaires ont été publiés pour Linear Simple Regression et Logistic Regression Ver, veuillez donc les lire également. [Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et de mathématiques [[Machine learning] Comprendre la régression logistique à partir de scikit-learn et des mathématiques] (https://qiita.com/Hawaii/items/ee2a0687ca451fe213be)
SVM est un modèle qui peut être utilisé pour la classification et la régression en tant qu'apprentissage supervisé. Et comme il existe un dispositif permettant d'obtenir des performances de discrimination élevées pour les données non apprises, il présente d'excellentes performances de reconnaissance. Source: [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)
En gros **, il s'agit d'un modèle très précis lorsque de nouvelles données sont obtenues **.
Supposons que vous soyez le président d'une entreprise de planification d'événements. Supposons que vous planifiez une visite pour voir des "chats rares" en réponse au récent boom des chats (un décor fictif).
Comme il y a trop de candidats pour le lieu de la visite, vous avez collecté des données sur les chats rares (= A) et les chats dits ordinaires (= B). Sur la base de ces données, nous allons créer un modèle qui peut déterminer s'il s'agit d'un chat rare en entrant des données sur la «taille du corps» et la «longueur de la barbe» à l'avenir, et nous nous concentrerons sur l'endroit où il a été déterminé qu'il y a un chat rare. Je vais faire un plan.
La répartition des données est la suivante.
Maintenant, quel genre de frontière est susceptible d'être tracé entre le bleu et l'orange dans la distribution ci-dessus? Comme indiqué ci-dessous, il peut y avoir des bordures rouges et des bordures vertes dans les données disponibles.
Maintenant que j'ai une nouvelle donnée, j'ai essayé de la tracer en plus. (Données dans un cadre orange)
Dans ce cas, la bordure rouge est correctement identifiée, mais la bordure verte est un chat rare (c'est à l'origine un chat normal), donc c'est une erreur d'identification.
Afin d'éviter de telles erreurs de jugement et de trouver la bonne norme de classification, SVM utilise le concept de ** "maximiser la marge" **. La marge fait référence à la distance entre la bordure supérieure, comme le rouge ou le vert, et les données réelles. L'idée est que si cette marge est grande, ** «une erreur de jugement due à de légères modifications des données» peut être rendue aussi petite que possible **.
Les données proches de la limite sont, pour ainsi dire, des données qui rendent difficile la distinction entre «chats rares» et «chats ordinaires». Ce serait un problème s'il y avait beaucoup de données subtiles, donc l'idée est que si vous décidez de la limite de sorte que la distance entre la limite et les données soit aussi loin que possible, le risque d'erreur de jugement peut être minimisé.
Cependant, il n'y a pas beaucoup de limites qui peuvent tout classer parfaitement à 100%. Dans le monde réel, des données telles que les valeurs aberrantes entrent parfois, comme indiqué ci-dessous.
Si vous essayez de tracer une frontière qui classe avec précision ce nouveau point orange, vous pouvez imaginer que ce sera probablement une limite qui ne correspond pas à la situation réelle. (Soi-disant surapprentissage)
SVM autorise ** «une erreur de jugement» afin de porter un jugement qui convient à la situation réelle.
Il apparaîtra dans la prochaine section scikit-learn, mais à quel point les erreurs d'identification sont-elles autorisées? En fait, nous devons décider nous-mêmes de construire le modèle, ce que nous appelons une «pénalité».
SVM peut être considéré comme un modèle qui réalise les deux ** «bonnes sensations» ** suivantes.
-Essayez de tracer une frontière qui maximise la distance entre la frontière et les données, c'est-à-dire la marge, afin d'éviter autant que possible les erreurs de jugement ・ Cependant, une erreur de jugement est autorisée afin de tracer une frontière qui correspond à la situation réelle.
Importez les éléments suivants requis pour exécuter SVM.
from sklearn.svm import SVC
#Vous trouverez ci-dessous une bibliothèque d'illustrations, de pandas et de numpy
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
Définissez les données de longueur et de barbe et la classification normale rare (Vrai pour les chats rares, Faux pour les chats normaux) comme données ci-dessous.
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],
})
J'illustrerai la longueur du corps, la longueur de la barbe et la classification rare et ordinaire. Afin de saisir les caractéristiques, n'utilisez pas scicit-learn soudainement, mais essayez d'illustrer les données.
y = data["rare"].values
x1, x2 = data["scale"].values, data["hige"].values
#Tracer les données
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')#Point bleu: y est vrai(=Rare)
plt.plot(x1[~y], x2[~y], '^', color='C1', label='normal')#Point orange: y est faux(=Ordinaire)
plt.xlabel("scale")
plt.ylabel("hige")
plt.legend(loc='best')
plt.show()
D'une manière ou d'une autre, la frontière semble fermée.
Tout d'abord, nous allons organiser la forme des données pour construire le modèle.
y = data["rare"].values#C'est le même que celui illustré ci-dessus, vous pouvez donc l'omettre.
X = data[["scale", "hige"]].values
Cette fois, ce n'est pas un article sur la grammaire python, je vais donc omettre les détails, mais je vais organiser x et y dans un formulaire pour SVM avec scikit-learn.
Enfin, le code du bâtiment modèle.
C = 10
clf = SVC(C=C,kernel="linear")
clf.fit(X, y)
Voilà pour un modèle simple. Nous allons créer un modèle svm dans une variable appelée clf! L'image est que le clf est ajusté (= appris) avec les X et y préparés dans la ligne suivante.
Les principaux arguments à prendre en compte lors de la construction d'un modèle SVM sont $ C $ et le noyau. ** <Environ $ C $> ** Je vais l'essayer pour le moment, je vais donc omettre les détails, mais si vous réduisez la valeur de $ C $, ce sera un modèle qui permet une erreur d'identification.
** <À propos du noyau> ** Les types de kérenel sont «linéaire», «poly», «rbf», «sigmoïde» et «précalculé». [Référence officielle pour plus de détails] (https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
Ici, nous allons introduire «linéaire» et «rbf». Utilisez linear pour dessiner la limite de manière linéaire (plan) et utilisez rbf (fonction de noyau non linéaire) pour dessiner la limite de manière non linéaire. Le résultat changera en fonction de celui que vous choisissez.
Maintenant, illustrons cette limite dans le diagramme de dispersion ci-dessus.
fig,ax = plt.subplots(figsize=(6,4))
#Afficher les points de données
ax.scatter(X[:,0], X[:,1], c=y)
#Organiser 100 valeurs dans la direction des coordonnées x
x = np.linspace(np.min(X[:,0]), np.max(X[:,0]), 10)
#Organiser 100 valeurs dans la direction des coordonnées y
y = np.linspace(np.min(X[:,1]), np.max(X[:,1]), 10)
#x,Avec les coordonnées x de 10000 points qui combinent y,Tableau de coordonnées y
x_g, y_g = np.meshgrid(x, y)
#np,c_Reliez les deux coordonnées avec,Passer à SVM
z_g = clf.predict(np.c_[x_g.ravel(), y_g.ravel()])
#z_g est une colonne du tableau, mais pour l'affichage dans le graphique(100, 100)Revenir à la forme de
z_g = z_g.reshape(x_g.shape)
#Coloration de la bordure
ax.contourf(x_g,y_g,z_g,cmap=plt.cm.coolwarm, alpha=0.8);
#Affichage à la fin
plt.show()
Suite à la construction du modèle, la limite a été fermée comme indiqué ci-dessus. Lorsque de nouvelles données arrivent après cela, si elles sont tracées dans la zone bleue, elles seront classées comme un chat normal, et si elles sont tracées dans la zone rouge, elles seront classées comme un chat rare.
Au fait, si le noyau introduit dans (4) ◆ Arguments est rbf, la limite sera la suivante.
C'est une frontière complètement différente! Dans ce cas, je pense que linear dessine les limites des données plus correctement, alors utilisons linéaire pour le noyau.
Cela n'a pas de sens de finir de faire un modèle. Dans le monde réel, il est important d'utiliser ce modèle prédictif pour faire la distinction entre rare et normal lors de l'acquisition de nouvelles données de chat.
Vous avez obtenu deux autres types d'informations et avez noté les données. Stockez-le dans une variable appelée z comme indiqué ci-dessous.
z = pd.DataFrame({
"scale":[28, 45],
"hige":[25, 20],
})
z2 = z[["scale", "hige"]].values
En comparant ces données avec l'illustration avec la limite linéaire, il semble que le premier animal est probablement classé comme rouge (rare = vrai) et le deuxième animal est classé comme bleu (normal = faux). Faisons une prédiction.
y_est = clf.predict(z2)
En faisant cela, y_est affichera le résultat sous la forme ([True, False]), afin que vous puissiez voir qu'il est classé en fonction de la ligne de démarcation.
En passant, jusqu'à 3, j'ai essayé d'implémenter le flux de construction d'un modèle SVM en utilisant scicit-learn → illustration → prédisant le rare et normal de deux autres chats. Ici, je voudrais clarifier comment le modèle SVM de ce flux est calculé mathématiquement.
Je vais approfondir la maximisation des marges décrite dans "2. Qu'est-ce que SVM (Support Vector Machine)". J'ai expliqué que la partie où la distance entre le point et la limite de chaque donnée est la plus grande est la ligne de frontière optimale, mais quel type d'état cela signifie-t-il?
Ce qui suit est une réécriture légèrement en trois dimensions du diagramme de dispersion qui a été montré jusqu'à présent.
Si vous pensez au plan vert qui passe à travers la bordure rouge ci-dessus comme la bordure, vous pouvez imaginer que changer le ** "tilt" ** de ce plan changera la marge (= distance entre les données et la bordure). Vraiment?
Par exemple, si la pente de ce plan est raide, la marge sera plus petite comme indiqué ci-dessous.
Au contraire, si l'inclinaison du plan est rendue douce, la marge devient grande comme indiqué ci-dessous.
En d'autres termes, ** «les données peuvent être classées proprement» et «la pente du plan passant par la frontière de décision est aussi douce que possible» est la condition aux limites optimale **.
Alors, qu'est-ce que ** «l'inclinaison du plan passant par la frontière de décision devient aussi douce que possible» **? Je vais continuer à l'illustrer.
J'ai essayé de montrer la vue de la surface limite de côté. Cette formule est exprimée sous la forme $ w_1x_1 + w_2x_2 $.
Comme mentionné précédemment, la marge maximale signifie que la pente (= pente) du plan passant par la frontière de décision devient aussi douce que possible. Le fait que la pente (= pente) soit la plus douce signifie que même si vous déplacez un peu $ x_1 $ ou $ x_2 $, l'effet sur $ w_1x_1 + w_2x_2 $ est petit (= la pente est douce, donc la valeur de $ x $ est légèrement modifiée. Même si vous le déplacez, la valeur de l'expression entière ne change pas beaucoup), c'est-à-dire "** $ w_1, w_2 $ sont petits **".
Si cela est converti en une formule, ce sera comme suit, mais comme la compréhension de la norme est nécessaire et compliquée pour comprendre la signification de cette formule, à ce stade, "$ w_1 $ et $ w_2 $ de la formule de la ligne de démarcation sont aussi petits que possible. Il est calculé pour qu'il devienne. "
L'idée de base se termine par (1), mais comme mentionné dans "◆ Pénalités" dans "2. Qu'est-ce que SVM (Support Vector Machine)?" Autorisez un autre.
Dans quelle mesure les erreurs de jugement sont-elles autorisées? Le degré de est appelé une pénalité.
La formule de pénalité est exprimée comme suit et $ ξ $ est appelé la fonction de perte de charnière.
$ C $ a la même signification que l'argument décrit dans (ii) Construction du modèle, mais plus ce $ C $ est grand, plus l'expression sera erronée (= si elle est trop grande, il sera plus facile de surapprendre). Si vous voulez comprendre cette formule en profondeur, vous devez la comprendre en profondeur, je vais donc m'en tenir à ce point cette fois. (Il peut être construit séparément plus tard, mais je voudrais également le résumer ici)
À partir de (1) et (2), SVM est calculé pour rendre les fonctions objectives suivantes aussi petites que possible. Intuitivement, ** j'essaye de rendre l'inclinaison de la surface limite aussi petite que possible "pour maximiser la marge", mais quelle erreur de jugement est autorisée pour classer selon la situation réelle? En plus du terme de pénalité de, la formule de la surface limite est définie de manière à ce que l'équilibre global soit bon. ** **
||w||_2^2 +
C(\sum_{i=1}^n ξi)
Qu'as-tu pensé. SVM nécessite une compréhension mathématique de l'arrière-plan plus qu'une simple régression et une régression logistique, je ne peux donc pas le décrire si profondément, mais j'espère que la compréhension jusqu'à présent aidera à approfondir la compréhension qu'auparavant. ..
Recommended Posts