Skip to main content
v2026.11,858 entries · CC-BY 4.0

Contextual Bandits: Research Software Guide

Implement contextual bandits for research using Vowpal Wabbit. Learn multiline ADF formatting, exploration policies, and offline evaluation techniques.

Written and maintained by CASRAI Editorial Board

Last updated

Contextual bandits provide a rigorous mathematical and computational framework for sequential decision-making under uncertainty, bridging the gap between static supervised learning and full reinforcement learning. In statistical machine learning and experimental research, a contextual bandit algorithm repeatedly observes covariate information (the context), selects an intervention or action from an available candidate set, and receives numerical feedback (a cost or reward) associated exclusively with the chosen action. Because the system never observes what would have happened under counterfactual choices, contextual bandits require structured exploration strategies to balance immediate performance against information acquisition.

What it is used for in research

Contextual bandits are deployed across empirical and computational disciplines where experimental interventions must adapt dynamically to incoming data while controlling opportunity costs. Unlike standard multi-armed bandits, which identify a single population-level optimal treatment, contextual bandits personalize selections based on instance-level features. Primary research applications include:

  • Adaptive Clinical Trials: Allocating participants to therapeutic regimens based on baseline biomarkers and clinical covariates, maximizing trial statistical power while minimizing exposure to suboptimal interventions.
  • Adaptive Behavioral and Educational Interventions: Dynamically sequencing digital learning modules or public health messages in mobile health (mHealth) studies according to participant engagement history and current physiological indicators.
  • Human-Computer Interaction and Information Retrieval: Optimizing ranking, news personalization, and layout selection where user interaction patterns diverge sharply across demographic and session contexts.
  • Automated Algorithm and Pipeline Steering: Dynamically allocating computational resources or tuning hyperparameters during iterative numerical simulations in high-performance computing environments.

In computational research methodologies, contextual bandits avoid the complexity and sample-inefficiency of full Markov Decision Processes (MDPs) when decisions are memoryless—meaning an intervention alters immediate payoff but does not transition the environment into a fundamentally new structural state. To understand how these models intersect with broader predictive workflows, researchers frequently consult foundational machine learning research methods, particularly when integrating contextual policies into alignment pipelines such as reinforcement learning from human feedback (RLHF).

Install or access (official source only)

The primary open-source reference implementation for contextual bandit reductions is Vowpal Wabbit (VW), an established high-performance machine learning system developed by Yahoo! Research and Microsoft Research. Vowpal Wabbit provides native support for online contextual bandit reductions using efficient feature hashing and optimized gradient descent routines.

Vowpal Wabbit can be installed through official package distributions across standard research platforms:

  • Python Package Index (PyPI):
    pip install vowpalwabbit
  • Conda-Forge (recommended for Anaconda and Miniconda environments):
    conda install -c conda-forge vowpalwabbit
  • Ubuntu / Debian Linux (APT system repository):
    sudo apt-get install vowpal-wabbit
  • macOS (Homebrew package manager):
    brew install vowpal-wabbit

Building from official GitHub source requires CMake (version 3.13 or newer), a C++17 compliant compiler (GCC 8+ or Clang 6+), and Boost libraries. Pre-compiled Python wheels are maintained on PyPI for standard x86_64 and Apple Silicon architectures running Python 3.8 through 3.12.

Step-by-step task

