BuildSys '26 · Banff, Canada Best Paper Candidate

NILMBench2026

A reproducible benchmark for energy disaggregation

We evaluate 16 NILM models across 3 datasets and 2 resolutions — on accuracy, efficiency, and generalization. Cross-building and cross-dataset results show a substantial generalization gap.

IIT Gandhinagar, India
* Equal contribution  ·  Corresponding author
AGGREGATE MAINS smart meter · 1 channel ↓ disaggregate Fridge MAE 14.2 W Washing Machine MAE 3.0 W Microwave MAE 4.7 W Kettle MAE 5.8 W

Schematic of the NILM task — appliance MAEs are NILMFormer's intra-building scores on UK-DALE. Real predictions below.

Benchmark scope and motivation

Non-Intrusive Load Monitoring (NILM) decomposes a household's aggregate power signal into appliance-level estimates. Despite many architectural advances, progress is hindered by the lack of a reproducible benchmark that evaluates models under varying compute budgets and at the resolutions that matter for real-time feedback (1 min) and utility-scale planning (15 min).


NILMBench2026 systematically evaluates sixteen models across regression accuracy, event detection, computational cost, and generalization on UK-DALE, REDD and REFIT. Two insights emerge: (1) model performance is highly context-dependent, varying with appliance type and temporal resolution; and (2) more critically, most models fail to generalize across buildings — especially when test appliances exhibit power characteristics unseen during training.


We also update the NILMTK model implementations: legacy models are re-implemented in PyTorch behind a unified API, and the evaluated environments are specified with Docker and uv. These artifacts support reproduction and extension of the reported experiments.

16
Models benchmarked
3
Public datasets
2
Time resolutions
3
Generalization tasks
576
Configurations ×3 runs

Evaluation beyond in-domain accuracy

Foundational toolkits standardized data parsers and baselines. NILMBench2026 additionally evaluates computational efficiency, 15-minute resolution, and cross-domain generalization under a recorded software environment.

Feature NILMTK '14 Contrib '19 NILMBench2026
DeployabilityDocker + uv
Models2916
Resolutionsvariable1-min1-min & 15-min
Efficiency (FLOPs / time)
Cross-building generalization
Cross-dataset generalization
Software stackPython 2.7TensorFlow 1.xPyTorch + uv
yt = Σi=1..N xi,t + εt   — aggregate = Σ appliances + noise & unmetered loads

Reproduce every result in three commands

NILMBench2026 is the benchmark runner around NILMTK data and nilmtk-contrib models. It freezes real-data protocols, provenance and leaderboard generation behind one CLI. Use uv for development or build the pinned CPU/CUDA container family. Pick a tab.

uv install
Docker
Python API
Example run
nilmbench — zsh
# Python 3.11 benchmark environment
uv venv --python 3.11
source .venv/bin/activate
uv pip install "nilmbench[benchmark] @ git+https://github.com/nilmtk/nilmbench.git"
nilmbench list
# Until the first public image release, build the pinned CUDA runner locally
git clone https://github.com/nilmtk/nilmtk-contrib.git
git clone https://github.com/nilmtk/nilmbench.git
cd nilmbench
docker buildx build --load --build-context contrib=../nilmtk-contrib \
  -f docker/Dockerfile.cuda -t nilmbench:cuda .
docker run --rm --gpus all nilmbench:cuda doctor
from nilmtk.api import API
from nilmtk.disaggregate import Mean
from nilmtk_contrib.torch import (
    Seq2PointTorch, Seq2Seq, RNN, WindowGRU, DAE,
    NILMFormer, TCN, ConvLSTM, MSDC, Reformer,   # +5 modern architectures
)

experiment = {
  'power':       {'mains': ['active'], 'appliance': ['active']},
  'sample_rate': 60,                          # 60s real-time  |  900s utility-scale
  'appliances':  ['fridge', 'washing machine', 'microwave', 'kettle'],
  'methods': {
      'NILMFormer': NILMFormer({'n_epochs': 50, 'batch_size': 256}),
      'Seq2Point':  Seq2PointTorch({'n_epochs': 50, 'batch_size': 256}),
      'TCN':        TCN({'n_epochs': 50, 'batch_size': 256}),
      'Mean':       Mean({}),
  },
  'train': {'datasets': {'UKDALE': {'path': 'ukdale.h5',
            'buildings': {1: {'start_time': '2013-04-01', 'end_time': '2013-05-01'}}}}},
  'test':  {'datasets': {'UKDALE': {'path': 'ukdale.h5',
            'buildings': {4: {'start_time': '2013-05-01', 'end_time': '2013-05-08'}}}},
            'metrics': ['mae', 'f1score']},
}

