A perimeter air-defense site fuses a short-range radar with a slewable EO/IR camera. Every second it holds hundreds of tracks, and about 92% of them are birds, crewed aircraft, road vehicles, wind turbines and weather. One operator watches the screen. You are building the model that decides which tracks get the operator's attention. Miss a small drone and it reaches the perimeter unobserved. Cue the operator on every gull and they stop looking. The dataset is synthetic and physically motivated: radar cross-section, SNR that falls with range, rotor blade flash (micro-Doppler) that fades into the noise floor, and a camera that only reaches about 5 km and only looks at some tracks. Your job is to engineer kinematics from raw radar plots, fuse the sensors, and defend an operating point in operator minutes.
Establish how rare drones are, what else is in the sky, and how often the camera looked.
Implement explore_tracks(train_df) returning a dict with:
track_class exists only in the training data. It tells you what each track really was: bird, quadcopter, fixed_wing_uas, crewed_aircraft or clutter. is_uas is 1 for quadcopter and fixed_wing_uas.
Look hard at the last three numbers. The camera looked at fewer than 3 tracks in 10, and the drone rate among tracks it looked at is several times the rate among tracks it did not. That is not a coincidence: the site's cueing logic prefers tracks the radar already finds suspicious. A missing camera score is evidence, so you must not impute it away. Then notice that the median micro-Doppler of a bird is not zero. Rotor blade flash is the best radar clue you have, and it sits on top of a noise floor.
Evaluated server-side against a hidden test set.