Leakage-free machine learning on 9,564 NASA Kepler Objects of Interest.
Raw transit photometry and stellar measurements only — no NASA vetting outputs.
NASA's Kepler telescope watched 150,000 stars for 9 years, logging every tiny brightness dip. Most dips are not planets — they are eclipsing binary stars, cosmic rays, or instrument noise. Each candidate needs expensive ground-based follow-up to confirm. Celesta is a first-pass classifier that reads raw photometry and predicts which candidates are worth investigating.
koi_pdisposition and koi_score — NASA's own pre-classification and confidence score.
Using them gives 99%+ accuracy but is scientifically worthless (we'd be copying NASA's answer).
Celesta uses only raw telescope measurements: transit photometry and stellar spectroscopy — no vetting outputs.
Evaluated on 1,913 held-out KOIs never seen during training. Validated with 5-fold stratified cross-validation.
| Predicted → | |||
|---|---|---|---|
| Actual ↓ | CAND | CONF | FP |
| CAND | 265 | 48 | 83 |
| CONF | 41 | 487 | 21 |
| FP | 123 | 41 | 804 |
Green diagonal = correct predictions. CANDIDATE F1 is lowest — and that is scientifically correct: CANDIDATE means "we genuinely don't know yet." Even astronomers cannot classify these without expensive follow-up.
| Model | Accuracy | Macro F1 |
|---|---|---|
| XGBoost | 79.2% | 77.9% |
| HistGradientBoosting | 78.5% | 77.3% |
| Random Forest | 77.1% | 74.8% |
| ★ Ensemble (all three) | 81.3% | 78.8% |
Raw measurements tell the model what was recorded. Engineered features tell it what those measurements mean physically. All 12 are derived from Kepler photometry and stellar catalogues — no external data.
| # | Feature | Physical Meaning |
|---|---|---|
| 1 | single_multi_ratio | One-off event vs repeating transit — the false positive fingerprint |
| 2 | duration_period_ratio | Transit chord encodes stellar density via Kepler's third law |
| 3 | log_period | Log-compresses 3-order-of-magnitude range for tree splits |
| 4 | log_depth | Same — transit depth is heavily right-skewed |
| 5 | log_snr | Same |
| 6 | stellar_density_proxy | M★/R★³ ∝ mean stellar density — validates transit geometry |
| 7 | impact_ror_ratio | Near 1 → grazing transit → eclipsing binary signature |
| 8 | expected_duration_ratio | Observed vs Keplerian duration — eccentricity / blended EB flag |
| 9 | snr_per_transit new | Per-transit SNR — consistent for real planets, noisy for artefacts |
| 10 | odd_even_norm new | Odd-even sig / SNR — normalised eclipsing binary flag |
| 11 | log_srad new | Stellar radius log-compressed (spans 0.1 – 10 R☉) |
| 12 | depth_ror_check new | Geometric consistency: depth/(ror²×10⁶) should ≈ 1 for clean transit |
Engineered
Raw Kepler measurement
2 of the top 5 features are engineered — feature engineering added real predictive value.
No single algorithm dominates every aspect of this dataset. Averaging probability outputs from three models with different inductive biases cancels individual errors.
Zero setup. Full ML pipeline in 10–15 min on free T4.
Open in Colab# Runtime → Run all (Ctrl+F9) # Downloads NASA data automatically # ~10–15 min on free tier
git clone https://github.com/vvsrinath/Celesta-India-High-School-Exoplanet-Data-Challenge cd celesta/celesta pip install -r requirements.txt python3 train_model.py # trains model python3 app.py # → :5000
cd celesta/celesta docker build -t celesta . docker run -p 5000:5000 celesta
Multi-stage: trains in stage 1, copies artefacts into lean runtime image.
pip install jupyter xgboost shap \ scikit-learn pandas matplotlib jupyter notebook \ colab/Celesta_Submission.ipynb
Every line of code, every engineered feature, every visualisation — from data pipeline to web app to this page.