results = API(experiment)   # trains, tests & scores every model — cross-building (T2)
# One provenance-recorded real-data smoke
nilmbench run --task corrected-t1-redd --model Seq2Point \
  --appliance fridge --seed 42 --epochs 3 --max-samples 8192 \
  --sequence-length 299 --device cuda --results results/candidates

# Generate the site artifacts only from immutable result bundles
nilmbench leaderboard --results results/published \
  --output leaderboard.json --csv leaderboard.csv

Unified PyTorch interface

Legacy Keras and TensorFlow models are re-implemented in PyTorch under a common training and inference interface.

Pinned environments

Docker images and uv lock files record the software environment used for each evaluation.

Common model contract

All architectures conform to the NILMTK Experiment API and can be selected through the experiment configuration.

Five additional architectures

TCN, ConvLSTM, MSDC, Reformer, and NILMFormer extend the evaluated temporal-modeling families.

A maintained benchmark for NILM

NILMBench2026 defines shared T1, T2, and T3 evaluation tasks, fixed data windows, and a public result format. New models and metrics use the same experiment API and can be evaluated on held-out buildings and datasets without changing the protocol.

add a new algorithm
from nilmtk.disaggregate import Disaggregator

class MyNILM(Disaggregator):            # implement the interface
    def __init__(self, params):
        self.MODEL_NAME = 'MyNILM'
        self.models = {}
        self.sequence_length = params.get('sequence_length', 99)
        self.n_epochs = params.get('n_epochs', 50)

    def partial_fit(self, train_main, train_appliances, **kw):
        ...    # train one PyTorch model per appliance

    def disaggregate_chunk(self, test_main):
        ...    # return {appliance: predicted_power}
        return predictions

# Register it — the only line your experiment changes
experiment['methods']['MyNILM'] = MyNILM({'n_epochs': 50})
add a new metric
# nilmtk/losses.py — define once, reference by name
def sae(app_gt, app_pred):              # Signal Aggregate Error
    return abs(app_pred.sum() - app_gt.sum()) / app_gt.sum()

def nep(app_gt, app_pred):              # Normalized Error in Power
    return (app_gt - app_pred).abs().sum() / app_gt.abs().sum()

# Score every model on it — just name it in the experiment
experiment['test']['metrics'] = ['mae', 'f1score', 'sae', 'nep']

# Same harness, same splits, same pre-processing for everyone —
# so reported gains are architectural, not implementation luck.
01 · IMPLEMENT

Subclass Disaggregator

Implement the shared training and inference contract used by the reference models.

02 · EVALUATE

Run the fixed protocol

Use the published T1, T2, or T3 split and record the resulting data, runtime, and model provenance.

03 · SUBMIT

Open a pull request

Submit the implementation and validated result bundle for review and possible publication.

The leaderboard now lives separately

This page records the fixed BuildSys 2026 study. The living board grows as new provenance-checked result bundles are published, without rewriting the paper.

Sixteen architectures, four families

The evaluated suite spans baseline, recurrent, convolutional, attention-based, and hybrid designs behind one PyTorch API.

added in NILMBench2026 existing NILMTK / contrib model

Recurrent & Hybrid

Sequence memory & attention gating
RNN WindowGRU ConvLSTM RNN Attention RNN Attn. Cl.

Fully Convolutional

Local filters & dilations
Seq2Point Seq2Seq TCN ResNet ResNet Cl.

Transformer-Based

Long-range dependencies
BERT Reformer NILMFormer

Specialized NILM

Denoising & state modeling
DAE MSDC

Three tasks, increasing realism

Generalization is tested at three levels — from the best case (same home) to the hardest case (a different country). Performance falls off a cliff as the domain shifts.

Building 1 · same home TRAIN · 30 d TEST · 1 wk
T1

Intra-Building

Train and test on disjoint time segments from the same home — temporal generalization, the best-case baseline.

Train 30d B1 → test held-out 1 week, B1
same dataset & country · unseen home TRAIN · B1, B2 generalize ? TEST · B4
T2

Cross-Building

Train and test on different homes within a dataset. The realistic deployment test — and where most models break.

UK-DALE: B1,B2 → B4  ·  REDD: B1,B2,B3 → B6
different countries & grids REDD · USA · 110V REFIT · UK · 230V zero-shot
T3

