Augmentation
NIRS datasets are often small. Collecting and measuring physical samples is expensive and time-consuming. Augmentation helps by generating synthetic variations of your training data, giving the model more examples to learn from without collecting new samples.
Why Augment?
A model trained on 50 spectra may overfit to the specific noise patterns of those 50 measurements. Augmentation introduces controlled variability – small spectral shifts, additive noise, baseline drift – so the model learns to be robust to these effects rather than memorising them.
Note
Augmentation is applied only during training. Validation and test samples are never augmented, so your evaluation scores remain honest.
When Augmentation Runs
During cross-validation, augmentation happens inside each fold:
Fold k:
1. Select train subset
2. Apply augmentation -> expanded train subset
3. Fit transforms and model on expanded train
4. Predict on val and test (no augmentation)
Augmented samples are tagged with an origin_id that links them back to their
base sample. This tagging ensures that:
Augmented samples never leak into the validation or test set.
Splitters ignore augmented samples when assigning folds.
Predictions can be traced back to the original measurement.
Sample Augmentation
Sample augmentation generates new training rows by applying random perturbations to existing spectra.
from nirs4all.operators.augmentation import GaussianAdditiveNoise
pipeline = [
{"sample_augmentation": GaussianAdditiveNoise(sigma=0.01)},
ShuffleSplit(n_splits=5),
{"model": PLSRegression(10)},
]
Each base sample produces one or more augmented copies. The augmented copies share the same target value (y) as the original.
Augmentation families
nirs4all includes a library of NIRS-specific augmentation operators grouped by the type of variation they simulate:
Family |
Examples |
What it simulates |
|---|---|---|
Noise |
GaussianAdditiveNoise, MultiplicativeNoise, SpikeNoise |
Instrument noise |
Baseline |
LinearBaselineDrift, PolynomialBaselineDrift |
Baseline shifts |
Wavelength |
WavelengthShift, WavelengthStretch, LocalWavelengthWarp |
Wavelength calibration drift |
Spectral |
SmoothMagnitudeWarp, BandPerturbation, BandMasking |
Spectral shape variation |
Mixup |
MixupAugmenter, LocalMixupAugmenter |
Weighted sample blending |
Physical |
PathLengthAugmenter, BatchEffectAugmenter |
Physical measurement effects |
Scatter |
ScatterSimulationMSC |
Scatter variation |
See Operator catalog: choose a job, then inspect the method for the full list of augmentation operators and their parameters.
Standard vs. balanced mode
By default, augmentation produces a fixed number of copies per sample (standard mode). For classification tasks with imbalanced classes, you can switch to balanced mode, which generates more copies for under-represented classes:
{"sample_augmentation": {
"transformers": [GaussianAdditiveNoise(sigma=0.01)],
"balance": "y",
"target_size": 100,
}}
This is especially useful when one class has many fewer samples than another.
Feature Augmentation
Feature augmentation does not create new rows. Instead, it creates new feature columns by applying different transforms to the same spectra and concatenating the results.
{"feature_augmentation": [SNV(), SavitzkyGolay()], "action": "extend"}
The action parameter controls how the new features are combined with
existing ones:
Action |
Effect |
|---|---|
|
Add new processing chains alongside existing ones |
|
Add derived features to the current processing chain |
|
Replace the current processing with the new one |
Feature augmentation is useful when you want a model to see both raw spectra and derived features (e.g., SNV-corrected, first-derivative) simultaneously, without branching.
concat_transform
A simpler alternative to feature augmentation for a common case: apply several transforms independently and concatenate all results into one wide feature matrix.
{"concat_transform": [SNV(), SavitzkyGolay(deriv=1), SavitzkyGolay(deriv=2)]}
The example above produces a feature matrix that is three times wider than the original – one copy per transform. This gives the model access to multiple representations of the same spectra in a single flat input.
Choosing an Approach
Technique |
New rows? |
New features? |
Best for |
|---|---|---|---|
Sample augmentation |
Yes |
No |
Small datasets, noise robustness |
Feature augmentation |
No |
Yes |
Multiple spectral views, deep learning |
concat_transform |
No |
Yes |
Quick multi-representation input |
You can combine all three in the same pipeline. Sample augmentation runs first (creating new rows), then feature augmentation or concat_transform adds feature columns.
Practical Tips
Tip
Start with mild augmentation (low noise, small shifts) and increase gradually. Aggressive augmentation can distort spectral features and hurt performance.
Tip
Monitor the gap between RMSEC (calibration error) and RMSECV (cross-validation error). If RMSEC is much lower, the model is overfitting and augmentation may help. If both are similar, augmentation is less likely to improve results.
Next Steps
Pipelines – understand pipeline structure and where augmentation steps fit.
Cross-Validation – learn how augmented samples interact with folds.
Sample Augmentation Guide – detailed sample augmentation guide.
Operator catalog: choose a job, then inspect the method – full list of augmentation operators.