This report captures four connected results that should stay comparable across later runs:
2018..20242010..2025 model rundata/models/autogluon/leaderboards/leaderboard_drought_damage_severe.csvdata/models/autogluon/feature_importances/feature_importance_drought_damage_severe.csvdata/models/autogluon/leaderboards_2010to2025/leaderboard_drought_damage_severe.csvdata/models/autogluon/feature_importances_2010to2025/feature_importance_drought_damage_severe.csvdata/validation/autogluon_2018_2024/overall_metrics.csvlogs/pipeline_ml_2025_20260402_115334.logdata/output/hannover_gesamt/trees_at_risk_hannover_gesamt.gpkgWeightedEnsemble_L3roc_auc = 0.90627934LightGBMPrep_r41_BAG_L2 with roc_auc = 0.906018LightGBMPrep_r31_BAG_L2 with roc_auc = 0.905555CatBoost_c1_BAG_L2 with roc_auc = 0.905141ROC-AUC = 0.9063Brier = 0.094289F1 = 0.6602Precision = 0.7578Recall = 0.5848Lift (top vs bottom 5%) = 579.5| Run | Best model | ROC-AUC |
|---|---|---|
| 2010..2025 historical setup | WeightedEnsemble_L3 |
0.913697 |
| 2018..2024 drought-window setup | WeightedEnsemble_L3 |
0.906279 |
Delta (new - old): -0.007418
The new model is slightly weaker in raw ROC-AUC, but the drop is small enough to be fully plausible given the tighter label definition:
Top signals in the old model:
| Rank | Feature | Importance |
|---|---|---|
| 1 | ga_lang |
0.020584 |
| 2 | vitality_value |
0.016544 |
| 3 | m_svf_value |
0.001105 |
| 4 | groundwater_level_std |
0.001006 |
Top signals in the new model:
| Rank | Feature | Importance |
|---|---|---|
| 1 | vitality_value |
0.039576 |
| 2 | groundwater_level_std |
0.015304 |
| 3 | m_svf_value |
0.013538 |
| 4 | ga_lang |
0.003692 |
| 5 | citree_krankheiten_schaedlinge |
0.002934 |
Interpretation:
ga_lang)vitality_value, but groundwater variability and SVF now contribute materiallyThe current validation results indicate a model that is operationally useful for ranking and class-based prioritisation:
ROC-AUC = 0.9063 means strong separation overallBrier = 0.0943 indicates reasonable probability qualityPrecision = 0.7578 at threshold 0.5 means flagged positives are often true positivesRecall = 0.5848 means a non-trivial part of the severe class is still missed at the default threshold5% of the score distribution has severe-label prevalence 0.9415, while the bottom 5% is almost empty at 0.0016This is a good model for prioritisation workflows. If operational use later needs more sensitivity, the threshold should be tuned rather than assuming the current 0.5 cut-off is final.
The latest inventory snapshot (2025-01-01) produced:
89,28661,31927,967Raw status counts:
active_tree = 67,756replacement_marker = 12,227removed_tree = 7,224object_control_placeholder = 1,384erroneous_record = 685planned_not_planted = 10Excluded active rows with invalid coordinates: 6,437
Interpretation:
trees_rawThe 2025 pipeline run completed successfully and wrote:
data/output/hannover_gesamt/trees_at_risk_hannover_gesamt.gpkgbgcki.analysis_tree_risk_scores with 61,319 rowsML inference summary from the run:
drought_risk_ml count: 61,3190.0065870.1702180.967135ML class counts in the final output:
low = 51,352medium = 5,369high = 1,841critical = 2,757Run-time validation summary on the 2025 pipeline output:
0.5010.9089+0.4079Plausibility summary:
critical = 0warning = 3info = 0The finished 2025 output was checked both stichprobenartig and globally.
Confirmed behavior:
replacement_marker rows are not present in the outputremoved_tree rows are not present in the outputobject_control_placeholder rows are not present in the output61,319 rows in the final output have inventory_status = active_treeThis means the #122 inventory/status handling is not only present in raw QA fields, but also works through to the final 2025 scored outputs.
Class means show a clear monotonic increase in drought_risk_ml, while the static weighted score changes much less:
| ML class | Mean ML proba | Mean static score |
|---|---|---|
low |
0.0843 |
0.4883 |
medium |
0.4573 |
0.4961 |
high |
0.6692 |
0.4955 |
critical |
0.8787 |
0.4999 |
Interpretation:
Vitality remains important, but it does not fully explain the final classes.
Vitality share by class:
| Class | Vitality 1 | Vitality 2 | Vitality 3 | Vitality 4+ |
|---|---|---|---|---|
low |
41.5% |
41.8% |
13.6% |
3.0% |
medium |
37.3% |
44.0% |
15.4% |
3.1% |
high |
35.7% |
46.9% |
14.0% |
3.3% |
critical |
35.5% |
45.5% |
14.9% |
4.0% |
Interpretation:
The corresponding explicit feature variants were prepared in:
config/ml_feature_variants_2026-04-02.yamlRecommended order:
no_vitality: remove only vitality_valueno_vitality_no_species_label: remove vitality_value and ga_langno_vitality_no_species_profile: remove vitality_value, ga_lang, and all citree_* profile featuresThis run establishes a useful new reference point: