J'utilise LibSVM pour classer certains documents. Les documents semblent être un peu difficiles à classer comme le montrent les résultats finaux. Cependant, j'ai remarqué quelque chose lors de la formation de mes modèles. et c'est-à-dire: si mon ensemble d'entraînement est par exemple 1000 environ 800 d'entre eux sont sélectionnés comme vecteurs de support. J'ai cherché partout pour savoir si c'est une bonne ou une mauvaise chose. Je veux dire qu'il y a une relation entre le nombre de vecteurs de support et les performances des classificateurs? J'ai lu cet article article précédent . Cependant, j'effectue une sélection de paramètres et je suis également sûr que les attributs dans les vecteurs de caractéristiques sont tous ordonnés. J'ai juste besoin de connaître la relation. Merci. p.s: J'utilise un noyau linéaire.
Les machines à vecteurs de support sont un problème d'optimisation. Ils tentent de trouver un hyperplan qui divise les deux classes avec la plus grande marge. Les vecteurs de support sont les points qui entrent dans cette marge. Il est plus facile à comprendre si vous le construisez de simple à plus complexe.
SVM linéaire à marge dure
Dans un ensemble d'apprentissage où les données sont linéairement séparables et où vous utilisez une marge ferme (pas de mou autorisé), les vecteurs de support sont les points qui se trouvent le long des hyperplans de support (les hyperplans parallèles à l'hyperplan diviseur sur les bords de la marge)
Tous les vecteurs de support se trouvent exactement sur la marge. Quel que soit le nombre de dimensions ou la taille de l'ensemble de données, le nombre de vecteurs de support pourrait être aussi petit que 2.
SVM linéaire à marge douce
Mais que faire si notre ensemble de données n'est pas séparable linéairement? Nous introduisons la marge douce SVM. Nous n'exigeons plus que nos points de données se trouvent en dehors de la marge, nous permettons à une certaine quantité d'entre eux de s'égarer sur la ligne dans la marge. Nous utilisons le paramètre mou C pour contrôler cela. (nu in nu-SVM) Cela nous donne une marge plus large et une plus grande erreur sur l'ensemble de données d'apprentissage, mais améliore la généralisation et/ou nous permet de trouver une séparation linéaire des données qui n'est pas séparable linéairement.
Maintenant, le nombre de vecteurs de support dépend de la quantité de mou que nous autorisons et de la distribution des données. Si nous autorisons une grande quantité de mou, nous aurons un grand nombre de vecteurs de support. Si nous autorisons très peu de mou, nous aurons très peu de vecteurs de support. La précision dépend de la recherche du bon niveau de jeu pour les données analysées. Pour certaines données, il ne sera pas possible d'obtenir un haut niveau de précision, nous devons simplement trouver le meilleur ajustement possible.
SVM non linéaire
Cela nous amène à SVM non linéaire. Nous essayons toujours de diviser linéairement les données, mais nous essayons maintenant de le faire dans un espace de dimension supérieure. Cela se fait via une fonction du noyau, qui a bien sûr son propre ensemble de paramètres. Lorsque nous traduisons cela à nouveau dans l'espace d'entité d'origine, le résultat est non linéaire:
Maintenant, le nombre de vecteurs de support dépend toujours de la quantité de mou que nous autorisons, mais cela dépend aussi de la complexité de notre modèle. Chaque torsion et rotation du modèle final dans notre espace d'entrée nécessite la définition d'un ou de plusieurs vecteurs de support. En fin de compte, la sortie d'un SVM est les vecteurs de support et un alpha, qui définissent essentiellement l'influence de ce vecteur de support spécifique sur la décision finale.
Ici, la précision dépend du compromis entre un modèle de haute complexité qui peut sur-ajuster les données et une grande marge qui classera incorrectement certaines des données de formation dans l'intérêt d'une meilleure généralisation. Le nombre de vecteurs de support peut varier de très peu à chaque point de données si vous sur-ajustez complètement vos données. Ce compromis est contrôlé via C et par le choix du noyau et des paramètres du noyau.
Je suppose que lorsque vous avez parlé de performances, vous parliez de précision, mais j'ai pensé parler également de performances en termes de complexité de calcul. Afin de tester un point de données à l'aide d'un modèle SVM, vous devez calculer le produit scalaire de chaque vecteur de support avec le point de test. Par conséquent, la complexité de calcul du modèle est linéaire dans le nombre de vecteurs de support. Moins de vecteurs de support signifie une classification plus rapide des points de test.
Une bonne ressource: n tutoriel sur les machines à vecteurs de support pour la reconnaissance des formes
800 sur 1000 vous indiquent essentiellement que le SVM doit utiliser presque tous les échantillons d'apprentissage pour coder l'ensemble d'apprentissage. Cela vous indique essentiellement qu'il n'y a pas beaucoup de régularité dans vos données.
On dirait que vous avez des problèmes majeurs avec pas assez de données d'entraînement. Pensez également à certaines fonctionnalités spécifiques qui séparent mieux ces données.
nombre d'échantillons et nombre d'attributs peuvent influencer le nombre de vecteurs de support, ce qui rend le modèle plus complexe. Je crois que vous utilisez des mots ou même des ngrammes comme attributs, donc ils sont nombreux et les modèles de langage naturel sont eux-mêmes très complexes. Ainsi, 800 vecteurs de support de 1000 échantillons semblent corrects. (Faites également attention aux commentaires de @ karenu sur les paramètres C/nu qui ont également un grand effet sur le nombre de SV).
Pour avoir une intuition sur ce rappel de l'idée principale de SVM. SVM fonctionne dans un espace d'entités multidimensionnelles et essaie de trouver hyperplan qui sépare tous les échantillons donnés. Si vous avez beaucoup d'échantillons et seulement 2 fonctionnalités (2 dimensions), les données et l'hyperplan peuvent ressembler à ceci:
Ici, il n'y a que 3 vecteurs de support, tous les autres sont derrière eux et ne jouent donc aucun rôle. Notez que ces vecteurs de support sont définis par seulement 2 coordonnées.
Imaginez maintenant que vous avez un espace tridimensionnel et que les vecteurs de support sont définis par 3 coordonnées.
Cela signifie qu'il y a un autre paramètre (coordonnées) à ajuster, et cet ajustement peut nécessiter plus d'échantillons pour trouver l'hyperplan optimal. En d'autres termes, dans le pire des cas, SVM ne trouve qu'une seule coordonnée hyperplan par échantillon.
Lorsque les données sont bien structurées (c'est-à-dire qu'elles contiennent assez bien les modèles), seuls plusieurs vecteurs de support peuvent être nécessaires - tous les autres resteront derrière eux. Mais le texte est une très, très mauvaise donnée structurée. SVM fait de son mieux, essayant d'ajuster au mieux l'échantillon, et prend donc comme vecteurs de support encore plus d'échantillons que de gouttes. Avec un nombre croissant d'échantillons, cette "anomalie" est réduite (des échantillons plus insignifiants apparaissent), mais le nombre absolu de vecteurs de support reste très élevé.
La classification SVM est linéaire dans le nombre de vecteurs de support (SV). Le nombre de SV est dans le pire des cas égal au nombre d'échantillons d'entraînement, donc 800/1000 n'est pas encore le pire des cas, mais c'est quand même assez mauvais.
Là encore, 1000 documents de formation est un petit ensemble de formation. Vous devez vérifier ce qui se passe lorsque vous mettez à l'échelle jusqu'à 10 000 ou plusieurs documents. Si les choses ne s'améliorent pas, envisagez d'utiliser des SVM linéaires, formés avec LibLinear , pour la classification des documents; ceux-ci évoluent beaucoup mieux (la taille du modèle et le temps de classification sont linéaires dans le nombre d'entités et indépendants du nombre d'échantillons d'apprentissage).
Il y a une certaine confusion entre les sources. Dans le manuel ISLR 6th Ed, par exemple, C est décrit comme un "budget de violation de frontière" d'où il s'ensuit qu'un C plus élevé permettra plus de violations de frontière et plus de vecteurs de support. Mais dans les implémentations svm dans R et python le paramètre C est implémenté en tant que "pénalité de violation", ce qui est le contraire et vous observerez ensuite que pour des valeurs plus élevées de C, il y a moins de vecteurs de support.