The trend this project exists to change
Families with dependent children newly assessed as homeless, per 1,000 resident households. Rates are pooled counts over pooled denominators, so that large and small authorities combine correctly.
Where prediction actually earns its place
Two questions put to the same dataset. Sorting a column answers the first. It does not answer the second.
Task A · Level a lookup
Will this authority be in the worst national quintile next year?
Task B · Escalation the real one
Will family homelessness rise by 25% or more next year?
Full performance table
Capacity planner
A service cannot act on a ranking of the whole country. It works a list of fixed length, so the metric that matters is the hit rate at the top of that list rather than AUC. Set the list length to whatever your team can actually take on and read the yield off directly.
National ranking, 2024–25
Every authority scored for escalation risk from data available at the end of 2023–24, shown alongside what actually happened. 2024–25 is a held-out year, so none of it was used to fit or tune anything.
Rate is families with dependent children owed a relief duty per 1,000 resident households. A blank outcome means the authority filed no return that year. Essex districts are marked with a green edge.
Colchester neighbourhoods
The local-authority layer answers "which areas". A service needs to know which neighbourhoods. Colchester's 105 LSOAs are grouped by deprivation profile and screened with an Isolation Forest for neighbourhoods that are unusual for Colchester, rather than simply deprived.
Flagged neighbourhoods
Every model, what it is for, and what it scored
Four predictive models and two reference baselines, each fitted separately for both tasks, plus two unsupervised models for the neighbourhood layer. The configurations below are read back from the fitted pipelines, so what is printed here is what actually ran.
Head to head
ROC-AUC on the held-out year, with 95% bootstrap intervals. Bars are drawn on a common scale so the two tasks can be compared directly.
Full results
PR-AUC and the hit rate should be read against the base rate for that task, not against 1.0. Brier is a calibration measure, so lower is better.
Predictive models
Unsupervised models
These run on Colchester's 105 neighbourhoods rather than on the national panel, and answer a different question: not who is at risk next year, but which places a service should look at differently.
How every model was validated
The protocol
- Fitted on outcome years up to 2023–24, scored once on 2024–25. Nothing is tuned on the test year.
- Every threshold is fixed from the training years alone, so no information from the scored year reaches its own label.
- ROC-AUC carries a 2,000-draw percentile bootstrap interval.
- Reported alongside PR-AUC, hit rate in a list of 30, and Brier.
What is deliberately absent
- No heavy hyperparameter search. Every degree of freedom spent against a held-out year of 262 authorities buys noise.
- No resampling to fix class imbalance. It distorts calibration; the loss is reweighted instead.
- No stacking or ensembling. The differences between these models sit inside their confidence intervals, so combining them would be fitting to noise.
What the data actually is
Counts, not records. The smallest unit anywhere in this project is a local authority in a financial year, or a neighbourhood of roughly 1,500 people. Every figure on this page is measured from the built dataset.
Rows per year
An authority that filed no return is counted as missing, never as zero.
Features
All measured in the feature year. Levels are largely complete; the year-on-year changes are missing more often, because a change needs two consecutive returns from the same authority.
Where the missing values are
The underlying measures
Before differencing and conversion to rates, grouped by the H-CLIC table they come from.
Outcome distribution
Labels and the split
Features come from year t, labels from year t+1 for the same authority. Escalation has fewer usable rows than level, because a relative change is undefined where the current rate is zero.
Neighbourhood layer
Method
Data
- MHCLG statutory homelessness (H-CLIC) detailed local authority tables, financial years 2018–19 to 2024–25.
- English Indices of Deprivation 2019, local authority summaries and LSOA-level scores.
- Measures are selected by matching published header text rather than column position, so a layout change between releases raises an error instead of quietly shifting a feature. 251 of the 252 measure-years resolve. The single gap is real, because Section 21 notices were not collected in 2018–19.
Validation
- Strictly temporal. Models are fitted on outcome years up to 2023–24 and scored once on 2024–25.
- Every threshold, including the definition of the "worst quintile" label, is fixed from the training years alone, so no information from the scored year reaches its own label.
- All ranking metrics carry 95% bootstrap intervals. With around 270 authorities and a small positive class, differences of a few points sit inside sampling noise.
- Probabilities are isotonically calibrated. Whoever acts on a triage score will read it as a probability, so it had better be one.
Boundary and coverage reconciliation
Local authorities move. There were 326 districts in 2018–19 and 296 in 2024–25, while the deprivation indices are published on 2019 boundaries. Rather than dropping the affected years, the pipeline reconciles them.
- Seven successor authorities (Buckinghamshire, the two Northamptonshires, the two Cumbrias, North Yorkshire and Somerset) have deprivation scores rebuilt by population-weighting their predecessors' LSOAs.
- Fourteen districts abolished in April 2019 inherit their successor's score.
- Every authority-year in the panel then carries a deprivation score, and the reconciliation is printed by the pipeline rather than hidden.
Data quality
Non-reporting is treated as a result in its own right. A silent zero and a genuine success look identical once they reach a summary table.
What this is, and what it is not
Limits
- The published statistics are aggregate, so this predicts areas rather than households. It is a test of method, not a finding about any individual family.
- Deprivation is fixed at 2019 while outcomes run to 2025.
- Non-reporting is almost certainly not random.
- Effect sizes are modest and the intervals are wide. An honest 2× lift is worth more than a polished 0.9.
- Non-reporting has not been modelled.
What changes with household-level data
- Monthly rather than annual, and at household level, so the horizon shortens from a year to a few weeks. That is the range in which prevention actually works.
- Rent account trajectories, repairs, anti-social behaviour, contact history and tenancy events, all of which these returns record only after the fact.
- Free-text case notes, where transformer-based feature extraction genuinely earns its place.
- Children's outcomes, such as school moves and attendance.
How the code is built
Two layers
- Twelve library modules hold the logic: parsing, measure selection, boundary reconciliation, feature construction, the models and their evaluation.
- Nine stage scripts run them in order. Each reads one artefact, calls into the library, and writes the next.
- Paths, financial years, the split and both thresholds are defined once, so the modelling stage and the dataset card cannot disagree about what the test year is.
What that is for
- Seventy-eight tests, weighted towards the label construction and the metrics, because that is where a bug changes a published number without changing anything visible.
- The model configurations on this page are read off the fitted pipelines, so a hyperparameter cannot change without the description changing with it.
- A research project that leaves behind something nobody else can run has not left much.
Reproducing this
Nine numbered stages, run by a single command. Every figure and every number on this page is written by the pipeline rather than typed in.