### Streamlined Calibration for Baseline LR Gates If you’re mainly struggling with mis‑calibrated confidence on your edge‑filtered checks, here’s a **minimal** integration to fix it without heavy lifting. --- #### 1. Add a toggle and holdout in `config.yaml` ```yaml baseline: calibration_enabled: true # turn on/off easily calibration_method: "isotonic" # handles multiclass calibration_holdout: 0.2 # 20% of your train split random_state: 42 ``` --- #### 2. Quick split for calibration In your `run_baseline_checks` (before any CI gates): ```python # original train/val split X_main, X_val, y_main, y_val = train_test_split( X_pruned, y_labels, test_size=0.2, random_state=seed ) if self.config['baseline']['calibration_enabled']: X_train, X_cal, y_train, y_cal = train_test_split( X_main, y_main, test_size=self.config['baseline']['calibration_holdout'], random_state=self.config['baseline']['random_state'] ) else: X_train, y_train = X_main, y_main X_cal, y_cal = None, None ``` --- #### 3. Fit an isotonic calibrator only when needed ```python # train raw LR lr = LogisticRegression(...).fit(X_train, y_train) if X_cal is not None: from sklearn.calibration import CalibratedClassifierCV calibrator = CalibratedClassifierCV(lr, method='isotonic', cv='prefit') calibrator.fit(X_cal, y_cal) else: calibrator = lr ``` --- #### 4. Use calibrated probabilities in your gates Replace all `lr.predict_proba(X)` calls with: ```python probs = calibrator.predict_proba(X) # binary: edge = |probs[:,1] - 0.5| # ternary: edge = max(probs, axis=1) - 1/3 ``` Then run your existing CI lower‑bound checks as usual. --- #### 5. (Optional) Skip persistence For a quick fix you can skip saving/loading the calibrator—just build and use it in the same process. --- With these five steps, you’ll correct your edge‑confidence estimates with minimal code and configuration. If your gates then pass, proceed to GRU training; if they still fail, the issue is likely weak features rather than calibration.