Inspiration
Every confirmed exoplanet started as a faint, ambiguous dip in a star's brightness — indistinguishable at first from noise, a binary star system, or an instrumental artifact. NASA scientists spend real time vetting these signals by hand. I wanted to see if I could build the same kind of judgment into a model, using the exact same public dataset professionals work with: the Kepler Objects of Interest (KOI) Cumulative table from the NASA Exoplanet Archive.
What it does
The model takes raw transit and stellar measurements — orbital period, transit depth, duration, planetary radius, equilibrium temperature, and more — for 9,564 Kepler targets, and classifies each one as CONFIRMED, CANDIDATE, or FALSE POSITIVE. It's a three-way classification problem, not a simple yes/no, which better reflects how uncertain and graded real astronomical vetting actually is.
How we built it
EDA — examined class balance and missingness, and visualized how key features like transit depth and planet radius differ across dispositions. Cleaning — deliberately removed columns that would leak the answer, including koi_pdisposition and the koi_fpflag_* flags, which are themselves outputs of NASA's own vetting pipeline. Keeping them would've let the model "cheat" instead of learning from actual signal. Feature engineering — derived features like depth-to-radius ratio and duration-to-period ratio, mirroring the geometric consistency checks a human astronomer would run. Modeling — trained and compared Random Forest and XGBoost with 5-fold stratified cross-validation and class-balanced weighting. Evaluation & explainability — measured accuracy/precision/recall/F1, confusion matrices, ROC curves, and feature importances to make sure the model's reasoning was inspectable, not a black box.
Challenges we ran into
The biggest one wasn't messy data — it was too-clean data. Several columns in the raw table are essentially the answer key in disguise (NASA's own pipeline flags), and it's easy to accidentally train a "99% accurate" model that's actually just reading those columns. Catching and removing that leakage was the most important decision in the whole project, even though it made my accuracy numbers look less flashy.
Accomplishments that we're proud of
Getting an 85.9% accuracy / 0.83 macro-F1 XGBoost model without any leakage, on real, imperfect telescope data — and being able to explain in plain language exactly which transit characteristics the model leans on to tell a real planet from a false alarm.
What we learned
That "clean" tabular ML work is less about model choice and more about deciding what not to feed the model. Domain understanding (why a flag column exists, what it encodes) mattered more here than any hyperparameter tuning.
What's next for Exoplanet Hunter: Classifying Kepler Candidates
Adding SHAP for per-prediction explanations, testing on TESS data to see if the model generalizes across missions, and exploring oversampling as an alternative to class weighting for the CANDIDATE class.
Built With
- jupyter
- machine-learning
- matplotlib
- nasa-data
- pandas
- python
- scikit-learn
- seaborn
- xgboost
Log in or sign up for Devpost to join the conversation.