Praxis: RandomForestClassifier

Der Random Forest ist das pflegeleichteste der vier Verfahren: kein Scaler, brauchbare Defaults, parallelisiert von allein. Dazu liefert er etwas, das die anderen nicht haben — eine eingebaute Antwort auf die Frage, welche Features wichtig waren.

Beachte, was fehlt: kein StandardScaler, kein max_iter, keine ConvergenceWarning. Bäume splitten auf Schwellwerten — Skalierung ist ihnen egal.

Training + Evaluation

PYTHONrf_plantvillage.py
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# Features + Split wie gehabt — aber OHNE Scaler
wald = RandomForestClassifier(
    n_estimators=300,        # Anzahl Bäume
    max_features="sqrt",     # ~23 von 512 Features pro Split
    min_samples_leaf=2,      # Blätter dürfen nicht zu klein werden
    oob_score=True,          # Gratis-Validierung (siehe Ensemble-Lektion)
    n_jobs=-1,               # Bäume parallel auf allen Kernen
    random_state=42,
)
wald.fit(X_train, y_train)

print("OOB-Score:", round(wald.oob_score_, 3))
print(classification_report(y_test, wald.predict(X_test), digits=3))

Auf den 512 HSV-Histogramm-Features schlägt der Wald die LogReg-Baseline typischerweise um einige Punkte — gekrümmte Entscheidungsgrenzen ohne Kernel-Kosten. Das Training der 300 Bäume läuft parallel und bleibt auch bei 43.000 Bildern im Minutenbereich.

Feature Importance: Was hat der Wald gelernt?

PYTHONimportance.py
import numpy as np

# Variante 1: eingebaut (Gini Importance) — schnell, aber mit Bias
imp = wald.feature_importances_
top = np.argsort(imp)[-10:][::-1]
print("Wichtigste Histogramm-Bins:", top)

# Variante 2: Permutation Importance — ehrlicher, dafür teurer.
# Misst: wie stark fällt der Score, wenn man ein Feature zerwürfelt?
from sklearn.inspection import permutation_importance
perm = permutation_importance(
    wald, X_test, y_test, n_repeats=5, n_jobs=-1, random_state=42
)
top_perm = np.argsort(perm.importances_mean)[-10:][::-1]
print("Wichtigste Bins (Permutation):", top_perm)

Die Top-Bins lassen sich in HSV-Bereiche zurückübersetzen — und erzählen meist eine plausible Geschichte: Grün-, Gelb- und Braun-Töne dominieren, genau die Farben, in denen sich gesunde und kranke Blätter unterscheiden.

Warum eigentlich?Warum zwei Importance-Varianten?
Die eingebaute Gini-Importance misst, wie viel Impurity-Reduktion ein Feature über alle Splits beigesteuert hat — auf den Trainingsdaten. Sie bevorzugt systematisch Features mit vielen möglichen Schwellwerten und kann Features belohnen, die nur beim Auswendiglernen halfen. Die Permutation-Importance stellt die ehrlichere Frage: Was kostet es auf ungesehenen Daten, dieses Feature zu zerstören? Wenn beide Rankings übereinstimmen — gut. Wenn nicht, glaub der Permutation.
Häufiger Denkfehlerpredict_proba für bare Münze nehmen
wald.predict_proba liefert den Stimmenanteil der Bäume — 0,9 heißt: 90 % der Bäume sagen diese Klasse. Das ist ein brauchbares Konfidenz-Ranking, aber keine kalibrierte Wahrscheinlichkeit: Wälder sind oft unterkonfident (selten nahe 0 oder 1, weil fast nie alle Bäume einstimmig sind). Für Schwellwert-Entscheidungen reicht es; für echte Risikoabschätzungen vorher kalibrieren (CalibratedClassifierCV).
Tiefer reinSpeicher und Latenz im Blick behalten
300 unbeschnittene Bäume auf 43.000 Bildern können als Pickle-Datei mehrere hundert MB wiegen — jeder Baum speichert zehntausende Knoten. Für eine Submission egal, für ein Deployment nicht. Stellschrauben: min_samples_leaf erhöhen (weniger Knoten pro Baum, oft sogar besserer Test-Score), max_depth begrenzen oder schlicht weniger Bäume — ab einem Punkt bringt jeder weitere Baum messbar nichts mehr. Die Vorhersage-Latenz bleibt dabei angenehm: 300 Baum-Abstiege sind Mikrosekunden, kein Vergleich zur Kernel-SVM.