Tuning: C & gamma

Bei der RBF-SVM entscheiden genau zwei Hyperparameter über alles: C (wie teuer sind Fehler?) und gamma (wie lokal denkt der Kernel?). Wer ihre Wirkung versteht, liest aus jedem Score-Plot sofort ab, in welche Richtung es weitergeht.

Merksatz: C kontrolliert die Strafe für Margin-Verstöße, gamma die Reichweite eines einzelnen Trainingspunkts. Beide hoch = auswendig lernen. Beide niedrig = alles verschwimmt.

Die Wirkung im Überblick

zu niedrigzu hoch
CFehler sind billig → breite, glatte Grenze, ignoriert auch echte Struktur (Underfitting)jeder Fehler teuer → Grenze windet sich um einzelne Punkte (Overfitting)
gammajeder Punkt strahlt weit → fast lineares Verhalten, Details gehen verlorenjeder Punkt strahlt nur millimeterweit → Inseln um einzelne Trainingspunkte, Test-Punkte fallen ins Niemandsland

Die beiden Parameter kompensieren sich teilweise: Ein zu großes gamma lässt sich mit kleinem C etwas zähmen und umgekehrt. Deshalb sucht man sie immer gemeinsam — als Gitter, nicht nacheinander.

Logarithmisches Grid + Heatmap

PYTHONsvm_grid.py
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("svc", SVC(kernel="rbf", cache_size=1000)),
])

# Immer in Zehnerpotenzen suchen — die Wirkung ist logarithmisch
grid = GridSearchCV(
    pipe,
    param_grid={
        "svc__C":     [0.1, 1, 10, 100],
        "svc__gamma": [1e-4, 1e-3, 1e-2, 1e-1, "scale"],
    },
    cv=3,
    scoring="f1_macro",
    n_jobs=-1,
)
# 4 x 5 Kombis x 3 Folds = 60 SVM-Trainings → aufs Subsample!
grid.fit(X_train_sub, y_train_sub)

print(grid.best_params_)
# Die ganze cv_results_-Matrix als C-gamma-Heatmap plotten:
# gute Regionen bilden ein Plateau — nimm dessen Mitte,
# nicht die zufällige Bestmarke am Rand.

Workflow-Empfehlung

  1. Subsample ziehen (z.B. 8.000 Bilder, stratifiziert) — das Grid wäre auf allen Daten unbezahlbar.
  2. Grob suchen in Zehnerpotenzen, Heatmap ansehen.
  3. Fein nachsuchen um die beste Region (z.B. C ∈ [3, 10, 30]).
  4. Final einmal mit den besten Parametern auf allen Trainingsdaten trainieren, dann Test-Set.
Warum eigentlich?Was bedeutet gamma='scale' eigentlich?
Der sklearn-Default setzt γ = 1 / (n_features · Var(X)) — die Reichweite des Kernels wird an Dimension und Streuung der Daten angepasst. Für skalierte Daten (Var ≈ 1) heißt das γ ≈ 1/512. Das ist ein bemerkenswert guter Startwert: Die typische quadrierte Distanz zweier zufälliger Punkte wächst proportional zur Dimension, und genau das gleicht der Nenner aus. Trotzdem gilt: „scale“ gehört als Kandidat ins Grid, ersetzt es aber nicht.
Häufiger DenkfehlerAuf dem Tuning-Subsample auch evaluieren
Subtiler Doppelfehler: Wer auf dem 8.000er-Subsample tunt und evaluiert, vergleicht Verfahren unter Laborbedingungen, die später keiner reproduziert. Das Subsample ist nur Werkzeug für die Suche. Final trainiert wird mit den gefundenen Parametern auf allen Trainingsdaten, gemessen wird auf dem unangetasteten Test-Set — sonst sind die berichteten Zahlen Äpfel gegen Birnen (z.B. gegen die LogReg, die auf allem trainiert hat).
Tiefer reinRandomizedSearch und Halving — wenn das Grid explodiert
Mit jedem zusätzlichen Parameter multipliziert sich das Grid. Zwei Auswege: RandomizedSearchCV zieht zufällige Kombinationen aus Verteilungen (überraschend effektiv — wichtige Parameter bekommen automatisch mehr unterschiedliche Werte) und HalvingGridSearchCV startet alle Kandidaten mit wenig Daten und lässt nur die besten in die teuren Runden mit vollen Daten aufsteigen. Für SVMs mit ihrem superlinearen Training ist Halving wie gemacht.