space-ml-lab · Project P5 · Technical report
Standard transit search (Box-Least-Squares) assumes periodicity and requires at least two transits; a planet whose period exceeds the ~27-day TESS sector transits only once and is missed by automated pipelines — precisely the regime in which Planet Hunters TESS finds many of its discoveries. We train a 1-D convolutional neural network to recognise a single transit in a light-curve window, using synthetic injection: analytic transit signals from batman are injected into real, quiet TESS light curves to build an unlimited, perfectly labelled training set. On a held-out, star-disjoint synthetic test set the detector reaches ROC-AUC = 0.998. A full injection-recovery analysis quantifies completeness as a function of transit depth and signal-to-noise: recovery rises monotonically from ~33% at $\mathrm{SNR}=4$ to essentially 100% above $\mathrm{SNR}\approx15$ (depth $\gtrsim350$ ppm). The stellar backgrounds are real TESS data; the transits are synthetic, and any real-data detection is a candidate requiring standard vetting.
The Box-Least-Squares algorithm [5] and its ML successors phase-fold a light curve on a trial period and require the transit to repeat. For a planet with orbital period longer than the observing baseline (a single 27-day TESS sector), only one transit occurs, so periodic search has nothing to fold and the event is discarded. These long-period systems are scientifically valuable — they probe cooler, wider orbits — and are exactly where citizen scientists (Planet Hunters TESS [6]) contribute most of their by-eye discoveries. On the automated side the problem is under-served. We treat single-transit detection as a supervised classification of light-curve windows, and solve the label-scarcity problem with synthetic injection.
We use real TESS two-minute (SPOC) light curves obtained with lightkurve [4] for a set of 16 stars across multiple sectors (32 light curves in total). Each light curve is cleaned (NaN removal), normalised to fractional flux, flattened, and cut into two-day windows resampled to 512 points, yielding 324 real background windows. Crucially, the train/test split is by star (12 stars for training, 4 held out for testing) so that no star appears in both — a strict test of generalisation.
Positive examples are generated by injecting analytic single-transit signals into real quiet windows. The transit model is the Mandel & Agol (2002) formalism [3] as implemented in batman [2], with randomised depth (planet-to-star radius ratio, so depth $\delta\approx(R_p/R_\star)^2$), duration, impact parameter, and epoch within the window. Negatives are un-injected quiet windows and realistic artefacts. This yields an unlimited, perfectly labelled dataset: 6,000 training and 4,000 test examples, with injected transits spanning a broad signal-to-noise range (5th/50th/95th percentiles $\mathrm{SNR}=8.6/78/737$), where
$$\mathrm{SNR}\;\approx\;\frac{\delta}{\sigma}\,\sqrt{n_{\mathrm{in}}}$$with $\sigma$ the per-point noise and $n_{\mathrm{in}}$ the number of in-transit points.
A 1-D CNN maps a 512-point window to the probability that it contains a single transit, trained with binary cross-entropy (Adam, 30 epochs, Apple-MPS). Performance is measured on the held-out, star-disjoint synthetic test set by ROC-AUC and by an injection-recovery analysis: the completeness (recovered fraction) as a function of injected transit depth and SNR, which is the standard way to characterise the sensitivity of a transit search.
cd projects/p5-tess-monotransit
python3 src/monotransit_local.py # downloads backgrounds, injects transits, trains, evaluates
Deterministic (seeded); runs locally on Apple M2 / MPS in about two minutes. Outputs: outputs/{injection_example,roc,recovery_curve}.png, candidates.csv, run_summary.json.