I build machine-learning models, and report what they actually get right.

Supervised, unsupervised and deep learning, NLP with transformers and local LLMs, and machine learning for audio and EEG, from feature design to honest evaluation. Finishing the University of Cambridge Data Science Career Accelerator.

Based in Barcelona, open to remote. Open to machine learning and AI engineering roles, and to PhD positions in machine learning for audio and music cognition.

Fig. 1 · Student dropout. Dropouts found by the tuned XGBoost model as student data arrives in three stages. Held-out test set: 5,013 students, 779 dropouts.
Selected work

Each project with the number it reached, and its limits

Applied machine learning

University of Cambridge coursework
Students still on course who later dropped out, Stage 3 model.
Supervised learning · 2026

Predicting student dropout, and showing when the prediction is useful

25,059 international students, with data arriving in three stages: applicant details, then attendance, then module results. I compared XGBoost with a neural network at each stage, using a split grouped by student and a held-out test set of 5,013.

The late-stage score of 0.993 was too good: imputed academic records were giving the answer away. Re-evaluated on the 4,339 students still on course, the model finds 105 of 136 future dropouts. A temporal split kept ROC-AUC at 0.891, 0.904 and 0.980 but showed the decision threshold would need recalibrating for each intake.

Python · XGBoost · Keras · scikit-learn · pandas

0.977 ROC-AUC on students still on course
Four approaches on the same reviews. The local LLM's labels were consolidated into 20 themes.
NLP and LLMs · 2026

Separating network-wide complaints from site-specific ones in customer reviews

Tens of thousands of reviews from two platforms for a UK fitness chain, a client under NDA. I compared BERTopic (MiniLM embeddings, UMAP, HDBSCAN, hierarchical merging), transformer-based emotion classification, LDA tuned on c_v coherence, and a local LLM (phi4-mini on Ollama, temperature 0) for theme labelling.

Results are reported as rates with minimum-volume thresholds instead of raw counts. I corrected date artefacts from bulk uploads and documented where the LLM's labels were vague or unsupported by the data.

BERTopic · sentence-transformers · UMAP · HDBSCAN · Hugging Face · Ollama · Gensim

20 themes, with recommendations per site
Customers per segment, K-means with k = 5.
Unsupervised learning · 2026

Turning 951,668 orders into five customer segments

Built a customer-level view from raw order data: frequency, recency, lifetime value, unit cost and age for 68,300 customers in 47 countries, in a scikit-learn pipeline with StandardScaler and K-means.

I chose k = 5: the elbow flattens there and the silhouette score peaks, while the Davies–Bouldin index was marginally better at k = 6, which the analysis reports. Ward clustering showed a broader two-group structure that the five segments subdivide, and each segment comes with a marketing action.

pandas · scikit-learn · SciPy · PCA · t-SNE

68,300 customers in five segments

Audio, music and the brain

Personal research
Gain from adding pitch surprisal to the EEG model, one dot per listener. The bar marks the median.
EEG and sequence models · in progress

Does musical surprise explain how the brain responds to Bach?

Public CC0 dataset: EEG from 20 listeners, 7,839 notes. I trained 24 GRU sequence models in PyTorch (pitch and rhythm, three seeds, with and without augmentation), with the design fixed before training, and fitted temporal response functions in MNE with cross-validation nested by piece.

Pitch surprisal from the augmented GRU improved EEG prediction in 16 of 20 listeners, more than IDyOM or IDyOMpy, and held across seeds and when leaving out a piece or a listener. The rhythm result did not hold, and the write-up says so. Along the way I reproduced a published effect and showed that trial-wise validation inflates it.

PyTorch · MNE-Python · ridge regression · Wilcoxon tests · pytest

1.15 Cohen's d for the pitch gain, 16 of 20 listeners (p < 0.0001)
Accents 3 · 6 · 8 · 10 · 12 · felt downbeat: 3 · Mode: Phrygian.
Music information retrieval · 2026

Telling flamenco palos apart from audio

Classifies soleá, seguiriya, bulería and alegrías. The four share a 12-beat compás, so the features come from music theory: Phrygian versus major mode, the Andalusian cadence, and where harmony falls within the cycle, alongside MFCCs and chroma.

A Random Forest beat gradient boosting and an SVM. Tempo turned out to be the strongest single feature, and the beat-position features lowered cross-validation variance rather than raising the mean. Deployed as a Streamlit app, with pytest tests and GitHub Actions CI.

