[PYTHON] [Apprentissage automatique] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques

1. Objet

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.

2. Qu'est-ce que SVM (Support Vector Machine)?

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 **.

◆ Exemple spécifique

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).

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

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.

◆ Qu'est-ce que SVM?

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. キャプチャ4.PNG

Maintenant que j'ai une nouvelle donnée, j'ai essayé de la tracer en plus. (Données dans un cadre orange) キャプチャ5.PNG

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 **.

キャプチャ6.PNG

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é.

◆ À propos de la sanction

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.

キャプチャ7.PNG

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é».

◆ Pour résumer ...

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.

3. SVM avec scicit-learn

(1) Importation des bibliothèques requises

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

(2) Préparation des données

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],
    })

(3) Essayez d'illustrer (important)

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()
キャプチャ8.PNG

D'une manière ou d'une autre, la frontière semble fermée.

(4) Construction du modèle

(I) Mise en forme des données

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.

(Ii) Construction du modèle

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.

◆ À propos des arguments

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.

(5) Illustrer le modèle construit

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()
キャプチャ9.PNG

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. キャプチャ10.PNG

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.

(6) Dans le monde réel ...

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.

4. Comprendre SVM à partir des mathématiques

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.

(1) À propos de la maximisation de la marge

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?

キャプチャ6.PNG

◆ Visualisation en trois dimensions

Ce qui suit est une réécriture légèrement en trois dimensions du diagramme de dispersion qui a été montré jusqu'à présent.

キャプチャ11.PNG

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.

キャプチャ12.PNG

Au contraire, si l'inclinaison du plan est rendue douce, la marge devient grande comme indiqué ci-dessous.

キャプチャ13.PNG

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 **.

◆ Formule de marge

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.

キャプチャ14.PNG

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. "

||w||_2^2← Si cela est minimisé, la marge sera maximisée

(2) Pénalité

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(\sum_{i=1}^n ξi)

$ 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)

(3) Pour résumer ...

À 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)

5. Résumé

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

[Apprentissage automatique] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression multiple linéaire à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la décorrélation des mathématiques
SVM essayant l'apprentissage automatique avec scikit-learn
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
[Apprentissage automatique] Comprendre la forêt aléatoire
Apprentissage automatique et optimisation mathématique
Créez un environnement d'apprentissage automatique scikit-learn avec VirtualBox et Ubuntu
[Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
[Apprentissage automatique] Comprenez à partir des mathématiques pourquoi le coefficient de corrélation varie de -1 à 1.
Apprentissage automatique ① Résumé SVM (Support Vector Machine)
Classification et régression dans l'apprentissage automatique
Organisez des plateformes d'apprentissage automatique et d'apprentissage en profondeur
[Note de lecture] Apprentissage automatique pratique avec Scikit-Learn, Keras et TensorFlow Chapitre 1
[Apprentissage automatique] OOB (Out-Of-Bag) et son ratio
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
Utiliser le groupe d'API d'apprentissage automatique A3RT de Python
Notes personnelles et liens sur l'apprentissage automatique ① (Machine learning)
Résumé de la classification et de la mise en œuvre des algorithmes d'apprentissage automatique
Créer un environnement pour Python et l'apprentissage automatique (macOS)
"Tutoriels OpenCV-Python" et "Système d'apprentissage automatique pratique"
Apprentissage automatique
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Étudiez l'apprentissage automatique et l'informatique. Liste des ressources
Apprentissage automatique à partir de 0 pour les étudiants en physique théorique # 1
Tournoi Numerai - Fusion de quants traditionnels et apprentissage automatique -
Notes sur l'apprentissage automatique (mises à jour de temps en temps)
Algorithme d'apprentissage automatique (de la classification à 2 classes à la classification à plusieurs classes)
Apprentissage automatique à partir de zéro (apprentissage automatique appris avec Kaggle)
Division des données de formation en apprentissage automatique et apprentissage / prédiction / vérification
[Français] scikit-learn 0.18 Introduction de l'apprentissage automatique par le didacticiel scikit-learn
Apprentissage automatique à partir de 0 pour les étudiants en physique théorique # 2
[Python] Trier les pommes et les poires à partir des valeurs de pixels à l’aide d’une machine à vecteurs de support (SVM)
Prédire les attributs offensifs et défensifs à partir du nom de la carte Yugioh --Yugiou Data Science 3. Machine Learning