[PYTHON] À propos du SVC du module svm (sans mathématiques)

Tout le monde, bonsoir. J'écrirai la phrase du 19/12. J'avais quelque chose à faire aujourd'hui et il était tard. .. ..

Aujourd'hui, je voudrais résumer la classification du modèle SVC linéaire que j'ai étudié hier.

Objectif de la classification

2019_12_19_blog.png

Voir l'image ci-dessus. La classification consiste à trouver automatiquement la ligne qui sépare ce point bleu de la croix orange. Le bidimensionnel est très facile pour les humains, n'est-ce pas? Le modèle SVC est étonnant car il semble que vous puissiez demander une expression à diviser même dans le cas de grandes dimensions. Alors, à quoi cela sert-il? Beaucoup de gens auraient pensé. Que diriez-vous de l'image ci-dessous?

2019_12_19_picpng.png

Avez-vous vu la différence? Oui, G-mail lit naturellement le courrier indésirable, mais c'est la puissance de l'IA. (L'algorithme est plus compliqué.) Cependant, ce qu'ils font est la même chose, tracer une ligne droite (visage) et analyser s'il s'agit de spam ou de courrier valide. C'est beau et incroyable, n'est-ce pas?

Eh bien, je vais vous montrer l'image de l'objectif final d'aujourd'hui. Ce sera comme suit.

Figfdsaure_1.png

⚠︎ Il y a quelque chose dont je veux faire attention. Autrement dit, dans le cas de cet exemple, une ligne infinie peut être dessinée. Par conséquent, une fois que la largeur de cette ligne en pointillé (fusion) est la plus large, une ligne pleine (limite de décision) est dessinée au milieu.

Regardons maintenant le code pour trouver cette limite de décision.

Exemple de code

import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
xmin = 0
xmax = 2
ymin = 0
ymax = 2

# 0 ~Contient des valeurs selon une distribution normale jusqu'à 1 (100 lignes et 2 colonnes (X & Y))) Créer une matrice
X0 = np.random.uniform(size=(100, 2))
y0 = np.repeat(0, 100)

X1 = np.random.uniform(low=1.0, high=2.0, size=(100, 2))
y1 = np.repeat(1, 100)

svc = SVC(kernel='linear', C=1e8)

#Apprentissage
# svc.fit(train_features, train_labels)
svc.fit(np.vstack((X0, X1)), np.hstack((y0, y1)))

fig, ax = plt.subplots()

# ax.scatter(x, y)Nuage de points
ax.scatter(X0[:, 0], X0[:, 1], marker='o', label='class 0')
ax.scatter(X1[:, 0], X1[:, 1], marker='x', label='class 1')

#Préparer les points de grille
xx, yy = np.meshgrid(np.linspace(xmin, xmax, 100), np.linspace(ymin, ymax, 100))
# decision_Dans une matrice pour la fonction.
xy = np.vstack([xx.ravel(), yy.ravel()]).T

# 100 *Une matrice de 100.
# z = x*2 + y*La partie de la hauteur de z de la pièce à 2.
#Z est obtenu à partir d'un point de grille appelé xy en utilisant la fonction de décision svc.
z = svc.decision_function(xy).reshape((100, 100))
#Tracer les limites et les marges de décision
ax.contour(xx, yy, z, colors='k', levels=[-1, 0, 1], alpha=0.3, linestyles=['--', '-', '--'])
plt.show()

En tant que flux,

  1. Préparez les données
  2. Créez une instance de SVC
  3. Entraînez les données d'entrée en plaçant l'étiquette qui leur est associée dans la fonction d'ajustement.
  4. Créez des points de grille (Article de référence)
  5. Créez Z en utilisant la fonction decision_function apprise en fit
  6. Vous pouvez dessiner une limite de décision en dessinant des lignes de contour à l'aide de contour.

Les fonctions importantes sont fit et decision_funkction. Je comprends comment utiliser fit, mais decision_function ne peut comprendre que comment trouver Z en utilisant un classificateur. Je vais l'étudier un peu plus et écrire un article.

Il est tard dans la nuit aujourd'hui, alors c'est à peu près tout. bonne nuit.

Recommended Posts

À propos du SVC du module svm (sans mathématiques)
À propos de la vitesse de traitement de SVM (SVC) de scikit-learn