The following task demonstrates how to configure, query, and update an online contextual bandit model in Python using Vowpal Wabbit’s Action-Dependent Features (ADF) reduction with ε-greedy exploration.

  1. Initialize the Vowpal Wabbit Workspace: Instantiate a learner specifying the --cb_explore_adf reduction and an exploration parameter. The --quiet flag suppresses terminal logging during high-throughput loops.

    import vowpalwabbit
    
    # Configure workspace with Action-Dependent Features and epsilon-greedy exploration
    vw = vowpalwabbit.Workspace("--cb_explore_adf --epsilon 0.2 --quiet")
  2. Format Context and Candidate Actions: Construct an interaction example using VW’s multiline format. The first line contains shared context features (prefixed with shared), followed by individual lines for each available action candidate (delimited with |Action).

    # Define shared context and three candidate interventions
    context_text = (
        "shared |User career_stage=postdoc discipline=bioinformaticsn"
        "|Action arm=treatment_a dosage=lown"
        "|Action arm=treatment_b dosage=mediumn"
        "|Action arm=treatment_c dosage=high"
    )
  3. Predict Action Probabilities: Call the predict() method on the unlabelled multiline string. VW returns a probability mass function (PMF) across the available action candidates.

    # Query the policy for exploration probabilities
    action_pmf = vw.predict(context_text)
    print("Action probabilities:", action_pmf)
    # Example output: [0.8666, 0.0666, 0.0666]
  4. Sample the Action and Observe Experimental Cost: Sample an action index according to the returned PMF, deploy the intervention, and observe the experimental feedback. In Vowpal Wabbit, objective functions minimize cost rather than maximize reward ($cost = -reward$, or $cost = 1.0 – success$ for binary indicators).

    import random
    
    def sample_action(pmf):
        r = random.random()
        cumulative = 0.0
        for idx, prob in enumerate(pmf):
            cumulative += prob
            if r <= cumulative:
                return idx, prob
        return len(pmf) - 1, pmf[-1]
    
    chosen_idx, chosen_prob = sample_action(action_pmf)
    # Observed clinical or experimental response (0.0 cost represents maximum efficacy)
    observed_cost = 0.0
  5. Format Label and Execute Online Update: Update the multiline record by appending the feedback label to the chosen action line in the format action_index:cost:probability (using 0-based indexing for the chosen line in ADF mode), then call learn().

    actions = [
        "|Action arm=treatment_a dosage=low",
        "|Action arm=treatment_b dosage=medium",
        "|Action arm=treatment_c dosage=high"
    ]
    
    # Apply feedback to the chosen action line
    actions[chosen_idx] = f"0:{observed_cost}:{chosen_prob} " + actions[chosen_idx]
    
    labeled_example = "shared |User career_stage=postdoc discipline=bioinformaticsn" + "n".join(actions)
    
    # Update model weights online
    vw.learn(labeled_example)
  6. Persist and Reload the Trained Model: Save the learned weight parameters to disk for subsequent inference or offline evaluation passes.

    # Save model checkpoint
    vw.save("contextual_bandit.model")
    
    # Reload checkpoint into a new workspace
    reloaded_vw = vowpalwabbit.Workspace("--cb_explore_adf -i contextual_bandit.model --quiet")

Output and how to read it

Interpreting contextual bandit output involves analyzing both real-time policy predictions and diagnostic progressive validation loss metrics.

Policy Predictions (PMF Output): When executing predict() on an ADF instance with --cb_explore_adf --epsilon 0.2 across three actions, the returned output is a list of floating-point probabilities summing to 1.0. The estimated optimal action receives probability 1 – ε + (ε / K), while each suboptimal arm receives exploration probability ε / K. For K = 3 and ε = 0.2, the greedy arm receives 0.8 + (0.2 / 3) ≈ 0.8667, and each alternate arm receives 0.0667. If using Boltzmann exploration (--softmax --lambda 1.0), probabilities scale proportionally to exponentiated negative estimated costs.

Diagnostic Console Stream: When running Vowpal Wabbit without the --quiet parameter, the engine prints a standard progressive validation log every $2^n$ examples:

