Skip to main content
This guide compares an observed-data baseline, global training with observed and augmented series, and models trained only on independent synthetic series and transferred zero-shot to the observed series. MLForecast trains a single global model over lagged and derived features pooled across every series in the panel. Because that fitted estimator is shared, two things follow. Adding synthetic series changes the model the observed series is scored by — unlike a local model fitted independently per series, where extra series leave the target fit untouched. And a model trained only on synthetic series can be applied to a previously unseen panel through predict(new_df=...), which is zero-shot transfer rather than a per-series refit. Both workflows below rely on that shared-weight behavior.
Scale the target before pooling series A global model sees every series through one set of coefficients, so series on different levels have to be made comparable first. The forecaster below applies Differences([12]) to remove the annual seasonal trend and LocalStandardScaler() to put each series on its own scale. Without those transforms every synthetic workflow on this page degrades by a factor of four to six: the estimator fits whatever level the synthetic panel happens to occupy and predicts a nearly flat line for the airline series. That failure is a symptom of the model configuration, not of the synthetic data.
We use the classic Box–Jenkins airline passenger series, holding out its final 12 months before generating any augmented data.
The next cell builds the four training sets. The observed baseline is the single airline series. The augmented panel adds eight counterparts of that series, drawn with SynAugment under a SARIMA override so the generated histories match its seasonal structure; the 12-month holdout is removed first, so no future value reaches the augmenter. The two pretraining panels are both independent of the airline data, and differ only in how they were composed:
  • matched monthly pool — SARIMA, ETS, and seasonal generators configured for monthly data with a 12-step seasonal period, an upward trend, and a comparable level.
  • generic balanced poolgenerate_series with its defaults, which spans random walks, volatility clustering, chaos, and counts at whatever scale each process produces.
Non-finite synthetic series are dropped from both so the estimator trains on clean histories.
MLForecast can apply a fitted global estimator to unseen series through predict(new_df=...). The estimators below are fitted only on independent SynForecast series; the observed history is supplied only when producing its recursive lag features and forecasts. This is zero-shot transfer, not fine-tuning. Fitting both pools separately is what makes the comparison useful: the pretraining corpus is a modeling choice, and choosing it badly costs more accuracy here than skipping pretraining altogether.
We score each workflow by mean absolute error over the 12-month holdout for the airline series.
Two things stand out, and both match the paired benchmarks in When does synthetic data help?. Augmentation is roughly neutral. Across ten augmentation seeds the augmented panel beat the observed-only baseline six times out of ten (median MAE 15.8 against 16.3). Treat the single row in the table as a workflow demonstration, not as evidence that augmentation improves accuracy. A matched pretraining pool wins here; a generic one loses. The matched-pool zero-shot model beat observed-only training in all ten pool seeds (median MAE 12.2), while the generic pool lost in all ten (median 22.2). One 132-point series is very little data for a global model, which is the data-scarce regime where synthetic pretraining pays off — but only when the corpus resembles the target domain in frequency, seasonal period, and scale. For a production decision, evaluate multiple temporal folds, generator configurations, estimators, and random seeds. Choose augmentation ratios and pool composition on validation data, never on the final holdout.