• This repository has been archived on 21/Sep/2022
  • Stars
    star
    129
  • Rank 279,262 (Top 6 %)
  • Language
    Ruby
  • License
    GNU General Publi...
  • Created over 13 years ago
  • Updated about 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A multi-armed bandit optimization framework for Rails

bandit

Build Status Dependency Status

Bandit is a multi-armed bandit optimization framework for Rails. It provides an alternative to A/B testing in Rails. For background and a comparison with A/B testing, see the whybandit.rdoc document or the blog post here.

Installation

First, add the following to your Gemfile in your Rails 3 app:

gem 'bandit'

Then, run the following:

bundle install
rails generate bandit:install

You can then edit the bandit.yml file in your config directory to set your storage and player parameters. Redis, memcache, dalli, memory, pstore and yaml-store storage options are available (you will need to add either the memcache-client, redis, or dalli gem to your Gemfile if you chose to use one of these. PStore and YamlStore do not require you to add additional gems though). Memory storage should only be used for testing. YamlStore is a nice option for testing as well since it is plaintext and you can have a look into it to see what is going on. If you have a simple application with only one server and just a hand full of tests, you might want to use PStore.

See the file players.rdoc for information about available players.

Configuration

To set up an experiment, add it either somewhere in your code or in the bandit initializer. Creating an experiment is simple:

Bandit::Experiment.create(:click_test) do |exp|
  exp.alternatives = [ 20, 30, 40 ]
  exp.title = "Click Test"
  exp.description = "A test of clicks on purchase page with varying link sizes."
end

View

To get an alternative (per viewer, based on cookies):

<%= bandit_choose :click_test %>

For instance, in a link:

<%= link_to "new purchase", new_purchase_path, :style => "font-size: #{bandit_choose(:click_test)}px;" %>

You can force a particular alternative by adding a query parameter named "bandit_" and setting it's value to the alternative you want. For instance, given the above experiment in the configuration example:

http://<yourhost>/<path>?bandit_click_test=40

will then force the alternative to be "40".

Controller

To track a conversion in your controller:

bandit_convert! :click_test

You can also request a choice in the controller:

redirect_to bandit_choose(:some_url_test)

Dashboard

The dashboard is a Rails engine so it just needs to be mounted in your config/routes.rb file:

mount Bandit::Engine, :at => '/bandit' # or any path you want

To view the dashboard with relevant information, go to:

http://<yourhost>/bandit

User Tracking

There are a few different ways that users/conversions can be tracked. Instead of calling bandit_choose and bandit_convert! in your code, you may alternatively use one of the following method combinations:

bandit_simple_choose/bandit_simple_convert!   (no cookies involved, same as raw impressions)
bandit_session_choose/bandit_session_convert! (session cookie, same as bandit_choose)
bandit_sticky_choose/bandit_sticky_convert!   (persistent cookies)

bandit_sticky_convert! creates a _converted cookie which stops additional conversions from being counted. For example, if you are collecting email addresses, a user may enter their email address more than once, but you may want to count all these attempts as one conversion.

You may also use the bandit_sticky_choose/bandit_session_convert! combination if you wish to use persistent cookies but allow each user to convert multiple times. This way visitors are always presented with the same alternative until they convert, at which point they are presented with another and so on.

Finally, if you use bandit_simple_convert!, please remember the second argument (alternative) is not optional, as we have no cookie to read from.

The default bandit_choose/bandit_convert methods use the session based choose/convert.

Tests

To run tests:

rake test_memory
rake test_memcache
rake test_redis
rake test_dalli
rake test_pstore
rake test_yamlstore

To produce fake data for the past week, first create an experiment definition. Then, run the following rake task:

rake bandit:populate_data[<experiment_name>]

For instance, to generate a week's worth of fake data for the click_test above:

rake bandit:populate_data[click_test]

Fault Tolerance

If the storage mechanism fails, then Bandit will automatically switch to in memory storage. It will then check every 5 minutes after that to see if the original storage mechanism is back up. If you have distributed front ends then each front end will continue to optimize (based on the in memory storage), but this optimization will be inefficient compared to shared storage among all front ends.

More Repositories

1

kademlia

A DHT in Python using asyncio
Python
791
star
2

gender_detector

Get gender from first name in Ruby.
Ruby
422
star
3

twistar

Twistar is an object-relational mapper (ORM) for Python that uses the Twisted library to provide asynchronous DB interaction.
Python
133
star
4

ankusa

Text classifier in Ruby that uses Hadoop/HBase, Mongo, or Cassandra for storage. New location for http://github.com/livingsocial/ankusa
Ruby
100
star
5

rpcudp

