-
-
Step 1 to load the Date
-
Step 2 - Explore the EDA
-
Feature histograms (koi_prad, koi_depth, koi_period, koi_teq)
-
Class balance + missingness table
-
Step 3 - Leakage removal + feature engineering code
-
Step 4 and 5
-
Step 6 - Confusion matrix + ROC curve code
-
ROC curve (full)
-
Step 7 - Feature importance chart
-
Step 8
-
Step 9 - Top candidate rankings
-
My Github Repo
Inspiration
Most student data science projects use toy datasets. This challenge used real data from NASA's Kepler Space Telescope — the same problem professional astronomers face when deciding whether a signal from space is an actual planet or just noise. I wanted to build something that didn't just get a high accuracy number, but actually reasoned like a scientist would.
What it does
ExoVet is a machine learning classifier that looks at Kepler telescope data and predicts whether a detected signal is a real confirmed exoplanet or a false positive — things like eclipsing binary stars that mimic a planet's signature. It also goes further: it deliberately hunts for and removes hidden data leakage in the dataset (columns that would let a model "cheat" by copying an answer instead of learning real physics), then proves the difference with a side-by-side comparison. Finally, it applies the trained model to NASA's ~1,978 still-unresolved candidate signals and ranks them by how likely each is to be a real planet.
How I built it
I used Python with pandas, scikit-learn, and XGBoost. After exploring the data, I noticed several columns were actually outputs of NASA's own vetting pipeline rather than raw telescope measurements — training on those would inflate accuracy without teaching the model anything real, so I removed them. I trained Random Forest and XGBoost classifiers, engineered a few physics-based features (like the ratio between orbital period and transit duration), and evaluated everything with proper cross-validation and a held-out test set.
Challenges I ran into
(Genuinely good material here — pick what actually happened:)
My first CSV upload silently got truncated by the browser, so my model trained on less than a third of the real dataset without me realizing it at first — the class balance looked wrong, which is what tipped me off. Spotting that several "measurement" columns were actually leaking the answer — the challenge organizers had already removed one obvious leak (koi_score), which made me wonder what else might be hiding. After adding engineered features partway through, several downstream cells broke because they still referenced the old feature set — a good lesson in how one upstream change ripples through a whole pipeline.
Accomplishments that I am proud of
Catching the data leakage was the accomplishment I'm most proud of — it would have been easy to just report a 99%+ accuracy number and move on. Instead, ExoVet demonstrates why that number would have been meaningless, and reports an honest ~98% result trained only on real physics.
What I learned
I learned that a high accuracy score means nothing without understanding what the model is actually learning — and that permutation importance and deliberate leakage testing are how you check that. I also learned a lot about the physics of exoplanet transits: why planet radius and eclipsing binaries matter, and how astronomers actually vet these signals.
What's next for ExoVet
I'd like to extend this to a full 3-class model that also classifies the unresolved CANDIDATE signals directly, and explore whether deep learning on the raw light curves (rather than pre-extracted features) could catch patterns the current feature set misses.
Built With
- google-colab
- jupyter-notebook
- machine-learning
- matplotlib
- numpy
- pandas
- python
- scikit-learn
- seaborn
- xgboost
Log in or sign up for Devpost to join the conversation.