Cross-Dataset

Zero-shot transfer across countries & grids (110/230V). The hardest test — a symmetric, bidirectional collapse.

REDD (USA) ⇄ REFIT (UK)

Three datasets, two countries, two grids

Selected for building diversity, temporal continuity, and open access — the properties needed to validate generalization. Single-building and pay-walled repositories are excluded.

REDD

USA
Buildings6
Duration3–19 days
Appliances10–20

UK-DALE

UK
Buildings5
Duration655 days
Appliances5–54

REFIT

UK
Buildings20
Duration2 years
Appliances9–21
Fridge · always-on Microwave · bursty Kettle · bursty Washing Machine · multi-state Dish Washer · multi-state Television · dynamic

Excluded: AMPds, iAWE, BLUED, DRED (single-building → cannot test cross-building generalization); PecanStreet (not freely available at full scale).

Explore the benchmark

Cells use the paper's color scale: green indicates better performance and red indicates worse performance. Bold marks the best and underline the second-best value per column. Scroll tables horizontally.

goodbad

Representative failure cases

Predictions on UK-DALE, REDD, and REFIT illustrate the quantitative findings.

UK-DALE aggregate mains decomposed by NILMFormer into a fridge and a bursty appliance.
Within-building predictions. A UK-DALE site meter (top) and NILMFormer's appliance estimates against ground truth for a periodic fridge (middle) and a sparse, high-power load (bottom).
NILMFormer television predictions: cross-building fails with spurious spikes; same-building tracks well.
Cross-building generalization gap. NILMFormer tracks a REFIT television in the same-building setting (bottom), but produces spurious spikes for an unseen television (top).
Four models all miss the microwave's high-power activation spikes on REFIT cross-building.
MAE is misleading. On the sparse REFIT microwave, NILMFormer, Seq2Seq, RNN and BERT all miss every 1200 W spike — yet score a low MAE by predicting "off". Event metrics (F1) are essential.
Mains power across four REDD buildings showing large temporal gaps and missing data.
Why static splits. Mains traces across REDD buildings show severe gaps and disjoint coverage — test homes like B6 lack data in the training window, ruling out naive rotation-based cross-validation.

Four findings

No single model wins

The best architecture depends on the appliance's electrical signature: CNNs perform well on sparse, high-power events, whereas Transformers perform well on several multi-state loads.

Generalization is the main hurdle

Most models lose substantial accuracy on unseen buildings and datasets. The decrease from within-building to cross-building evaluation occurs in both transfer directions.

MAE is misleading for sparse events

Always predicting "off" yields a deceptively low MAE while missing every activation. Event metrics like F1 are essential for sparse, bursty appliances.

Efficiency ≠ accuracy

The trade-off is non-monotonic. Architectural inductive bias beats raw compute: a 69K-param TCN rivals the heavyweight NILMFormer on cross-dataset tasks.

Illustrative error difference. On the UK-DALE fridge, moving from RNN (~43 W MAE) to RNN Attn. Cl. (~18 W) corrects roughly 219 kWh / year of energy attribution — a difference that matters for consumer feedback and billing systems.

Research directions

The observed failure modes motivate six directions for improving cross-building and cross-dataset performance.

01

Domain adaptation

Study source/target alignment for transfer to new grids and appliances with limited labels.

02

Self-supervised pre-training

Evaluate masked modeling on unlabeled aggregate-power data before supervised fine-tuning.

03

Multi-task state classification

Combine power regression with probabilistic state and transition modeling for sparse loads.

04

Adaptive denormalization

Test local statistics and exogenous covariates, including time of day and occupancy, at low resolution.

05

Generative augmentation

Measure whether synthetic appliance signatures improve performance on held-out domains.

06

Maintained leaderboards

Publish provenance-checked results with explicit in-domain and out-of-domain cohorts.

Cite NILMBench2026

If you use the benchmark protocol, implementation, or reported results, please cite the paper.

@inproceedings{kuloor2026nilmbench,
  title     = {NILMBench2026: A Benchmark for Energy Disaggregation},
  author    = {Kuloor, Aayush and Singh, Anurag and Dhru, Harsh and Batra, Nipun},
  booktitle = {Proceedings of the 13th ACM International Conference on Systems for
               Energy-Efficient Buildings, Cities, and Transportation (BuildSys '26)},
  year      = {2026},
  doi       = {10.1145/3744256.3812587},
  publisher = {ACM},
  address   = {Banff, AB, Canada}
}