The work
A full self-supervised learning pipeline benchmarking six architectures for recognising physical activity from a wrist sensor.
Given movement data from a wearable sensor, can a model tell walking from cycling from sitting? I benchmarked six approaches, from a twenty-year-old method to a modern transformer, three of them self-supervised, on the same dataset with the same protocol. Each was tested on people it had never seen during training, which is the only version of the question that matters if you want to ship something.
The scores ranged from 0.880 down to 0.843, which looks like a ranking. It is not one. A statistical test designed for exactly this comparison says the differences are indistinguishable from chance, so I did not run the follow-up test that would have ranked them — there was nothing to rank. The practical consequence is the interesting part: the state-of-the-art model the project was built around took about seven hours and finished fourth, while a conventional method took about twenty-three minutes and was statistically tied with it.
Chart scrolls sideways on a narrow screen — or open “Show the numbers” below.
Show the numbers
| model | pooled macro f1 | mean per fold macro f1 | min fold | max fold | mean friedman rank |
|---|---|---|---|---|---|
| SimCLR | 0.8795 | 0.7609 | 0.3619 | 0.944 | 2.636 |
| DeepConvLSTM | 0.8706 | 0.7464 | 0.3719 | 0.9403 | 3.591 |
| SelfHARModel | 0.8622 | 0.7472 | 0.4408 | 0.903 | 3.5 |
| SelfPAB | 0.8601 | 0.7377 | 0.3321 | 0.922 | 3.727 |
| XGBoost | 0.8509 | 0.7392 | 0.2954 | 0.8808 | 3.864 |
| MOMENT | 0.8432 | 0.7334 | 0.4247 | 0.8757 | 3.682 |
Chart scrolls sideways on a narrow screen — or open “Show the numbers” below.
Show the numbers
| class | support | SimCLR | DeepConvLSTM | SelfHARModel | SelfPAB | XGBoost | MOMENT |
|---|---|---|---|---|---|---|---|
| 1 | 4862 | 0.9178 | 0.9007 | 0.8981 | 0.8858 | 0.908 | 0.9454 |
| 2 | 1174 | 0.9728 | 0.9713 | 0.9775 | 0.9788 | 0.9797 | 0.9928 |
| 3 | 769 | 0.5263 | 0.5028 | 0.4595 | 0.4965 | 0.4224 | 0.5725 |
| 4 | 662 | 0.7941 | 0.7875 | 0.7783 | 0.7381 | 0.6851 | 0.9041 |
| 5 | 1999 | 0.9633 | 0.9646 | 0.9657 | 0.962 | 0.9434 | 0.9671 |
| 6 | 3034 | 0.8866 | 0.8533 | 0.8634 | 0.8698 | 0.8946 | 0.8368 |
| 7 | 11612 | 0.9928 | 0.994 | 0.988 | 0.9898 | 0.993 | 0.9383 |
| 8 | 1719 | 0.9825 | 0.9905 | 0.967 | 0.96 | 0.9813 | 0.5889 |
Read the full BSc thesis (PDF, 4.6 MB, 30 pages). The timings above are from its results chapter.
The technical version
The load-bearing finding is negative
Macro-F1 (an accuracy score that weights rare activities equally) under leave-one-subject-out cross-validation on HARTH v1.2 — a public research dataset of wearable-sensor recordings — across 12 activity classes: SimCLR 0.880, DeepConvLSTM 0.871, SelfHARModel 0.862, SelfPAB 0.860, XGBoost 0.851, MOMENT 0.843. A Friedman test failed to reject the null at α = 0.05; the Nemenyi post-hoc was therefore not run. The thesis states the spread "could reasonably be attributed to random chance."
Recomputed, not quoted — tools/make_figures.py re-derives the test
from the committed per-fold logs: χ² = 6.104,
df = 5, p = 0.296. Note the headline
scores are the pooled report across all folds; the mean of the per-fold scores is a
different and lower quantity (SimCLR 0.761), and the two are
not interchangeable.
The practical finding
SelfPAB cost about 7 hours for the full cross-validation against 1.7 hours for SimCLR and 23 minutes for XGBoost, and finished fourth. Recorded honestly rather than claimed: SelfPAB scored 0.860 here against 0.813 in its original paper on the same dataset, attributed to setup variation and not claimed as an improvement. Known persistent limitation: class imbalance.