Welchen Einfluss hat C in SVMs mit linearem Kernel?

134

Ich verwende derzeit eine SVM mit einem linearen Kernel, um meine Daten zu klassifizieren. Es liegt kein Fehler im Trainingssatz vor. Ich habe verschiedene Werte für den Parameter ausprobiert ( ). Dies hat den Fehler im Test-Set nicht verändert.10 - 5 , , 10 2C105,,102

Jetzt frage ich mich: ist dies ein Fehler durch die Ruby - Bindungen verursacht für libsvmIch verwende ( rb-LIBSVM ) oder ist dies theoretisch erklärbar ?

Sollte der Parameter immer die Leistung des Klassifikators ändern?C

alfa
quelle
Nur ein Kommentar, keine Antwort: Jedes Programm, das eine Summe von zwei Begriffen minimiert, wie z. B. sollte (imho) Ihnen sagen, was die beiden Begriffe am Ende sind dass Sie sehen können, wie sie ausbalancieren. (Wenn Sie Hilfe bei der Berechnung der beiden SVM-Begriffe benötigen, versuchen Sie, eine separate Frage zu stellen. Haben Sie sich einige der am schlechtesten eingestuften Punkte angesehen? Können Sie ein ähnliches Problem wie das Ihre posten?)|w|2+Cξi,
denis

Antworten:

136

Der C-Parameter teilt der SVM-Optimierung mit, wie sehr Sie eine Fehlklassifizierung der einzelnen Trainingsbeispiele vermeiden möchten. Für große Werte von C wählt die Optimierung eine Hyperebene mit kleinerem Rand, wenn diese Hyperebene besser dazu beiträgt, alle Trainingspunkte korrekt zu klassifizieren. Umgekehrt führt ein sehr kleiner Wert von C dazu, dass der Optimierer nach einer Hyperebene mit größerem Rand sucht, auch wenn diese Hyperebene mehr Punkte falsch klassifiziert. Für sehr kleine Werte von C sollten Sie falsch klassifizierte Beispiele erhalten, selbst wenn Ihre Trainingsdaten linear trennbar sind.

