Loading portfolio
My MSc dissertation asks a simple but expensive question: if you train an anomaly detector on one wind turbine, does it actually work on the rest of the farm? Standard practice is one model per turbine, which stops scaling the moment you’re managing a real fleet. I ran a fifteen-experiment ablation study on real SCADA data from a ten-turbine wind farm, training on a single turbine and holding the other nine out completely, to isolate what actually closes that gap: per-regime normalisation, lightweight decoder fine-tuning, or a Mixture-of-Experts decoder. Two of those helped. One didn’t, and it stayed in the final write-up instead of getting quietly dropped.
What makes this project different:
Genuine turbine-level holdout, not a pooled split. Train on one turbine, test on nine it has never seen.
Condition-Binned Standardisation, normalising each channel within its own power regime instead of globally.
Decoder-only fine-tuning on ~60 normal windows per turbine, cheap enough to run on a freshly commissioned asset.
Paired significance testing across all nine held-out turbines, not point-estimate comparison, so the negative results are as trustworthy as the positive ones.
The starting point is the Anomaly-Reinforced Autoencoder (ARAE): a 1D convolutional encoder-decoder that’s deliberately trained to reconstruct normal turbine behaviour well and abnormal behaviour badly, so the reconstruction error itself becomes the anomaly score. Left unmodified and pointed at nine turbines it never trained on, it performs no better than a coin flip.
Combining CBS with decoder fine-tuning on a single shared decoder recovers most of the usable signal: mean AUC goes from 0.50 to 0.735, mean recall to 0.835. That configuration is what I ended up recommending! Not the more elaborate one.
SCADA window
6 channels × 128 timesteps, one turbine
CBS normalisation
z-scored within its own power-regime bin
Shared 1D-conv encoder
inverted-bottleneck stages → 4×16 latent code
Single decoder
adopted
Router + 2 experts
tested, not significant (p = 0.43)
Reconstruction error → anomaly score
Same encoder, two candidate decoders but only one earned its place in the final model.
Seven of the fifteen runs, chosen to show the shape of the argument. Full table and Wilcoxon matrix are in the write-up.
| Exp. | Configuration | Mean AUC ± SD | Verdict |
|---|---|---|---|
| 1 | ARAE, no CBS, no fine-tuning | 0.498 ± 0.213 | Baseline: no better than random |
| 2 | + CBS only | 0.471 ± 0.159 | CBS alone does nothing without fine-tuning |
| 3 | + Fine-tuning only | 0.658 ± 0.157 | Fine-tuning alone recovers most of the gap |
| 4 | + CBS + fine-tuning | 0.735 ± 0.226 | Adopted as the final model |
| 6 | + CBS + MoE, symmetric init | 0.493 ± 0.181 | Router collapses to a fixed 51/49 split |
| 9 | + CBS + MoE + fine-tuning | 0.721 ± 0.187 | Competitive, not an improvement |
| 11 | + CBS + MoE + fine-tuning + load-balancing | 0.752 ± 0.212 | Best MoE run but still p = 0.43 vs. Exp. 4 |
The best MoE variant (0.752) does edge out the plain single-decoder baseline on paper. A paired Wilcoxon signed-rank test across the nine held-out turbines puts that gap at p = 0.43, and the simpler fixed-weight ensemble version comes in at p = 0.73, neither clears any reasonable significance bar. The router adds parameters and training complexity for a difference that, statistically, isn’t really there.
So the final model is the boring one: one decoder, CBS, and about sixty windows of fine-tuning per target turbine. I kept the full MoE investigation in the dissertation anyway, as a documented answer to “why not just add a Mixture-of-Experts layer,” rather than deleting the chapter because it didn’t win.
The 0.735 fleet mean isn’t spread evenly across turbines, and I didn’t want to bury that in an appendix:
Realistic anomaly rate
0.698AUC
Most of the fleet. This is the harder, more representative case, and it sits below the flat fleet average.
Abnormal-majority turbines
0.941AUC
Structurally an easier discrimination task, more abnormal examples to separate from, not evidence the model is actually better here.
Turbine 07 (worst case)
0.256AUC
Below random. Its power distribution differs enough from the training turbine that CBS’s bin statistics, fit only on the source turbine, don’t transfer cleanly.