SVM (Support Vector Machine) est connu comme une méthode d'apprentissage automatique avec une précision de classification élevée. Pour une meilleure précision de classification dans SVM, les hyperparamètres doivent être déterminés à partir des données d'entraînement. Dans cet article, j'expliquerai comment la limite de décision change en ajustant les hyperparamètres de SVM en utilisant le noyau RBF (noyau gaussien).
Pour SVM avec noyau RBF, ajustez les deux hyper paramètres suivants.
SVM est une méthode pour déterminer le superplan qui sépare l'ensemble des points de données mappés à l'espace d'entités. Cependant, l'ensemble de points sur l'espace des fonctions n'est pas toujours séparable. Par exemple, dans la figure ci-dessous, il n'est pas possible de tracer une ligne droite qui sépare parfaitement les deux types de symboles.
Maintenant, considérons les erreurs de classification, traçons une ligne droite et divisons l'ensemble de points. Par exemple, tracez une ligne droite dans la figure précédente comme indiqué ci-dessous pour diviser les deux types de symboles.
Le paramètre de coût $ C $ est un paramètre qui détermine le degré de classification erronée tolérée. $ C $ apparaît dans l'équation du problème de planification secondaire résolu par SVM.
\min_{\beta}\frac{1}{2}\|\beta\|^2+C\sum_{i=1}^{N}\xi_i
Déterminez l'hyperplan de sorte que le plus petit $ C $ permette une mauvaise classification et que le plus grand $ C $ ne tolère pas une erreur de classification.
Paramètres du noyau RBF: $ \ gamma $ apparaîtra dans la formule du noyau RBF suivante.
K(x, x')=\exp(-\gamma\|x-x'\|^2)
Comme le montre l'expérience décrite plus loin, plus la valeur de $ \ gamma $ est petite, plus la frontière de décision est simple, et plus la valeur est grande, plus la limite de décision est complexe.
Trouvons une frontière de décision lorsque $ C $ et $ \ gamma $ sont définis sur des valeurs extrêmes. $ C $ a été défini sur $ 2 ^ {-5} $ et $ 2 ^ {15} $, et $ \ gamma $ a été défini sur $ 2 ^ {-15} $ et $ 2 ^ 3 $, respectivement. Utilisez le SVM implémenté dans scikit-learn (0.15). (En interne, [LIBSVM](http: // www. csie.ntu.edu.tw/~cjlin/libsvm/) est utilisé.) Utilisez iris pour l'ensemble de données. iris est un jeu de données qui contient 3 étiquettes de classe et 4 entités. Cette fois, nous n'utiliserons que 2 étiquettes de classe et 2 entités. Pour rendre le problème plus difficile, nous ajoutons du bruit à chacune des deux fonctionnalités.
# -*- coding: utf-8 -*-
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
from itertools import product
if __name__ == '__main__':
iris = datasets.load_iris()
#Les deux premières fonctionnalités,Utilisez les deux premières étiquettes de classe
X = iris.data[:100, :2]
#Ajouter du bruit aux fonctionnalités
E = np.random.uniform(0, 1.0, size=np.shape(X))
X += E
y = iris.target[:100]
#pas de maille
h = 0.02
#Paramètre de coût
Cs = [2 ** -5, 2 ** 15]
#Paramètres du noyau RBF
gammas = [2 ** -15, 2 ** 3]
svms = [svm.SVC(C=C, gamma=gamma).fit(X, y) for C, gamma in product(Cs, gammas)]
titles = ["C: small, gamma: small", "C: small, gamma: large",
"C: large, gamma: small", "C: large, gamma: large"]
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
for i, clf in enumerate(svms):
plt.subplot(2, 2, i + 1)
plt.subplots_adjust(wspace=0.4, hspace=0.4)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel("Sepal length")
plt.ylabel("Sepal width")
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.title(titles[i])
plt.show()
L'axe horizontal et l'axe vertical représentent chacun deux quantités d'entités. Lorsque $ C $ est petit, il y a de nombreux points de mauvaise classification dans la zone de décision, tandis que lorsque $ C $ est grand, il y a peu de points de mauvaise classification dans la zone de décision. La frontière de décision lorsque $ \ gamma $ est petit est une frontière de décision simple (ligne droite), tandis que la frontière de décision lorsque $ \ gamma $ est grand a une forme compliquée.
L'ajustement de $ C $ et $ \ gamma $ semble donner quelque chose de similaire aux limites de décision lors de l'utilisation d'un noyau linéaire. Si vous n'êtes pas sûr de la sélection du noyau, il semble correct d'utiliser le noyau RBF, mais il faudra du temps pour régler les paramètres. (´ ・ ω ・ `)
Recommended Posts