Marc Shivers
quelle
1
OK, ich verstehe, dass C den Einfluss der Fehlklassifizierung auf die Zielfunktion bestimmt. Die Zielfunktion ist die Summe aus einem Regularisierungszeitraum und der Fehlklassifizierungsrate (siehe en.wikipedia.org/wiki/Support_vector_machine#Soft_margin ). Wenn ich C ändere, hat dies keine Auswirkungen auf das Minimum meiner Zielfunktion. Könnte das bedeuten, dass der Regularisierungszeitraum immer sehr klein ist?
Alfa
3
Ich würde vorschlagen, einen größeren Bereich von C-Werten auszuprobieren, vielleicht 10 ^ [- 5, ..., 5], oder mehr, wenn die Optimierung in Ihrem Dataset schnell ist, um zu sehen, ob Sie etwas bekommen, das vernünftiger aussieht. Sowohl der Trainingsfehler als auch der Wert der Mindestkosten sollten sich ändern, wenn C variiert. Ist der Umfang Ihrer Daten auch extrem? Im Allgemeinen sollte ein optimaler C-Parameter größer sein, wenn Sie Ihre Daten verkleinern und umgekehrt. Wenn Sie also sehr kleine Werte für Features haben, achten Sie darauf, sehr große Werte für die möglichen C-Werte anzugeben. Wenn keine der oben genannten hilft, würde ich denke , das Problem ist in dem Ruby - Bindings
Marc Shivers
3
Das Ändern der ausgeglichenen Genauigkeit von 0,5 (nur Vermutung) auf 0,86 klingt für mich nicht nach einem geringfügigen Einfluss. Es wäre eine gute Idee, ein feineres Wertegitter für C zu untersuchen, wie Marc vorschlägt, aber die von Ihnen angegebenen Ergebnisse scheinen ein ziemlich normales Verhalten zu sein. Man könnte erwarten, dass der Fehler wieder auftritt, da C aufgrund von Überanpassung gegen unendlich tendiert, aber das scheint in diesem Fall kein großes Problem zu sein. Beachten Sie, dass Sie möglicherweise bessere Ergebnisse
erzielen
2
... indem verschiedene Werte von C für Muster verwendet werden, die zu den positiven und negativen Klassen gehören (was asymptotisch dem erneuten Abtasten der Daten entspricht, um den Anteil der Muster zu ändern, die zu jeder Klasse gehören).
Dikran Beuteltier
2
Ich halte es für möglich, dass die SVM bei Erreichen von C = 10 ^ 0 bereits alle Trainingsdaten korrekt klassifiziert und in diesem Fall keiner der Unterstützungsvektoren gebunden ist (das Alpha ist gleich C), was C größer macht keine Auswirkung auf die Lösung.
Dikran Marsupial
152

In einer SVM suchen Sie nach zwei Dingen: einer Hyperebene mit dem größten minimalen Rand und einer Hyperebene, die so viele Instanzen wie möglich korrekt trennt. Das Problem ist, dass Sie nicht immer beides bekommen können. Der Parameter c bestimmt, wie groß Ihr Wunsch nach letzterem ist. Ich habe ein kleines Beispiel unten gezeichnet, um dies zu veranschaulichen. Links haben Sie ein niedriges c, was Ihnen einen ziemlich großen Mindestrand (lila) gibt. Dies setzt jedoch voraus, dass wir den blauen Kreisausreißer, den wir nicht richtig klassifiziert haben, vernachlässigen. Rechts hast du ein Hoch c. Jetzt werden Sie den Ausreißer nicht vernachlässigen und haben einen viel kleineren Spielraum.

Bildbeschreibung hier eingeben

Welche dieser Klassifikatoren sind also die besten? Das hängt davon ab, wie die zukünftigen Daten aussehen, die Sie vorhersagen werden, und meistens wissen Sie das natürlich nicht. Wenn die zukünftigen Daten so aussehen:

großes c ist am besten dann ist der mit einem großen c-Wert erlernte Klassifikator am besten.

Auf der anderen Seite, wenn die zukünftigen Daten so aussehen:

niedrig c ist am besten dann ist der mit einem niedrigen c-Wert erlernte Klassifikator am besten.

Abhängig von Ihrem Datensatz kann das Ändern von c eine andere Hyperebene erzeugen oder nicht. Wenn es tut , eine andere Hyperebene erzeugen, das bedeutet nicht , dass Ihre Klassifikator verschiedene Klassen , für die speziellen Daten werden Sie es verwendet haben , zu klassifizieren. Weka ist ein gutes Tool zum Visualisieren von Daten und zum Herumspielen mit verschiedenen Einstellungen für eine SVM. Dies kann Ihnen helfen, eine bessere Vorstellung davon zu bekommen, wie Ihre Daten aussehen und warum das Ändern des c-Werts den Klassifizierungsfehler nicht ändert. Im Allgemeinen erleichtern wenige Trainingsinstanzen und viele Attribute die lineare Trennung der Daten. Auch die Tatsache, dass Sie Ihre Trainingsdaten und keine neuen unsichtbaren Daten auswerten, erleichtert die Trennung.

Aus welchen Daten möchten Sie ein Modell lernen? Wie viele Daten? Können wir es sehen?

Kent Munthe Caspersen
quelle
4
Ich habe die Daten seit mehr als 3 Jahren nicht mehr angefasst. Es ist sehr hochdimensional und laut und ich darf es nicht veröffentlichen. Die Frage wurde bereits beantwortet, aber ich denke, Ihre Visualisierung ist sehr gut und intuitiv.
Alfa
genial. hast du solche erklärungen auch für gama value?
MonsterMMORPG
2
Der Gamma-Parameter wird für die Gaußsche Kernelfunktion verwendet. Die Kernelfunktionen können als eine effiziente Methode angesehen werden, um Ihre ursprünglichen Features in einen anderen Bereich zu transformieren, in dem eine separate Hyperebene im neuen Feature-Bereich nicht linear im ursprünglichen Feature-Bereich sein muss. Beispielsweise könnte die zweidimensionale Position eines Datenpunkts im ursprünglichen Merkmalsraum verwendet werden, um ein neues Merkmal zu berechnen, das die Entfernung zu einer Markierung auf einer Karte darstellt. Mit dieser neuen Funktion kann ein nichtlinearer Klassifikator (im ursprünglichen Raum) erstellt werden, dessen Entscheidungsgrenze einen Kreis um den Marker bildet
Kent Munthe Caspersen,
@ KentMuntheCaspersen ist Ihre Erklärung von C nicht falsch? Es ist das Gegenteil von dem, was in dem Buch "Einführung in das statistische Lernen" steht.
Diugalde
2
@diugalde kannst du aus dem Buch zitieren, was genau von meiner Erklärung abweicht? Ich stelle mir c immer als die Kosten einer Fehlklassifizierung vor (leicht zu merken durch c bei der Klassifizierung). Auf diese Weise bedeutet ein höheres c hohe Fehlklassifizierungskosten, was dazu führt, dass der Algorithmus versucht, alle Datenpunkte perfekt zu trennen. Bei Ausreißern ist dies nicht immer möglich oder führt nicht immer zu einem guten Gesamtergebnis, was ein guter Grund ist, c zu senken / einzuführen.
Kent Munthe Caspersen
26

C ist im Wesentlichen ein Regularisierungsparameter, der den Kompromiss zwischen dem Erreichen eines geringen Fehlers bei den Trainingsdaten und der Minimierung der Norm der Gewichte steuert. Dies ist analog zum Ridge-Parameter bei der Ridge-Regression (in der Praxis gibt es kaum Unterschiede in Bezug auf Leistung oder Theorie zwischen linearen SVMs und Ridge-Regression, daher verwende ich im Allgemeinen die letztere - oder die Kernel-Ridge-Regression, wenn es mehr Attribute als Beobachtungen gibt).

Die korrekte Abstimmung von C ist ein entscheidender Schritt in der bewährten Praxis bei der Verwendung von SVM, da die strukturelle Risikominimierung (das Hauptprinzip des grundlegenden Ansatzes) über die Abstimmung von C umgesetzt wird. Der Parameter C erzwingt eine Obergrenze für die Norm von weight, was bedeutet, dass es eine verschachtelte Menge von Hypothesenklassen gibt, die durch C indiziert sind. Wenn wir C erhöhen, erhöhen wir die Komplexität der Hypothesenklasse (wenn wir C geringfügig erhöhen, können wir immer noch alle linearen Modelle bilden, die wir vorher konnten und auch einige, die wir nicht konnten, bevor wir die Obergrenze für die zulässige Norm der Gewichte erhöht haben). Neben der Implementierung von SRM über die maximale Margin-Klassifizierung wird dies auch durch die Einschränkung der Komplexität der Hypothesenklasse über das Controlling C implementiert.

Leider ist die Theorie zur Bestimmung, wie C gesetzt werden soll, derzeit nicht sehr gut entwickelt, sodass die meisten Menschen dazu neigen, eine Kreuzvalidierung durchzuführen (wenn sie etwas tun).

Dikran Beuteltier
quelle
OK, ich glaube, ich verstehe jetzt die Bedeutung von C. :)
Alfa
2
Aber wenn C ein Regularisierungsparameter ist, warum erhöht ein hoher C die Überanpassung, wenn im Allgemeinen eine Regularisierung durchgeführt wird, um die Überanpassung abzumildern, dh indem ein allgemeineres Modell erstellt wird?
user1603472
2
C ist ein Regularisierungsparameter, der jedoch im Wesentlichen eher mit dem Datenfehlanpassungsterm (der Summe der Slack-Variablen) als mit dem Regularisierungsterm (dem Margin-Bit) verknüpft ist. Ein größerer Wert von C bedeutet also weniger Regularisierung als mehr. Alternativ können Sie die übliche Darstellung des Regularisierungsparameters als 1 / C anzeigen.
Dikran Beuteltier
8

