http://scikit-learn.org/0.18/modules/svm.html traduction google de l'apprentissage supervisé Contenu du guide de l'utilisateur [scikit-learn 0.18 Guide de l'utilisateur 1. Apprentissage supervisé](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98 À partir de% E3% 81% 8D% E5% AD% A6% E7% BF% 92)
** Support Vector Machine (SVM) ** est "[Category](# 141-% E5% 88% 86% E9% A1% 9E)", "[Return](# 142% E5% 9B% 9E% E5) % B8% B0) "et" [Détection des valeurs aberrantes](# 143-% E5% AF% 86% E5% BA% A6% E6% 8E% A8% E5% AE% 9A% E6% 96% B0% E8% A6% 8F% E6% 80% A7% E6% A4% 9C% E5% 87% BA) »est un ensemble de méthodes d'apprentissage supervisé.
Les avantages de la machine à vecteurs de support sont:
Les inconvénients de la machine à vecteurs de support sont:
Prise en charge de scikit-learn La machine vectorielle prend en charge des vecteurs d'échantillons haute densité (qui peuvent être convertis en ceux de numpy.ndarray
et numpy.asarray
) et clairsemés (tous les vecteurs scipy.sparse
) en entrée. Cependant, afin d'utiliser SVM pour faire des prédictions de données rares, il doit être compatible avec ces données. Pour de meilleures performances, utilisez numpy.ndarray
(dense) ou scipy.sparse.csr_matrix
(sparse) avec dtype = float64
.
SVC, NuSVC /modules/generated/sklearn.svm.NuSVC.html#sklearn.svm.NuSVC) et [LinearSVC](http://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn .svm.LinearSVC) est une classe qui peut effectuer une classification multi-classes sur des ensembles de données.
SVC et NuSVC sont similaires, mais acceptent des ensembles de paramètres légèrement différents et ont des formulations mathématiques différentes (voir la section [Formulations mathématiques](# 147% E6% 95% B0% E5% AD% A6). % E7% 9A% 84% E5% 87% A6% E6% 96% B9)). D'autre part, LinearSVC est un autre classificateur de vecteur de support pour les noyaux linéaires. C'est une mise en œuvre. Notez que LinearSVC n'accepte pas le mot-clé kernel
. Ceci est considéré comme linéaire. De plus, certains membres de SVC et NuSVC n'ont pas quelque chose comme support_
.
SVC, NuSVC et LinearSVC prennent deux tableaux de taille [n_samples, n_features]
pour contenir les échantillons d'apprentissage, le tableau X d'étiquette de classe (chaîne ou entier) et la taille [n_samples]
comme entrées. Je vais le prendre.
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
Après l'ajustement, vous pouvez utiliser le modèle pour prédire de nouvelles valeurs.
>>> clf.predict([[2., 2.]])
array([1])
La fonction de décision SVM repose sur plusieurs sous-ensembles de données d'apprentissage appelés vecteurs de support. Certaines propriétés de ces vecteurs de support se trouvent dans les membres support_vectors_
, support_
et n_support
.
>>> # get support vectors
>>> clf.support_vectors_
array([[ 0., 0.],
[ 1., 1.]])
>>> # get indices of support vectors
>>> clf.support_
array([0, 1]...)
>>> # get number of support vectors for each class
>>> clf.n_support_
array([1, 1]...)
SVC et NuSVC mettent en œuvre une approche «un contre un» pour la multiclassification (Knerr et al., 1990). Si n_class
est le nombre de classes, un classificateur de n_class * (n_class -1) / 2
est construit, chaque donnée d'apprentissage provenant de deux classes. Pour fournir une interface cohérente avec d'autres classificateurs, l'option decision_function_shape
agrège les résultats du classificateur" un contre un "en un déterminant de forme (n_samples, n_classes)
. rend le possible.
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovo', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4
LinearSVC, quant à lui, implémente une stratégie multiclasse "one-vs-rest" et entraîne le modèle n_class. S'il n'y a que deux classes, un seul modèle sera formé.
>>>
>>> lin_clf = svm.LinearSVC()
>>> lin_clf.fit(X, Y)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)
>>> dec = lin_clf.decision_function([[1]])
>>> dec.shape[1]
4
Voir [Formulation](# svm-mathématique-formulation) pour une description complète du déterminant.
LinearSVC implémente également une stratégie multiclasse alternative, appelée SVM multiclasse, développée par Crammer et Singer en utilisant l'option multi_class = 'crammer_singer'
. Cette méthode est cohérente. Cela ne s'applique pas à la classification «un contre repos». En pratique, les résultats sont à peu près les mêmes, mais le temps d'exécution est nettement inférieur, de sorte que la classification "un contre repos" est généralement préférée.
Pour le LinearSVC "one-vs-rest", les attributs de coef_
et ʻintercept_ sont respectivement de la forme
[n_class, n_features] ʻet [n_class]
. Chaque ligne de coefficients correspond à l'un des nombreux classificateurs «one-vs-rest» «n_class», dans l'ordre de la classe «one», similaire à l'interception.
Pour le SVC "one-vs-one", la disposition des attributs est un peu plus compliquée. Pour un noyau linéaire, la disposition de coef_
et de ʻintercept_ est celle décrite dans LinearSVC ci-dessus, sauf que la forme de
coef_ est
[n_class * (n_class -1) / 2, n_features] . Est le même que. De nombreux classificateurs binaires. L'ordre de la classe 0 à la classe n est "0 à 1", "0 à 2", ... "0 à n", "1 à 2", "1 à 3", "1 à n". .. .. "n-1 contre n". La forme de
dual_coef_ est
[n_class-1, n_SV], ce qui est une mise en page assez difficile. La colonne correspond à un vecteur de support contenu dans l'un des classificateurs "one-vs-one" "n_class * (n_class --1) / 2". Chaque vecteur de support est utilisé dans le classificateur
n_class --1. L'entrée
n_class -1sur chaque ligne correspond au double coefficient de ces classificateurs. Cela peut être plus clair dans l'exemple: Classe 0 avec 3 vecteurs de support $ v ^ {0} \ _ 0, v ^ {1} \ _ 0, v ^ {2} \ _ 0 $ et 2 vecteurs de support $ v ^ {0} \ _1, respectivement Considérons trois problèmes de classe, classe 1 et classe 2 avec v ^ {1} \ _1 $, $ v ^ {0} \ _2, v ^ {1} \ _2 $. Chaque vecteur de support $ v ^ {j} \ _i $ a deux coefficients doubles. Appelons le coefficient $ v ^ {j} \ _i $ du vecteur support dans le classificateur entre les classes $ i $ et $ k $ $ \ alpha ^ {j} \ _ {i, k} $. Alors
dual_coef_` devient:
$\alpha^{0}_{0,1}$ | $\alpha^{0}_{0,2}$ | Coefficients vectoriels de support de classe 0 td> tr> |
$\alpha^{1}_{0,1}$ | $\alpha^{1}_{0,2}$ | |
$\alpha^{2}_{0,1} $ | $\alpha^{2}_{0,2}$ | |
$\alpha^{0}_{1,0}$ | $\alpha^{0}_{1,2}$ | Coefficients vectoriels de support de classe 1 td> |
$\alpha^{1}_{1,0}$ | $\alpha^{1}_{1,2}$ | |
$\alpha^{0}_{2,0}$ | $\alpha^{0}_{2,1}$ | Coefficients vectoriels de support de classe 2 td> tr> |
$\alpha^{1}_{2,0}$ | $\alpha^{1}_{2,1}$ |
La méthode SVC «decision_function» donne un score par classe pour chaque échantillon (ou un score par échantillon dans le cas binaire). Lorsque l'option du constructeur «probabilité» est définie sur «Vrai», l'estimation de la probabilité d'appartenance à une classe (à partir des méthodes de «predict_proba» et de «predict_log_proba») est valide. Pour le binaire, les probabilités sont calibrées à l'aide de la mise à l'échelle de Platt: régression logistique sur les scores SVM, ajustement par validation croisée supplémentaire sur les données d'entraînement. Pour les multiclasses, cela a été étendu comme dans Wu et al. (2004).
Il va sans dire que la validation mutuelle impliquée dans la mise à l'échelle de Platt est une opération coûteuse pour les grands ensembles de données. En outre, l'estimation de la probabilité peut être incompatible avec le score dans le sens où «l'argmax» du score n'est pas l'argmax de la probabilité. (Par exemple, dans la classification binaire, un échantillon peut être étiqueté par "prédire" s'il appartient à une classe avec une probabilité de <½ selon "prédire_proba"). La méthode de Platt est également connue pour avoir des problèmes théoriques. Si vous avez besoin de scores de confiance, mais qu'il ne s'agit pas nécessairement de probabilités, c'est une bonne idée de définir probabilité = False
et d'utiliser decision_function
au lieu de predict_proba
.
--Référence: Wu, Lin et Weng, "Estimation de probabilité de classification multiclasse par combinaison par paires", JMLR 5: 975 -1005, 2004.
Vous pouvez utiliser les mots-clés «class_weight» et «sample_weight» dans les cas où vous souhaitez mettre davantage l'accent sur une classe particulière ou un échantillon individuel particulier.
SVC (et non NuSVC) implémente le mot-clé class_weight
dans la méthode fit
. Ceci est un dictionnaire de la forme «{class_label: value}», où value est un nombre à virgule flottante> 0 qui définit le paramètre «C» de «class_label» sur «C * value».
SVC, NuSVC, SVR, NuSVR et OneClassSVM implémentent également des pondérations pour des échantillons individuels de la méthode «fit» à l'aide du mot-clé «sample_weight». Comme class_weight
, ils définissent le paramètre C
dans le i-ème exemple surC * sample_weight [i]
.
--Exemple:
La méthode de classification des vecteurs de support peut être étendue pour résoudre les problèmes de régression. Cette méthode est appelée régression vectorielle de support. Le modèle généré par la classification des vecteurs de support (comme décrit ci-dessus) ne dépend que d'un sous-ensemble des données d'apprentissage, car la fonction de coût de construction du modèle ne se soucie pas des points d'apprentissage au-delà de la marge. De même, le modèle généré par la régression vectorielle de support dépend uniquement d'un sous-ensemble des données d'apprentissage, car la fonction de coût qui construit le modèle ignore les données d'apprentissage proches de la prédiction du modèle. Il existe trois types d'implémentations de régression vectorielle de support: SVR, NuSVR et LinearSVR. LinearSVR offre une implémentation plus rapide que SVR, tandis que NuSVR implémente un format légèrement différent de SVR et LinearSVR, mais ne considère que le noyau linéaire. Pour plus d'informations, consultez Détails d'implémentation (# svm-implementation-details). Comme la classe de classification, la méthode fit est considérée comme les vecteurs d'arguments X, y. Dans ce cas, y devrait avoir une valeur à virgule flottante au lieu d'une valeur entière.
>>>
>>> from sklearn import svm
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = svm.SVR()
>>> clf.fit(X, y)
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict([[1, 1]])
array([ 1.5])
--Exemple:
Une classe de SVM est utilisée pour la détection de nouveauté. Autrement dit, étant donné un ensemble d'échantillons, il détecte les limites souples de l'ensemble afin de classer le nouvel ensemble comme appartenant à cet ensemble. La classe qui implémente ceci est OneClassSVM.
Dans ce cas, la méthode fit
n'a pas d'étiquette de classe et prend le tableau X comme entrée car c'est un type d'apprentissage non supervisé.
Pour plus d'informations sur cette utilisation, consultez la section "[Détection des nouveautés et des valeurs aberrantes](http://qiita.com/nazoking@github/items/e3c4d203abafb8accbab#271-%E6%96%B0%E8%A6%8F%" E6% 80% A7% E3% 81% AE% E6% A4% 9C% E5% 87% BA) ".
--Exemple:
Les machines vectorielles de support sont un outil puissant, mais à mesure que le nombre de vecteurs d'entraînement augmente, leurs besoins en informatique et en stockage augmentent rapidement. Au cœur de SVM se trouve un problème de planification secondaire (QP) qui sépare le vecteur de support du reste du vecteur de formation. Le solveur QP utilisé dans cette implémentation basée sur libsvm dépend de l'efficacité du cache libsvm, $ O (n \ _ {features} \ times n \ _ {samples} ^ 2) $ et $ O (n \ _ {features} \ times n \ _ {samples} ^ 3) $ En fait utilisé (en fonction de l'ensemble de données). Si les données sont très rares, remplacez $ n_ {features} $ par le nombre moyen d'entités non nulles dans l'exemple de vecteur. Aussi, pour linéaire, les algorithmes utilisés dans l'implémentation liblinear de LinearSVC sont beaucoup plus efficaces que le compilateur SVC basé sur libsvm. Il peut être mis à l'échelle presque linéairement à des millions d'échantillons et de fonctionnalités.
flags
.cache_size
sur une valeur supérieure à la valeur par défaut de 200 (Mo), par exemple 500 (Mo) ou 1000 (Mo).LinearSVC (loss = 'l2', penalty = 'l1', dual = False)
, vous obtiendrez une solution éparse. Autrement dit, seul un sous-ensemble de pondérations d'entités diffère de zéro et contribue à la fonction déterminante. L'augmentation de «C» générera un modèle plus complexe (plus de fonctionnalités seront sélectionnées). La valeur C
qui produit le modèle" nul "(tous les poids égaux à zéro) est [l1_min_c](http://scikit-learn.org/stable/modules/generated/sklearn.svm.l1_min_c.html# Il peut être calculé en utilisant sklearn.svm.l1_min_c).La fonction du noyau peut être l'une des suivantes:
--Linéaire: $ \ langle x, x '\ rangle $.
--Polygon: $ (\ gamma \ langle x, x '\ rangle + r) ^ d $. $ D $ spécifie le mot-clé degree
et $ r $ avec coef0
.
coef0
.Différents noyaux sont spécifiés lors de l'initialisation par le mot-clé kernel
:
>>> linear_svc = svm.SVC(kernel='linear')
>>> linear_svc.kernel
'linear'
>>> rbf_svc = svm.SVC(kernel='rbf')
>>> rbf_svc.kernel
'rbf'
Vous pouvez définir votre propre noyau en donnant les fonctions Python du noyau ou en pré-calculant la matrice Gram. Un classificateur avec un noyau personnalisé se comporte comme n'importe quel autre classificateur, à l'exception de ce qui suit:
support_vectors_
est vide. Seul l'index du vecteur de support est stocké dans support_
fit ()
est enregistrée pour référence ultérieure. Si ce tableau est modifié entre l'utilisation de fit ()
et predict ()
, des résultats inattendus se produiront.Vous pouvez également utiliser votre propre noyau prédéfini en passant une fonction au mot-clé du constructeur kernel
.
Le noyau doit prendre deux matrices de forme (n_samples_1, n_features)
, (n_samples_2, n_features)
comme arguments et renvoyer une matrice de noyau de forme(n_samples_1, n_samples_2)
.
Le code suivant définit un noyau linéaire et crée une instance de classificateur qui utilise ce noyau.
>>> import numpy as np
>>> from sklearn import svm
>>> def my_kernel(X, Y):
... return np.dot(X, Y.T)
...
>>> clf = svm.SVC(kernel=my_kernel)
--Exemple:
Définissez kernel = 'precalculé'
et passez la matrice de gramme au lieu de X dans la méthode d'ajustement. À ce stade, les valeurs du noyau entre tous les vecteurs d'entraînement et de test doivent être fournies.
>>> import numpy as np
>>> from sklearn import svm
>>> X = np.array([[0, 0], [1, 1]])
>>> y = [0, 1]
>>> clf = svm.SVC(kernel='precomputed')
>>> # linear kernel computation
>>> gram = np.dot(X, X.T)
>>> clf.fit(gram, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto',
kernel='precomputed', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)
>>> # predict on training examples
>>> clf.predict(gram)
array([0, 1])
Lors de la formation des SVM avec le noyau de la fonction de base radiale (RBF), il y a deux paramètres à prendre en compte: «C» et «gamma». Le paramètre «C», qui est commun à tous les noyaux SVM, élimine les erreurs de classification des exemples d'apprentissage pour la simplicité de la table de décision. Un C bas vise à lisser la table de décision et un «C» élevé vise à classer correctement tous les exemples d'entraînement. gamma
définit l'impact qu'aura un exemple de formation. Plus le «gamma» est grand, plus les autres exemples sont affectés.
Une bonne sélection de «C» et «gamma» est importante pour les performances SVM. On utilise sklearn.model_selection.GridSearchCV avec C et `gamma Il est recommandé d'utiliser ʻexponentiellement loin.
--Exemple:
Les machines vectorielles de soutien construisent des superplans ou des ensembles de superplans dans un espace dimensionnel supérieur ou infini utilisé pour la classification, la régression ou d'autres tâches. Intuitivement, en général, plus la marge est grande, plus l'erreur de généralisation du classificateur est faible, de sorte qu'une bonne séparation est obtenue par le superplan avec la plus grande distance au point de données d'apprentissage le plus proche (ce que l'on appelle la marge de fonction) de quelle classe. Atteint.
1.4.7.1. SVC
Étant donné le vecteur y des vecteurs d'apprentissage $ x_i \ in \ mathbb {R} ^ p $, $ i = 1 ... n $ et $ y \ in \ mathbb {R} ^ n $ $ \ varepsilon $ pour les deux classes Le SVC était un problème:
\min_ {w, b, \zeta} \frac{1}{2} w^T w + C \sum_{i=1}^{n} \zeta_i
\begin{align}
\textrm {subject to } & y_i (w^T \phi (x_i) + b) \geq 1 - \zeta_i,\\
& \zeta_i \geq 0, i=1, ..., n
\end{align}
Ce double
\min_{\alpha} \frac{1}{2} \alpha^T Q \alpha - e^T \alpha
\begin{align}
\textrm {subject to } & y^T \alpha = 0\\
& 0 \leq \alpha_i \leq C, i=1, ..., n
\end{align}
Où $ e $ est le vecteur de tous les 1, $ C> 0 $ est la borne supérieure, $ Q $ est la matrice de valeurs fixes semi-positives n × n positives, $ Q_ {ij} \ equiv y_i y_j K (x_i, x_j) $. Où $ K (x_i, x_j) = \ phi (x_i) ^ T \ phi (x_j) $ est le noyau. Ici, le vecteur d'apprentissage est implicitement mappé à un espace supérieur (éventuellement infini) par la fonction $ \ phi $. Le déterminant est:
\operatorname{sgn}(\sum_{i=1}^n y_i \alpha_i K(x_i, x) + \rho)
** Remarque **: Les modèles SVM dérivés de libsvm et liblinear utilisent C comme paramètre de régularisation, mais la plupart des autres estimateurs utilisent alpha. La relation entre les deux est $ C = \ frac {n \ samples} {alpha}. $.
Ce paramètre est accessible via le membre dual_coef_
, qui contient le produit $ y_i \ alpha_i $, support_vectors_
, qui contient les vecteurs de support, et ʻintercept`, qui contient le terme indépendant $ \ rho $.
--Référence:
1.4.7.2. NuSVC
Présentation d'un nouveau paramètre, $ \ nu $, qui contrôle le nombre de vecteurs de support et les erreurs d'entraînement. Paramètres $ \ nu \ in (0, 1] $ est la limite supérieure du taux d'erreur d'entraînement et la limite inférieure du taux de vecteur de support. Il s'avère que la formulation $ \ nu $ -SVC est une reparamétrie de C-SVC et est donc mathématiquement équivalente.
1.4.7.3. SVR
Étant donné le vecteur d'apprentissage $ x_i \ mathbb {R} ^ p $, i = 1, ..., n et le vecteur $ \ mathbb {R} ^ n \ varepsilon $ -SVR résout les problèmes suivants Faire.
\min_ {w, b, \zeta, \zeta^*} \frac{1}{2} w^T w + C \sum_{i=1}^{n} (\zeta_i + \zeta_i^*)
\begin{align}
\textrm {subject to } & y_i - w^T \phi (x_i) - b \leq \varepsilon + \zeta_i,\\
& w^T \phi (x_i) + b - y_i \leq \varepsilon + \zeta_i^*,\\
& \zeta_i, \zeta_i^* \geq 0, i=1, ..., n
\end{align}
Ce double
\min_{\alpha, \alpha^*} \frac{1}{2} (\alpha - \alpha^*)^T Q (\alpha - \alpha^*) + \varepsilon e^T (\alpha + \alpha^*) - y^T (\alpha - \alpha^*)
\begin{align}
\textrm {subject to } & e^T (\alpha - \alpha^*) = 0\\
& 0 \leq \alpha_i, \alpha_i^* \leq C, i=1, ..., n
\end{align}
Où $ e $ est le vecteur de tous les 1, $ C> 0 $ est la borne supérieure, $ Q $ est la matrice de valeur semi-fixe $ n $ par $ n $ positive, $ Q_ {ij} \ equiv K (x_i`` x_j) = \ phi (x_i) ^ T \ phi (x_j) $ est le noyau. Ici, le vecteur d'apprentissage est implicitement mappé à un espace supérieur (éventuellement infini) par la fonction $ \ phi $. Le déterminant est:
\sum_{i=1}^n (\alpha_i - \alpha_i^*) K(x_i, x) + \rho
Ces paramètres sont accessibles via le membre dual_coef_
, qui contient la différence $ \ alpha_i- \ alpha_i ^ * $, support_vectors_
, qui contient les vecteurs de support, et ʻintercept_`, qui contient le terme indépendant $ \ ρ $.
--Référence:
En interne, libsvm et [liblinear](http: //www.csie.) Pour gérer tous les calculs. Utilisez ntu.edu.tw / ~ cjlin / liblinear /). Ces bibliothèques sont encapsulées à l'aide de C et Cython.
--Référence: Pour la mise en œuvre et les détails de l'algorithme utilisé, voir:
[scikit-learn 0.18 Guide de l'utilisateur 1. Apprentissage supervisé](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98 À partir de% E3% 81% 8D% E5% AD% A6% E7% BF% 92)
© 2010 --2016, développeurs scikit-learn (licence BSD).
Recommended Posts