Inspiration
Coro.ai predicts coronary artery disease and per-vessel stenosis in the LAD, LCX and RCA from routine clinical data — demographics, history, ECG, labs and echocardiography — and paints each prediction onto the artery it actually refers to on an interactive 3D heart.
What it does
Four calibrated random forests are trained on the Z-Alizadeh Sani cohort (303 patients), with decision thresholds chosen by nested cross-validation so that no threshold is ever scored on the data that selected it. Every prediction is explained: SHAP contributions carry the patient's own measured values, and a model performance view reports accuracy with confidence intervals, calibration curves, global feature importance, and an honest account of where the model is weakest.
How we built it
Cardiovascular disease is the leading cause of death worldwide. Statistical models can already produce a risk percentage from clinical data — but a percentage is an abstraction. It tells a clinician how much risk, and nothing at all about where. The number and the anatomy live in separate worlds, and the work of connecting them happens silently in the reader's head.
Coro.ai closes that gap. It takes the clinical picture a cardiologist already has, predicts which specific arteries are likely narrowed, and shows the answer on the heart itself — with the reasoning attached.
Select a patient from a curated set, or enter one manually through a dialog covering all 38 clinical inputs the model uses, grouped the way they are actually collected: demographics, history, symptoms, examination, ECG, laboratory results, echocardiography. Five fields are mandatory — age, sex, typical chest pain, hypertension, diabetes — because these are the fields where a default would actively mislead rather than merely approximate.
The model returns four probabilities: overall coronary disease, and stenosis in each of the three major vessels. The 3D heart recolours accordingly — green, amber, red — and clicking an artery opens its detail: what that vessel supplies, the model's estimate, and the factors driving it.
Seven what-if sliders let you explore how the estimate responds to change, but only for factors a patient or a treatment could actually alter: LDL, HDL, triglycerides, blood pressure, fasting glucose, weight, pulse. Never age, never family history. Every assessment exports as a two-page PDF report, and runs can be saved and compared side by side.
Challenges we ran into
Early on we filled missing fields with healthy values, reasoning that it was the charitable assumption. Measuring it showed the opposite: best-case fill understated LAD risk by 29 percentage points against 13 for median fill. For a screening tool, false reassurance is the worst available failure, so every missing continuous field now takes the dataset median and the interface reports how many values were assumed.
We also learned that the model family mattered far less than we expected. XGBoost, LightGBM, SMOTE, per-target feature selection, interaction terms and voting ensembles were all evaluated; every result fell within cross-validation noise. What actually moved the needle was calibration and threshold selection.
Accomplishments that we're proud of
Held-out test set, 61 patients, scored once after thresholds were fixed.
target accuracy 95% CI recall ROC-AUC baseline Overall CAD 86.9% 78.4–95.4 97.7% 0.873 71.3% LAD 72.1% 60.9–83.4 94.1% 0.798 58.4% LCX 59.0% 46.7–71.4 76.9% 0.698 60.7% RCA 50.8% 38.3–63.4 85.0% 0.712 62.4%
What we learned
RCA sits below its majority-class baseline on accuracy, and that is the direct consequence of the recall floor: the model catches 85% of true RCA stenoses at 38.6% precision, where a classifier calling every vessel normal would score 62.4% and miss every blockage. The confidence interval spans that baseline, so on 61 test patients the two are not statistically distinguishable in either direction — which is why we report the interval rather than the point estimate.
The weakness is a property of the data, not an untried model. For the two weaker vessels, stenotic and normal patients overlap heavily on every available feature.
A verify_models.py script loads the committed weights, rebuilds the identical test split and reproduces all 20 reported metrics, so nothing in the application or the documentation is a number anyone typed by hand.
What's next for Coro.ai
External validation on an independent cohort is the obvious missing piece, and the limitation that matters most. Beyond that: a screening-versus-balanced operating-point toggle so the threshold trade-off becomes something a user can inspect rather than something we chose for them; subgroup performance analysis, which 61 test patients cannot currently support; and per-segment rather than per-vessel prediction, which the anatomy already supports but the labels do not.
Built With
- fastapi
- panda
- python
- react
- scikit-learn
- shap
- three.js
- vite
Log in or sign up for Devpost to join the conversation.