[PYTHON] Que se passe-t-il lorsque je change les hyper paramètres de SVM (noyau RBF)?

Aperçu

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

Hyper paramètres à décider

Pour SVM avec noyau RBF, ajustez les deux hyper paramètres suivants.

À propos des paramètres de coût

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. na.PNG

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. miss.PNG

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.

À propos des paramètres du noyau RBF

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.

Expérience

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.

Code source

# -*- 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()

Résultat d'exécution

plot.png

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.

Autre

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

Que se passe-t-il lorsque je change les hyper paramètres de SVM (noyau RBF)?
Quel type de noyau est ce noyau?
Que se passe-t-il lorsque je change les hyper paramètres de SVM (noyau RBF)?
Faisons un noyau jupyter
Ce que j'ai fait pour économiser la mémoire Python
Que faire quand une PermissionError dans tempfile.mkstemp se produit
[Question] Que se passe-t-il si vous utilisez% en python?
J'ai échoué lors du clustering avec k-means, mais que dois-je faire (implémentation du noyau k-means)
TensorFlow change-t-il l'image de l'apprentissage profond? Ce que j'ai pensé après avoir touché un peu
Que se passe-t-il lorsqu'un amateur effectue 100 coups de traitement linguistique?
Vérifiez à l'avance ce qui se passe lorsque la commande est exécutée
Ce que j'ai vu en analysant les données du marché des ingénieurs
Changer le thème de Jupyter
Lorsque je démarre l'environnement virtuel de conda, l'invite de bash s'effondre
Je l'ai découvert en analysant les avis du site de changement d'emploi! ??
Animer ce qui se passe dans l'espace de fréquences lorsque la fréquence de Nyquist est dépassée
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
Changer l'arrière-plan d'Ubuntu (GNOME)
J'ai étudié le mécanisme de connexion flask!
H29.2.27 ~ 3.5 Résumé de ce que j'ai fait
Changer le suffixe de django-filter / DateFromToRangeFilter
Ce que j'ai fait pour garder une trace de l'humidité et de la température des archives
Lorsque vous souhaitez modifier l'en-tête HTTP du client de test de Flask
Un rappel de ce que je suis resté coincé lors du démarrage d'Atcoder avec python