# Pump It Up capstone

Working area for the DrivenData **Pump It Up: Data Mining the Water Table**
competition.

Source: <https://www.drivendata.org/competitions/7/pump-it-up-data-mining-the-water-table/>

Browse the [live Stage 1 dashboard](https://anthonypwatts.github.io/imperial-capstone/dashboard/)
and [training label map](https://anthonypwatts.github.io/imperial-capstone/map/),
or return to the [Capstone Hub](https://anthonypwatts.github.io/imperial-capstone/).

## Contents

- `instructions/competition-reference.md`: concise brief, data dictionary,
  submission shape and links to the authoritative pages.
- `instructions/source-pages/`: dated offline copies of the public competition
  pages.
- `data/`: competition data downloaded after joining.
- `notebooks/`: numbered modelling notebooks and the per-predictor
  `data-audit/` hierarchy.
- `src/`: reusable loading, preprocessing, modelling and evaluation code.
- `reports/`: concise findings and model interpretation.
- `submissions/`: notes about submitted models and their scores.

## Current position

The raw-data audit covers all 39 non-identifier predictors. Three structural
removals are settled, leaving 36 candidate predictors. Twenty-one submissions
have tested the submission path and the audit-led modelling workflow. The best
public score is **`0.8304`** from the fresh CatBoost identity/spatial-grid
50:50 bag within the fixed CatBoost slot. Submission `321154` improved the
previous `0.8298` best by `0.0006` and was observed at public-leaderboard
position **1** on 5 September 2026.

[![Historical DrivenData Pump It Up leaderboard milestone showing anthonypwatts at rank 2 with a score of 0.8298](../assets/pump-it-up-public-leaderboard-rank-2.png)](https://www.drivendata.org/competitions/7/pump-it-up-data-mining-the-water-table/leaderboard/)

*Historical leaderboard evidence from 23 August 2026. The later rank-1 result
was observed live on 5 September 2026; rankings may change.*

The 5 September generalisation investigation found no evidence that the base
model path or competition test population was broken. Formal model ordering
remained strongly aligned with public ordering, train-versus-competition shift
was negligible, and the historical local subset was only moderately harder.
By contrast, all three 4 September row-targeted repair submissions improved
reused internal evidence and regressed publicly. The working diagnosis is
adaptive overfit in the micro-postprocessing, which is now stopped. See the
[generalisation diagnosis](reports/generalisation-diagnosis.md).

One fresh five-fold reconstruction then admitted only two model-level within-
slot bags and their predeclared combination under a weaker exploratory guard.
The locked files were submitted without inspecting or adapting to intermediate
scores and returned **`0.8302`**, **`0.8304`** and **`0.8303`**. All beat the
incumbent, although their fresh OOF gains were only 9–13 rows and none passed
the formal promotion gate. See the
[fresh reconstruction report](reports/fresh-ensemble-reconstruction-and-submission-slate.md)
and [submission log](submissions/README.md).

At the earlier 23 August checkpoint, the deliberately held third daily slot was
reopened for the depth-17 top-50 identity XGBoost. A bounded follow-up retained
the same 600 trees and six component weights but changed the primary model to
predeclared seed 20260824. It reaches **81.8981%** development accuracy and
**81.3973%** local-test accuracy, ten and five net rows above the seed-20260822
candidate. Its validated 14,850-row competition CSV was submitted unchanged in
the final daily slot and scored **0.8298** publicly. See the
[deep follow-up report](reports/deep-follow-up-search.md).

The formal workflow reserves a stratified 20% local test and fixes five
development folds. It compares seven classifier families: a constrained tree,
logistic regression, Gaussian naïve Bayes, KNN, Extra Trees, histogram gradient
boosting and Random Forest. Random Forest is the strongest single model at
80.59% mean accuracy. An equal-weight Random Forest and boosting vote leads the
bounded ensemble round at 81.37%, with 34.28% repair recall and 78.03%
non-functional recall.

The selected vote records 80.82% accuracy on the one-time local test, including
32.10% repair recall and 77.81% non-functional recall. Both components have
then been refitted on all 59,400 labelled rows. The structurally validated
14,850-row competition CSV scored `0.8223` on the public leaderboard. See the
[submission log](submissions/README.md), the [maintained audit report](notebooks/data-audit/00-overall/00-overall-data-audit.md)
and the [data-preparation handoff](reports/data-preparation-next-steps.md).

A bounded follow-up compared 40:60 component weights and a nested calibrated
stack with the equal vote; none passed its gate. A subsequent frozen-feature
model-family screen found that XGBoost is a better partner for Random Forest
than the incumbent histogram booster. The leading 55% child-weight-1 depth-8
XGBoost and 45% Random Forest vote reaches 81.625% across the current-runtime
development folds, up 0.223 percentage points from the recreated incumbent.
Two structurally validated, materially different competition candidates were
generated locally. The leading candidate scored 0.8241 publicly; the second
was preselected without using that result and scored 0.8240. Later physical-
hierarchy submissions raised the public best to 0.8246 for source plus class,
with a cross-policy component hybrid at 0.8244.

On 23 August, the predeclared archive synthesis and complete-identity vote were
submitted unchanged. They scored **0.8288** and **0.8259** respectively. Their
public ordering agrees with both development and local-test evidence, and the
archive synthesis established the project best at that point. The later
seed-20260824 deep substitution raised it to **0.8298**.
That bounded modelling phase then concluded; see the
[final evidence audit](reports/model-search-conclusion.md).

The completed target-structure investigation traces the 74,250 competition
rows to a strong but explicitly inferential match with the cleaned February
2014 Tanzanian Water Point Mapping release. It retains flat nominal prediction
for competition scoring: a constrained-tree operational hierarchy improved
repair recall from 15.2% to 24.0%, but slightly reduced accuracy from 75.0% to
74.8%. A proper cumulative-threshold ordinal probe reduced severe two-step
errors but not nominal accuracy; 28.8% of its independent cumulative estimates
crossed before coherence correction, and nested cut-off tuning still trailed
flat multiclass.

The separate imbalance experiment raised Random Forest repair recall
from 36.9% to 44.7% with random oversampling and to 50.0% with balanced class
weights on development folds. A later exact replay of the three 21 August
recipes did open the labelled local test: full oversampling gained 20.0–22.4
points of repair recall but lost 1.4–1.8 points of accuracy. Retaining 80% of
the added replicas recovered a little accuracy. Six validated competition
CSVs were generated for possible later experiments; none was uploaded then. A final
2.5× minority-count point brought competition repair predictions to 6.91–7.10%
and reduced the XGBoost blends' local accuracy cost to 0.40–0.43 points while
retaining a 10.9–11.9-point repair-recall gain. Probability diagnostics show
that its raw repair probabilities are optimistic despite the balanced hard
labels. The multiplier is frozen. The depth-6/7/8 bag was subsequently
submitted unchanged and scored 0.8174, 0.0066 below its unoversampled
counterpart; the other replay CSVs remain local. Compressed data and generated
CSVs remain ignored local artefacts.

The fixed-model geography screen compared twelve alternatives with the accepted
representation. None passed the frozen-fold gate: removing coordinates cost
0.734 percentage points, removing named geography cost 0.299 points, and the
best challenger was fold-fitted hierarchical coordinate-centroid imputation at
81.566%, 0.059 points below the accepted vote. On deliberately harder
LGA-disjoint folds, centroid imputation improved 0.161 points and won four of
five folds, but absolute accuracy fell to 72.26% and repair recall to 2.99%.
This records material geographic-transfer risk without reopening the local test.
See the [geography robustness report](reports/geography-feature-family-and-robustness.md).

The next fixed-model screen introduced `funder` and `installer` separately and
together through fold-fitted rare grouping and frequency. None of ten
challengers passed the frozen-fold gate. Funder frequency was the only result
above baseline at 81.656%, a 0.032-point gain with only two fold wins; installer
and identity-bearing representations were weaker. An LGA-disjoint sensitivity
improved 0.250 points but breached the worst-fold limit and reduced repair
recall, so it did not reopen the primary decision. See the
[high-cardinality report](reports/funder-installer-high-cardinality-screen.md).

The numeric state and imputation screen then compared eleven challengers for
amount, height, population and `num_private`. Every complete vote trailed the
accepted 81.625% recipe; the closest was fold-fitted geographic population
imputation at 81.591%. That treatment improved a separate LGA-disjoint mean by
0.128 points and won four folds, but failed the primary comparison and the
grouped worst-fold limit. The existing numeric representation therefore remains
selected. See the
[numeric-feature report](reports/numeric-state-and-imputation-screen.md).

The management hierarchy screen compared nine alternatives to the accepted
`management` plus `scheme_management` representation. None passed the gate.
Management-only was the best challenger at 81.637%, just 0.013 points above
baseline while removing twelve transformed columns; the difference is too
small for accuracy promotion, so it remains a named parsimony candidate. Coarse
groups, composites and disagreement states were weaker. See the
[management hierarchy report](reports/management-hierarchy-screen.md).

A bounded neural-network screen compared seven scaled one-hot MLP
configurations and 84 fixed probability blends without reopening the local
test. The strongest standalone ANN reached 78.590%; its genuine error diversity
was insufficient to improve the accepted ensemble, and the closest blend
reached 81.616%. Conventional one-hot MLP tuning is therefore stopped on these
folds. See the [ANN screen report](reports/ann-candidate-screen.md).

The physical categorical hierarchy screen then compared extraction, source,
quality and waterpoint granular features with every deterministic parent-level
alternative. None of twenty challengers or six bounded component crosses passed
the accuracy gate. Source plus class reached 81.635% and both waterpoint levels
reached 81.627%, but each won only two folds. Granular features remain selected;
extraction group-only is retained solely as a compact-model candidate. See the
[physical hierarchy report](reports/physical-categorical-hierarchy-screen.md).

Two exploratory hierarchy outputs were submitted after the screen. Source plus
class scored 0.8246, a new public best, and waterpoint-aware XGBoost plus the
source-class Random Forest scored 0.8244. These external results do not
retrospectively change the frozen-fold feature decision, because both candidates
won only two folds and failed the promotion gate.

A fold-safe regional-specialisation screen then tested whether the striking
regional class mixes justified separate classifiers. Hard-routed regional
Random Forests fell to 80.505%, and the only selection-eligible 80% global / 20%
regional blend reached 81.469%, 0.156 points below the accepted vote with zero
fold wins. Regional-prior corrections were also worse. The existing global
trees already reproduce regional repair rates closely while retaining national
pooling. See the
[regional-specialisation report](reports/regional-specialisation-and-layering.md).

An independent no-refit ensemble screen added low fixed contributions from
CatBoost, bagged LightGBM and the most diverse MLP while preserving the accepted
55:45 ratio in the remaining weight. All three reduced accuracy. The 5% MLP
addition was closest at 81.601%, 0.023 points below baseline. Each slightly
improved log loss and Brier score, but none improved the competition metric or
passed the gate. See the
[expanded-voter report](reports/expanded-ensemble-voter-screen.md).

A full binary-reduction rebuild then removed every repair case from each
training partition while retaining all three classes for validation. Eleven
standalone families and nine fixed votes were assessed. The selected equal
Random-Forest/LightGBM binary vote improved conditional functional-versus-non-
functional accuracy by 1.073 points, but its forced zero repair recall reduced
full development accuracy from 81.625% to 80.086%. It reached 79.992% on the
already-used local test, 0.833 points below the earlier three-class workflow.
No competition prediction was generated. See the
[binary-reduction report](reports/binary-reduction-screen.md).

A bounded fuzzy-target screen then assigned row-normalised membership to each
observed condition and its immediate neighbours at four fixed overlap widths.
Fuzzy XGBoost improved slightly as a standalone component, but fuzzy Random
Forest deteriorated. The closest component cross—2.5% fuzzy XGBoost plus the
hard-label forest—reached 81.534%, 0.090 points below baseline with zero fold
wins. Fully fuzzy votes were weaker. No candidate passed the gate, so the local
test remained closed and no competition prediction was generated. See the
[fuzzy-membership report](reports/fuzzy-target-membership-screen.md).

The accepted ensemble's existing `predict_proba()` output was then treated as
row-level class membership, without retraining or softening the target. On the
development folds it retains 81.625% accuracy and 0.708% top-label expected
calibration error. Mean predicted membership closely matches every observed
class share. For the competition rows, mean repair membership is 7.178%, but
only 3.953% receive repair as their hard prediction: 1,323 rows retain at least
25% repair membership, compared with 587 hard repair predictions. The validated
three-membership table is an analysis artefact, not a submission. See the
[class-membership report](reports/class-membership-probabilities.md).

A bounded training-only outlier screen then compared physical contradictions,
strict accepted-feature duplicate conflicts and class-blind Isolation Forest
removal at 0.5% and 1.0%. Every validation row remained in scoring. The strict
duplicate rule was closest at 81.566%, 0.059 points below baseline; Isolation
Forest lost on every fold. Eight fixed component crosses also trailed, with a
best result of 81.572%. Hard or unusual rows are therefore retained. See the
[outlier-filtering report](reports/outlier-filtering-screen.md).

A leakage-safe target-encoding screen then represented five deferred location,
scheme and organisation identities as inner-cross-fitted class rates. All three
complete votes were weaker; organisation identity was closest at 81.111%.
Organisation-aware XGBoost did add a small complementary signal: a bounded 20%
contribution reached 81.673%, up 0.048 points with four fold wins, but below the
promotion threshold. No prediction was generated. See the
[target-encoding report](reports/cross-fitted-target-encoding-screen.md).

Cross-fitted local spatial rates then used ten nearby training pumps, smoothing
20 and a great-circle radius. The direct 15% voter was effectively flat at
81.623% but lost 2.635 points of repair recall. Adding the rates as features was
clearly worse at 80.995%, and both component crosses trailed. Spatial outcome
aggregation is therefore stopped. See the
[spatial-outcome report](reports/cross-fitted-spatial-outcome-screen.md).

One fixed native-categorical CatBoost candidate then restored all six deferred
identity fields. The complete-identity model improved CatBoost standalone by
0.339 points, and a 20% contribution to the accepted ensemble reached 81.740%:
+0.116 points, four fold wins, worst-fold change -0.084 points and repair-recall
change -0.926 points. This is the first new candidate to pass the established
promotion gate. Its frozen 44% XGBoost / 36% Random Forest / 20% CatBoost recipe
now moves to one confirmation on the already-reserved local test. See the
[CatBoost identity report](reports/catboost-deferred-identity-screen.md).

That frozen recipe then confirmed on the 11,880-row local test at 81.086%,
against 80.699% for the identically refitted accepted ensemble: +0.387 points
and 46 net additional correct classifications. Log loss and Brier score also
improved. Functional recall gained 0.806 points, repair recall lost 0.695 points
and non-functional recall was unchanged. The recipe now advances unchanged to
a full-labelled-data competition refit; the local test will not be used for
weight tuning. See the
[confirmation report](reports/catboost-identity-confirmation.md).

The unchanged full-data refit produced a validated 14,850-row competition file
with 60.788% functional, 3.623% repair and 35.589% non-functional predictions.
It differs from the accepted submission on 1.576% of rows and exactly recreates
the accepted file from its shared components. The new candidate was recorded
but not uploaded while the 22 August allowance was 3/3; it was submitted
unchanged on 23 August and scored 0.8259. See the
[candidate record](submissions/2026-08-22-catboost-identities/README.md).

A final native-identity representation check added only three well-supported
context pairs: LGA×ward, LGA×scheme and funder×installer. Its fixed 20% vote
tied the promoted recipe exactly at 81.7403%, won only two folds and reduced
repair recall by another 0.463 points. Explicit context construction is stopped
without reopening the local test. See the
[identity-context report](reports/catboost-identity-context-screen.md).

Two final identity-vote follow-ups also stopped. Crossing the identity CatBoost
with source-plus-class XGBoost and Random Forest reached 81.7466%, only 0.0063
points above the promoted recipe despite four fold wins. A depth-7 identity
CatBoost substitution reached 81.7319%, 0.0084 points below. Neither justified
another local-test use. See the
[identity follow-up report](reports/catboost-identity-follow-up-screen.md).

A distinct text candidate then represented all six deferred names with 60,000
fold-fitted character 3–5 grams alongside the accepted features. It reached
75.619% standalone, and its fixed 5% contribution lowered the promoted vote to
81.705%, with only one fold win and lower repair recall. The text branch stops
without vectoriser or weight tuning. See the
[name-text report](reports/deferred-name-text-screen.md).

Adding extraction class, source class, quality group and waterpoint group only
to the identity CatBoost then reached 81.7466% at the unchanged 20% weight: a
three-row, 0.0063-point gain with two fold wins. The specialist itself weakened,
so parent subsets are not screened. See the
[physical-backoff report](reports/catboost-identity-physical-backoff-screen.md).

A transductive XGBoost teacher then added 2,394–2,740 competition rows per fold
at a fixed 98% confidence threshold before student refitting. No selected row
was labelled repair. Student XGBoost weakened by 0.088 points and the promoted
vote fell to 81.730%, despite three fold wins. Threshold tuning is stopped. See
the [pseudo-labelling report](reports/transductive-pseudo-labelling-screen.md).

The strongest model-based outlier test then generated removal evidence through
three inner OOF teachers inside every outer fold. It removed 1.12–1.44% of
training rows at fixed 90% alternative and 5% observed-label probabilities,
but filtered XGBoost weakened and the promoted vote fell to 81.684%. Difficult
rows are retained; outlier removal is now closed. See the
[confident-filter report](reports/confident-label-filtering-screen.md).

The previously untested recording-time audit recommendation then added year,
month and year-month categories beside elapsed days. Both XGBoost and Random
Forest weakened, and the promoted vote fell to 81.711% with two fold wins. The
continuous elapsed feature is retained without further calendar bins. See the
[recording-time report](reports/recording-time-feature-screen.md).

Six fold-fitted log occurrence counts then represented support for funder,
installer, waterpoint name, subvillage, ward and scheme name. They improved the
Random Forest component but damaged XGBoost; the promoted identity vote fell to
81.585% with one fold win. The native identity representation is retained
without frequency subsets or weight tuning. See the
[identity-frequency report](reports/identity-frequency-screen.md).

A fixed pump-age cohort then supplemented continuous age in the global trees,
the identity CatBoost and all three components. The all-component vote reached
81.804%, a stable 0.063-point gain with three fold wins, but every individual
component weakened and the gain missed the promotion gate. Cut points and
weights remain untuned. See the
[pump-age report](reports/pump-age-cohort-screen.md).

One additional complete-identity CatBoost seed then tested variance reduction
inside the fixed 20% identity allocation. Although the two CatBoost models
disagreed on 4.06% of rows, their equal seed bag lowered the promoted vote to
81.719% with one fold win. Seed expansion is stopped. See the
[identity seed-bag report](reports/catboost-identity-seed-bag.md).

The complete physical-hierarchy check then added all seven supplied parent and
intermediate fields to native identity CatBoost. Standalone CatBoost weakened,
and the unchanged 20% vote fell to 81.726% with two fold wins. This closes
hierarchy back-off subsets. See the
[full-hierarchy report](reports/catboost-identity-full-hierarchy.md).

A target-free 4,096-column hash block then represented all six sparse identities
for XGBoost. Hashed XGBoost weakened by 0.343 points and its promoted-vote
substitution fell to 81.578% with one fold win. Hash dimensions are not tuned,
and the sparse-name representation branch closes. See the
[identity-hash report](reports/identity-hash-screen.md).

Three independent one-vs-rest XGBoost boundaries then improved standalone
XGBoost to 81.082%, but direct ensemble substitution weakened. A single equal
multiclass/OvR boundary bag reached 81.759% with three fold wins and no losing
fold, only 0.019 points above the promoted recipe. The XGBoost OvR branch closes
without weights or thresholds. See the
[one-vs-rest report](reports/one-vs-rest-xgboost-screen.md).

Complete-identity CatBoost then received the same independent-boundary task.
OvR raised standalone CatBoost to 81.130%; an equal CatBoost boundary bag raised
the promoted vote to 81.776% with four fold wins, but gained only 0.036 points
at about 28.9 fold-minutes of compute. Combining both XGBoost and CatBoost OvR
bags did not add their gains. Task decomposition is closed. See the
[OvR CatBoost report](reports/one-vs-rest-catboost-screen.md).

A no-refit hard-majority rule then selected any two-component agreement and
used the promoted soft vote only for the 160 all-disagree rows. It fell to
81.534% and lost on every fold, confirming that component probability magnitude
matters. See the
[hard-majority report](reports/hard-majority-decision-screen.md).

The official solution archive then motivated a compact Random Forest that
replaced all 29 categorical/date fields with fold-fitted occurrence support.
Its hard predictions differed from the accepted forest on 6.46% of rows, but
an equal within-family representation bag gained only 0.025 points, reaching
81.766%. The count threshold and blend are not tuned. See the
[categorical-frequency report](reports/categorical-frequency-forest-screen.md).

A second archived solution motivated learned reconstruction of missing GPS
height. One fold-fitted ten-neighbour coordinate treatment strengthened both
tree components slightly; equal averaging of original and imputed
representations reached 81.768%, a 0.027-point gain with four fold wins. The
effect remains below the promotion gate. See the
[spatial-height report](reports/spatial-height-imputation-screen.md).

Equal averaging of the two complete archive-derived candidate votes then
reached 81.793%, a 0.053-point gain with positive movement on all five folds.
It still misses the promotion gate, and adding the strongest earlier pump-age
near-miss weakens it. Broad near-miss accumulation therefore stops. See the
[external synthesis report](reports/external-representation-synthesis.md).

The archived count method's transductive detail was then reproduced using only
development and supplied competition covariates. It improves the compact
frequency forest by 0.217 points, but its best fixed vote reaches 81.782% and
its archive-synthesis substitution is weaker than the inductive version. See
the [transductive count report](reports/transductive-frequency-forest-screen.md).

Two cumulative accepted-spec XGBoost boundaries then encoded repair as the
middle state. Standalone accuracy exactly matches multiclass XGBoost at
81.014%; their equal boundary bag nudges the archive synthesis to 81.804%, only
five extra development rows and far below the promotion gate. The ordinal
branch stops without local or competition use. See the
[cumulative XGBoost report](reports/ordinal-xgboost-screen.md).

The archived 0.8264 solution then motivated 50 fold-fitted common-value
indicators for each of the six deferred identities. They strengthen XGBoost to
81.088%, but the equal archive representation bag reaches only 81.814%: ten
extra development rows and below the promotion gate. See the
[top-common identity report](reports/top-common-identity-screen.md).

The same archived solution's fixed depth-17, 600-tree XGBoost then strengthens
the top-common component to 81.471%. Direct archive substitution reaches
81.877%, only eight rows below the promotion gate; an equal three-seed bag
falls to 81.858%. The architecture is retained as the strongest research
near-miss without selecting the fortunate seed or opening local test. See the
[archived deep-XGBoost report](reports/archived-deep-xgboost-screen.md).

Fold-fitted distance to the nearest and 10th-nearest training waterpoints then
tested target-free isolation and settlement density. They weaken deep XGBoost
to 81.296% and its archive substitution to 81.818%, closing neighbour-rank,
radius and clustering follow-ups. See the
[spatial-density report](reports/spatial-density-screen.md).

The final bounded cross added fold-fitted support counts for all 29 categorical
fields to the top-common-identity deep model. It weakens the component to
81.305% and the fixed archive substitution to 81.787%, closing support
threshold and per-field follow-ups. See the
[deep occurrence-support report](reports/deep-occurrence-xgboost-screen.md).

## Next modelling loop

1. Retain the `0.8304` CatBoost identity/spatial-grid within-slot bag as the
   public leader, while recording that its 13-row fresh-OOF gain passed only the
   exploratory guard rather than the formal promotion gate.
2. Require a genuinely new signal or independently motivated representation
   before more ensemble work. Do not tune the fresh-slate weights, resume
   row-targeted repair postprocessing or decompose public score movements into
   hidden row labels.
3. Keep the LGA-disjoint result as a robustness warning; do not replace the
   competition-aligned frozen-fold selection metric silently.
4. Treat the 2.5× replay's 0.8174 result as confirmation of the accuracy cost;
   do not start another oversampling loop or claim an expected accuracy gain.
5. Retain the operational hierarchy as a named candidate for decision-focused
   work; do not replace the competition's flat target silently.
6. Stop both isolated regional classifiers and extra-voter weight grids unless
   a genuinely new representation, data source or operational objective appears.
7. Retain all three target classes for competition modelling; the binary-only
   rebuild improves its narrower decision but loses 1.538 development points
   once repair cases are scored.
8. Retain crisp labels; stop global triangular-overlap tuning unless row-level
   uncertainty evidence becomes available.
9. Use the retained probability memberships to describe uncertainty and inspect
   edge cases, but do not call an uncertain row an outlier merely because its
   winning margin is small.
10. Stop broad outlier removal for the accepted representation. The difficult
   rows are part of the inference population, and every tested filter reduced
   unchanged-fold accuracy.
11. Stop category-wide target-encoding and weight grids. The complete policies
    are substantially weaker; their best bounded low-weight contribution gains
    only 0.048 points.
12. Stop local spatial outcome features and neighbour grids. Their information
    is already largely represented by accepted geography, and the complete
    feature vote loses 0.629 points.
13. Stop transductive category-count mixing. Supplied inference covariates
    strengthen the standalone count forest, but not the selected ensemble.
14. Stop cumulative-boundary tuning. The untuned ordinal decomposition is
    diverse but not stronger, and its five-row archive gain is too small to
    justify thresholds, class weights or another submission candidate.
15. Retain top-common identities as positive representation evidence, but do
    not tune common-value counts or weights around their ten-row archive gain.
16. Retain archived depth-17 XGBoost as the strongest unconfirmed near-miss.
    Do not select its best seed, expand the seed count or tune depth and rounds
    against the reused folds.
17. Stop waterpoint-density variants. Fold-safe nearest-neighbour distances
    make substantial but less accurate changes to the strongest deep model.
18. Stop occurrence-support/deep-XGBoost crosses. The combined representation
    is diverse but weaker, and its fixed archive substitution does not improve
    the incumbent.
19. Retain fixed 600-tree deep XGBoost. Exact recording batches, mined residual
    voters and inner stopping did not confirm; predeclared seed 20260824 became
    the previous public incumbent at `0.8298`. The later `0.8304` improvement
    came from a fresh, bounded CatBoost representation bag rather than another
    deep-XGBoost seed or parameter search.

The practical question is how well maintenance data can distinguish functional,
repairable and non-functional water pumps. Class imbalance, missing values,
high-cardinality categories and geographic leakage will shape the model design.

## Data handling

The competition data is governed by the DrivenData competition rules. Do not
commit or redistribute the downloaded CSV/ZIP files. The local `.gitignore`
excludes everything under `data/` except its inventory README.
