How it works

A music foundation model, 1,887 labelled songs, and a linear classifier.

The short version

The score is the output of a classifier trained to reproduce the ratings given by the hosts of Yacht or Nyacht? [1]. Each host scores a song out of 100, and the four scores are averaged into its yachtski. The site treats 50 as the boundary between Yacht Rock and Nyacht Rock.

This model listens to 30 seconds of audio and returns the estimated probability that a song's yachtski β€” the average of the four hosts β€” would land above 50. That is not the same as all four hosts agreeing: of the 1,243 songs with an average above 50, only 942 have every host individually above it. A song can clear the line on the strength of two enthusiasts and a sceptic.

It is a rough detector, not a verdict. On songs it has never seen it gets the Yacht/Nyacht call right about 70% of the time, where always guessing the majority class would score 51%, and its probability explains roughly 30% of the variance in the hosts' scores. It is confident and correct at the extremes, and close to guessing on songs near the boundary.

The pipeline

Ground truthThe hosts' ratings ship as a static JavaScript file on yachtornyacht.com, so the full table β€” artist, title, year, four individual host scores, and the averaged "yachtski" β€” is read directly. 2,438 rated songs.
AudioEach song is matched against Deezer's catalogue [5] β€” the same source the app scores β€” and its 30-second preview is used. A match counts only when both artist and title agree after normalisation; fuzzy matches are discarded rather than risked. 1,910 songs matched (79%), of which 1,887 make the training set after excluding ambiguous rows.
EmbeddingThe clip goes through MERT-v1-95M [2], a self-supervised model trained on music. Each of its 13 transformer layers is mean-pooled over time, giving a 9,984-dimensional representation of how the recording sounds.
ClassificationAn L2-regularised logistic regression, fit with scikit-learn [4], maps that representation to P(yacht). The regularisation strength is re-chosen by an inner cross-validation inside every training fold, so it never sees the song being scored.
EnsembleCross-validation fits five models, each on a different 80% of the data. All five are kept: a new song is scored by every one of them and the probabilities are averaged, then rounded. Averaging cancels some of the variance any single fit would carry, and it costs nothing extra since the folds are already computed.

What the numbers mean

All figures are for the logistic model on songs held out of training, under nested cross-validation across all 1,887 songs: the regularisation strength is re-selected by an inner cross-validation inside each outer training fold, so no hyperparameter ever sees the song it is scoring.

MetricHeld outWhat it means
ROC AUC0.766 Ranks a random yacht song above a random nyacht song 77% of the time
Accuracy0.70 Yacht/Nyacht call. Always guessing the majority class would score 0.51
Reliability0.0015 Miscalibration: take every song scored near 30% β€” what fraction were actually yacht? This is the average squared gap between the two. Lower is better, 0 is perfect
P(yacht) vs true scorePearson r = 0.55 The probability tracks the hosts' 0–100 rating, not just the label

Two of those rows are worth a note. Reliability of 0.0015 means the probabilities are close to honest: of the songs the model calls 30%, close to 30% really are yacht, and the same holds across the range. So the number on the dial can be read as a genuine confidence, not just a ranking β€” a 90 really is much likelier to be yacht rock than a 60.

And the model is trained only on a yes/no label, yet its probability still correlates with the hosts' full 0–100 score at a Pearson correlation of 0.55. It recovers more than it was asked to.

Which encoder

MERT [2] was compared against CLAP [3], an audio–text model, under identical conditions β€” same songs, same folds, same classifier, same nested tuning.

EncoderDimsAUCPearson r vs true score
MERT, all 13 layers9,9840.766+0.551
MERT, layer 8 only (best layer)7680.758+0.535
CLAP5120.734+0.489

MERT wins, but by less than it might appear: +0.032 AUC. CLAP reaches 95% of that from a representation 19Γ— smaller, and embeds roughly ten times faster. The much larger gain in this project came from dropping zero-shot text prompts in favour of a supervised head β€” not from the change of encoder. Concatenating both encoders scores 0.772, which is inside noise of MERT alone and not worth double the inference cost.

Honest limitations

The score is confidence, not a yachtski estimate

A score of 90 does not mean "the hosts would average this at 90". It means the model is 90% confident their average would land on the yacht side of 50. The two usually move together β€” the probability correlates with the hosts' actual rating at r = 0.55 β€” but a song can be unmistakably yacht-shaped and still only be rated 60.

An earlier version reported a direct 0–100 yachtski estimate from a ridge regression. It was dropped: its predictions compressed toward the middle of the scale, rarely leaving the 20–80 range even for songs the hosts rated 5 or 95. The probability does not have that problem β€” it uses nearly the full range β€” but it is answering a different question, and it is worth being clear which one.

The middle is a coin flip

Roughly 62% of its mistakes are songs the hosts rated between 40 and 60. Some of that is not really model error: a song rated 49 and one rated 51 are near-identical, but the binary label calls them opposites.

It over-rates polished non-yacht music

Smooth, well-produced records that the hosts reject on other grounds tend to score too high β€” some 1980s R&B, and Japanese city pop in particular, which is sonically almost indistinguishable from yacht rock but which the hosts rate only modestly.

What you search is not always what it was trained on

Every metric above is measured on the kind of song the hosts choose to review: overwhelmingly studio recordings from roughly 1975–1990, soft rock and its immediate neighbours. A search box accepts anything β€” covers, remixes, live versions, modern pop, classical, children's music. None of that resembles the training data, and the model has no way to say "I have not seen anything like this". It will always return a confident-looking number.

Training on the same Deezer previews the app scores removes one failure mode an earlier version had: when training audio came from one source and scoring audio from another, the same song could land eight points apart depending on the upload's mastering. Now a track's preview is a single canonical input. But Deezer lists covers, remasters and live versions as separate tracks, and each one is scored as its own unheard piece of audio.

One hypothesis that did not survive. The low scores given to several modern revivalist tracks suggested the model might be detecting recording vintage rather than genre. Testing it on the 190 post-2000 songs the hosts have actually rated refuted this: the correlation between release year and prediction error is -0.04, essentially zero. The apparent era pattern was mean-reversion in disguise.

Caching and cross-validation

Every scored track is stored, so a repeat query returns instantly rather than re-downloading and re-running the model.

If you pick a song that is already in the training data β€” matched by artist and title β€” the app returns its cross-validated score β€” the score produced by a model trained on the other songs, which never saw this one. Running the fitted model on its own training example would report a memorised answer and flatter the model. Those results are labelled cross-validated in the interface.

References

  1. Yacht or Nyacht? β€” the ratings this model is trained to reproduce. yachtornyacht.com
  2. Li, Y., Yuan, R., Zhang, G., et al. (2024). MERT: Acoustic Music Understanding Model with Large-Scale Self-supervised Training. ICLR 2024. arXiv:2306.00107
  3. Wu, Y., Chen, K., Zhang, T., et al. (2023). Large-scale Contrastive Language-Audio Pretraining with Feature Fusion and Keyword-to-Caption Augmentation. ICASSP 2023. arXiv:2211.06687
  4. Pedregosa, F., et al. (2011). Scikit-learn: Machine Learning in Python. JMLR 12, 2825–2830. scikit-learn.org
  5. Deezer β€” 30-second audio previews, for both training and scoring. developers.deezer.com

Audio is fetched transiently to compute a score and is not redistributed. Ratings belong to the hosts of Yacht or Nyacht?; this is an unaffiliated hobby project by Felipe Maia Polo.