weltby Ergodic Sign inGet started
All use cases

What's on the Ground in This Part of Ouagadougou?

From its Sentinel-2 satellite bands, is this spot in Ouagadougou buildings, roads, bare soil, vegetation or water? Fast-growing cities need up-to-date maps, and ground surveys can't keep pace.

Use caseClimatePredictionModel evaluation

The table

Points in Ouagadougou with their Sentinel-2 band values and spectral indices, labelled by land-cover class. It's in Welt's research catalogue as Trusted Urban Land-Cover Training Labels, 46 African Cities: Ouagadougou, 5,013 rows by 19 columns, licensed CC0 1.0. The catalogue measures its signal at 0.64. At 5,013 rows and 18 features, TabICLv2 and Kumo Tabular Medium take the table as it is. The others can't take a table this size, so the walkthrough leaves them out.

Walkthrough

  1. Load it from the catalogue

    Find the table, read its recorded target and print the column names.

    import pandas as pd
    from welt import Client
    
    with Client() as client:
        item = client.research_datasets(q="urban land-cover Ouagadougou", limit=1)["items"][0]
        info = client.research_dataset(item["id"])
        data = client.load_research_dataset(item["id"])
    
    target = info["targets"][0]
    target = target["name"] if isinstance(target, dict) else target
    print([column["name"] for column in info["schema"]], target)
  2. Pick the rows

    Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.

    known = data.dropna(subset=[target])
    new_rows = known.sample(20, random_state=1)
    table = known.drop(new_rows.index)
  3. Compare the models and predict

    The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.

    with Client() as client:
        evaluation = client.evaluate(table, target, task="classification", seed=7,
                                     models=["tabicl-v2", "kumo-medium"])
        model = evaluation.fit()
    
    print(evaluation.summary()[["name", "rank", "roc_auc_mean", "brier_mean"]])
    features = new_rows.drop(columns=target)
    print(pd.DataFrame({"actual": new_rows[target].values, "predicted": model.predict(features),
                        "probability": model.predict_proba(features).max(axis=1)}))

What you get

A class per pointLand cover with a probability for each class.
Maps that keep upClassify new satellite passes as they arrive.
Checked labelsTrained on labels people verified on the ground.

Try it

Use Open with to run the research datasets notebook in Colab, Kaggle or Jupyter and search for "urban land-cover Ouagadougou", or run the code above after pip install "welt-client[parquet]".