{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"2022-01-21-vw.ipynb","provenance":[{"file_id":"https://github.com/recohut/nbs/blob/main/raw/T119194%20%7C%20Contextual%20RL%20Product%20Recommender.ipynb","timestamp":1644659711070}],"collapsed_sections":[],"authorship_tag":"ABX9TyNC5ke2GT+lT8iBhdN8FkK/"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"nG-P5CDvH7WG"},"source":["# Contextual Recommender with Vowpal Wabbit"]},{"cell_type":"markdown","metadata":{"id":"4aI3KjKLVsnn"},"source":["We will simulate the scenario of personalizing news content on a site, using CB, to users. The goal is to maximize user engagement quantified by measuring click through rate (CTR).\n","\n","Let's recall that in a CB setting, a data point has four components,\n","- Context\n","- Action\n","- Probability of choosing action\n","- Reward/cost for chosen action\n","\n","We will need to generate a context, get an action/decision for the given context and also simulate generating a reward. We have two website visitors: 'Tom' and 'Anna' Each of them may visit the website either in the morning or in the afternoon. The context is therefore (user, time_of_day). We have the option of recommending a variety of articles to Tom and Anna. Therefore, actions are the different choices of articles: \"politics\", \"sports\", \"music\", \"food\", \"finance\", \"health\", \"cheese\". The reward is whether they click on the article or not: 'click' or 'no click'."]},{"cell_type":"markdown","metadata":{"id":"0X6NWsRBjT5f"},"source":["## Setup"]},{"cell_type":"markdown","metadata":{"id":"y0uVpw69jU4F"},"source":["### Installations"]},{"cell_type":"code","metadata":{"id":"YqOCKRRAjR6T"},"source":["!pip install vowpalwabbit"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"NtQy4OVzjWh3"},"source":["### Imports"]},{"cell_type":"code","metadata":{"id":"_m3opUkTjX7M"},"source":["from vowpalwabbit import pyvw\n","import random\n","import matplotlib.pyplot as plt\n","import pandas as pd\n","import itertools\n","from itertools import product\n","import numpy as np\n","import scipy\n","import scipy.stats as stats"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"yBX5eCYOOc_8"},"source":["## Simulate reward\n","\n","In the real world, we will have to learn Tom and Anna's preferences for articles as we observe their interactions. Since this is a simulation, we will have to define Tom and Anna's preference profile. The reward that we provide to the learner will follow this preference profile. Our hope is to see if the learner can take better and better decisions as we see more samples which in turn means we are maximizing the reward.\n","\n","We will also modify the reward function in a few different ways and see if the CB learner picks up the changes. We will compare the CTR with and without learning.\n","\n","VW optimizes to minimize **cost which is negative of reward**. Therefore, we will always pass negative of reward as cost to VW."]},{"cell_type":"code","metadata":{"id":"NOzs-MMwOc_9"},"source":["# VW tries to minimize loss/cost, therefore we will pass cost as -reward\n","USER_LIKED_ARTICLE = -1.0\n","USER_DISLIKED_ARTICLE = 0.0"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"XQTwsgNMOc_-"},"source":["The reward function below specifies that Tom likes politics in the morning and music in the afternoon whereas Anna likes sports in the morning and politics in the afternoon. It looks dense but we are just simulating our hypothetical world in the format of the feedback the learner understands: cost. If the learner recommends an article that aligns with the reward function, we give a positive reward. In our simulated world this is a click."]},{"cell_type":"code","metadata":{"id":"xpVW_5juOc__"},"source":["def get_cost(context,action):\n"," if context['user'] == \"Tom\":\n"," if context['time_of_day'] == \"morning\" and action == 'politics':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'music':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE\n"," elif context['user'] == \"Anna\":\n"," if context['time_of_day'] == \"morning\" and action == 'sports':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'politics':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"Hh0MYzfeOdAB"},"source":["\n","## Understanding VW format\n","\n","There are some things we need to do to get our input into a format VW understands. This function handles converting from our context as a dictionary, list of articles and the cost if there is one into the text format VW understands.\n"]},{"cell_type":"code","metadata":{"id":"Wn_sVCzxOdAC"},"source":["# This function modifies (context, action, cost, probability) to VW friendly format\n","def to_vw_example_format(context, actions, cb_label = None):\n"," if cb_label is not None:\n"," chosen_action, cost, prob = cb_label\n"," example_string = \"\"\n"," example_string += \"shared |User user={} time_of_day={}\\n\".format(context[\"user\"], context[\"time_of_day\"])\n"," for action in actions:\n"," if cb_label is not None and action == chosen_action:\n"," example_string += \"0:{}:{} \".format(cost, prob)\n"," example_string += \"|Action article={} \\n\".format(action)\n"," #Strip the last newline\n"," return example_string[:-1]"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"el20qcr1OdAD"},"source":["To understand what's going on here let's go through an example. Here, it's the morning and the user is Tom. There are four possible articles. So in the VW format there is one line that starts with shared, this is the shared context, followed by four lines each corresponding to an article."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_Yk4gaXWOdAE","executionInfo":{"status":"ok","timestamp":1634747734282,"user_tz":-330,"elapsed":9,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"0bcbd55e-95d5-4c70-b4a2-cf3c11a63638"},"source":["context = {\"user\":\"Tom\",\"time_of_day\":\"morning\"}\n","actions = [\"politics\", \"sports\", \"music\", \"food\"]\n","\n","print(to_vw_example_format(context,actions))"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shared |User user=Tom time_of_day=morning\n","|Action article=politics \n","|Action article=sports \n","|Action article=music \n","|Action article=food \n"]}]},{"cell_type":"markdown","metadata":{"id":"XNOSmbNgOdAE"},"source":["## Getting a decision\n","\n","When we call VW we get a _pmf_, [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function), as the output. Since we are incorporating exploration into our strategy, VW will give us a list of probabilities over the set of actions. This means that the probability at a given index in the list corresponds to the likelihood of picking that specific action. In order to arrive at a decision/action, we will have to sample from this list.\n","\n","So, given a list `[0.7, 0.1, 0.1, 0.1]`, we would choose the first item with a 70% chance. `sample_custom_pmf` takes such a list and gives us the index it chose and what the probability of choosing that index was."]},{"cell_type":"code","metadata":{"id":"TFpPKrU4OdAF"},"source":["def sample_custom_pmf(pmf):\n"," total = sum(pmf)\n"," scale = 1/total\n"," pmf = [x * scale for x in pmf]\n"," draw = random.random()\n"," sum_prob = 0.0\n"," for index, prob in enumerate(pmf):\n"," sum_prob += prob\n"," if(sum_prob > draw):\n"," return index, prob"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"FGyYUeeVOdAG"},"source":["We have all of the information we need to choose an action for a specific user and context. To use VW to achieve this, we will do the following:\n","\n","1. We convert our context and actions into the text format we need\n","2. We pass this example to vw and get the pmf out\n","3. Now, we sample this pmf to get what article we will end up showing\n","4. Finally we return the article chosen, and the probability of choosing it (we are going to need the probability when we learn form this example)"]},{"cell_type":"code","metadata":{"id":"W9GHrLJjOdAG"},"source":["def get_action(vw, context, actions):\n"," vw_text_example = to_vw_example_format(context,actions)\n"," pmf = vw.predict(vw_text_example)\n"," chosen_action_index, prob = sample_custom_pmf(pmf)\n"," return actions[chosen_action_index], prob"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"pRt4MxDnOdAH"},"source":["\n","\n","## Simulation set up\n","\n","Now that we have done all of the setup work and know how to interface with VW, let's simulate the world of Tom and Anna. The scenario is they go to a website and are shown an article. Remember that the reward function allows us to define the worlds reaction to what VW recommends.\n","\n","\n","We will choose between Tom and Anna uniformly at random and also choose their time of visit uniformly at random. You can think of this as us tossing a coin to choose between Tom and Anna (Anna if heads and Tom if tails) and another coin toss for choosing time of day.\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":204},"id":"fd_g9N5UOdAH","executionInfo":{"status":"ok","timestamp":1634747751750,"user_tz":-330,"elapsed":12,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"9d5106ce-b0ff-4401-968c-46a99915693f"},"source":["users = ['Tom', 'Anna']\n","times_of_day = ['morning', 'afternoon']\n","actions = [\"politics\", \"sports\", \"music\", \"food\", \"finance\", \"health\", \"camping\"]\n","\n","def choose_user(users):\n"," return random.choice(users)\n","\n","def choose_time_of_day(times_of_day):\n"," return random.choice(times_of_day)\n","\n","# display preference matrix\n","def get_preference_matrix(cost_fun):\n"," def expand_grid(data_dict):\n"," rows = itertools.product(*data_dict.values())\n"," return pd.DataFrame.from_records(rows, columns=data_dict.keys())\n","\n"," df = expand_grid({'users':users, 'times_of_day': times_of_day, 'actions': actions})\n"," df['cost'] = df.apply(lambda r: cost_fun({'user': r[0], 'time_of_day': r[1]}, r[2]), axis=1)\n","\n"," return df.pivot_table(index=['users', 'times_of_day'], \n"," columns='actions', \n"," values='cost')\n","\n","get_preference_matrix(get_cost)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
actions
\n","
camping
\n","
finance
\n","
food
\n","
health
\n","
music
\n","
politics
\n","
sports
\n","
\n","
\n","
users
\n","
times_of_day
\n","
\n","
\n","
\n","
\n","
\n","
\n","
\n","
\n"," \n"," \n","
\n","
Anna
\n","
afternoon
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
0.0
\n","
\n","
\n","
morning
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
\n","
\n","
Tom
\n","
afternoon
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
0.0
\n","
0.0
\n","
\n","
\n","
morning
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
0.0
\n","
\n"," \n","
\n","
"],"text/plain":["actions camping finance food health music politics sports\n","users times_of_day \n","Anna afternoon 0.0 0.0 0.0 0.0 0.0 -1.0 0.0\n"," morning 0.0 0.0 0.0 0.0 0.0 0.0 -1.0\n","Tom afternoon 0.0 0.0 0.0 0.0 -1.0 0.0 0.0\n"," morning 0.0 0.0 0.0 0.0 0.0 -1.0 0.0"]},"metadata":{},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"0Z4F7pRzOdAI"},"source":["We will instantiate a CB learner in VW and then simulate Tom and Anna's website visits `num_iterations` number of times. In each visit, we:\n","\n","1. Decide between Tom and Anna\n","2. Decide time of day\n","3. Pass context i.e. (user, time of day) to learner to get action i.e. article recommendation and probability of choosing action\n","4. Receive reward i.e. see if user clicked or not. Remember that cost is just negative reward.\n","5. Format context, action, probability, reward in VW format\n","6. Learn from the example\n"," - VW _reduces_ a CB problem to a cost sensitive multiclass classification problem.\n","\n","This is the same for every one of our simulations, so we define the process in the `run_simulation` function. The cost function must be supplied as this is essentially us simulating how the world works.\n"]},{"cell_type":"code","metadata":{"id":"7Vd-9I-KOdAI"},"source":["def run_simulation(vw, num_iterations, users, times_of_day, actions, cost_function, do_learn = True):\n"," cost_sum = 0.\n"," ctr = []\n","\n"," for i in range(1, num_iterations+1):\n"," # 1. In each simulation choose a user\n"," user = choose_user(users)\n"," # 2. Choose time of day for a given user\n"," time_of_day = choose_time_of_day(times_of_day)\n","\n"," # 3. Pass context to vw to get an action\n"," context = {'user': user, 'time_of_day': time_of_day}\n"," action, prob = get_action(vw, context, actions)\n","\n"," # 4. Get cost of the action we chose\n"," cost = cost_function(context, action)\n"," cost_sum += cost\n","\n"," if do_learn:\n"," # 5. Inform VW of what happened so we can learn from it\n"," vw_format = vw.parse(to_vw_example_format(context, actions, (action, cost, prob)),pyvw.vw.lContextualBandit)\n"," # 6. Learn\n"," vw.learn(vw_format)\n","\n"," # We negate this so that on the plot instead of minimizing cost, we are maximizing reward\n"," ctr.append(-1*cost_sum/i)\n","\n"," return ctr"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"STiQn3KWOdAJ"},"source":["\n","We want to be able to visualize what is occurring, so we are going to plot the click through rate over each iteration of the simulation. If VW is showing actions the get rewards the ctr will be higher. Below is a little utility function to make showing the plot easier.\n"]},{"cell_type":"code","metadata":{"id":"wJxpv72YOdAK"},"source":["def plot_ctr(num_iterations, ctr):\n"," plt.plot(range(1,num_iterations+1), ctr)\n"," plt.xlabel('num_iterations', fontsize=14)\n"," plt.ylabel('ctr', fontsize=14)\n"," plt.ylim([0,1])"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"AVR_H4StOdAK"},"source":["## Scenario 1\n","\n","We will use the first reward function `get_cost` and assume that Tom and Anna do not change their preferences over time and see what happens to user engagement as we learn. We will also see what happens when there is no learning. We will use the \"no learning\" case as our baseline to compare to.\n","\n","### With learning\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"KiWbwzoXOdAL","executionInfo":{"status":"ok","timestamp":1634747758919,"user_tz":-330,"elapsed":1096,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"ceed5a34-03a8-44c1-eac4-2831bec215f2"},"source":["# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations = 5000\n","ctr = run_simulation(vw, num_iterations, users, times_of_day, actions, get_cost)\n","\n","plot_ctr(num_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"M-s1_N1fOdAL"},"source":["Aside: interactions\n","\n","You'll notice in the arguments we supply to VW, **we include `-q UA`**. This is telling VW to create additional features which are the features in the (U)ser namespace and (A)ction namespaces multiplied together. This allows us to learn the interaction between when certain actions are good in certain times of days and for particular users. If we didn't do that, the learning wouldn't really work. We can see that in action below."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"voXxj6dwOdAM","executionInfo":{"status":"ok","timestamp":1634747763631,"user_tz":-330,"elapsed":1765,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"22ddf753-545e-4238-fb6f-be63e5d4c8fc"},"source":["# Instantiate learner in VW but without -q\n","vw = pyvw.vw(\"--cb_explore_adf --quiet --epsilon 0.2\")\n","\n","num_iterations = 5000\n","ctr = run_simulation(vw, num_iterations, users, times_of_day, actions, get_cost)\n","\n","plot_ctr(num_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"7RpLurdyOdAN"},"source":["\n","### Without learning\n","Let's do the same thing again (but with `-q`, but this time show the effect if we don't learn from what happens. The ctr never improves are we just hover around 0.2."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"-agneYrYOdAN","executionInfo":{"status":"ok","timestamp":1634747765089,"user_tz":-330,"elapsed":696,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"046fe1b2-0801-4db6-d15c-ab9609b60b08"},"source":["# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations = 5000\n","ctr = run_simulation(vw, num_iterations, users, times_of_day, actions, get_cost, do_learn=False)\n","\n","plot_ctr(num_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"I6ZyisDnOdAO"},"source":["## Scenario 2\n","\n","In the real world people's preferences change over time. So now in the simulation we are going to incorporate two different cost functions, and swap over to the second one halfway through. Below is a a table of the new reward function we are going to use, `get_cost_1`:\n","\n","### Tom\n","\n","| | `get_cost` | `get_cost_new1` |\n","|:---|:---:|:---:|\n","| **Morning** | Politics | Politics |\n","| **Afternoon** | Music | Sports |\n","\n","### Anna\n","\n","| | `get_cost` | `get_cost_new1` |\n","|:---|:---:|:---:|\n","| **Morning** | Sports | Sports |\n","| **Afternoon** | Politics | Sports |\n","\n","This reward function is still working with actions that the learner has seen previously.\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":204},"id":"5EY5x6FGOdAO","executionInfo":{"status":"ok","timestamp":1634747766985,"user_tz":-330,"elapsed":14,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"434a2190-9dc9-4eae-8e15-c22555ea2ec1"},"source":["def get_cost_new1(context,action):\n"," if context['user'] == \"Tom\":\n"," if context['time_of_day'] == \"morning\" and action == 'politics':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'sports':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE\n"," elif context['user'] == \"Anna\":\n"," if context['time_of_day'] == \"morning\" and action == 'sports':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'sports':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE\n"," \n","get_preference_matrix(get_cost_new1)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
actions
\n","
camping
\n","
finance
\n","
food
\n","
health
\n","
music
\n","
politics
\n","
sports
\n","
\n","
\n","
users
\n","
times_of_day
\n","
\n","
\n","
\n","
\n","
\n","
\n","
\n","
\n"," \n"," \n","
\n","
Anna
\n","
afternoon
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
\n","
\n","
morning
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
\n","
\n","
Tom
\n","
afternoon
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
\n","
\n","
morning
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
-1.0
\n","
0.0
\n","
\n"," \n","
\n","
"],"text/plain":["actions camping finance food health music politics sports\n","users times_of_day \n","Anna afternoon 0.0 0.0 0.0 0.0 0.0 0.0 -1.0\n"," morning 0.0 0.0 0.0 0.0 0.0 0.0 -1.0\n","Tom afternoon 0.0 0.0 0.0 0.0 0.0 0.0 -1.0\n"," morning 0.0 0.0 0.0 0.0 0.0 -1.0 0.0"]},"metadata":{},"execution_count":15}]},{"cell_type":"markdown","metadata":{"id":"sap2wFagOdAP"},"source":["To make it easy to show the effect of the cost function changing we are going to modify the `run_simulation` function. It is a little less readable now, but it supports accepting a list of cost functions and it will operate over each cost function in turn. This is perfect for what we need."]},{"cell_type":"code","metadata":{"id":"nVmE_UkFOdAP"},"source":["def run_simulation_multiple_cost_functions(vw, num_iterations, users, times_of_day, actions, cost_functions, do_learn = True):\n"," cost_sum = 0.\n"," ctr = []\n","\n"," start_counter = 1\n"," end_counter = start_counter + num_iterations\n"," for cost_function in cost_functions:\n"," for i in range(start_counter, end_counter):\n"," # 1. in each simulation choose a user\n"," user = choose_user(users)\n"," # 2. choose time of day for a given user\n"," time_of_day = choose_time_of_day(times_of_day)\n","\n"," # Construct context based on chosen user and time of day\n"," context = {'user': user, 'time_of_day': time_of_day}\n","\n"," # 3. Use the get_action function we defined earlier\n"," action, prob = get_action(vw, context, actions)\n","\n"," # 4. Get cost of the action we chose\n"," cost = cost_function(context, action)\n"," cost_sum += cost\n","\n"," if do_learn:\n"," # 5. Inform VW of what happened so we can learn from it\n"," vw_format = vw.parse(to_vw_example_format(context, actions, (action, cost, prob)),pyvw.vw.lContextualBandit)\n"," # 6. Learn\n"," vw.learn(vw_format)\n","\n"," # We negate this so that on the plot instead of minimizing cost, we are maximizing reward\n"," ctr.append(-1*cost_sum/i)\n"," start_counter = end_counter\n"," end_counter = start_counter + num_iterations\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"0O--0JpdOdAQ"},"source":["def run_simulation_multiple_cost_functions(vw, num_iterations, users, times_of_day, actions, cost_functions, do_learn = True):\n"," cost_sum = 0.\n"," ctr = []\n","\n"," start_counter = 1\n"," end_counter = start_counter + num_iterations\n"," for cost_function in cost_functions:\n"," for i in range(start_counter, end_counter):\n"," # 1. in each simulation choose a user\n"," user = choose_user(users)\n"," # 2. choose time of day for a given user\n"," time_of_day = choose_time_of_day(times_of_day)\n","\n"," # Construct context based on chosen user and time of day\n"," context = {'user': user, 'time_of_day': time_of_day}\n","\n"," # 3. Use the get_action function we defined earlier\n"," action, prob = get_action(vw, context, actions)\n","\n"," # 4. Get cost of the action we chose\n"," cost = cost_function(context, action)\n"," cost_sum += cost\n","\n"," if do_learn:\n"," # 5. Inform VW of what happened so we can learn from it\n"," vw_format = vw.parse(to_vw_example_format(context, actions, (action, cost, prob)),pyvw.vw.lContextualBandit)\n"," # 6. Learn\n"," vw.learn(vw_format)\n","\n"," # We negate this so that on the plot instead of minimizing cost, we are maximizing reward\n"," ctr.append(-1*cost_sum/i)\n"," start_counter = end_counter\n"," end_counter = start_counter + num_iterations\n","\n"," return ctr"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"FqGuu9aiOdAQ"},"source":["### With learning\n","Let us now switch to the second reward function after a few samples (running the first reward function). Recall that this reward function changes the preferences of the web users but it is still working with the same action space as before. We should see the learner pick up these changes and optimize towards the new preferences.\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"F1pAQ0ecOdAR","executionInfo":{"status":"ok","timestamp":1634747775296,"user_tz":-330,"elapsed":2310,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"645f59c4-a4e4-41a2-a3c4-d44bb46795ef"},"source":["# use first reward function initially and then switch to second reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new1]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, times_of_day, actions, cost_functions)\n","\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"rv_kVQU_OdAR"},"source":["**Note:** The initial spike in CTR depends on the rewards received for the first few examples. When you run on your own, you may see something different initially because our simulator is designed to have randomness.\n","\n","### Without learning"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"KPXXayj8OdAR","executionInfo":{"status":"ok","timestamp":1634747776303,"user_tz":-330,"elapsed":1016,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"256a29bd-17bd-4e94-ad02-aa79b525f293"},"source":["# Do not learn\n","# use first reward function initially and then switch to second reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new1]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, times_of_day, actions, cost_functions, do_learn=False)\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"O8zluZecOdAS"},"source":["## Scenario 3\n","In this scenario we are going to start rewarding actions that have never seen a reward previously when we change the cost function.\n","\n","### Tom\n","\n","| | `get_cost` | `get_cost_new2` |\n","|:---|:---:|:---:|\n","| **Morning** | Politics | Politics|\n","| **Afternoon** | Music | Food |\n","\n","### Anna\n","\n","| | `get_cost` | `get_cost_new2` |\n","|:---|:---:|:---:|\n","| **Morning** | Sports | Food|\n","| **Afternoon** | Politics | Food |\n"]},{"cell_type":"code","metadata":{"id":"AzmkXtSOOdAS"},"source":["def get_cost_new2(context,action):\n"," if context['user'] == \"Tom\":\n"," if context['time_of_day'] == \"morning\" and action == 'politics':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'food':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE\n"," elif context['user'] == \"Anna\":\n"," if context['time_of_day'] == \"morning\" and action == 'food':\n"," return USER_LIKED_ARTICLE\n"," elif context['time_of_day'] == \"afternoon\" and action == 'food':\n"," return USER_LIKED_ARTICLE\n"," else:\n"," return USER_DISLIKED_ARTICLE"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"hyqhA3WFOdAS"},"source":["\n","### With learning\n","Let us now switch to the third reward function after a few samples (running the first reward function). Recall that this reward function changes the preferences of the users and is working with a **different** action space than before. We should see the learner pick up these changes and optimize towards the new preferences\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"VIh8qkMcOdAT","executionInfo":{"status":"ok","timestamp":1634747780582,"user_tz":-330,"elapsed":1899,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"9666899d-9a7c-4cb5-aad3-f0c2de5c8918"},"source":["# use first reward function initially and then switch to third reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new2]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, times_of_day, actions, cost_functions)\n","\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"a-PpzgP_OdAT"},"source":["### Without Learning"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"XuE1kVH6OdAU","executionInfo":{"status":"ok","timestamp":1634747782889,"user_tz":-330,"elapsed":830,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"bcc22ee6-f8e0-40f3-97e9-ec24e9ab7b43"},"source":["# Do not learn\n","# use first reward function initially and then switch to third reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new2]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, times_of_day, actions, cost_functions, do_learn=False)\n","\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"wDoMeJ8rOdAU"},"source":["This section aimed at showcasing a real world scenario where contextual bandit algorithms can be used. We were able to take a context and set of actions and learn what actions worked best for a given context. We saw that the learner was able to respond rapidly to changes in the world. We showed that allowing the learner to interact with the world resulted in higher rewards than the no learning baseline. We worked with simplistic features. VW supports high dimensional sparse features, different exploration algorithms and policy evaluation approaches."]},{"cell_type":"markdown","metadata":{"id":"CJk-yZDQjZMX"},"source":["## Contextual bandit with changing context\n","\n","> Customizing the context and changing it midway to see how fast the agent can adapt to the new context and start recommending better products as per the context"]},{"cell_type":"markdown","metadata":{"id":"V9D8ePsikWAv"},"source":["### Setting the context"]},{"cell_type":"markdown","metadata":{"id":"-9UvUHeflfz5"},"source":["We have 3 users and 6 items. Context 1 is time of day - morning and evening. Context 2 is season - summer and winter.\n","\n","Ground truth rules:\n","\n","1. User 1 likes Item 1 in morning, and Item 6 in summer\n","2. User 2 likes Item 2 in winter, and Item 5 in summer morning\n","3. User 3 likes Item 2 in morning, Item 3 in evening, and item 4 in winter morning"]},{"cell_type":"code","metadata":{"id":"uP6Qy9upkX9x"},"source":["USER_LIKED_ARTICLE = -1.0\n","USER_DISLIKED_ARTICLE = 0.0"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"lyLnQ1ERkZhh"},"source":["users = ['A','B','C']\n","items = ['Item1','Item2','Item3','Item4','Item5','Item6']\n","context1 = ['morning','evening']\n","context2 = ['summer','winter']\n","\n","context = pd.DataFrame(list(product(users, context1, context2, items)), columns=['users', 'context1', 'context2', 'items'])\n","context['reward'] = 0\n","\n","#user 1 likes Item 1 in morning, and Item 6 in summer\n","context.loc[(context.users=='A') & \\\n"," (context.context1=='morning') & \\\n"," (context['items']=='Item1'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='A') & \\\n"," (context.context2=='summer') & \\\n"," (context['items']=='Item6'), \\\n"," 'reward'] = 1\n","\n","#user 2 likes Item 2 in winter, and Item 5 in summer morning\n","context.loc[(context.users=='B') & \\\n"," (context.context2=='winter') & \\\n"," (context['items']=='Item2'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='B') & \\\n"," (context.context1=='morning') & \\\n"," (context.context2=='summer') & \\\n"," (context['items']=='Item5'), \\\n"," 'reward'] = 1\n","\n","\n","#user 3 likes Item 2 in morning, Item 3 in evening, and item 4 in winter morning\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='morning') & \\\n"," (context['items']=='Item2'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='evening') & \\\n"," (context['items']=='Item3'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='morning') & \\\n"," (context.context2=='winter') & \\\n"," (context['items']=='Item4'), \\\n"," 'reward'] = 1\n","\n","context['cost'] = context['reward']*-1\n","\n","contextdf = context.copy()"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"gGiJWfhtkc9_","executionInfo":{"status":"ok","timestamp":1634747969054,"user_tz":-330,"elapsed":1929,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"8740bf12-79d9-42d2-a96f-494395009429"},"source":["contextdf.cost.value_counts()"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" 0 60\n","-1 12\n","Name: cost, dtype: int64"]},"metadata":{},"execution_count":27}]},{"cell_type":"markdown","metadata":{"id":"Jodzh1ofkl5X"},"source":["### Cost function util"]},{"cell_type":"code","metadata":{"id":"MSfJOXwMktkA"},"source":["def get_cost(context,action):\n"," return contextdf.loc[(contextdf['users']==context['user']) & \\\n"," (contextdf.context1==context['context1']) & \\\n"," (contextdf.context2==context['context2']) & \\\n"," (contextdf['items']==action), \\\n"," 'cost'].values[0]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Yy89o4afkvYy","executionInfo":{"status":"ok","timestamp":1634748013910,"user_tz":-330,"elapsed":702,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"36cc4b90-f560-4dcc-b41e-8b664437cec6"},"source":["get_cost({'user':'A','context1':'morning','context2':'summer'},'Item2')"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0"]},"metadata":{},"execution_count":29}]},{"cell_type":"markdown","metadata":{"id":"apj4zt0_kw00"},"source":["### Vowpalwabbit format util"]},{"cell_type":"code","metadata":{"id":"xJ9laRJGkzSD"},"source":["# This function modifies (context, action, cost, probability) to VW friendly format\n","def to_vw_example_format(context, actions, cb_label = None):\n"," if cb_label is not None:\n"," chosen_action, cost, prob = cb_label\n"," example_string = \"\"\n"," example_string += \"shared |User users={} context1={} context2={}\\n\".format(context[\"user\"], context[\"context1\"], context[\"context2\"])\n"," for action in actions:\n"," if cb_label is not None and action == chosen_action:\n"," example_string += \"0:{}:{} \".format(cost, prob)\n"," example_string += \"|Action items={} \\n\".format(action)\n"," #Strip the last newline\n"," return example_string[:-1]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"BrASk6IPk007","executionInfo":{"status":"ok","timestamp":1634748035616,"user_tz":-330,"elapsed":693,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"ab6dbbbd-b935-4e9a-846b-c572b5906279"},"source":["context = {\"user\":\"A\",\"context1\":\"morning\",\"context2\":\"summer\"}\n","\n","print(to_vw_example_format(context,items))"],"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shared |User users=A context1=morning context2=summer\n","|Action items=Item1 \n","|Action items=Item2 \n","|Action items=Item3 \n","|Action items=Item4 \n","|Action items=Item5 \n","|Action items=Item6 \n"]}]},{"cell_type":"code","metadata":{"id":"ez2lyHNCk2u2"},"source":["def sample_custom_pmf(pmf):\n"," total = sum(pmf)\n"," scale = 1 / total\n"," pmf = [x * scale for x in pmf]\n"," draw = random.random()\n"," sum_prob = 0.0\n"," for index, prob in enumerate(pmf):\n"," sum_prob += prob\n"," if(sum_prob > draw):\n"," return index, prob"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"ZflJA3J0k8hP"},"source":["def get_action(vw, context, actions):\n"," vw_text_example = to_vw_example_format(context,actions)\n"," pmf = vw.predict(vw_text_example)\n"," chosen_action_index, prob = sample_custom_pmf(pmf)\n"," return actions[chosen_action_index], prob\n","\n","\n","def choose_user(users):\n"," return random.choice(users)\n","\n","def choose_context1(context1):\n"," return random.choice(context1)\n","\n","def choose_context2(context2):\n"," return random.choice(context2)\n","\n","\n","def run_simulation(vw, num_iterations, users, contexts1, contexts2, actions, cost_function, do_learn = True):\n"," cost_sum = 0.\n"," ctr = []\n","\n"," for i in range(1, num_iterations+1):\n"," user = choose_user(users)\n"," context1 = choose_context1(contexts1)\n"," context2 = choose_context2(contexts2)\n","\n"," context = {'user': user, 'context1': context1, 'context2': context2}\n"," # print(context)\n"," action, prob = get_action(vw, context, actions)\n"," # print(action, prob)\n","\n"," cost = cost_function(context, action)\n"," # print(cost)\n"," cost_sum += cost\n","\n"," if do_learn:\n"," # 5. Inform VW of what happened so we can learn from it\n"," vw_format = vw.parse(to_vw_example_format(context, actions, (action, cost, prob)),pyvw.vw.lContextualBandit)\n"," # 6. Learn\n"," vw.learn(vw_format)\n"," # 7. Let VW know you're done with these objects\n"," vw.finish_example(vw_format)\n","\n"," # We negate this so that on the plot instead of minimizing cost, we are maximizing reward\n"," ctr.append(-1*cost_sum/i)\n","\n"," return ctr\n","\n","\n","def plot_ctr(num_iterations, ctr):\n"," plt.plot(range(1,num_iterations+1), ctr)\n"," plt.xlabel('num_iterations', fontsize=14)\n"," plt.ylabel('ctr', fontsize=14)\n"," plt.ylim([0,1])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"LFnJ5I2XlFR0","executionInfo":{"status":"ok","timestamp":1634748123342,"user_tz":-330,"elapsed":5744,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"0e809d4d-f955-46af-aec6-d4ae11bb0e73"},"source":["# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations = 5000\n","ctr = run_simulation(vw, num_iterations, users, context1, context2, items, get_cost)\n","\n","plot_ctr(num_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"UIhoP-rjlK0G","executionInfo":{"status":"ok","timestamp":1634748136550,"user_tz":-330,"elapsed":6353,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"11dc0681-d65d-4e14-b8a9-56a48ec7c5ed"},"source":["# Instantiate learner in VW but without -q\n","vw = pyvw.vw(\"--cb_explore_adf --quiet --epsilon 0.2\")\n","\n","num_iterations = 5000\n","ctr = run_simulation(vw, num_iterations, users, context1, context2, items, get_cost)\n","\n","plot_ctr(num_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"RwaRHglwlow_"},"source":["### Changing the context\n","\n","Updated ground truth rules:\n","\n","1. User 1 likes Item 2 in morning, and Item 5 in summer\n","2. User 2 likes Item 2 in summer, and Item 5 in morning\n","3. User 3 likes Item 4 in morning, Item 3 in evening, and item 4 in winter evening"]},{"cell_type":"code","metadata":{"id":"y_PbP3ZMlQQR"},"source":["users = ['A','B','C']\n","items = ['Item1','Item2','Item3','Item4','Item5','Item6']\n","context1 = ['morning','evening']\n","context2 = ['summer','winter']\n","\n","context = pd.DataFrame(list(product(users, context1, context2, items)), columns=['users', 'context1', 'context2', 'items'])\n","context['reward'] = 0\n","\n","#user 1 likes Item 2 in morning, and Item 5 in summer\n","context.loc[(context.users=='A') & \\\n"," (context.context1=='morning') & \\\n"," (context['items']=='Item2'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='A') & \\\n"," (context.context2=='summer') & \\\n"," (context['items']=='Item5'), \\\n"," 'reward'] = 1\n","\n","#user 2 likes Item 2 in summer, and Item 5 in morning\n","context.loc[(context.users=='B') & \\\n"," (context.context2=='summer') & \\\n"," (context['items']=='Item2'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='B') & \\\n"," (context.context1=='morning') & \\\n"," (context['items']=='Item5'), \\\n"," 'reward'] = 1\n","\n","\n","#user 3 likes Item 4 in morning, Item 3 in evening, and item 4 in winter evening\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='morning') & \\\n"," (context['items']=='Item4'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='evening') & \\\n"," (context['items']=='Item3'), \\\n"," 'reward'] = 1\n","context.loc[(context.users=='C') & \\\n"," (context.context1=='evening') & \\\n"," (context.context2=='winter') & \\\n"," (context['items']=='Item4'), \\\n"," 'reward'] = 1\n","\n","context['cost'] = context['reward']*-1\n","\n","contextdf_new = context.copy()\n","\n","def get_cost_new1(context,action):\n"," return contextdf_new.loc[(contextdf_new['users']==context['user']) & \\\n"," (contextdf_new.context1==context['context1']) & \\\n"," (contextdf_new.context2==context['context2']) & \\\n"," (contextdf_new['items']==action), \\\n"," 'cost'].values[0]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"giMJGBc_lTPH"},"source":["def run_simulation_multiple_cost_functions(vw, num_iterations, users, contexts1, contexts2, actions, cost_functions, do_learn = True):\n"," cost_sum = 0.\n"," ctr = []\n","\n"," start_counter = 1\n"," end_counter = start_counter + num_iterations\n"," for cost_function in cost_functions:\n"," for i in range(start_counter, end_counter):\n"," user = choose_user(users)\n"," context1 = choose_context1(contexts1)\n"," context2 = choose_context2(contexts2)\n","\n"," context = {'user': user, 'context1': context1, 'context2': context2}\n"," \n"," action, prob = get_action(vw, context, actions)\n"," cost = cost_function(context, action)\n"," cost_sum += cost\n","\n"," if do_learn:\n"," vw_format = vw.parse(to_vw_example_format(context, actions, (action, cost, prob)),pyvw.vw.lContextualBandit)\n"," vw.learn(vw_format)\n","\n"," ctr.append(-1*cost_sum/i)\n"," start_counter = end_counter\n"," end_counter = start_counter + num_iterations\n","\n"," return ctr"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"oer_Vp8SlUsu","executionInfo":{"status":"ok","timestamp":1634748177369,"user_tz":-330,"elapsed":12390,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"c77cba28-8ad5-40e7-8edb-6d22a46986ab"},"source":["# use first reward function initially and then switch to second reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new1]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, context1, context2, items, cost_functions)\n","\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":287},"id":"p7LbRqzElWgc","executionInfo":{"status":"ok","timestamp":1634748188707,"user_tz":-330,"elapsed":11393,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"8fc30f58-d9ab-4eac-ab68-a02c050c0d1b"},"source":["# Do not learn\n","# use first reward function initially and then switch to second reward function\n","\n","# Instantiate learner in VW\n","vw = pyvw.vw(\"--cb_explore_adf -q UA --quiet --epsilon 0.2\")\n","\n","num_iterations_per_cost_func = 5000\n","cost_functions = [get_cost, get_cost_new1]\n","total_iterations = num_iterations_per_cost_func * len(cost_functions)\n","\n","ctr = run_simulation_multiple_cost_functions(vw, num_iterations_per_cost_func, users, context1, context2, items, cost_functions, do_learn=False)\n","plot_ctr(total_iterations, ctr)"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["