Winston-Salem Bird Station

Thursday, September 17, 2026 — 12:14 AM

Raspberry Pi 4 · Ecowitt WittBoy 7-in-1 Weather Station · Cornell Lab BirdNET-Pi Acoustic Recognition

Questions or feedback: [email protected]

MLOps Model Results

Predicted vs Actual — by Hour of Day

Averaged across every date in the training data, so this shows the daily activity shape rather than a specific day.

Weather Effects on Detection Rate

WittBoy Variable Correlation Heatmap

tempfhumiditybaromrelinwinddirwindspeedmphwindgustmphsolarradiationuvrainratedailyrain
tempf 1.0 -0.81 -0.12 0.14 0.29 0.45 0.57 0.54 -0.03 -0.14
humidity -0.81 1.0 -0.02 -0.11 -0.32 -0.48 -0.52 -0.49 0.06 0.22
baromrelin -0.12 -0.02 1.0 -0.01 0.0 -0.0 0.07 0.08 -0.01 -0.02
winddir 0.14 -0.11 -0.01 1.0 0.02 0.03 0.09 0.08 -0.02 -0.03
windspeedmph 0.29 -0.32 0.0 0.02 1.0 0.59 0.38 0.36 0.03 0.02
windgustmph 0.45 -0.48 -0.0 0.03 0.59 1.0 0.5 0.46 0.05 0.06
solarradiation 0.57 -0.52 0.07 0.09 0.38 0.5 1.0 0.99 -0.03 -0.06
uv 0.54 -0.49 0.08 0.08 0.36 0.46 0.99 1.0 -0.03 -0.07
rainrate -0.03 0.06 -0.01 -0.02 0.03 0.05 -0.03 -0.03 1.0 0.14
dailyrain -0.14 0.22 -0.02 -0.03 0.02 0.06 -0.06 -0.07 0.14 1.0

Model Version History

VersionRowsModel Fit ScorePromoted
v53_20260916_223346 17900 -0.5391
v52_20260915_223058 17580 -0.5331
v51_20260914_222937 17260 -0.5244
v50_20260913_222811 16940 -0.5237
v49_20260912_222759 16620 -0.5248
v48_20260911_222542 16300 -0.5165
v47_20260910_222420 15980 -0.5184
v46_20260909_222246 15660 -0.5209
v45_20260908_221910 15340 -0.518
v44_20260907_222028 15020 -0.5165

About This Model

This dashboard is powered by a Bayesian hierarchical Negative Binomial model, fit using PyMC via MCMC sampling (NUTS), on the top 20 most-detected species. The outcome is the number of detections for a given species within a given hourly window, including true zeros for hours when nothing was heard. A negative binomial likelihood was chosen over Poisson because detection counts are highly overdispersed — some species (like Carolina Wren and Gray Catbird) call in bursts, producing far more variance than a Poisson model can explain. Temperature, humidity, pressure, and rainfall enter as standardized fixed effects shared across all species. Time of day enters as a quadratic curve, letting each species peak at its own hour rather than sharing one shape — species is treated as a random intercept and random time-of-day slope on the log scale, letting each species have its own baseline calling rate and its own peak timing, with sparse species pulled toward the group average. The model is retrained daily as new detections accumulate, and a new version is only promoted to production if it has a better estimated out-of-sample fit (via LOO cross-validation) than the current one. The current formulation is shown below, where count is assumed to follow a Negative Binomial distribution with mean μ and dispersion α.
log(μ) = β0 + β1·Temp + β2·Humidity + β3·Pressure + β4·Rain + (β5+b5,species)·TimeOfDay + (β6+b6,species)·TimeOfDay² + uspecies

count ∼ NegBinomial(μ, α)
uspecies ∼ Normal(μspecies, σ²species)
b5,species, b6,species ∼ Normal(0, σ²time)

What "hierarchical" actually means

Each species' baseline calling rate is pulled toward the group average — pulled hard when a species has little data, barely at all when it has a lot. This is what lets sparse species (like Common Grackle) get a stable, sensible estimate instead of an overfit one, while common species (like Gray Catbird) are trusted almost entirely on their own data.

Group average calling rate Gray Catbird n = 6,552 Barely moves Fish Crow n = 1,806 Small pull Great Crested Flycatcher n = 76 Moderate pull Common Grackle n = 33 Pulled hardest Raw estimate → model estimate Coefficients and predictions shown above reflect the current production model version.