SandWatch

Model comparison

Five baselines evaluated under leave-one-river-out cross-validation: every held-out reach’s points are predicted by a model that never saw that reach during training.

Headline finding: the trained models fail to generalize — and this is robust

Out-of-fold ROC-AUC for logistic regression, random forest, and gradient boosting is 0.010–0.053 — far below the 0.5 chance level, meaning their predicted probabilities are anti-correlated with the true label once tested on a river reach they never trained on. This is not a data-leakage bug (the spatial split is structurally enforced and tested), and a reach-level bootstrap (see Uncertainty) confirms all three 95% CIs sit safely below 0.5. What it is not confirmed to be: a case where temporal differencing helps, or a fully isolated “reach fingerprint” mechanism — a feature-subset ablation below actually falsified that specific hypothesis, and a visual spot-check of real misclassified points found three distinct, unrelated causes (a snow-covered scene, a label-granularity issue, and one unexplained case) rather than one unifying story. A single-feature bare-soil-index threshold has a higher point estimate (AUC=0.604), but its bootstrap CI straddles 0.5 — that claim is not statistically robust at n=7 reaches. Full discussion in research/limitations.md.

ModelAccuracyBalanced accuracyPrecisionRecallF1ROC-AUC
gradient_boosting0.6250.4000.7460.7940.7690.026
logistic_regression0.4620.2960.6840.5860.6320.010
majority0.7860.5000.7861.0000.8800.500
random_forest0.6340.4050.7490.8050.7760.053
spectral_threshold_bsi0.5350.5300.8050.5390.6460.604

Pooled out-of-fold metrics across all 809 points (n per model). Per-fold precision/recall are not separately meaningful since each held-out reach carries a single true label — see Methods.

Model comparison chart

Feature-subset ablation: does temporal differencing help?

We expected temporal-difference features (recent minus baseline scene, ~6 years apart) to generalize better than absolute reflectance values, on the theory that absolute values encode reach- and season-specific characteristics a model could overfit to. The ablation below falsifies that: absolute-only features are consistently less bad than diff-only or the combined set, for every trained model.

Modelabsolute_only (AUC)diff_only (AUC)full (AUC)
gradient_boosting0.2000.0500.026
logistic_regression0.4430.0200.010
random_forest0.1930.0310.053
spectral_threshold_bsi0.6040.604
Feature-subset ablation chart

Best-supported reading: at n=6 training reaches per fold, an 8-dimensional feature space overfits faster than a 4-dimensional one — regardless of which physical quantity (absolute or differenced) it represents. See research/limitations.md for the full discussion.

Per-fold breakdown (accuracy)

ModelHeld-out reachnAccuracy
majorityyamuna_shamli_in1461.000
spectral_threshold_bsiyamuna_shamli_in1460.603
logistic_regressionyamuna_shamli_in1460.829
random_forestyamuna_shamli_in1460.911
gradient_boostingyamuna_shamli_in1460.925
majoritykrishna_vijayawada_in1461.000
spectral_threshold_bsikrishna_vijayawada_in1460.589
logistic_regressionkrishna_vijayawada_in1460.582
random_forestkrishna_vijayawada_in1460.692
gradient_boostingkrishna_vijayawada_in1460.651
majoritydoodhganga_budgam_in1501.000
spectral_threshold_bsidoodhganga_budgam_in1500.360
logistic_regressiondoodhganga_budgam_in1500.520
random_forestdoodhganga_budgam_in1500.880
gradient_boostingdoodhganga_budgam_in1500.953
majoritymekong_chaudoc_vn441.000
spectral_threshold_bsimekong_chaudoc_vn440.591
logistic_regressionmekong_chaudoc_vn440.659
random_forestmekong_chaudoc_vn440.841
gradient_boostingmekong_chaudoc_vn440.727
majoritybenue_makurdi_ng1501.000
spectral_threshold_bsibenue_makurdi_ng1500.593
logistic_regressionbenue_makurdi_ng1500.400
random_forestbenue_makurdi_ng1500.727
gradient_boostingbenue_makurdi_ng1500.667
majoritykallada_kollam_in1030.000
spectral_threshold_bsikallada_kollam_in1030.748
logistic_regressionkallada_kollam_in1030.010
random_forestkallada_kollam_in1030.010
gradient_boostingkallada_kollam_in1030.010
majoritystcroix_grantsburg_us700.000
spectral_threshold_bsistcroix_grantsburg_us700.186
logistic_regressionstcroix_grantsburg_us700.000
random_foreststcroix_grantsburg_us700.000
gradient_boostingstcroix_grantsburg_us700.000