C ist ein Regularisierungsparameter, der den Kompromiss zwischen dem Erreichen eines geringen Trainingsfehlers und einem geringen Testfehler steuert. Dies ist die Fähigkeit, Ihren Klassifikator auf unsichtbare Daten zu verallgemeinern.

Betrachten Sie die Zielfunktion einer linearen SVM: min | w | ^ 2 + C∑ξ. Wenn Ihr C zu groß ist, versucht der Optimierungsalgorithmus, | w | zu reduzieren so viel wie möglich zu einer Hyperebene führen, die versucht, jedes Trainingsbeispiel richtig zu klassifizieren. Andernfalls gehen die Generalisierungseigenschaften des Klassifikators verloren. Wenn andererseits Ihr C zu klein ist, geben Sie Ihrer Zielfunktion eine gewisse Freiheit, um | w | zu erhöhen viel, was zu großen Trainingsfehlern führen wird.

Die folgenden Bilder können Ihnen dabei helfen, dies zu veranschaulichen. Linearer SVM-Klassifikator mit C = 10000000Linearer SVM-Klassifikator mit C = 0,001

Deerishi
quelle
Ich verstehe deine Pläne nicht wirklich. Kannst du es erklären?
Alfa
1
@alfa: Meine Absicht für die Darstellung der Diagramme war: 1) Wenn C zu groß ist (Diagramm 1), passt Ihr Klassifikator über, dh es wird versucht, jeden Trainingsdatenpunkt genau zu klassifizieren. In Diagramm 1 sind fast alle Trainingspunkte korrekt klassifiziert. 2) Wenn andererseits C zu klein ist (Diagramm 2), wird Ihr Klassifikator nicht richtig passen. Diagramm 2 zeigt den Under-Fit-Klassifikator. Die Punkte werden nicht in ihre jeweiligen Klassen unterteilt. Hoffe das hilft.
Deerishi
Das bedeutet, dass Ihre x- und y-Achse zwei unterschiedliche Merkmale aufweisen. Die Bezeichnungen "Länge des Datensatzes" und "Summe der Mittelwerte" sind etwas verwirrend?
Alfa
Es wäre interessant zu sehen, wie die richtige Wahl für C in beiden Fällen hilft.
Alfa
2
Ich denke, es ist nicht offensichtlich, dass C = 10000000 eine schlechte Wahl ist, und ich denke, dass der Datensatz nicht der richtige ist, um dies zu demonstrieren. Vielleicht wäre ein Datensatz mit nur wenigen Ausreißern auf der falschen Seite der trennenden Hyperebene besser?
Alfa
4

