Die 100%ige Trefferquote, die keine war
Teil dieser Serie über Netzresilienz-Forschung ist es, ehrlich über die Ergebnisse zu sein, die einer Prüfung nicht standhalten. Dieses hier ist das schärfste Beispiel: eine zustandsabhängige Filterregel, die scheinbar 43 von 43 bekannten Spannungsverletzungen auffing – buchstäblich 100 % Recall – und sich bei genauerer Betrachtung als zirkulär konstruiert herausstellte.
Die Behauptung
Der Selektor aus dem vorherigen Beitrag, der nur nach der Größe filtert, hat einen offensichtlichen blinden Fleck: Er markiert Ereignisse allein anhand der Redispatch-Größe, aber das Spannungsrisiko wird von der Hintergrundlast dominiert, die der Selektor niemals betrachtet. Die natürliche Lösung ist eine zustandsabhängige Regel – eine, die auch vom Lastmultiplikator zum Zeitpunkt des Ereignisses abhängt.
Eine frühe Version dieser Regel verwendete einen einfachen Schwellenwert für den Lastmultiplikator: Ein Ereignis wurde markiert, wenn der Lastmultiplikator einen bestimmten Grenzwert überschritt. Getestet an einem bekannten Set von 43 Verletzungen aus einer Stichprobe zur Überprüfung der Trefferquote (Recall-Audit), wurden alle 43 erfasst. 100 %.
Diese Zahl ist die Art von Ergebnis, von der man möchte, dass sie wahr ist. Es ist aber auch die Art von Ergebnis, die Sie misstrauisch machen sollte, bevor Sie sich darüber freuen.
Die Überprüfung
Der Test, der für eine solche Behauptung wirklich zählt: Ist der Schwellenwert unabhängig von der Stichprobe, an der er validiert wird? Wenn ein Schwellenwert gewählt wurde – auch implizit –, indem man sich die Ergebnisse angesehen hat, die er später „vorhersagt“, ist die Validierung wertlos, unabhängig davon, wie sauber die Zahl aussieht.
Die Überprüfung selbst ist ein Einzeiler: Was ist der minimale Lastmultiplikator unter den 43 bekannten Verletzungen?
Der verwendete Schwellenwert lag bei exakt 1,20. Nicht in der Nähe davon – identisch mit dem Mindestwert genau in der Stichprobe, an der er getestet wurde. Ein Schwellenwert, der auf das eigene Minimum der Stichprobe festgelegt ist, erfasst konstruktionsbedingt jede Verletzung in dieser Stichprobe und sagt nichts darüber aus, wie er bei einem Ereignis außerhalb davon abschneiden würde. Es ist das Modellierungs-Äquivalent zur Benotung der eigenen Prüfung mit bereits ausgefülltem Lösungsbogen.
Warum es sich lohnt, darüber zu schreiben
Dies ist keine Geschichte über den Fehler eines anderen, der während eines Reviews entdeckt wurde – es ist ein Fehler, den ich gemacht und entdeckt habe, indem ich dieselbe Disziplin anwandte, die ich auf jedes andere Ergebnis anwenden würde: Vertraue keiner Zahl, die ungewöhnlich gut aussieht, bis du überprüft hast, ob die Evaluierung in die Modellanpassung durchgesickert sein könnte. Es ist eine leichte Falle, gerade weil ein auf diese Weise gewählter Schwellenwert nicht falsch aussieht. Es gibt keinen offensichtlich zirkulären Code-Pfad, kein geleaktes Label im offensichtlichen Sinne – nur einen Grenzwert, der zufällig dem Minimum der genauen Population entspricht, die zur Validierung verwendet wurde, was funktional der gleiche Fehler ist, mit einer weniger offensichtlichen Signatur.
Die Lösung, die Bestand hatte: echte Train/Test-Disziplin. Passe jede zustandsabhängige Regel auf einem 70/30-Split einer Population an, bewerte sie out-of-sample auf einer zurückgehaltenen Population, die während der Anpassung nie berührt wurde, und passe die Regel niemals an, nachdem du gesehen hast, wie sie beim auditierten Set abschneidet. Das ist die Methodik hinter dem tatsächlichen Ersatzergebnis – einer linearen Spannungssensitivitätsregression, die bei jedem Betriebszustand neu angepasst und echt out-of-sample getestet wurde –, welches das Thema eines späteren Beitrags in dieser Serie ist und die 43/43-Behauptung vollständig ersetzt.
Der Widerruf, klar gesagt
Das 43/43 (≈100 %)-Ergebnis wird widerrufen. Es handelte sich nicht um einen echten Out-of-Sample-Test für zustandsabhängiges Screening; es war ein Schwellenwert, der dem Minimum der Population entsprach, an der er validiert wurde, und jede darauf aufbauende Behauptung sollte eher verworfen als mit Vorbehalten versehen werden. Das ehrliche Ersatzergebnis – ein echtes out-of-sample Ergebnis, das für die gesamte Population über drei Schweregrade des Betriebszustands geprüft wurde – stellt sich ohnehin als interessantere Erkenntnis heraus, und dorthin führt diese Serie als Nächstes.
Reproduzierbarkeit: die Überprüfung auf Zirkularität
import pandas as pd
from engine import GridSimulator, SyntheticLoadProvider
sample_df = pd.read_csv("final_output/recall_audit_sample.csv")
violations = sample_df[sample_df["sampled_violation"] == True].copy()
# Der Lastmultiplikator ist keine Spalte in der Stichprobendatei selbst --
# er wird pro Ereignis vom selben Provider nachgeschlagen, der den Lauf erzeugt hat.
simulator = GridSimulator()
provider = SyntheticLoadProvider(simulator.load_multipliers)
violations["multiplier"] = violations["event_idx"].apply(lambda i: provider.get_multiplier(int(i)))
threshold_in_use = 1.20
min_multiplier_in_sample = violations["multiplier"].min()
print(f"Bekannte Verletzungen in der Stichprobe: {len(violations)}")
print(f"Verwendeter Schwellenwert: {threshold_in_use}")
print(f"Minimaler Multiplikator unter den {len(violations)} bekannten Verletzungen: {min_multiplier_in_sample:.4f}")
# Bekannte Verletzungen in der Stichprobe: 43
# Verwendeter Schwellenwert: 1.2
# Minimaler Multiplikator unter den 43 bekannten Verletzungen: 1.2000


