
Even though Rrs is measured above the surface:
PACE’s spectral richness gives us new power to infer what’s happening at depth.



Raw profiles come at irregular depths → ML models need consistent targets.
👉 This is why we train one BRT per depth bin instead of forcing a single parametric profile shape.
sklearn HistGradientBoostingRegressor() function. Standard. Easy.Each model predicts CHLA in a single depth range:
Benefits:
Loaded ML bundle from: models/brt_chla_profiles_bundle.zip
model_kind : pickle
model_type : collection (dict), n_submodels=20
example key: CHLA_0_10
target : log10_CHLA_A_B depth bins
features : 174 columns
train/test : 4408 / 1102 rows
dataset : 5510 rows stored in bundle
Usage example (Python):
bundle = load_ml_bundle('path/to/bundle.zip')
# Predict using helper 'predict_all_depths_for_day'
# Example: predict all depths for one day from a BRF dataset R
pred = bundle.predict(
R_dataset, # xr.DataArray/xr.Dataset with lat/lon + predictors
brt_models=bundle.model, # dict of models by depth bin
feature_cols=bundle.meta['feature_cols'],
consts={'solar_hour': 12.0, 'type': 1},
) # -> e.g. CHLA(time?, z, lat, lon)
# Plot using helper 'make_plot_pred_map'
fig, ax = bundle.plot(pred_da, pred_label='Prediction')
Overall we see a close match between our predictions and our test data for CHLA in the upper 10m — for non-coastal data.

Using PACE data for hyperspectral Rrs, we can make a prediction of surface CHLA. Let’s compare to PACE’s surface CHLA product as a first pass check, but note that these are different products trained on different in-situ data. Note surface CHLA is not our goal.

We do not expect these to be identical as the PACE chlor_a is based on the classic Rrs ratio algorithm while the BRT uses the whole spectrum but most importantly was trained on Argo and OOI florometer measurements.
PACE chlor_a to BRT with type = 1 (ooi) and solar_hour = 0 (midnight)
Notice that at high PACE chlor_a, the BRT model predicts lower CHLA_0_10. We might be able to correct this by using the whole CHLA depth profile (next section).

We can do this for the whole globe.


Not enough data yet. No correction was done for bathymetry (scattering off bottom), so that will need to be fixed for shallow water.



| peak_obs_m | peak_pred_m | peak_error_m | peak_obs_val | peak_pred_val | peak_error_val | int_obs_0_200 | int_pred_0_200 | int_error_0_200 | |
|---|---|---|---|---|---|---|---|---|---|
| 1433 | 45.0 | 65.0 | 20.0 | 0.552569 | 0.269209 | -0.283360 | 60.357637 | 29.869666 | -30.487972 |
| 1200 | 45.0 | 45.0 | 0.0 | 0.422407 | 0.552620 | 0.130213 | 24.065508 | 38.637324 | 14.571816 |
| 4501 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4552 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1867 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |


Once the per-depth-bin BRTs are trained:
This moves us toward estimates of global, depth-resolved CHLA density from space.