loss     since    example            current  current  current
back     last     counter    weight    label  predict features
0.000000 0.000000        1       1.0  0:0:0.87        0       12
0.333333 0.666667        2       2.0  0:1:0.07        1       12
0.250000 0.166667        4       4.0  0:0:0.87        0       12
0.218750 0.187500        8       8.0  0:0:0.87        0       12
  • loss back: Cumulative progressive validation loss from the beginning of execution, computed using counterfactual importance weighting.
  • since last: Average importance-weighted loss over the most recent exponential reporting block, indicating whether current policy performance is improving.
  • example counter: Total number of multiline decision events processed.
  • current label: The observed label of the instance in cost:probability format.
  • current predict: The index of the action predicted by the internal model prior to updating weights on the observed feedback.
  • current features: Total count of active nonzero feature weights evaluated across the shared context and candidate action namespaces.

Researchers coordinating multi-model pipelines can benchmark these streaming metrics against standard offline pipelines documented in machine learning workflows in R and broader open-source statistical tools.

Troubleshooting

When running contextual bandit workflows, empirical researchers commonly encounter configuration and convergence issues specific to partial observability:

  • Error: “VW requires multiline format for ADF”: Occurs when passing a single-line string to --cb_explore_adf or when lines are separated by platform-incompatible escape characters. Ensure all shared features precede the action candidates and each action line is separated by explicit newline (
    ) delimiters.
  • Loss Explosion and Gradient Divergence: Occurs when logging probabilities approach zero, causing importance weights ($c / p$) to escalate to extreme magnitudes. Counteract this by establishing an explicit probability floor with --epsilon 0.1 during data collection and capping propensity weights during offline evaluation passes.
  • Positional Index Shift Across Dynamic Action Sets: In variable action environments (e.g., varying inventory or clinical arms), positional indices shift between rounds. Avoid indexing by integer order; instead, attach unique categorical identifiers within the action feature namespace (e.g., |Action arm_id=drug_x).
  • Namespace Collision: Omitting the pipe character (|) causes feature tokens to merge into the preceding namespace, altering hash calculations. Always verify whitespace formatting around namespace prefixes.
  • Wheel Compilation Errors on High-Performance Clusters: Environments lacking pre-compiled Python wheels require system-level development libraries. Verify installation of cmake and a C++17 compiler before building from source.

Free alternatives

While Vowpal Wabbit provides leading throughput for large-scale online reductions, several free and open-source alternatives cater to specific statistical environments and offline research designs:

Package License Primary Implementation Paradigm Key Algorithms Supported Best Research Use Case
Vowpal Wabbit (VW) BSD-3-Clause Online cost-sensitive multi-class reduction cb_explore_adf, LinUCB, Bagging, Cover, Softmax High-throughput streaming, large-scale online experiments, and dynamic action spaces.
contextualbandits (Python) BSD-2-Clause Scikit-learn wrapper reductions LinUCB (disjoint/shared), LogisticUCB, Contextual Thompson Sampling Offline benchmarking with standard scikit-learn estimators and Doubly Robust evaluation.
MABWiser Apache-2.0 Object-oriented Python library Epsilon-Greedy, LinUCB, Contextual Thompson Sampling, Softmax Rapid prototyping and simulation in tabular operations research and decision analytics.
TF-Agents Bandits Apache-2.0 TensorFlow computational graphs Neural Linear Bandits, Neural Epsilon-Greedy, Per-Arm Models Deep contextual representations with image, audio, or high-dimensional perceptual embeddings.
Ray RLlib Apache-2.0 Distributed reinforcement learning framework Linear Bandits, Deep Q-Bandits, Offline Policy Evaluation Cluster-scale distributed simulation and integration with full reinforcement learning pipelines.

FAQ

How do contextual bandits differ from standard multi-armed bandits?

Standard multi-armed bandits evaluate arm reward distributions across the entire population, converging toward a single uniform intervention for all cases. Contextual bandits condition decisions on an incoming covariate vector (context), learning a mapping from context features to action payoffs to deliver personalized, subgroup-specific selections.

Can contextual bandit models be validated using historical offline data?

