SVM mit ungleichen Gruppengrößen in Trainingsdaten

12

Ich versuche, eine SVM aus Trainingsdaten zu erstellen, bei denen eine Gruppe mehr als die andere vertreten ist. Die Gruppen werden jedoch in den endgültigen Testdaten zu gleichen Teilen vertreten sein. Daher möchte ich den class.weightsParameter der e1071R-Paket-Schnittstelle verwenden libsvm, um den Einfluss der beiden Gruppen auf die Trainingsdaten auszugleichen.

Da ich nicht genau wusste, wie diese Gewichte angegeben werden sollten, habe ich einen kleinen Test durchgeführt:

  1. Generieren Sie einige Nulldaten (zufällige Merkmale; Verhältnis 2: 1 zwischen Gruppenbezeichnungen)
  2. Passen Sie ein SVM mit dem class.weightsParametersatz an.
  3. Sagen Sie eine Reihe neuer Null-Datensätze voraus und sehen Sie sich die Klassenproportionen an.
  4. Wiederholen Sie den gesamten Prozess mehrmals für verschiedene Null-Trainingssätze.

Hier ist der R-Code, den ich verwende:

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

Von dieser ganzen Sache habe ich eine Ausgabe von ~ 0,5 erwartet, aber das habe ich nicht bekommen:

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

Die class.weightsParamter arbeiten, eine Art , wie das untere ich Gewicht a, desto niedriger ist es in dieser Simulation dargestellt wird (und wenn ich weglassen class.weightses nahe 1 zurückgibt) ... aber ich verstehe nicht , warum nur Gewichte von 1: 2 ( für Trainingsdaten, die 2: 1 sind) bringt mich nicht ganz auf 50%.

Wenn ich SVMs falsch verstehe, kann jemand diesen Punkt erklären? (oder einige refs schicken?)

Kann mir jemand sagen, wie ich den class.weightsParameter richtig verwenden soll, wenn ich es falsch mache ?

Könnte es möglicherweise ein Fehler sein? (Ich denke nicht, da ich diese Software und die zugrunde liegende libsvm recht ausgereift verstehe)

John Colby
quelle
Ich habe keine Erfahrung mit libsvm, aber mit LiblineaR sind die Klassengewichte von entscheidender Bedeutung. Ohne die richtige Einstellung erhalten Sie suboptimale Ergebnisse, wenn Ihre Klassen stark aus dem Gleichgewicht geraten. Ich würde vorschlagen: Holen Sie sich ein reales Dataset mit unsymmetrischen Klassen und versuchen Sie es mit verschiedenen Werten von class.weights (in LiblineaR wi). LiblineaR ist für einen linearen Kernel um Größenordnungen schneller und hat auch Methoden bestraft. Nach meiner Erfahrung finden Sie zuerst ein anständiges Klassengewicht und optimieren dann C.
Marbel

Antworten:

7

Ich denke, es kann von den Werten von C und der Anzahl der Muster abhängen, die Sie haben. Die SVM versucht, die maximale Margin-Diskriminante zu finden. Wenn Sie also nur wenige Daten haben, kann es sein, dass die SVM die Lösung mit der harten Margin findet, ohne dass einer der Lagrange-Multiplikatoren seine Obergrenze erreicht (in diesem Fall das Verhältnis der Strafen für jeden Klasse ist im Wesentlichen irrelevant, da die Slack-Valiables klein oder null sind. Versuchen Sie, die Anzahl der Trainingsmuster zu erhöhen, und prüfen Sie, ob dies einen Effekt hat (da dies die Wahrscheinlichkeit verringert, dass die Hard-Margin-Lösung innerhalb der Box-Beschränkungen gefunden wird). .

Noch wichtiger ist, dass die optimalen Werte von C datenabhängig sind. Sie können sie nicht einfach auf bestimmte Werte einstellen, sondern sie optimieren, indem Sie den ausgelassenen Fehler oder eine bestimmte Verallgemeinerungsgrenze minimieren. Bei unausgeglichenen Klassen können Sie das Verhältnis der Werte für jede Klasse festlegen und die durchschnittliche Strafe für alle Muster optimieren.

Dikran Beuteltier
quelle
Das macht Sinn. Wenn ich in dieser Simulation die Anzahl der Features reduziere und die Anzahl der Beobachtungen erhöhe, rückt der Ausgabewert näher an 0,5. Es kommt jedoch nie ganz an - auch bei 900 Zeilen und nur 1 Spalte.
John Colby
Natürlich verwende ich bei realen Daten immer das caretPaket oder die eingebaute tune()Funktion zur Optimierung von Modellparametern. Daher gefällt mir besonders Ihre zweite Idee, wie Sie in der Praxis damit umgehen können, indem Sie das Resampling-Schema an die Minoritätsklasse anpassen. Sehr geschätzt.
John Colby
Ich bin froh, dass Ihr Vorschlag hilfreich war. Es gibt einen Artikel zur Einstellung des optimalen Verhältnisses, der auch nützlich sein kann. Theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Die optimale theoretische Korrektur ist jedoch in der Praxis nicht immer optimal, sodass die besten Ergebnisse erzielt werden können tatsächlich erhalten werden, indem man die beiden getrennten C-Parameter abstimmt, ohne ein bestimmtes Verhältnis zu erzwingen, aber die Muster gemäß der Klasse gewichtet, wenn man das Kriterium für die Auswahl eines ausgelassenen Modells bewertet.
Dikran Beuteltier
2
Ich möchte auch hinzufügen, dass ich heutzutage eher die Kernel-Ridge-Regression als SVMs verwende, da diese Art von kontraintuitiven Problemen aufgrund der Diskontinuität in der Ableitung der Verlustfunktion nicht auftreten. Sehr oft, wenn Sie eine L2-SVM richtig einstellen, erhalten Sie einen sehr kleinen Wert von C und alle Daten sind SVs. Zu diesem Zeitpunkt haben Sie ohnehin ein KRR-Modell. Je öfter ich sie verwendete, desto weniger nützlich habe ich SVMs in der Praxis gefunden, obwohl die theoretischen Erkenntnisse, die sie gebracht haben, von entscheidender Bedeutung waren.
Dikran Beuteltier
0

beim trainieren von svm finden sie unterstützungsvektoren, um eine unterscheidungsgrenze zu bilden, und wenn es genug unterstützungsvektoren für alle klassendaten gibt, wäre dies kein problem. Bei der Ergebnisgenauigkeit des Testsets sollten Sie die Datenmenge für alle Klassen in der realen Welt berücksichtigen. Um echte Ergebnisse zu erzielen, sollten Sie die Daten so manipulieren, dass sie ordnungsgemäß in die reale Situation eingehen.

ho3ein
quelle
Diese Antwort ist im Moment ziemlich unklar - ich dachte darüber nach, sie zu kopieren, aber es gibt mehrere Stellen, an denen ich nicht sicher war, was Sie beabsichtigten. Zeichensetzung und Grammatik sind wichtig, um Bedeutung zu vermitteln.
Silberfischchen