Curious by default
I want to understand why a system behaves the way it does, not only whether a metric moved.
Machine learning, NLP, and applied AI, from research to production systems.
About / Approach
Based in Chicago, I’m a machine-learning engineer and software builder interested in language, healthcare, and applied AI.
I work across the full path from messy data and experiments to reliable pipelines, APIs, and user-facing products.
What I enjoy most is taking an ambiguous problem and making it concrete: understanding what the data can support, choosing the right technical approach, and building something other people can inspect, use, and improve.
I want to understand why a system behaves the way it does, not only whether a metric moved.
I’m comfortable moving from data and models to backend services, databases, deployment, and product interfaces.
Clear assumptions, reproducible work, thoughtful evaluation, and maintainable software matter as much as the first demo.
Selected work
Product-focused engineering in progress, followed by selected research and published work.
Product thesis / Working title: SignalBrief
The first use case is job-search inbox intelligence: surface recruiter outreach, interviews, assessments, deadlines, application changes, and follow-up opportunities without asking the user to scan another chronological feed. The same architecture can later support university, work, and personal mail.
Pydantic separates provider facts, extractor claims, user state, and historical briefing context, and rejects invalid or unsupported states.
Hard gates remove resolved, dismissed, archived, or not-yet-arrived messages before explicit inclusion reasons are assigned.
Priority, deadlines, recency, and stable tie-breaking create a transparent benchmark for future learned rankers.
The pipeline assembles attention, update, and activity sections and renders the same typed result as human-readable text or JSON.
Chronological groups produce ranking metrics while PostgreSQL preserves exact briefing lineage for later historical reconstruction.
Learn the order of each morning list rather than classifying emails independently, then compare it with the deterministic baseline and a zero-shot LLM reference.
Future action and deadline claims must point back to supporting text, with abstention when evidence is weak instead of invented certainty.
Future feedback will separate immediate interactions from later outcomes while preserving point-in-time features and avoiding training-serving leakage.
Immutable briefing runs and items retain the exact snapshot, analysis version, ranking decision, and workflow values required to reconstruct historical output.
04 / Reliability foundation
The persistence layer now stores immutable briefing runs and ordered items linked to exact message snapshots and analysis versions. A historical brief can be reconstructed from PostgreSQL without reading future mailbox or workflow state; full champion-versus-candidate replay remains a later MLOps stage.
The deterministic vertical slice now runs through a Dockerized PostgreSQL persistence layer with schema migrations, repository and service boundaries, append-only feedback history, immutable briefing lineage, and verified historical reconstruction. FastAPI, Outlook synchronization, learned ranking, grounded extraction, cloud deployment, monitoring, and the iOS client remain next.
Project thesis / DivvyAI
Divvy’s public feeds only describe the present, so the history needed to train a forecasting model doesn’t exist yet. DivvyAI records it: both station feeds, every 15 minutes, with the original responses preserved and loaded into BigQuery.
Cloud Scheduler triggers a containerized Python job on Cloud Run.
Station information and status, with source URLs and UTC receipt times.
One archive per capture in Cloud Storage, with a manifest and a stable capture ID.
Append-only loads into an ingestion-time partitioned table.
Capture-scoped queries confirm the warehouse matches what was received.
Captures run every 15 minutes, building the dataset the forecasting model will be trained on. Independent project using Divvy’s public data feeds; not affiliated with Divvy or Lyft.
Research
Multimodal clinical AI, published predictive modeling, and explainable NLP for healthcare policy research.
Simplified system architecture
Explore whether complementary speech and language signals can support earlier MCI detection when clinical datasets are small and imbalanced.
Keep the speech and language backbones frozen while training cross-modal projections, soft-prompt adapters, and lightweight classification layers.
Compare model scale, task type, transfer strategy, and imbalance handling across PROCESS-2 and ADReSS picture-description and verbal-fluency tasks.
Status: ongoing research. Performance findings are intentionally omitted until the experiments are validated and ready to share.
Final cross-validated performance
Built the preprocessing, feature-engineering, imbalance-handling, model-validation, and benchmark workflows used to develop and assess the neural network.
Combined ReLU hidden layers, L2 regularization, batch normalization, sigmoid output, binary cross-entropy, early stopping, and model checkpointing.
Addressed an 85/15 class split with SMOTE, evaluated with five-fold cross-validation, and benchmarked against random-forest and decision-tree baselines.
Two-stage prediction and explanation system
Current respondent-grouped evaluation
Nested threshold tuning improved macro-F1 from 0.659 to 0.692 and minority-class recall from 0.386 to 0.579, with every respondent kept entirely within a single fold.
Converted the survey export into linked scenario- and participant-level datasets covering 214 reimbursement decisions from 72 respondents. The pipeline preserves repeated decisions, original open-ended responses, codebook context, and model outputs without inventing outcomes for incomplete respondents.
Completed a controlled ablation across reimbursement representations, respondent characteristics, human-coded themes, and SentenceTransformer embeddings. Fold-isolated dimensionality reduction supports the text features, while a transparent structured model remains the benchmark for the selected text-augmented candidate.
Implemented nested respondent-grouped cross-validation so every decision from the same person stays in one fold. Preprocessing, PCA, and threshold selection are fitted only inside training data before producing out-of-fold predictions and targeted error cases.
Status: active research and validation. Predictive results are from respondent-grouped nested cross-validation; expert review and full-sample validation of the generated explanations remain ongoing. Predictions and rationales describe model-supported associations, not causal reasons, clinical recommendations, or deployment readiness.
Get in touch