Implements the validation step of issue #257 for the
2026_10retraining round (label B+future_drought_damage_severe_t1, 54 features,spatial_cvdisabled). The check answers one question: does the model rank the trees that the city actually treats (Treelife root-zone therapy) higher than the average tree?
Treelife is the root-zone treatment the Landeshauptstadt Hannover (LHH) prescribes for stressed trees. The decision is made by field staff from their own observation, independent of the ML model — which makes it an external, practice-based validation signal: if the model is useful operationally, the trees it flags as high-risk should be enriched in the set of trees that professionals actually intervene on.
Explicitly out of scope (per issue #257): using Treelife as a training label for a second model. The treatment decision is endogenous (budget, species, site, assessor judgement) and largely redundant with label B+.
Maßnahmen festgelegt or Maßnahmen durchgeführt column
contains the token “Treelife” (semicolon lists split, IDs deduplicated) in
the reference year. Historical volumes: 2021: 1,383 / 2022: 1,636 /
2023: 1,255 / 2024: 1,862 / 2025: 1,061 trees.Implementation: scripts/analysis/treelife_overlap_check.py (CLI:
--holdout-csv, --trees-csv, --treelife-year, --top-fractions,
--output-json). Result artefacts: data/derived/ml/treelife_overlap_2024.json
and data/derived/ml/treelife_overlap_operational_2026.json (derived data,
not committed).
2024 holdout predictions of the validation run
(train_2018_2023__predict_2024__validate_2025, 25,334 trees, snapshot 2024
→ damage 2025) against the Treelife list 2024 (1,862 trees; 1,318 of them
present in the holdout, i.e. inspected in 2024).
| Ranking | Treelife in top group | Share of flagged | Share of Treelife caught | Lift |
|---|---|---|---|---|
| Top 5 % | 90 | 7.1 % | 6.8 % | 1.37 |
| Top 10 % | 208 | 8.2 % | 15.8 % | 1.58 |
| Top 20 % | 557 | 11.0 % | 42.3 % | 2.11 |
Operational 2026 scores of all 89,280 active v6 trees (new 54-feature model,
run train_2018_2024__predict_2025) against the Treelife list 2025
(1,061 trees, last complete inventory year; 1,054 in the current inventory).
| Ranking | Treelife in top group | Share of flagged | Share of Treelife caught | Lift |
|---|---|---|---|---|
| Top 5 % | 105 | 2.4 % | 10.0 % | 1.99 |
| Top 10 % | 182 | 2.0 % | 17.3 % | 1.73 |
| Top 20 % | 314 | 1.8 % | 29.8 % | 1.49 |
Treelife overlap is a useful, soft validation signal — not an acceptance gate. The models consistently rank actually-treated trees enriched (1.4–2.0× depending on top group and reference year) without being exclusive to them. Recommended ongoing use: rerun the check in future monthly cycles against the newest complete treatment year and track the top-5 % and top-10 % lifts over time (a decaying trend would be an early drift indicator complementing the #260 AUC drift watch).
# 2024 holdout (validation model)
conda run -n bgcki_wesemann python scripts/analysis/treelife_overlap_check.py `
--holdout-csv data/models/autogluon/annual_validation/2026_10/train_2018_2023__predict_2024__validate_2025/temporal_holdout/holdout_predictions.csv `
--trees-csv <historical inventory CSV> --treelife-year 2024 `
--output-json data/derived/ml/treelife_overlap_2024.json
# Operational 2026 (against latest operational score export)
conda run -n bgcki_wesemann python scripts/analysis/treelife_overlap_check.py `
--holdout-csv <operational 2026 score CSV with objectid,y_proba> `
--trees-csv <historical inventory CSV> --treelife-year 2025 `
--output-json data/derived/ml/treelife_overlap_operational_2026.json