Yes. Offline policy evaluation (OPE) leverages counterfactual statistical estimators such as Inverse Propensity Scoring (IPS), the Replay method, and Doubly Robust (DR) estimation. Valid offline evaluation requires that historical data was generated by a logging policy that assigned a known, strictly positive exploration probability to all candidate actions.

Why does Vowpal Wabbit formulate bandit objectives as cost minimization?

Vowpal Wabbit builds on statistical learning theory reductions where algorithms optimize generalized loss functions (such as squared or logistic loss). In contextual bandits, researchers convert standard rewards to costs by setting $cost = -reward$, or $cost = 1.0 – reward$ for bounded binary outcomes.

When should researchers transition from contextual bandits to full reinforcement learning?

Full reinforcement learning is required when current actions alter future environmental states and feedback involves multi-step delayed rewards (such as multi-stage chemotherapy dosing or robotic control). Contextual bandits are optimal for single-stage decisions where current actions do not dictate future context arrivals, providing higher statistical efficiency and lower sample complexity. Methodological comparisons across sequential decision paradigms are documented in peer-reviewed proceedings including the Proceedings of Machine Learning Research (PMLR).

Sources (official docs)

  • Vowpal Wabbit Project. Vowpal Wabbit Contextual Bandit Documentation and Source Repository. Maintained by Microsoft Research and Yahoo! Research. Available at: https://vowpalwabbit.org/ and https://github.com/VowpalWabbit/vowpal_wabbit. Accessed November 9, 2026.
  • Cortes, D. contextualbandits: Python Implementations of Algorithms for Contextual Bandits. Documentation hosted on Read the Docs. Available at: https://contextual-bandits.readthedocs.io/en/latest/ and https://github.com/david-cortes/contextualbandits. Accessed November 9, 2026.
  • Li, L., Chu, W., Langford, J., and Schapire, R. E. (2010). “A contextual-bandit approach to personalized news article recommendation.” In Proceedings of the 19th International Conference on World Wide Web (WWW ’10), pp. 661–670. Association for Computing Machinery. DOI: 10.1145/1772690.1772758.
  • Dudík, M., Langford, J., and Li, L. (2011). “Doubly Robust Policy Evaluation and Learning.” In Proceedings of the 28th International Conference on Machine Learning (ICML ’11), pp. 1097–1104.
  • Fidelity Investments. MABWiser: Parallelizable Contextual Multi-Armed Bandits Library. Apache 2.0 open-source distribution. Available at: https://github.com/fidelity/mabwiser. Accessed November 9, 2026.

Follow CASRAI

Research-administration guidance, standards updates and independent tool reviews.

Ask CASRAI · free to try

Ask about Contextual Bandits: Research Software Guide

Ask your first 2 questions free below. Subscribers get 150 a day for $29 a month.

An AI assistant specialized in research administration. It cites the sources behind every answer, labels web answers and says when it can't answer.

Answers draw on CASRAI's guides and dictionary plus the federal and funder documents we index: Federal Register, Grants.gov, Regulations.gov and UKRI.

Works on this site and inside Claude, Cursor and the AI tools you already use.

Everything CASRAI publishes — this page, the dictionary, the guides and the news — stays free to read, with no account and no card.

Referenced across the research world

University of Cambridge logoColumbia University logoCrossref logoUniversity of Edinburgh logoHarvard University logoUniversity of Oxford logoPrinceton University logoStanford School of Medicine logoUniversity College London logoORCID logoUniversity of Cambridge logoColumbia University logoCrossref logoUniversity of Edinburgh logoHarvard University logoUniversity of Oxford logoPrinceton University logoStanford School of Medicine logoUniversity College London logoORCID logo
  • University of Cambridge logo
  • Columbia University logo
  • Crossref logo
  • University of Edinburgh logo
  • Harvard University logo
  • University of Oxford logo
  • Princeton University logo
  • Stanford School of Medicine logo
  • University College London logo
  • ORCID logo

View CASRAI adoption →