Oboe
No history yet

A customer wants us to interview 200 people who have switched car insurance providers in the last six months.

Our panel is about 4 million people. We don't know who's switched. The only way to find out is to screen someone — a short qualifying interaction — and screening isn't free: it costs real money per person, roughly a tenth of what a full interview costs.

We do have metadata on panelists from prior studies: demographics, past survey topics, self-reported categories, engagement history. Some of it correlates with switching. None of it tells you directly.

The customer wants their 200 completes in two weeks.

Design something.

This is a classic needle-in-a-haystack problem with a sharp operational constraint: finding 200 switchers out of 4 million people in 14 days, where every single check costs money. To tackle this, we can design a high-yield, cost-optimal active learning pipeline.

Your path
Batch Active Learning and Acquisition Dynamics
Cold-Start Modeling and Prior Feature Engineering
Pipeline Architecture and Operational Constraints

Formalizing the Math: Covariates, Switchers, and Costs

Let's translate this problem into a precise mathematical framework. We can represent each panelist ii as a covariate vector xix_i containing demographic metrics, past engagement history, and survey topics. The target variable is binary: yi{0,1}y_i \in \{0, 1\}, representing whether they have switched car insurance in the last six months (yi=1y_i = 1) or not (yi=0y_i = 0).

Our primary constraint is financial. We have two distinct actions we can take: a cheap screening query that costs cscreenc_{\text{screen}} (to check if they qualify) and a full interview that costs cinterviewc_{\text{interview}}. We are told that screening costs roughly a tenth of a full interview, giving us a clear cost ratio:

cscreen0.1cinterviewc_{\text{screen}} \approx 0.1 \cdot c_{\text{interview}}

Let NscreenN_{\text{screen}} be the total number of panelists we choose to screen, and NinterviewN_{\text{interview}} be the number of people we successfully interview (which is capped at our target of 200 completes). We want to minimize our total operational cost function:

Total Cost=Nscreencscreen+Ninterviewcinterview\text{Total Cost} = N_{\text{screen}} \cdot c_{\text{screen}} + N_{\text{interview}} \cdot c_{\text{interview}}

Because we only interview people who successfully pass our screen, NinterviewN_{\text{interview}} will be exactly equal to the number of positive switchers we find during our screening process. If we randomly sampled the 4M panel with a baseline switching rate of, say, 1%, we would have to screen 20,000 people to find our 200 switchers, which would be incredibly expensive.

Continue to Expected Value of Information and Acquisition Functions

Let's dive straight into the decision-making mechanics of our active learning pipeline by introducing the Expected Value of Information (EVOI) framework.

The Decision Engine: Expected Value of Information (EVOI)

To determine whether we should spend $0.1 to screen a specific panelist ii with covariates xix_i, we need to calculate the net expected utility of that query. Every time we dispatch a screening survey, we risk spending cscreenc_{\text{screen}} for a negative result (yi=0y_i = 0), which yields zero progress. Conversely, a positive result (yi=1y_i = 1) yields a valid candidate for a full interview, saving us from wasting money on random screens.

Let's formalize this trade-off. We define the net expected utility of screening panelist ii, denoted as U(xi)U(x_i), as the expected payout of the screening action minus its guaranteed cost:

U(xi)=P(yi=1xi)VsuccesscscreenU(x_i) = P(y_i = 1 \mid x_i) \cdot V_{\text{success}} - c_{\text{screen}}

To find the value of a successful screen (VsuccessV_{\text{success}}), we look at our baseline alternative. If we did not have a predictive model, we would have to screen people completely at random. If the baseline prevalence of switchers in the general population is π\pi, we would expect to screen 1/π1/\pi people to find just one switcher. This random search sets our baseline cost-per-acquisition:

Crandom=1πcscreenC_{\text{random}} = \frac{1}{\pi} \cdot c_{\text{screen}}

Thus, finding a switcher using our active learning model saves us from spending CrandomC_{\text{random}}. This means the value of a positive screen is exactly Vsuccess=CrandomV_{\text{success}} = C_{\text{random}}. Substituting this back into our utility function, we get a clean mathematical expression for the per query:

U(xi)=P(yi=1xi)cscreenπcscreenU(x_i) = P(y_i = 1 \mid x_i) \cdot \frac{c_{\text{screen}}}{\pi} - c_{\text{screen}}
U(xi)=cscreen(P(yi=1xi)π1)U(x_i) = c_{\text{screen}} \left( \frac{P(y_i = 1 \mid x_i)}{\pi} - 1 \right)

If we purely exploit this cost-benefit formula, we will only screen the panelists who have the absolute highest P(yi=1xi)P(y_i = 1 \mid x_i). However, our initial model's estimates might be highly biased or inaccurate because we are starting with very little labeled data. This introduces a classic risk: if we only screen high-probability candidates, we might miss entirely different sub-populations of switchers that our model doesn't know about yet.

Continue to acquisition functions and the exploration-exploitation trade-off

To prevent our decision engine from getting trapped in its own feedback loop, we must design an acquisition function that mathematically balances immediate utility with long-term model improvement.

The Exploration-Exploitation Trade-off

