Practical Projects (Classical & Deep)
- Project-based learning is the fastest path from understanding ML concepts to implementing production systems
- The gap between understanding an algorithm and debugging it in practice is significant
- Classic projects (MNIST, CIFAR-10, IMDB, housing prices) have well-established benchmarks for self-assessment
Practical ML projects teach the skills textbooks cannot: data wrangling, debugging gradient issues, hyperparameter tuning, evaluating models correctly, and iterating on ideas. Working through canonical projects builds the muscle memory needed to tackle real problems.
- Each project exercises a specific pipeline stage from the ML workflow
- Debugging skills transfer directly to production ML engineering roles
- Project portfolios demonstrate practical competence beyond exam performance
- Pick a project that exercises a specific skill you want to demonstrate (modeling, statistics, engineering, deep learning, generative).
- Set up a baseline-to-best progression so each project compares at least two model families on the same data and metric.
- Choose a real public dataset, define a holdout split, and track a single headline metric plus one diagnostic.
- Write up a project as a one-page case study with problem statement, baseline, ablations, lessons learned, suitable for a research-track interview portfolio.
TL;DR
This page is a project catalog, not a topic page. Pick projects 1, 2, and 6 if you have a weekend; pick 1-8 if you have a full quarter; pick 1-10 if you are building an interview portfolio. Each project pairs a real dataset with a baseline, an upgrade, and a stretch goal so the write-up has a comparison story. The accompanying ComparisonTable lists primary models, dataset, difficulty, time estimate, and which page on this site to read first.
How to choose a project
Pick the project whose comparison story demonstrates the skill you want to be judged on:
- Statistical rigor and feature engineering: Titanic with XGBoost + SHAP or California housing regression.
- Model-family taxonomy: MNIST classifier comparison (kNN, RF, MLP, CNN on the same data).
- Modern deep learning: IMDB sentiment classifier (TF-IDF baseline -> LSTM -> Transformer fine-tune).
- Generative modeling: MNIST GAN or image colorization with autoencoder.
- Production ML systems: MovieLens recommender (cold-start, cost of evaluation, ranking metrics).
A good portfolio has at most one project per category, picked to showcase distinct skills. Three projects done deeply beats six done shallowly.
A research-track interviewer wants to see how you think, not what library you can call. Format each project as a one-page case study in this order:
- Problem statement (2-3 sentences). What is the task, what is the dataset, what is the headline metric, and what is a “good” number on this benchmark?
- Baseline. The simplest reasonable model with default hyperparameters. Report its number. Always start with this; an interviewer will ask why.
- Upgrade. One conceptually distinct model (e.g. linear -> tree, RF -> gradient boosting, MLP -> CNN). Report its number and the delta from baseline.
- One ablation. Pick the design choice that you think matters (e.g. number of trees, regularization strength, feature normalization on/off). Report a small table or curve. This shows you can isolate effects.
- Lessons learned (3-5 bullets). What surprised you. What you would do next with more time. This is the question they will actually probe.
Avoid: model-zoo write-ups (10 models, no analysis), framework hagiography (“I used PyTorch Lightning”), and metrics with no baseline comparison. The shape of the write-up is more important than the absolute score.
Project catalog at a glance
| # | Project | Primary models | Dataset | Difficulty | Time | Read first |
|---|---|---|---|---|---|---|
| 1 | MNIST classifier comparison | kNN, RF, MLP, CNN | MNIST | easy | 1 weekend | /classical-ml/knn, /deep-learning/cnns |
| 2 | Titanic survival with XGBoost + SHAP | logistic baseline, XGBoost | Titanic (Kaggle) | easy-medium | 1-2 days | /classical-ml/gradient-boosting |
| 3 | California housing regression | OLS, Ridge, Lasso, ElasticNet | California housing (sklearn) | easy | 1 day | /classical-ml/linear-regression |
| 4 | Customer segmentation | K-Means, DBSCAN, GMM | UCI Online Retail | medium | 2-3 days | /classical-ml/clustering |
| 5 | Image colorization (autoencoder) | U-Net autoencoder | CIFAR-10 grayscale or Places365 | medium-hard | 1 week | /deep-learning/autoencoders-and-vaes |
| 6 | IMDB sentiment classifier | TF-IDF + LR, LSTM, Transformer fine-tune | IMDB (Hugging Face) | medium | 1 week | /deep-learning/rnns-lstms-grus |
| 7 | MNIST GAN | DCGAN, optionally WGAN-GP | MNIST | medium-hard | 3-5 days | /deep-learning/gans |
| 8 | MovieLens recommender | ALS / matrix factorization, optional NCF | MovieLens-100k or 1M | medium | 3-5 days | /classical-ml/recommender-systems |
| 9 (stretch) | CIFAR-10 with small ResNet | ResNet-20 from scratch | CIFAR-10 | hard | 1-2 weeks | /deep-learning/cnns |
| 10 (stretch) | Time-series forecasting with LSTM | naive seasonal baseline, LSTM | M5 Walmart or NOAA weather | hard | 1-2 weeks | /deep-learning/rnns-lstms-grus |
1. MNIST classifier comparison
Goal: demonstrate the bias-variance and capacity-vs-data trade-off across model families on a single dataset.
Prerequisites: /foundations/bias-variance-overfitting, /foundations/evaluation-metrics, /classical-ml/knn, /classical-ml/random-forests, /deep-learning/mlp, /deep-learning/cnns.
Dataset: MNIST handwritten digits, 60k train / 10k test, 28x28 grayscale, 10 classes [1]. Available at https://yann.lecun.com/exdb/mnist/ or via sklearn.datasets.fetch_openml('mnist_784') or torchvision.datasets.MNIST.
Starter steps:
- Load MNIST, flatten to 784-dim, scale to , split 60k/10k. Compute the trivial baseline: predict the most common class. Report accuracy (~11%).
- Fit
KNeighborsClassifier(n_neighbors=5)on a 10k train subset (full 60k is slow). Report test accuracy and total wall-clock training + inference time. - Fit
RandomForestClassifier(n_estimators=100)on the full 60k. Report accuracy and training time. - Train an MLP (2 hidden layers of 256 units, ReLU, dropout 0.2) for 10 epochs. Report accuracy and training time.
- Train a 3-conv-layer CNN with the same training budget. Report accuracy and training time.
Evaluation criteria:
- kNN: 95-97% test accuracy, training instant, inference seconds per 10k.
- RF: 96-97% test accuracy, training ~30 seconds.
- MLP: 97-98% test accuracy, training a couple of minutes on CPU.
- CNN: 99.0-99.4% test accuracy, training under 10 minutes on a CPU; under 1 minute on GPU.
- Plot accuracy vs. wall-clock training time across all four; CNN should be on the Pareto frontier.
Stretch goals:
- Add Fashion-MNIST as a second test domain; the gap between MLP and CNN widens.
- Vary CNN depth/width and plot accuracy vs. parameter count.
- Add data augmentation (random crops, rotations) and quantify the gain on the CNN.
- Implement label-smoothing or mixup and report the regularization effect.
2. Titanic survival with XGBoost + SHAP
Goal: classical tabular ML pipeline end-to-end with explainability.
Prerequisites: /foundations/evaluation-metrics, /classical-ml/logistic-regression, /classical-ml/decision-trees, /classical-ml/gradient-boosting.
Dataset: Titanic passenger list, 891 train / 418 test, mixed categorical and numeric features. Available at https://www.kaggle.com/c/titanic/data.
Starter steps:
- Load the data; impute missing ages with the median per Pclass-Sex group, missing embarked with the mode. One-hot encode categoricals.
- Fit a
LogisticRegressionbaseline. Report 5-fold cross-validated accuracy and AUC. - Fit
XGBClassifierwith default hyperparameters [6]. Report the same two metrics. - Tune
max_depth,learning_rate,n_estimatorsvia grid search with 5-fold CV. Report best parameters and the cross-validated metric. - Compute SHAP values [2] on the test set with
shap.TreeExplainer. Plot the global summary (beeswarm) and one local explanation for a high-confidence and a low-confidence prediction.
Evaluation criteria:
- Logistic baseline: 5-fold CV accuracy 0.78-0.81, AUC 0.84-0.87.
- Tuned XGBoost: 5-fold CV accuracy 0.82-0.84, AUC 0.87-0.90.
- Held-out Kaggle leaderboard score: 0.78-0.81 typical (the test set is small so leaderboard variance is high).
- SHAP summary: Sex, Pclass, and Age should dominate; if any feature dominates that should not (e.g. PassengerId), you have a leakage bug.
Stretch goals:
- Engineer features: title from Name, family size from SibSp + Parch, has-cabin indicator. Quantify the gain.
- Replace one-hot with target encoding for categoricals; compare on the same CV split.
- Add LightGBM and CatBoost; report timing and accuracy on the same CV.
- Use SHAP interaction values to find the strongest 2-way interaction; compare with a hand-engineered interaction term in logistic regression.
3. California housing regression
Goal: regularized linear regression and cross-validation on a real economics dataset.
Prerequisites: /foundations/math-you-need, /classical-ml/linear-regression.
Dataset: California housing 1990 census [7], 20640 rows, 8 numeric features, target = median house value. Available via sklearn.datasets.fetch_california_housing().
Starter steps:
- Load and scale features with
StandardScaler. Train/test split 80/20. - Fit OLS, Ridge, Lasso, and ElasticNet on the train set; for each tune the regularization strength via 5-fold CV.
- Report test RMSE and for each model. Plot the learning curve (train and test error vs. training set size) for OLS and Ridge.
- Plot the Lasso coefficient path: vs. , highlight the order in which coefficients enter.
- Add polynomial features (degree 2, no interactions) and refit Ridge; report the gain.
Evaluation criteria:
- OLS: test RMSE ~0.72-0.74, ~0.59-0.61.
- Ridge with tuned : test RMSE ~0.71-0.73, ~0.60-0.62.
- Lasso with tuned : similar RMSE; coefficient sparsity > 0 with at least one feature driven to zero.
- Polynomial Ridge: test RMSE ~0.62-0.65, ~0.68-0.71.
Stretch goals:
- Add a
RandomForestRegressorandGradientBoostingRegressorbaseline; compare on the same split and discuss why trees beat linear models on this dataset. - Quantify residual heteroskedasticity with a Breusch-Pagan test and add log-transform of the target; report the change in RMSE.
- Spatial-aware split: hold out one geographic region and evaluate generalization. Report the train/test gap; this is the realistic deployment scenario.
- Use 1-D cubic splines or a small additive model (
pyGAM) and compare against Ridge.
4. Customer segmentation
Goal: unsupervised clustering on real transactional data with three different cluster shapes.
Prerequisites: /classical-ml/clustering, /classical-ml/dimensionality-reduction.
Dataset: UCI Online Retail (UK retail invoices, 2010-2011). Available at https://archive.ics.uci.edu/ml/datasets/online+retail. About 540k rows, fields include InvoiceNo, CustomerID, Country, Quantity, UnitPrice [8].
Starter steps:
- Aggregate to one row per CustomerID with RFM features: Recency (days since last purchase), Frequency (number of invoices), Monetary (total spend). Filter to customers with at least 3 invoices.
- Log-transform F and M, then standardize all three. Run PCA and inspect the explained-variance curve; project to 2-D for plotting.
- Fit
KMeans(n_clusters=k)for . Plot the elbow (inertia vs. k) and silhouette score vs. k. Pick a . - Fit
DBSCAN(eps, min_samples)with reasonable hyperparameters; plot how many points are clustered vs. labeled noise. - Fit
GaussianMixture(n_components=k)with the same . Compare cluster assignments with K-Means via Adjusted Rand Index.
Evaluation criteria:
- Elbow at or with silhouette on RFM features.
- DBSCAN should mark 5-15% of customers as noise; the rest cluster into 4-8 groups.
- GMM and K-Means should have ARI when both are well-tuned (the data is roughly globular in RFM space).
- Cluster sizes should not be wildly imbalanced; if one cluster has 95% of the data, RFM features need different scaling.
Stretch goals:
- Engineer additional features: average basket size, return rate, country, weekday vs. weekend purchases. Re-segment and check stability.
- Run hierarchical clustering with Ward linkage; cut the dendrogram and compare to K-Means.
- Profile the segments: median R, F, M per cluster, top-5 product categories. Build a one-slide “persona” per segment.
- Time-aware segmentation: split customers into “early 2011” and “late 2011” buckets and check whether segment membership is stable.
5. Image colorization with an autoencoder
Goal: image-to-image regression with a U-Net-like autoencoder.
Prerequisites: /deep-learning/cnns, /deep-learning/autoencoders-and-vaes.
Dataset: CIFAR-10 grayscale (synthesize from RGB via 0.2989 R + 0.587 G + 0.114 B) [3] for a small project, or Places365 256x256 for a real one. CIFAR-10 is at https://www.cs.toronto.edu/~kriz/cifar.html.
Starter steps:
- Convert RGB images to LAB color space; the L channel is the grayscale input, the AB channels are the regression target. Normalize AB to roughly .
- Build a U-Net-style autoencoder: 4 down-sampling conv blocks, a bottleneck, 4 up-sampling conv blocks with skip connections. Output 2 channels (AB).
- Train with for 30 epochs. Track validation loss; save the best checkpoint.
- Evaluate on a held-out test set: report PSNR (peak signal-to-noise ratio) on the AB channels and L1 reconstruction error.
- Inspect 16 sample reconstructions side-by-side: grayscale input, predicted AB combined with input L, and ground-truth color. Note systematic failure modes (skies, faces).
Evaluation criteria:
- Per-pixel L1 on AB after normalization: 0.05-0.10.
- PSNR on the colorized image: 22-26 dB (CIFAR-10 is low-resolution; bigger datasets give higher PSNR).
- Visual: skies and grass should look right; objects with category-specific colors (cars, fruit) will be desaturated because the L1 mean is the average plausible color.
Stretch goals:
- Replace L2 loss with L1 + a perceptual loss (VGG feature matching). Compare reconstructions; perceptual loss reduces the gray-mean-ification.
- Add a discriminator (cGAN-style: pix2pix loss). Compare on the same data.
- Move to Places365 256x256 with a deeper U-Net; budget 3-5 epochs of training.
- Quantify hue diversity (entropy of predicted hue) to detect “all-gray” mode collapse.
6. IMDB sentiment classifier
Goal: model-family progression on the same NLP task.
Prerequisites: /classical-ml/logistic-regression, /deep-learning/rnns-lstms-grus. Familiarity with Hugging Face transformers helps for the third stage.
Dataset: IMDB movie reviews, 25k train / 25k test, balanced binary sentiment [4]. Available at https://huggingface.co/datasets/imdb or https://ai.stanford.edu/~amaas/data/sentiment/.
Starter steps:
- Baseline: TF-IDF unigrams + bigrams (top 50k features) + logistic regression with L2. Report test accuracy.
- LSTM: train a 1-layer LSTM (hidden=128) on tokenized + embedded reviews (embedding dim 128, learned from scratch), max length 256. Train for 5 epochs.
- Transformer fine-tune: load
distilbert-base-uncased, fine-tune the classification head + last 2 layers for 3 epochs. - Build a confusion matrix for each model. Read 10 disagreement examples (LR is right, LSTM is wrong, and vice versa); note systematic patterns.
- Plot accuracy vs. training time for the three models on a single chart.
Evaluation criteria:
- TF-IDF + LR: test accuracy 0.88-0.90.
- LSTM from scratch: test accuracy 0.86-0.89 (often loses to TF-IDF on this dataset because IMDB is small).
- DistilBERT fine-tune: test accuracy 0.92-0.94.
- Wall-clock: TF-IDF takes minutes on CPU, LSTM about an hour on CPU, DistilBERT about 30 minutes on a single GPU.
Stretch goals:
- Ablation on the TF-IDF baseline: chars n-grams, max features, log-tf weighting. Quantify each.
- Replace DistilBERT with
roberta-largefor a stronger ceiling; report accuracy and compute cost. - Adversarial robustness: replace 5% of words with synonyms and re-evaluate; the LR baseline often degrades less than the LSTM.
- Few-shot: use only 1k labeled examples and compare TF-IDF + LR to fine-tuned DistilBERT to demonstrate the pretraining advantage.
7. MNIST GAN
Goal: train a generative model and evaluate sample quality and diversity.
Prerequisites: /deep-learning/cnns, /deep-learning/gans.
Dataset: MNIST again. The point is that you already know the digit distribution, so visual checks of sample quality and mode coverage are direct.
Starter steps:
- Implement a small DCGAN: generator with 3 ConvTranspose layers and Tanh output, discriminator with 3 strided Conv layers and Sigmoid output. Latent dim 64.
- Train for 50 epochs with Adam(lr=2e-4, betas=(0.5, 0.999)), batch size 128. Save 64 sample images per 1000 steps.
- After training, sample 5000 images, classify them with a pretrained MNIST classifier, and plot the histogram of predicted digits. The histogram should be roughly uniform; any mode under-represented signals partial collapse.
- Switch to WGAN-GP loss with , 5 critic steps per generator step, and no BatchNorm in the critic. Retrain. Compare sample quality and the histogram.
- Plot the critic loss curve from WGAN-GP; it should decrease (more negative) and roughly correlate with sample quality.
Evaluation criteria:
- DCGAN: visual samples are recognizable digits within 5-10 epochs; full coverage of all 10 modes within 30 epochs.
- WGAN-GP: training is more stable (less oscillation), critic loss curve is monotonic, sample quality similar after equal compute.
- Per-class proportion among 5000 samples: each class between 7% and 13% (uniform baseline is 10%); large deviations indicate mode collapse.
Stretch goals:
- Conditional DCGAN: feed a one-hot digit label to both networks and sample digit-by-digit.
- Compute FID against a held-out 10k MNIST set using a small pretrained MNIST feature extractor; lower is better.
- Add spectral normalization to the discriminator and compare against gradient penalty on training stability.
- Compare GAN samples to a simple VAE trained on the same data; the VAE will be blurrier but mode-covering.
8. MovieLens recommender
Goal: practical recommender pipeline with matrix factorization, evaluated by ranking metrics.
Prerequisites: /classical-ml/recommender-systems, /classical-ml/dimensionality-reduction (for the SVD baseline).
Dataset: MovieLens-100k (943 users, 1682 movies, 100k ratings) for a quick project, or MovieLens-1M / MovieLens-Latest for a real one [5]. Available at https://files.grouplens.org/datasets/movielens/.
Starter steps:
- Load ratings; split chronologically (train = first 80% of each user’s ratings, test = last 20%) so the evaluation is realistic.
- Baseline: popularity ranker (recommend top-rated unseen movies globally) and a user-mean predictor. Report MAE and RMSE on test ratings, and Recall@10 on top-N recommendations.
- Matrix factorization: alternating least squares (ALS) or Funk-SVD with 64 factors, trained for 20 epochs. Report the same metrics.
- Evaluation: for each user in the test set, score all unseen movies; compute Precision@10, Recall@10, NDCG@10. Plot training loss and validation NDCG by epoch.
- Cold-start audit: report recall@10 separately on users with fewer than 5 training ratings; this is where collaborative filtering struggles.
Evaluation criteria:
- Popularity baseline: NDCG@10 ~0.10, Recall@10 ~0.05.
- ALS / matrix factorization: RMSE 0.90-0.95 on ML-100k, NDCG@10 0.30-0.40, Recall@10 0.20-0.30.
- Cold-start users: matrix factorization gain over popularity should be small or negative; this is the documented limitation.
Stretch goals:
- Add implicit-feedback matrix factorization (treat any rating as a “click”, weight by confidence). Compare on Recall@10.
- Two-tower neural recommender with side features (genre, year). Compare to ALS.
- Diversity-aware re-ranking: introduce a determinantal-point-process or simple genre-diversity penalty and report NDCG vs. diversity Pareto.
- Time-aware split: train on movies released before 2015 and evaluate on 2015+; quantify concept drift.
9. CIFAR-10 with a small ResNet (stretch)
Goal: train a deep CNN from scratch with proper data augmentation and learning-rate scheduling.
Prerequisites: /deep-learning/cnns, /deep-learning/regularization-in-deep-nets, /deep-learning/backprop-and-optimizers.
Dataset: CIFAR-10, 50k train / 10k test, 32x32 RGB, 10 classes [3]. Available at https://www.cs.toronto.edu/~kriz/cifar.html or via torchvision.datasets.CIFAR10.
Starter steps:
- Build ResNet-20 (3 stages of 3 residual blocks, channels 16-32-64). Train for 100 epochs with SGD(momentum=0.9, weight_decay=5e-4), batch 128, cosine learning-rate schedule starting at 0.1.
- Add data augmentation: random crop with 4-pixel padding, random horizontal flip, normalize. Track train/test accuracy.
- Train a second model without augmentation; compare the train-test gap.
- Plot the per-class confusion matrix on the test set; identify the two most-confused class pairs.
- Evaluate the test-time accuracy with and without test-time augmentation (10-crop average).
Evaluation criteria:
- ResNet-20 with augmentation: 91-93% test accuracy.
- No augmentation: 87-89% test accuracy, with a much larger train-test gap.
- Most-confused pairs: cat vs. dog, deer vs. horse.
Stretch goals:
- Mixup or CutMix augmentation; report the gain.
- ResNet-56 or PreAct-ResNet; compare against ResNet-20 at equal compute.
- Switch to AdamW and cosine schedule; document the optimizer ablation.
- Profile training: time per epoch on CPU, single GPU, and amp+gpu.
10. Time-series forecasting with LSTM (stretch)
Goal: sequence modeling on real noisy time series with proper baselines.
Prerequisites: /deep-learning/rnns-lstms-grus, /foundations/evaluation-metrics.
Dataset: M5 Walmart sales (Kaggle, ~30k stores x SKUs, daily for ~5 years) at https://www.kaggle.com/c/m5-forecasting-accuracy, or NOAA daily weather at https://www.ncei.noaa.gov/data/global-historical-climatology-network-daily/. M5 is the better choice if you want to engage with the M-competitions literature.
Starter steps:
- Pick one moderately busy SKU/series. Plot the time series; identify weekly and yearly seasonality.
- Naive baseline: predict the same day-of-week average from the prior 4 weeks. Report MASE (mean absolute scaled error) on the last 28 days.
- Exponential smoothing (ETS): with
statsmodelsordarts. Report MASE on the same holdout. - LSTM: 1-layer LSTM (hidden=64) with day-of-week + month one-hots and 28-day lookback. Train for 50 epochs, predict 28 days ahead.
- Compare the three models on MASE. Plot one prediction window for each model overlaid with truth.
Evaluation criteria:
- Naive baseline: MASE ~1.0 by definition (depends on baseline used).
- ETS: MASE 0.80-0.95, often hard to beat on short horizons.
- LSTM: MASE 0.85-1.05; on a single series with limited data, LSTM frequently does not beat ETS, which is the textbook M-competition lesson.
- Plot the residual ACF for the best model; significant autocorrelation at lag 7 means you missed weekly seasonality.
Stretch goals:
- Multi-series LSTM (one model trained jointly on 1000 series with series-id embedding); the cross-series pooling is where neural models start to win.
- Add holiday and promotion regressors (M5 provides them); quantify the gain.
- Try a Temporal Fusion Transformer (
pytorch-forecasting); report MASE and training cost. - Build a probabilistic forecast (quantile loss); evaluate with pinball loss at 10/50/90 quantiles.
Pitfalls
Beating “random” or “predict the mean” is meaningless. Pick a baseline that someone could ship: the most-popular item for recommendation, the day-of-week average for time series, the dominant class for classification. The interview question “what would a non-ML solution do?” is exactly this point.
Time-series and recommender splits must be chronological, not random. A 5-fold random CV on time-series data overstates accuracy by 2-5x. For tabular data with grouped observations (e.g. multiple rows per customer), the CV split must be on the group, not the row.
A single well-chosen ablation (e.g. “Lasso vs. Ridge with 5-fold CV”) teaches more than a model zoo with no analysis. Pick the design choice you think matters most, isolate it, and present a small table or curve. The interviewer will probe on this; “I tried ten models” is not a good answer.
Pop quiz
- 1. You want to demonstrate strong statistics and feature-engineering skills. Which project is the best fit?
- 2. You want to demonstrate the bias-variance trade-off across model families. Which project is the best fit?
- 3. You want a project that exercises generative modeling and forces you to evaluate sample diversity, not just sample quality. Which fits best?
- 4. For a portfolio aimed at a research-track interview, which project mix is best?
- 5. Which of these projects is the strongest fit for demonstrating MLOps and production thinking (drift monitoring, retraining cadence, latency budget)?
Interview Q&A
How should I talk about a side project in a machine-learning interview?onsite
The interviewer cares about how you reason, not what library you used. Lead with the comparison story:
- State the problem, dataset, and headline metric in three sentences. “I built a movie recommender on MovieLens-1M. The metric I optimized was Recall@10 on a chronological split. The popularity baseline gives Recall@10 around 0.05; matrix factorization with 64 factors gets to about 0.27.”
- Name your baseline before your best model. This shows you understand what counts as a real improvement. If you cannot describe the baseline in one sentence, you do not understand the project.
- Describe one ablation you ran. “I varied the number of factors from 8 to 256; recall plateaued around 64. Lower factors hurt cold-start users disproportionately, which I confirmed by splitting the test set by user-history length.” This is the question they will probe.
- Be ready to defend your design choices. Why chronological split? Why this regularization strength? Why ALS instead of stochastic gradient? You should have a one-sentence reason for each, even if “because the data is small enough that ALS is fast and stable” is the answer.
- End with what you would do next. A research-track interviewer reads this as evidence of taste: “with more time I would add side features, because cold-start was the worst regime”, or “I would compare to a two-tower neural model and budget the compute trade-off.”
What to avoid:
- Framework hagiography. “I used PyTorch Lightning with Hydra and Weights & Biases” is irrelevant. The interviewer cares about modeling decisions.
- Resume-driven complexity. “I trained a Vision Transformer from scratch on CIFAR-10” with no comparison to a small ResNet is a red flag.
- Metrics without baselines. “I got 92% accuracy” tells the interviewer nothing if 90% is trivial and 95% is the published state of the art on the dataset.
- Hiding bugs. If the project had a leakage bug or a failed model, say so; “I caught the bug because the validation accuracy was suspiciously high” is a stronger signal than a polished narrative.
How do you decide which projects belong in a portfolio?phone
Aim for a portfolio that demonstrates breadth across the major modeling categories without redundancy. A reasonable target is 3-5 projects covering:
- One classical-ML / tabular project with cross-validation and an explainability angle (Titanic + SHAP, California housing).
- One deep-learning vision or sequence project with augmentation and learning-rate scheduling (MNIST or CIFAR-10 CNN, IMDB sentiment LSTM/Transformer).
- One unsupervised or generative project to show that you can evaluate without ground-truth labels (clustering with silhouette/ARI, GAN with FID and mode-coverage audit).
- One systems-leaning project: a recommender, a time-series forecaster, or a small end-to-end pipeline. This signals that you can think about evaluation in production-shaped settings (cold start, drift, latency).
- Optional fifth slot: a project tied to a domain you care about (medical, finance, audio). Hiring for research roles often weights domain intuition; a domain project signals you do not just chase benchmarks.
Each project should follow the case-study template: problem -> baseline -> upgrade -> ablation -> lessons. Cap each write-up at one page. The repo on GitHub should have a clean README and reproducible scripts; no notebooks-only repos.
Common mistake: adding more projects to compensate for shallow ones. Three deep projects beat seven shallow projects every time. If you cannot defend a project’s design choices in 15 minutes of probing, drop it from the portfolio.
References
- LeCun, Y., Bottou, L., Bengio, Y., and Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE 86(11), 2278-2324. doi:10.1109/5.726791
- Lundberg, S. M. and Lee, S.-I. (2017). A Unified Approach to Interpreting Model Predictions. NeurIPS 2017. arXiv:1705.07874
- Krizhevsky, A. (2009). Learning Multiple Layers of Features from Tiny Images. University of Toronto technical report. https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
- Maas, A. L., Daly, R. E., Pham, P. T., Huang, D., Ng, A. Y., and Potts, C. (2011). Learning Word Vectors for Sentiment Analysis. ACL 2011. https://aclanthology.org/P11-1015/
- Harper, F. M. and Konstan, J. A. (2015). The MovieLens Datasets: History and Context. ACM Transactions on Interactive Intelligent Systems 5(4), Article 19. doi:10.1145/2827872
- Chen, T. and Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. KDD 2016. doi:10.1145/2939672.2939785
- Pace, R. K. and Barry, R. (1997). Sparse spatial autoregressions. Statistics & Probability Letters 33(3), 291-297. doi:10.1016/S0167-7152(96)00140-X
- Chen, D., Sain, S. L., and Guo, K. (2012). Data mining for the online retail industry: A case study of RFM model-based customer segmentation using data mining. Journal of Database Marketing & Customer Strategy Management 19, 197-208. doi:10.1057/dbm.2012.17