Python library for RPC over UDP
Python
89
star
6

mod_auth_openid

mod_auth_openid is an authentication module for the Apache 2 webserver. It handles the functions of an OpenID consumer as specified in the OpenID 2.0 specification.
C++
74
star
7

arrow

Date interaction for Golang, with strftime formatting for time
Go
41
star
8

hbaserb

HBase Thrift interface for Ruby
Ruby
34
star
9

gatling_gun

A Ruby library wrapping SendGrid's Newsletter API.
Ruby
33
star
10

pundit-elixir

Simple authorization helpers for Elixir stucts, like Ruby's Pundit
Elixir
29
star
11

abanalyzer

A/B test analysis library for Ruby - performs Chi-Square tests and G-tests on A/B results - New location for https://github.com/livingsocial/abanalyzer
Ruby
29
star
12

fastimage

Python library that finds the size / type of an image given its URI by fetching as little as needed
Python
28
star
13

StactiveRecord

StactiveRecord is a C++ ORM library designed to make simple database use as simple as possible. It was inspired by Ruby on Rail's Active Record, however, no similar look, feel, or performance is guaranteed. It uses an Object-relational mapping pattern to represent records as objects. It also provides persistent object relationships (one to many, many to many, one to one).
C++
26
star
14

pymur

pymur is a Python interface to The Lemur Toolkit.
C++
19
star
15

fake

Make Python's Fabric act like Ruby's Capistrano
Python
19
star
16

telemetry_metrics_cloudwatch

Provides an AWS CloudFront reporter for Elixir Telemetry.Metrics definitions
Elixir
19
star
17

robostrippy

Python lib to strip websites. Like a robot.
Python
17
star
18

campfirer

Jabber to Campfire gateway
Python
13
star
19

imgproxy

Elixir module to generate imgproxy URLs
Elixir
12
star
20

genderator

A Python library to determine gender based on first name, with i18n support.
Python
12
star
21

toquen

Capistrano + AWS + Chef-Zero
Ruby
11
star
22

gridcli

A command line client for The Grid
Ruby
11
star
23

txyam

Yet Another Memcached (YAM) client for Python Twisted
Python
10
star
24

endon

ActiveRecord type helpers for Elixir's Ecto 3+
Elixir
8
star
25

hubot-aws-sesame

Hubot script to open/close AWS EC2 ports automagically based on chat presence
CoffeeScript
8
star
26

readembedability

Turn unstructured webpages into structured content. Readability + oembed
Python
6
star
27

pubsub.in

Async pubsub broker between twitter/xmpp/email/identi.ca/sms/etc using Python's Twisted
Python
5
star
28

aioipfs-api

IPFS API Bindings for Python 3 using asyncio
Python
5
star
29

clive

Clojure library for interacting with Hive via Thrift
Clojure
4
star
30

pubsubd

Distributed PubSub using Node.js
JavaScript
3
star
31

SassyPy

More featureful CSV handling
Python
3
star
32

aws-sesame

node package to open/close access to servers on AWS by IP like a boss
CoffeeScript
3
star
33

configulator

Generate config files from a template
Ruby
2
star
34

debmeo

oEmbed for Python3
Python
2
star
35

grid-plugin-echo

An example plugin for the grid
Ruby
2
star
36

txairbrake

Report exceptions in Twisted code to an airbrake server
Python
2
star
37

doop

A Hadoop command line utility that acts like a shell.
Shell
2
star
38

ex_aws_s3_crypto

AWS S3 client-side encryption support for Elixir
Elixir
2
star
39

twistler

Controller class extensions for Divmod's Nevow
Python
2
star
40

bizratr

Synthesize business information from many sources
Ruby
1
star
41

Sane.R

A library for making R act sane.
R
1
star
42

robostrippure

Clojure lib to strip websites. Like a robot.
Clojure
1
star
43

blobber

A program that tracks points of light (lasers, LEDs) and projects reactions. The results range from graffiti to various games.
C++
1
star
44

dorsey

A microframework for Go. There are many like it, but this one is mine.
Go
1
star
45

onionvpn

Docker image for a OpenVPN => Tor gateway
Shell
1
star
46

gossipr

Jabber chatroom logger (logs XMPP MUC rooms and provides web interface) using Python Twisted
JavaScript
1
star
47

bmuller.github.io

HTML
1
star
48

oper8r

DEPRECATED - See https://github.com/bmuller/toquen
Ruby
1
star
49

txque

Python library for running asynchronous background jobs using Twisted
Python
1
star
50

grid-plugin-osx-notifier

OSX notifier for new message on the grid http://griddoor.com
Ruby
1
star