Ich versuche eine einfache und leicht verständliche Antwort zu geben. Eine vollständige Antwort müsste wahrscheinlich alles abdecken, vom Zweck hinter SVMs bis zu den feineren Details von Verlust- und Unterstützungsvektoren. Wenn Sie sich eingehender mit diesen Details befassen möchten, müssen Sie möglicherweise die Kapitel über SVMs in den Büchern zum maschinellen Lernen lesen.
SVMs sind Klassifikatoren mit großem Rand . Dies bedeutet, dass die (angenommene lineare) Trennung zwischen Stichproben der Schwarz- und Weißklasse nicht nur eine mögliche, sondern die bestmögliche Trennung ist, die durch Erzielen eines größtmöglichen Spielraums zwischen Stichproben der beiden Klassen definiert wird. Dies wäre im Beispielbild:H3
Wenn Sie einen Moment darüber nachdenken, werden Sie zu dem Schluss kommen, dass die Trennung nur von den Stichproben abgeleitet wird, die näher an "der anderen Klasse" liegen, also von denen, die nahe am Rand liegen (um genau zu sein: die am Rand). Im Beispielbild sind dies die Proben, die mit den grauen Linien orthogonal zu . Dieses Verhalten verursacht ein Problem: Da die Menge der zur Ableitung der Trennung verwendeten Stichproben weitgehend Teilmengen ist, führt das Rauschen, das diese Stichproben beeinflusst, sehr wahrscheinlich dazu, dass die Trennung für die Mehrzahl der Daten suboptimal ist. Dies ist das, was wir alle als Überanpassung kennen: Die Trennung wäre aus Sicht des verwendeten Trainings mit großem Spielraum optimal, würde sich jedoch schlecht verallgemeinern und daher für andere / noch nicht sichtbare Daten suboptimal sein.H3
Was wir bisher besprochen haben, ist die "harte Randklassifizierung": Wir erlauben keine Stichproben innerhalb des Randes, da der Rand so definiert ist. Wenn wir diese harte Eigenschaft jetzt lockern, führen wir am Ende eine "weiche Randklassifizierung" durch. Die Idee hinter dem Rand bleibt dabei dieselbe - aber wir können jetzt zulassen, dass sich bestimmte Stichproben innerhalb des Randes befinden . Der Hauptvorteil besteht darin, dass auf diese Weise die Gesamtanpassung des Modells an die Daten möglicherweise besser ist als bei einer Klassifizierung mit harten Margen ( Verringerung der Varianz auf Kosten einer gewissen Verzerrung ).
Einerseits müssen wir also noch unser einfaches Optimierungsproblem lösen (wie man das Modell = Linie am besten an unsere Daten anpasst). Auf der anderen Seite möchten wir nicht alle / viele Samples am Rand haben - wir möchten irgendwie einstellen, wie viele Samples wir innerhalb des Randes lassen, damit der Rand weder vollständig überpasst noch seine große Randeigenschaft vollständig verliert.
Hier tritt der Parameter in die Bühne ein. CDie Kernidee ist einfach: wir das Optimierungsproblem zu optimieren modifizieren sowohl die Anpassung der Linie zu Daten und benachteiligt die Menge an Proben innerhalb der Marge in der gleichen Zeit, wo das Gewicht , wie viele Proben innerhalb der Marge beitragen definiert zu dem Gesamtfehler. Folglich können Sie mit einstellen, wie hart oder weich Ihre Klassifizierung mit großem Rand sein soll . Mit einem niedrigen , Proben innerhalb der Ränder sind weniger benachteiligt , als mit einem höheren . Mit einemCCCCCvon 0 werden Stichproben innerhalb der Ränder nicht mehr bestraft - was das mögliche Extrem für die Deaktivierung der Klassifizierung mit großen Rändern ist. Mit einem unendlichen Sie das andere mögliche Extrem harter Ränder.C
Hier ist ein kleines Beispiel, das den Effekt veranschaulicht, der durch das Ändern von mithilfe des bekannten Iris-Datasets verursacht wird (in und unter Verwendung des Pakets, aber das gilt natürlich auch für). So sehen die Originaldaten aus (es ist ein binäres Klassifizierungsproblem):CR
caret
libsvm
library(caret)
d <- iris[51:150,c(1,2,5)]
plot(d[,c(2,1)], pch = ifelse(d[,3]=='versicolor', 1, 2))
So kann das Ändern von die Leistung Ihres Modells beeinflussen:C
m <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', 10, 20), tuneGrid = expand.grid(C=3**(-7:7)))
plot(m, scales=list(x=list(log=3)))
Und dies ist der Unterschied in der Trennung zwischen zwei unterschiedlich gewählten Werten (beachten Sie, dass die Trennlinien unterschiedliche Neigungen haben!):C
m1 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(-7)))
plot(m1$finalModel)
m2 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(7)))
plot(m2$finalModel)
Praktisch ist es also am wahrscheinlichsten, dass Sie in Ihrem ML-Setup richtig einstellen möchten , z. B. mithilfe eines Abstimmungsrasters. Sie können zB diese Veröffentlichung für weitere Details betrachten. Es stammt von den LibSVM-Leuten und bietet viele nützliche Informationen, von der Erklärung der Funktionsweise von SVMs anhand netter Beispiele bis hin zum Codieren von Snippets für die Verwendung von Parametergittern mit LibSVM:C
Hsu et al. (2003). "Ein praktischer Leitfaden zur Unterstützung der Vektorklassifizierung." Institut für Informatik und Informationstechnik, National Taiwan University.
Übrigens: Es gibt eine kleine Liste von Dingen, die über den SVM- Parameter gesagt wurden , die ich auch zum Verständnis hilfreich finde: http://www.svms.org/parameters/C