When dealing with highly sparse positive regimes — like finding a few hundred switchers in a massive panel — a pure exploitation strategy based solely on our predicted probability P(yi=1xi)P(y_i = 1 \mid x_i) will fail. The model will continuously query panelists who resemble the few known positive cases, leaving large, unmapped regions of the covariate space completely unexplored. To formalize this, we need an a(xi)a(x_i) that maps each candidate's state to a selection priority, explicitly trading off exploitation (expected yield) and exploration (information gain).

One highly effective formulation for this in cost-sensitive active learning is an Entropy-Weighted Utility metric. Instead of ranking candidates purely by U(xi)U(x_i), we scale our screening decision by the Shannon H(yixi)H(y_i \mid x_i) of the prediction. This ensures we prioritize individuals where the model's prediction is highly valuable and where the model is most fundamentally confused.

H(yixi)=P(yi=1xi)log2P(yi=1xi)(1P(yi=1xi))log2(1P(yi=1xi))H(y_i \mid x_i) = -P(y_i=1 \mid x_i)\log_2 P(y_i=1 \mid x_i) - (1-P(y_i=1 \mid x_i))\log_2(1-P(y_i=1 \mid x_i))

Using this, we can construct an acquisition function that linearly weights our calculated net expected utility against this informational entropy parameter:

a(xi)=U(xi)+βcscreenH(yixi)a(x_i) = U(x_i) + \beta \cdot c_{\text{screen}} \cdot H(y_i \mid x_i)

Let's walk through a concrete example to see how this balance plays out in practice. Suppose we set our exploration weight β=1.5\beta = 1.5. We have a baseline switching prevalence of π=0.02\pi = 0.02 (2%), and our screen cost cscreen=c_{\text{screen}} = $0.10. Let's evaluate two different candidate panelists under our acquisition function.

ParameterCandidate A (Likely Switcher)Candidate B (High Uncertainty)
Covariates xix_iHigh-match profileUnseen demographic combination
Model Probability P(yi=1xi)P(y_i=1 \mid x_i)0.200.200.500.50
Base Expected Utility U(xi)U(x_i)$0.10(0.200.021)=0.10 \cdot \left( \frac{0.20}{0.02} - 1 \right) = $0.900.90$0.10(0.500.021)=0.10 \cdot \left( \frac{0.50}{0.02} - 1 \right) = $2.402.40
Model Entropy H(yixi)H(y_i \mid x_i)0.2log2(0.2)0.8log2(0.8)0.72-0.2\log_2(0.2) - 0.8\log_2(0.8) \approx 0.720.5log2(0.5)0.5log2(0.5)=1.00-0.5\log_2(0.5) - 0.5\log_2(0.5) = 1.00
Exploration Bonus βcscreenH\beta \cdot c_{\text{screen}} \cdot H1.51.5 \cdot $0.100.72=0.10 \cdot 0.72 = $0.110.111.51.5 \cdot $0.101.00=0.10 \cdot 1.00 = $0.150.15
Acquisition Score a(xi)a(x_i)$0.90+0.90 + $0.11=0.11 = $1.011.01$2.40+2.40 + $0.15=0.15 = $2.552.55

In this setup, Candidate B receives a massive boost due to both a high raw utility (since a 50% probability is far above our 2% baseline) and maximum informational entropy. This mathematically prioritizes them for screening.

As our active learning pipeline runs and collects real data, our estimate of P(yi=1xi)P(y_i=1 \mid x_i) updates, causing these entropy profiles to collapse toward 0 for known cohorts. This naturally shifts our system from exploration to pure exploitation as we approach our target of 200 completes.

Continue to Batch Active Learning and Acquisition Dynamics

Batch Diversity: Moving Beyond Pointwise Queries

Now that we have a mathematical formulation for evaluating a single candidate's acquisition priority a(xi)a(x_i), we face a major operational hurdle. We cannot simply screen panelists one by one, wait for them to finish, update our model, and pick the next person. To meet our 14-day timeline, we have to dispatch surveys in parallel batches. If we greedily select the top KK individuals with the highest acquisition scores, we will inevitably query redundant candidates. Highly correlated panelists will cluster in the same regions of our covariate space, leading to wasted screening dollars. To prevent this, we must enforce diversity within our batch queries.

To achieve this, we can utilize a or run K-Means clustering directly inside our panel's latent representation space. Instead of sampling purely based on our pointwise acquisition score a(xi)a(x_i), we can frame batch selection as a geometry-preserving optimization problem. In the representation space defined by our panelist metadata, we want to choose a subset of size KK that minimizes the maximum distance between any panelist in the entire unselected pool and their nearest neighbor in our selected batch.

A side-by-side comparison of greedy selection and diverse batch selection across data points in a two-dimensional feature space.

By combining our pointwise acquisition scores with this geometric clustering, we ensure that every batch we dispatch is both informative and highly diverse.

Next, we need to address how to scale these batches dynamically over our 14-day timeline. Because response rates decay and our model's confidence improves as positive examples accumulate, keeping our batch size static is highly inefficient. We must optimize our daily dispatch sizes and design a robust model refitting cadence.