librosa · scikit-learn · Streamlit · pytest

0.645 F1-macro, cross-validated (±0.115)
ROC over 2,418 test–train recording pairs, 78 of them same-singer.
Deep learning · audio · 2026

Recognising a singer's voice rather than their style

109 historical flamenco recordings of 79 singers, only 31 of them with more than one recording: too little data to train an encoder from scratch. I trained a 512-256-128 triplet-loss projection head on pretrained OpenL3 embeddings and evaluated closed-set verification.

The fine-tuned space beats the frozen baseline. A follow-up probe showed it also separates the two source datasets, so part of what it learns is recording origin, and the write-up says so.

PyTorch · OpenL3 · triplet loss · UMAP

0.80 AUC, closed-set verification (EER ≈ 30%)

Engineering

Backend practice

Client → Flask API
Flask API → PostgreSQL
Flask API → Redis → Celery
Alembic · Docker Compose · CI

REST API · synthetic data · 2026

Tracking airline disruptions the way an operations centre would

Flask REST API with Pydantic validation and API-key authentication, SQLAlchemy and PostgreSQL with Alembic migrations, and a Celery worker that estimates impact and propagates delays along an aircraft's rotation. Runs in Docker Compose, with a GitHub Actions pipeline that tests the full stack end to end.

Flask · SQLAlchemy · PostgreSQL · Celery · Redis · Docker · pytest

99% test coverage, 96 pytest tests
Method

How I work, in four steps

The same sequence runs through every project above. Each step has an example from the work.

  1. 1 · Data

    Audit before modelling

    Check what the data can and cannot say. In the dropout data, 182 students appeared twice, so the split was grouped by student.

  2. 2 · Features

    Encode what the domain knows

    Mode and compás position for flamenco. For dropout, the order in which information about a student actually arrives.

  3. 3 · Model

    Fix the design before training

    Baselines first, and the comparison decided in advance. In the EEG project, all 24 GRU models were specified before any of them was trained.

  4. 4 · Evaluation

    Test the result against itself

    Validation that matches the question. Split by trial, a published EEG effect looked solid; split by piece, the gain was no longer significant (ΔR +0.0002, p = 0.35).

Listen

Play a few notes. This is what an audio model sees.

Each key you press is drawn as a spectrogram: time runs left to right, pitch goes up, brightness is energy. The palo classifier and the singer embeddings both start from time–frequency pictures like this one.

3 kHz 100 Hz Andalusian cadence · A G F E

Click the keys or type A S D F G H J K. Synthesised in the browser with the Web Audio API, no samples.

Research interests

Machine learning for audio, music and the listening brain

Representation learning, music information retrieval, and models of musical expectation tested against EEG. My training as a classical and flamenco pianist is where the features and the questions come from.

Skills
Machine learning
scikit-learn, XGBoost, PyTorch, Keras, transfer and metric learning, clustering, sequence models (GRU)
NLP and LLMs
BERTopic, LDA (Gensim), Hugging Face transformers, sentence-transformers, local LLMs (Ollama, LM Studio)
Audio and EEG
librosa, OpenL3, MFCC, chroma, F0, MNE-Python
Data
Python, pandas, NumPy, SQL, PostgreSQL, UMAP, HDBSCAN, statistics
Engineering
Flask, Pydantic, Docker, Git, GitHub Actions, pytest, ruff, mypy, Celery, Redis, Streamlit
Languages
Spanish (native), English (advanced), Catalan (basic)
Experience
  • 2024 – nowFounder and piano teacherEstudio Pianístico, Barcelona
  • 2025Invited speaker, neuromusicNus Agency, Barcelona
  • 2020 – 2024Piano teacherLa Clau, Colegio Patrocinio, Saint Anne's School
Education
  • 2026Data Science Career Accelerator, Machine Learning & AIUniversity of Cambridge (PACE)in progress
  • 2026Python Programming, 300 hoursEscuela Musk Technologies
  • 2025Master's in Neuromusic: Music–Brain InteractionUniversidad Católica San Antonio de Murcia (UCAM)60 ECTS
  • 2023 – 2024Master's in Advanced Studies in Flamenco, Flamenco PianoEscola Superior de Música de Catalunya (ESMUC)9.5 / 10
  • 2022Título Superior de Música, Classical Piano (Bachelor's equivalent)Musical Arts, Madrid9 / 10
Contact

Machine learning and AI roles, PhD positions, collaborations.

laura.ortega.garre@gmail.com