Skip to content
Sheharyar Ishfaq, home

BirdCLEF+ 2026

Recognising 206 species of birds, frogs and insects from 35,549 recordings, with classical machine learning only. No neural networks were allowed.

Type
Machine learning, solo
When
May 2026, Sorbonne M1
Result
0.922 macro ROC-AUC
Stack
Python, scikit-learn, librosa

The problem

Sheharyar Ishfaq took on BirdCLEF+ 2026 alone in May 2026, during his first year of the MSc at Sorbonne. BirdCLEF+ 2026 asks which species are calling in a recording. The training set has 35,549 clips from Xeno-canto and iNaturalist, resampled to 32 kHz, covering 206 species. It is badly imbalanced: the largest class has 499 recordings, 25 species have fewer than 10, and four have a single clip.

The course rule made it harder: classical models only, so every pattern a network would learn from a spectrogram had to be captured by hand-built features first.

Waveform and mel-spectrogram of a clean training clip of an Ashy-headed Greenlet, above a noisy field soundscape where several species overlap.
A clean training clip (top) and a field soundscape (bottom). Training audio is clean; the real test is not.

What I built

Audio features
30 librosa features per frame (13 MFCCs, spectral centroid, bandwidth and rolloff, zero-crossing rate, RMS and 12 chroma), summarised over time by six statistics into 180 numbers per clip.
A fair benchmark
Five models compared with 5-fold stratified cross-validation, scored on macro ROC-AUC so every species counts the same, rare or common.
Recording metadata
Latitude, longitude, recording rating and source added as four extra features, which lifted the best model from 0.893 to 0.922.
Ablation and error analysis
Removing the MFCCs drops AUC from 0.897 to 0.758; every other group moves it by under 0.002. Small classes score lowest, and field soundscapes far below clean clips.

Results

Macro ROC-AUC, 5-fold stratified cross-validation on the 180 audio features.

Logistic Regressionaudio and metadata0.922
Logistic Regressionaudio only0.893
Linear SVM0.867
Random Forest0.770
k-NN, k = 50.639
LightGBMdefault settings0.504
LightGBM reached 0.865 once tuned (500 trees, learning rate 0.01), still below the linear model.

Hard calls

01
A linear model over the stronger ones

I expected the tree ensembles to win. They didn't: the non-linear work from raw audio to features is already done before the classifier sees the data, so the bottleneck is not capturing complex patterns but generalising from a few samples per species. A linear model has lower variance, and it came out on top.

02
A linear SVM, not an RBF kernel

RBF kernels scale roughly with the square of the training set, which is impractical for 35,000 clips. A linear SVM kept the comparison runnable and still scored 0.867.

03
Location as a prior

Latitude and longitude encode where a species can live, and field recorders sit at fixed, known places, so they are available at inference time too. The recording rating is not available for unlabelled audio, and the report says so.

What I'd do next

The biggest gap is the jump from clean clips to field soundscapes: 25.5% accuracy on clean validation clips against an 8.8% hit rate on soundscape segments. Next would be training on soundscape-like noise, and class weighting or oversampling for the rarest species.

See the code and the report