Die Antworten oben sind ausgezeichnet. Nachdem ich Ihre Fragen sorgfältig gelesen hatte, stellte ich fest, dass es zwei wichtige Fakten gibt, die wir möglicherweise übersehen haben.

  1. Sie verwenden einen linearen Kernel
  2. Ihre Trainingsdaten sind linear trennbar, da "Es liegt kein Fehler im Trainingssatz vor".

Wenn sich die C-Werte innerhalb eines vernünftigen Bereichs ändern, verschiebt sich die optimale Hyperebene unter Berücksichtigung der beiden Tatsachen nur zufällig um einen kleinen Betrag innerhalb des Randes (der durch die Stützvektoren gebildeten Lücke).

Angenommen, der Abstand der Trainingsdaten ist gering und / oder es gibt keine Testdatenpunkte innerhalb des Abstandes. Die Verschiebung der optimalen Hyperebene innerhalb des Abstandes hat keinen Einfluss auf den Klassifizierungsfehler des Testsatzes.

Wenn Sie jedoch C = 0 setzen, ignoriert SVM die Fehler und versucht nur, die Summe der Quadrate der Gewichte (w) zu minimieren. Möglicherweise erhalten Sie unterschiedliche Ergebnisse für den Testsatz.

Luz
quelle
2

Der C-Parameter wird zur Steuerung der Ausreißer verwendet - niedriges C bedeutet, dass wir mehr Ausreißer zulassen, hohes C bedeutet, dass wir weniger Ausreißer zulassen.

H. Irshad
quelle
1

Ein hohes C (Kosten) bedeutet, dass die Kosten einer Fehlklassifizierung erhöht werden. Dies bedeutet, dass ein flexibler Kernel schneller wird, um Fehlklassifizierungen der Beobachtungen im Trainingssatz zu vermeiden.

Wenn der Kernel verzerrt sein soll, lässt sich das Modell bei der Vorhersage neuer Daten nicht gut verallgemeinern.

Wenn der Kernel gerade ist, kann das Modell bei der Vorhersage neuer Daten nicht gut verallgemeinert werden.

Brad
quelle