Spheer embedding β†’ CBS land use, linear probe (Lelystad, 2020)

A 100 β†’ 11 logistic-regression probe that maps the annual Spheer FM Sentinel-2 embedding to Statistics Netherlands (CBS) NBBG2020 land-use classes. It's the model behind experiment 01 of my Posts series, which asks whether a precomputed embedding beats a random forest on raw Sentinel-2.

It's a research artefact, not a land-use product. It was trained on a single 11 Γ— 11.5 km window (Lelystad coast, MGRS 31UFU, 20 m), 89% of which is open water.

Results (5-fold, 1 km spatial blocks, 100 m buffer)

  • macro-F1 over 11 classes: 0.592 (95% block-bootstrap CI 0.523–0.626)
  • random forest on 46 hand-built Sentinel-2 features, same pixels: 0.551
  • paired difference: +0.041 (95% CI +0.006 to +0.066)

Classes: 20 residential, 21 retail & catering, 24 industry & business, 40 park, 41 sports grounds, 60 forest, 61 dry nature, 62 wet nature, 70 IJsselmeer/Markermeer, 75 recreational water, 78 other inland water.

Use

import json, numpy as np
from safetensors.numpy import load_file
w = load_file("probe.safetensors"); cfg = json.load(open("config.json"))
# emb: (N, 100) float32 Spheer 2020 embeddings, same model version as the training data
z = (emb - w["mean"]) / w["scale"]
logits = z @ w["coef"].T + w["intercept"]
pred = np.array(cfg["classes"])[logits.argmax(1)]

The embeddings are gated; request access on the dataset page. Don't mix model versions, because embeddings from different Spheer versions live in different spaces.

Limitations

One window, one year, 11 classes (agriculture, roads and construction had too few pure pixels here and were dropped). CBS classes describe use, not cover, and are partly unobservable from 20 m pixels. Expect it to transfer poorly outside the training area without refitting.

Downloads last month
14
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support