Ich verwende SVM-Modelle zur kurzfristigen Vorhersage von Luftschadstoffen. Um ein neues Modell zu trainieren, muss ich geeignete Metaparameter für ein SVM-Modell finden (ich meine C, Gamma usw.).
In der Libsvm-Dokumentation (und in vielen anderen Büchern, die ich gelesen habe) wird vorgeschlagen, diese Parameter mithilfe der Rastersuche zu finden. Daher trainiere ich grundsätzlich das Modell für jede Kombination dieser Parameter aus einem bestimmten Satz und wähle das beste Modell aus.
Gibt es eine bessere Möglichkeit, optimale (oder nahezu optimale) Metaparameter zu finden? Für mich ist es hauptsächlich eine Frage der Rechenzeit - eine Rastersuche für dieses Problem dauert ungefähr zwei Stunden (nachdem ich einige Optimierungen vorgenommen habe).
Vorteile der Rastersuche:
- Es kann leicht parallelisiert werden - wenn Sie 20 CPUs haben, läuft es 20-mal schneller, andere Methoden zu parallelisieren ist schwieriger
- Sie überprüfen große Teile des Metaparameterraums. Wenn es also eine gute Lösung gibt, werden Sie sie finden.
Wenn Sie davon ausgehen, dass dem Parameterraster eine relativ glatte Funktion zugrunde liegt, können Sie bestimmte Dinge tun. Eine einfache Heuristik besteht beispielsweise darin, mit einem sehr groben Gitter von Parametern zu beginnen und dann ein feineres Gitter um die besten Parametereinstellungen aus dem Grobgitter zu verwenden.
Dies funktioniert in der Praxis recht gut, natürlich mit Vorbehalten. Erstens ist der Raum nicht unbedingt glatt, und es könnte lokale Optima geben . Das Grobraster kann diese komplett verfehlen und es kann zu einer suboptimalen Lösung kommen. Beachten Sie auch, dass Sie bei relativ wenigen Samples in Ihrem Hold-Out-Set möglicherweise viele Parametereinstellungen haben, die den gleichen Score liefern (Fehler oder welche Metrik Sie auch verwenden). Dies kann besonders problematisch sein, wenn Sie in mehreren Klassen lernen (z. B. mit dem One-versus-All) Methode) und Sie nur wenige Beispiele aus jeder Klasse in Ihrem Hold-Out-Set haben. Ohne auf unangenehme nichtlineare Optimierungstechniken zurückzugreifen, ist dies jedoch wahrscheinlich ein guter Ausgangspunkt.
Es gibt eine schöne Referenzen eingestellt hier . In der Vergangenheit bin ich davon ausgegangen, dass Sie einen vernünftigen Bereich von Kernel-Hyperparametern durch Inspektion des Kernels abschätzen können (z. B. im Fall des RBF-Kernels, um sicherzustellen, dass das Histogramm der Kernel-Werte eine gute Streuung der Werte ergibt, anstatt auf 0 oder 1 zu verzerren - und Sie können dies auch automatisch ohne zu viel Arbeit tun), was bedeutet, dass Sie den Bereich eingrenzen können, bevor Sie beginnen. Sie können Ihre Suche dann auf andere Parameter wie den Regularisierungs- / Kapazitätsparameter konzentrieren. Dies funktioniert natürlich nur mit vorberechneten Kerneln, obwohl Sie dies anhand einer zufälligen Teilmenge von Punkten abschätzen können, wenn Sie keine vorberechneten Kernel verwenden möchten, und ich denke, dass dieser Ansatz auch in Ordnung wäre.
quelle
Ich benutze simuliertes Tempern für die Suche nach Parametern.
Das Verhalten wird von einigen Parametern bestimmt:
k
ist Boltzmanns Konstante.T_max
ist deine Starttemperatur.T_min
ist Ihre Endschwelle.mu_T
(μ
) ist, wie viel Sie die Temperatur senken (T->T/μ
)i
ist die Anzahl der Iterationen bei jeder Temperaturz
ist eine Schrittgröße - Sie bestimmen, was genau das bedeutet. Ich bewege mich willkürlich hineinold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
undi
verringern Sie dabei gelegentlich alle Iterationen, bis Sie einen Treffer erzielenT_min
.Spielen Sie ein bisschen mit den Parametern herum und Sie sollten in der Lage sein, ein Set zu finden, das gut und schnell funktioniert.
Und die GNU Scientific Library enthält simuliertes Tempern.
quelle
Wenn jemand hier interessiert ist, sind einige meiner Gedanken zu diesem Thema:
quelle
Wenn der Kernel radial ist, können Sie diese Heuristik verwenden , um einen richtigen Kernel zu erhaltenσ - C-Optimierung ist dann viel einfacher.
quelle