SVM avec des tailles de groupe inégales dans les données d'entraînement


12

J'essaie de construire un SVM à partir de données de formation où un groupe est représenté plus que l'autre. Cependant, les groupes seront également représentés dans les éventuelles données de test. Par conséquent, je voudrais utiliser le class.weightsparamètre de l' e1071interface du package R libsvmpour équilibrer l'influence des deux groupes dans les données d'entraînement.

Comme je ne savais pas exactement comment ces poids devaient être spécifiés, j'ai mis en place un petit test:

  1. Générez des données nulles (caractéristiques aléatoires; rapport 2: 1 entre les étiquettes de groupe)
  2. Ajustez un svm avec le class.weightsjeu de paramètres.
  3. Prédisez un tas de nouveaux ensembles de données nuls et examinez les proportions de classe.
  4. Répliquez l'ensemble du processus plusieurs fois pour différents ensembles d'entraînement nuls.

Voici le code R que j'utilise:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

De tout cela, je m'attendais à une sortie ~ 0,5, cependant, ce n'est pas ce que j'ai obtenu:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

Le class.weightsparamètre fonctionne, en quelque sorte , plus le poids I est faible a, plus il est représenté dans cette simulation (et si je l'omet, class.weightsil revient proche de 1) ... mais je ne comprends pas pourquoi simplement utiliser des poids de 1: 2 ( pour les données d'entraînement qui sont de 2: 1) ne me fait pas descendre à 50%.

Si je ne comprends pas bien les SVM, quelqu'un peut-il expliquer ce point? (ou envoyer des références?)

Si je me trompe, quelqu'un peut-il me dire comment utiliser correctement le class.weightsparamètre?

Serait-ce peut-être un bug? (Je ne pense pas, car je comprends que ce logiciel et le libsvm sous-jacent sont assez matures)


Je n'ai pas d'expérience avec libsvm mais avec LiblineaR, les poids de classe sont cruciaux. Sans le régler correctement, vous obtenez des résultats sous-optimaux si vos classes sont fortement déséquilibrées. Je suggérerais: Obtenez un vrai ensemble de données avec des classes non équilibrées et essayez différentes valeurs de class.weights (dans LiblineaR wi). LiblineaR est un ordre de grandeur plus rapide pour un noyau linéaire et a également des méthodes pénalisées. D'après mon expérience, vous trouvez d'abord un poids de classe décent, puis optimisez C.
marbel

Réponses:


7

Je pense que cela peut dépendre des valeurs de C et du nombre de motifs que vous avez. Le SVM essaie de trouver le discriminant de marge maximale, donc si vous avez des données rares, il est possible que le SVM trouve la solution de marge dure sans qu'aucun des multiplicateurs de Lagrange n'atteigne leurs limites supérieures (auquel cas le rapport des pénalités pour chaque la classe est essentiellement hors de propos car les variables de jeu sont petites ou nulles. Essayez d'augmenter le nombre de modèles de formation et voyez si cela a un effet (car cela rend moins probable que la solution de marge dure puisse être trouvée dans les contraintes de boîte) .

Plus important encore, les valeurs optimales de C sont dépendantes des données, vous ne pouvez pas simplement les définir sur certaines valeurs prédéterminées, mais les optimiser à la place en minimisant l'erreur de sortie ou une limite de généralisation. Si vous avez des classes déséquilibrées, vous pouvez fixer le rapport de valeurs pour chaque classe et optimiser la pénalité moyenne sur tous les modèles.


C'est logique. Lorsque je réduit le nombre de fonctions et augmente le nombre d'observations dans cette simulation, la valeur de sortie se rapproche de 0,5. Cependant, il n'y arrive jamais tout à fait - même avec 900 lignes et seulement 1 colonne.
John Colby

Bien sûr, sur des données réelles, j'utilise toujours le caretpackage ou la tune()fonction intégrée pour le réglage des paramètres du modèle.J'aime donc particulièrement votre deuxième idée sur la façon de gérer cela en pratique en ajustant le schéma de rééchantillonnage pour favoriser la classe minoritaire. Très appréciée.
John Colby

heureux que votre suggestion ait été utile. Il existe un document sur la définition du rapport optimal qui pourrait également être utile theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Cependant, la correction théorique optimale n'est pas toujours optimale dans la pratique, donc les meilleurs résultats pourraient en fait être obtenu en ajustant les deux paramètres C séparés sans forcer un rapport particulier, mais en pondérant les modèles selon la classe lors de l'évaluation du critère de sélection du modèle de sortie.
Dikran Marsupial

2
J'ajouterais également que ces jours-ci, j'ai tendance à utiliser la régression de la crête du noyau plutôt que les SVM car vous n'avez pas ce genre de problèmes contre-intuitifs en raison de la discontinuité dans le dérivé de la fonction de perte. Très souvent, si vous réglez correctement un SVM L2, vous vous retrouvez avec une très petite valeur de C et toutes les données sont des SV, auquel cas vous avez un modèle KRR de toute façon. Plus je les utilisais, moins je trouvais les SVM utiles dans la pratique, bien que les connaissances théoriques qu'ils aient apportées aient été essentielles.
Dikran Marsupial

0

dans la formation, svm trouve des vecteurs de support pour faire une frontière discriminante et quand il y a suffisamment de vecteurs de support pour toutes les données de classes pour le faire, ce ne serait pas un problème. dans la précision des résultats de l'ensemble de tests, vous devez tenir compte de la quantité d'égalité des données pour toutes les classes dans le monde réel et pour obtenir des résultats réels, vous devez manipuler les données ainsi qu'elles sont correctement prises en compte dans la situation réelle.


Cette réponse n'est pas assez claire pour le moment - j'ai envisagé de lui donner une copie-édition, mais il y a plusieurs endroits où je ne savais pas ce que vous vouliez. La ponctuation et le grammmar sont importants pour transmettre du sens.
Silverfish
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.