{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Identifying Right AD Banner Using MAB" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "Let us say you are running a website and you have five different banners for the same ad and you want to know which banner attracts the user? We model this problem statement as a bandit problem. Let us say these five banners are five bandits and we assign reward 1 if the user clicks the ad and reward 0 if the user does not click the ad.\n", "\n", "In a normal A/B testing, we perform complete exploration of all these five banners alone before deciding which banner is the best. But that will cost us lot of regret. Instead, we will use good exploration strategy for deciding which banner will give us most rewards (most clicks)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ " First, let us import necessary libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[2018-06-01 12:43:31,568] Making new env: BanditTenArmedGaussian-v0\n" ] } ], "source": [ "import gym_bandits\n", "import gym\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import seaborn as sns\n", "env = gym.make(\"BanditTenArmedGaussian-v0\")" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "scrolled": true }, "source": [ "Let us simulate a dataset with 5*10000 as shape where the column is the ad banner type and rows are either 0 or 1 i.e whether the ad has been clicked or not clicked by the user respectively\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame()\n", "df['Banner_type_0'] = np.random.randint(0,2,100000)\n", "df['Banner_type_1'] = np.random.randint(0,2,100000)\n", "df['Banner_type_2'] = np.random.randint(0,2,100000)\n", "df['Banner_type_3'] = np.random.randint(0,2,100000)\n", "df['Banner_type_4'] = np.random.randint(0,2,100000)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Banner_type_0Banner_type_1Banner_type_2Banner_type_3Banner_type_4
000000
101011
210011
311110
401101
510101
600010
701110
801101
901111
\n", "
" ], "text/plain": [ " Banner_type_0 Banner_type_1 Banner_type_2 Banner_type_3 Banner_type_4\n", "0 0 0 0 0 0\n", "1 0 1 0 1 1\n", "2 1 0 0 1 1\n", "3 1 1 1 1 0\n", "4 0 1 1 0 1\n", "5 1 0 1 0 1\n", "6 0 0 0 1 0\n", "7 0 1 1 1 0\n", "8 0 1 1 0 1\n", "9 0 1 1 1 1" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let us initialize necessary variables" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# number of banners\n", "num_banner = 5\n", "\n", "# number of iterations\n", "no_of_iterations = 100000\n", "\n", "# list for storing banners which are selected\n", "banner_selected = []\n", "\n", "# count number of times the banner was selected\n", "count = np.zeros(num_banner)\n", "\n", "# Q value of the banner\n", "Q = np.zeros(num_banner)\n", "\n", "# sum of rewards obtained by the banner\n", "sum_rewards = np.zeros(num_banner)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Now we define the epsilon greedy policy" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def epsilon_greedy(epsilon):\n", " \n", " random_value = np.random.random()\n", " choose_random = random_value < epsilon\n", " \n", " if choose_random:\n", " action = np.random.choice(num_banner)\n", " else:\n", " action = np.argmax(Q)\n", " \n", " return action\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "for i in range(no_of_iterations):\n", " \n", " # select the banner using epsilon greedy policy\n", " banner = epsilon_greedy(0.5)\n", " \n", " # get the reward\n", " reward = df.values[i, banner]\n", " \n", " # update the selected banner count\n", " count[banner] += 1\n", " \n", " # sum the rewards obtained by that banner\n", " sum_rewards[banner]+=reward\n", " \n", " # calculate the Q value of the banner\n", " Q[banner] = sum_rewards[banner]/count[banner]\n", " \n", " banner_selected.append(banner)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot and see which banner type gives us most clicks(rewards)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.distplot(banner_selected)" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:universe]", "language": "python", "name": "conda-env-universe-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.4" } }, "nbformat": 4, "nbformat_minor": 2 }