{ "cells": [ { "cell_type": "markdown", "id": "09fe27ef", "metadata": {}, "source": [ "# Optimising the timing of paid media spend\n", "\n", "What is the best way of splitting a media budget across the year? [Two weeks ago](/anvil/paid-media-forecasting/) I wrote an introduction to forecasting paid media; in this post I will develop the ideas further to show you how to use a machine learning forecasting model to figure out how much you should spend on a channel across the year.\n", "\n", "The big idea here is that if you have a forecast that uses daily spend as a regressor column (see the [last post](/anvil/paid-media-forecasting/) for more on this) then you can estimate what would happen in the future if you spent different amounts each day e.g. \"what would happen if we spent 10% more on April 12th?\"\n", "\n", "This can be quite useful by itself but you can take things to another level by asking the computer to test lots of different spend levels on each day in order to find the optimal values. If you have a good forecast model then this process can find the perfect balance between the diminishing returns of increasing spend and the fact that at some times of year there is more demand and higher conversion rates. Very cool!\n", "\n", "In this post I will walk you through how to do this. Unfortunately this isn't possible in the Forecast Forge Google Sheets addon because the addon hides a lot of the model details; I'm working on a solution for this at the moment but it is complicated. Instead I will build the forecast in tensorflow like I did with my most recent attempt to improve my [Mariah Carey predictions](/anvil/all-i-want-for-christmas-is-overfitting/).\n", "\n", "For the training data I will use clicks and spend data from the [Google Analytics demo account](https://support.google.com/analytics/answer/6367342). This has the advantage of being public data from a real life Google Ads account. But it has some major disadvantages too as we shall see. If you can give me some data that I can anonymise and make public for use in future demos then I will give you a reduced rate for running the kind of analysis you see in this post; email [fergie@forecastforge.com](mailto:fergie@forecastforge.com) if you are interested in this.\n", "\n", "Start by importing some libraries and loading the data" ] }, { "cell_type": "code", "execution_count": 1, "id": "1d95fb00", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-12-09 12:15:01.609375: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /nix/store/bz317974raly88wakps7h1y7p9l81hgz-gcc-10.3.0-lib/lib:\n", "2021-12-09 12:15:01.609411: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] }, { "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", "
DayClicksCost
02018-01-01302$122.93
12018-01-02299$134.97
22018-01-03332$134.61
32018-01-04345$128.13
42018-01-05358$129.13
............
14192021-11-20581$807.64
14202021-11-21474$746.14
14212021-11-22518$727.00
14222021-11-23295$515.11
1423NaN249,269$284,602.42
\n", "

1424 rows × 3 columns

\n", "
" ], "text/plain": [ " Day Clicks Cost\n", "0 2018-01-01 302 $122.93\n", "1 2018-01-02 299 $134.97\n", "2 2018-01-03 332 $134.61\n", "3 2018-01-04 345 $128.13\n", "4 2018-01-05 358 $129.13\n", "... ... ... ...\n", "1419 2021-11-20 581 $807.64\n", "1420 2021-11-21 474 $746.14\n", "1421 2021-11-22 518 $727.00\n", "1422 2021-11-23 295 $515.11\n", "1423 NaN 249,269 $284,602.42\n", "\n", "[1424 rows x 3 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import tensorflow.compat.v2 as tf\n", "tf.random.set_global_generator(1111)\n", "tf.enable_v2_behavior()\n", "import tensorflow_probability as tfp\n", "import numpy as np\n", "np.random.seed(1234)\n", "\n", "raw = pd.read_csv(\"google-ads-sample.csv\")\n", "raw" ] }, { "cell_type": "markdown", "id": "4a0b03ab", "metadata": {}, "source": [ "I exported far too much data from Google Analytics; in the early years the advertising spend is intermittent with long blocks of no spend at all. It has only been for the last 329 days when there has been consistent activity so we will take this data only for the model.\n", "\n", "In the block below I'm also doing some other tidying up (removing the totals row, and converting everything to a number)" ] }, { "cell_type": "code", "execution_count": 2, "id": "5efe30da", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/run/user/1000/ipykernel_18908/1298462988.py:10: FutureWarning: The default value of regex will change from True to False in a future version.\n", " raw[\"Cost\"] = raw['Cost'].str.replace('[$,]', '').astype(\"float\")\n" ] }, { "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", "
ClicksCost
2020-11-1039.024.93
2020-11-11165.0158.85
2020-11-12107.0164.09
2020-11-13109.0176.69
2020-11-1497.0330.31
.........
2021-11-19495.0759.03
2021-11-20581.0807.64
2021-11-21474.0746.14
2021-11-22518.0727.00
2021-11-23295.0515.11
\n", "

379 rows × 2 columns

\n", "
" ], "text/plain": [ " Clicks Cost\n", "2020-11-10 39.0 24.93\n", "2020-11-11 165.0 158.85\n", "2020-11-12 107.0 164.09\n", "2020-11-13 109.0 176.69\n", "2020-11-14 97.0 330.31\n", "... ... ...\n", "2021-11-19 495.0 759.03\n", "2021-11-20 581.0 807.64\n", "2021-11-21 474.0 746.14\n", "2021-11-22 518.0 727.00\n", "2021-11-23 295.0 515.11\n", "\n", "[379 rows x 2 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import date\n", "# Remove totals row at the end\n", "raw = raw.drop(1423).drop(\"Day\", axis=1)\n", "\n", "# Set data index\n", "ix = pd.date_range(start=date(2018, 1, 1), end=date(2021, 11, 23), freq='D')\n", "raw.index=ix\n", "\n", "# Convert everything to a number\n", "raw[\"Cost\"] = raw['Cost'].str.replace('[$,]', '').astype(\"float\")\n", "raw[\"Clicks\"] = raw[\"Clicks\"].str.replace(',', '').astype(\"float\")\n", "\n", "# Take only the last 379 days of data\n", "raw = raw[-379:]\n", "raw" ] }, { "cell_type": "markdown", "id": "f2175909", "metadata": {}, "source": [ "Let's have a quick look at the data" ] }, { "cell_type": "code", "execution_count": 3, "id": "8a38051e", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "ax = sns.lineplot(data=raw[\"Clicks\"], color=\"blue\")\n", "ax2 = ax.twinx()\n", "sns.lineplot(data=raw[\"Cost\"], ax=ax2, color=\"green\")\n", "import matplotlib.dates as mdates\n", "ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "40ce1e6c", "metadata": {}, "source": [ "It looks like they spent heavily in November through until February and then started up again in October. I have no idea why they would do it like this, but if you worked at Google on this account you would know and you might be able to include this information in the forecast model.\n", "\n", "The main takeaway from me here is that there doesn't seem to be any trend or seasonality in the data; increases in clicks are mostly driven by an increase in spend. This means that a much simpler model without any seasonal components could work well here.\n", "\n", "Let's also check the relationship between the daily cost and the number of clicks:" ] }, { "cell_type": "code", "execution_count": 4, "id": "070d634b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy import stats\n", "\n", "reg = stats.linregress(x=np.log(raw[\"Cost\"]),y=np.log(raw[\"Clicks\"]))\n", "\n", "fig, ax = plt.subplots()\n", "sns.scatterplot(x=raw[\"Cost\"],y=raw[\"Clicks\"], ax=ax)\n", "sns.lineplot(x=raw[\"Cost\"],y=np.exp(reg.intercept)*(raw[\"Cost\"]**reg.slope),ax=ax, color=\"red\")" ] }, { "cell_type": "markdown", "id": "a1337298", "metadata": {}, "source": [ "This shows the expected diminishing returns curve; there are a lot of points on the right where spend has increased by a lot but the number of clicks has increased by proportionally less. There is also an outlier at the top with a very high number of clicks for a fairly low level of spend. I'm going to leave that there and not do anything with it for now but for a real life project this would be something to investigate further.\n", "\n", "The red line on the above chart fits a power curve to the data `y=k*x^alpha`. The values of `k` and `alpha` are printed below. You can use these to optimise spend *but* using a forecasting model can work better because it allows for seasonal variation and trends in these values. I first read about this method of PPC forecasting in a [Search Engine Land post from 2007](https://searchengineland.com/free-tool-for-back-of-the-napkin-paid-search-forecasting-11554)" ] }, { "cell_type": "code", "execution_count": 5, "id": "0ca33d49", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alpha: 0.8214178170507559\n", "k: 0.8148322151838423\n" ] } ], "source": [ "print(\"alpha: \", reg.slope)\n", "print(\"k: \", reg.intercept)" ] }, { "cell_type": "markdown", "id": "da5615db", "metadata": {}, "source": [ "I'd rather use as simple a model as possible for this demo so the model will use two components to predict the **log** of the number of clicks (see the [last post](https://www.forecastforge.com/anvil/paid-media-forecasting/) for more on why we use logs here):\n", "\n", "+ A regression component that uses the **log** of the cost as input\n", "+ A trend component that is meant to represent everything else that is going on. \n", "\n", "I don't think there is much structure in this timeseries so I am going to use a trend component called `LocalLevel` which is like a random walk. This means it can fit historical data quite well with few assumptions but the downside is that when you forecast into the future your best guess for the value of this component for all days is the last value you saw. i.e. the forecast is constant" ] }, { "cell_type": "code", "execution_count": 6, "id": "4ce2136b", "metadata": {}, "outputs": [], "source": [ "def build_model(observed_time_series, cost_regressor):\n", " trend = tfp.sts.LocalLevel(observed_time_series=observed_time_series, \n", " name=\"Trend\"\n", " )\n", " cost = tfp.sts.LinearRegression(design_matrix=tf.reshape(cost_regressor,(-1,1)), \n", " name=\"Cost\" \n", " )\n", " model = tfp.sts.Sum([trend,cost], \n", " observed_time_series=observed_time_series, \n", " constant_offset=0 # forgetting this line cost me hours!\n", " )\n", " return model" ] }, { "cell_type": "markdown", "id": "b1138f6d", "metadata": {}, "source": [ "Now let's train the model on the observed data" ] }, { "cell_type": "code", "execution_count": 7, "id": "485470e0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2021-12-09 12:15:07.570924: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /nix/store/bz317974raly88wakps7h1y7p9l81hgz-gcc-10.3.0-lib/lib:\n", "2021-12-09 12:15:07.570977: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)\n", "2021-12-09 12:15:07.571034: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (abulafia): /proc/driver/nvidia/version does not exist\n", "2021-12-09 12:15:07.571459: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:From /run/user/1000/ipykernel_18908/2609533206.py:26: StructuralTimeSeries.joint_log_prob (from tensorflow_probability.python.sts.structural_time_series) is deprecated and will be removed after 2022-03-01.\n", "Instructions for updating:\n", "Please use `StructuralTimeSeries.joint_distribution(observed_time_series).log_prob`\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n", "WARNING:tensorflow:From /home/fergie/src/notebooks/_build/pip_packages/lib/python3.9/site-packages/tensorflow_probability/python/distributions/distribution.py:342: calling MultivariateNormalDiag.__init__ (from tensorflow_probability.python.distributions.mvn_diag) with scale_identity_multiplier is deprecated and will be removed after 2020-01-01.\n", "Instructions for updating:\n", "`scale_identity_multiplier` is deprecated; please combine it into `scale_diag` directly instead.\n", "WARNING:tensorflow:From /home/fergie/src/notebooks/_build/pip_packages/lib/python3.9/site-packages/tensorflow/python/ops/linalg/linear_operator_block_diag.py:238: LinearOperator.graph_parents (from tensorflow.python.ops.linalg.linear_operator) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Do not call `graph_parents`.\n", "WARNING:tensorflow:@custom_gradient grad_fn has 'variables' in signature, but no ResourceVariables were used on the forward pass.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2021-12-09 12:15:13.000277: I tensorflow/compiler/xla/service/service.cc:171] XLA service 0x95081b0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:\n", "2021-12-09 12:15:13.000336: I tensorflow/compiler/xla/service/service.cc:179] StreamExecutor device (0): Host, Default Version\n", "2021-12-09 12:15:13.189303: W tensorflow/compiler/tf2xla/kernels/random_ops.cc:102] Warning: Using tf.random.uniform with XLA compilation will ignore seeds; consider using tf.random.stateless_uniform instead if reproducible behavior is desired. fit_surrogate_posterior/sanitize_seed/seed\n", "2021-12-09 12:15:13.196494: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:237] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.\n", "2021-12-09 12:15:19.124977: I tensorflow/compiler/jit/xla_compilation_cache.cc:351] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Use a MaskedTimeSeries in case there are any missing values\n", "# \"Missing\" here is most likely to be days with zero clicks\n", "observed = tfp.sts.MaskedTimeSeries(\n", " time_series=np.log(raw[\"Clicks\"]).astype(\"float32\"),\n", " is_missing=np.isinf(np.log(raw[\"Clicks\"]))\n", " )\n", "\n", "# Setup the regressor as the log of the costs\n", "regressor = np.log(raw[\"Cost\"]).astype(\"float32\")\n", "# Rather than negative infinity on days with zero cost, change this to a low number\n", "# I think this shouldn't be necessary because of using the MaskedTimeSeries above\n", "# But best to be safe! I like the belt and braces approach\n", "regressor[regressor == -np.inf] = -1e6\n", "\n", "model = build_model(observed, regressor)\n", "\n", "\n", "# Work the tensorflow magic\n", "variational_posteriors = tfp.sts.build_factored_surrogate_posterior(\n", " model=model)\n", "\n", "num_variational_steps = 200\n", "\n", "# Build and optimize the variational loss function.\n", "elbo_loss_curve = tfp.vi.fit_surrogate_posterior(\n", " target_log_prob_fn=model.joint_log_prob(\n", " observed_time_series=observed),\n", " surrogate_posterior=variational_posteriors,\n", " optimizer=tf.optimizers.Adam(learning_rate=0.1),\n", " num_steps=num_variational_steps,\n", " jit_compile=True)\n", "\n", "plt.plot(elbo_loss_curve)\n", "plt.show()\n", "\n", "# Draw samples from the variational posterior.\n", "q_samples = variational_posteriors.sample(1000)" ] }, { "cell_type": "markdown", "id": "87fe1bc2", "metadata": {}, "source": [ "The loss converges (very quickly!) so we can proceed.\n", "\n", "The variable `q_samples` contains samples from the model parameters" ] }, { "cell_type": "code", "execution_count": 8, "id": "73c0b32e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "odict_keys(['observation_noise_scale', 'Trend/_level_scale', 'Cost/_weights'])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q_samples.keys()" ] }, { "cell_type": "markdown", "id": "cc382457", "metadata": {}, "source": [ "+ `Trend/_level_scale` describes how quickly the `LocalLevel` random walk moves around\n", "+ `Cost/_weights` are the regression coefficiants for the `LinearRegression` component on daily spend\n", "+ `observation_noise_scale` is the amount random variation that isn't covered by the above two components\n", "\n", "The `Cost/_weights` values are particularly interesting. Remember from last week, this determines how hard the account will be hit by diminishing returns on extra spend; values near 1 mean returns do not diminish very much and values near zero mean they diminish a lot. Values above 1 mean that there are increasing (not diminishing!) returns to extra spend.\n", "\n", "Let's look at the distribution of these values" ] }, { "cell_type": "code", "execution_count": 9, "id": "76c8e4fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sns.displot(q_samples['Cost/_weights'].numpy())" ] }, { "cell_type": "code", "execution_count": 10, "id": "e842535f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.55927974" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q_samples['Cost/_weights'].numpy().mean()" ] }, { "cell_type": "markdown", "id": "f0c2ac5e", "metadata": {}, "source": [ "This is about what I would expect; `0.5` is always a good starting point for a guess at this value and the actuals derived from the data are close to it.\n", "\n", "We can also split the trained model back into the individual components. Let's do that to see how the `LocalLevel` trend changes over time" ] }, { "cell_type": "code", "execution_count": 11, "id": "7e0f6cd5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "comps = tfp.sts.decompose_by_component(\n", " model, observed, q_samples\n", ")\n", "component_vals = {k.name: c.mean() for k, c in comps.items()}\n", "sns.lineplot(data=component_vals['Trend/'].numpy())" ] }, { "cell_type": "markdown", "id": "ea6490a8", "metadata": {}, "source": [ "The values on the y-axis here are added to the regressor component each day to give the estimate for the log of the number of clicks. Because of this, we can think of these values as being a *multiplier* on the actual number of clicks (because adding logs is like multiplying).\n", "\n", "Lower values mean everything is multiplied by a smaller number - so you would expect to get fewer clicks for each dollar of ad spend. Higher values mean that everything is working more efficiently and you get more for each dollar of spend.\n", "\n", "With a different model you can expect to see seasonal changes here with, for example, times of year with higher conversion rates getting high values and times of year with little demand getting low values.\n", "\n", "I would need to do further analysis to figure out why Google were getting more efficient advertising around day 325 and why it dropped back again afterwards. It could be to do with them running brand adverts or turning off the display network or something like that.\n", "\n", "The way it is correlated with an increase in spend and clicks makes me worry that there is something going on that the model isn't capturing but I will move on regardless so I can show you the good stuff.\n", "\n", "To optimise the future spend, we need to add the future spend data to the `LinearRegression` component." ] }, { "cell_type": "code", "execution_count": 12, "id": "32034e0a", "metadata": {}, "outputs": [], "source": [ "def build_cost_forecast_model(observed_time_series, cost_regressor, future_costs):\n", " regressor = np.concatenate([cost_regressor,future_costs]) \n", " trend = tfp.sts.LocalLevel(observed_time_series=observed_time_series, \n", " # Names must end with \"/\" for\n", " # tfp.math.value_and_gradients to not throw a fit\n", " name=\"Trend/\"\n", " )\n", " cost = tfp.sts.LinearRegression(design_matrix=tf.reshape(regressor,(-1,1)), \n", " name=\"Cost/\" \n", " )\n", " model = tfp.sts.Sum([trend,cost], \n", " observed_time_series=observed_time_series, \n", " constant_offset=0\n", " )\n", " return model\n", "\n", "# For this notebook, observed and regressor are fixed so we can make\n", "# a function that only requires the future_costs as input\n", "def build_forecast(future_costs):\n", " m1 = build_cost_forecast_model(observed, regressor, future_costs)\n", " forecast_dist = tfp.sts.forecast(\n", " m1,\n", " observed_time_series=observed,\n", " parameter_samples=q_samples,\n", " num_steps_forecast=future_costs.shape[0])\n", " return forecast_dist" ] }, { "cell_type": "markdown", "id": "ebce30aa", "metadata": {}, "source": [ "Let's plot what the model predicts if the spend was to be the same for the next 12 months as it was for the last" ] }, { "cell_type": "code", "execution_count": 13, "id": "0540b13f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /home/fergie/src/notebooks/_build/pip_packages/lib/python3.9/site-packages/tensorflow_probability/python/distributions/distribution.py:342: MultivariateNormalFullCovariance.__init__ (from tensorflow_probability.python.distributions.mvn_full_covariance) is deprecated and will be removed after 2019-12-01.\n", "Instructions for updating:\n", "`MultivariateNormalFullCovariance` is deprecated, use `MultivariateNormalTriL(loc=loc, scale_tril=tf.linalg.cholesky(covariance_matrix))` instead.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Use the last 365 days as input\n", "f = build_forecast(regressor[-365:].values)\n", "\n", "# Reverse the log transform by taking the exponential\n", "forecast_mean = np.exp(f.mean().numpy()[..., 0])\n", "\n", "# Pad the forecast so the days line up with the observed data\n", "padded_forecast = np.pad(forecast_mean,(observed[0].to_numpy().shape[0],0),constant_values=(np.NaN,))\n", "forecast_df = raw[[\"Clicks\"]]\n", "ix = pd.date_range(start=date(2020, 11, 10), end=date(2022, 11, 23), freq='D')\n", "forecast_df = forecast_df.reindex(ix)\n", "forecast_df[\"Forecast\"] = padded_forecast\n", "\n", "# Plot\n", "ax = sns.lineplot(data=forecast_df, dashes=False)\n", "ax.xaxis.set_major_locator(mdates.MonthLocator(interval=6))\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "daae46db", "metadata": {}, "source": [ "There are a couple of things to notice here:\n", "\n", "1. The forecasted values are less \"spikey\" than the training data. This is because a large spike in the training data will be interpreted as partly being caused by random noise (i.e. higher values in the `observation_noise_scale` parameter)\n", "2. The increase in spend at the end of the forecast period does not increase clicks as much as it did in training. This is because the model forecasts a much lower value for the trend than originally occured during this period in the training data.\n", "\n", "You will also see point 1 occuring with most other machine learning forecasting methods. Point 2 is more unique to the trend component I picked for this example; you can get different (and better?) results by being cleverer with this.\n", "\n", "Now we have a forecasting model we can use it to tell what is the optimal amount to spend each day. Basically, we will use machine learning to balance the diminishing returns we get from increasing spend with the fact that some days we expect to be able to spend more efficiently than others.\n", "\n", "The forecasting model we have chosen for this example doesn't have a seasonal component; this means that the optimum amount to spend each day will be the same. Unfortunately this is kind of boring, but it does mean it is easy to verify if the machine learning optimiser has found the right result.\n", "\n", "Suppose we want to optimise spend for the year. The process looks like this at a high level:\n", "\n", "1. Make a function which takes 365 inputs (the spend for each day) and outputs the total return (revenue - costs) for the year\n", "2. Give this function to an \"optimiser\" which is a special piece of software that will find the values of the 365 inputs that maximises the return\n", "\n", "Searching all the possible values for 365 input variables is a lot so the optimiser will be more likely to find a solution if it also knows the *gradient* of the function at a point; you can think of this as telling the optimiser which direction is \"uphill\" so it knows where to go to find the point of maximum return.\n", "\n", "It *should* be possible for the optimisers to work directly with the STS forecast object, but I get much better results by first decomposing the forecast and then using these values to make my own function." ] }, { "cell_type": "code", "execution_count": 14, "id": "cfaad90c", "metadata": {}, "outputs": [], "source": [ "# How many days to optimise\n", "ndays = 365\n", "\n", "f_model = build_cost_forecast_model(observed, \n", " regressor, \n", " # Dummy value here; not important because we only\n", " # want the other components\n", " np.repeat(1,ndays).astype(\"float32\")\n", " )\n", "forecast_dist = tfp.sts.forecast(\n", " f_model,\n", " observed_time_series=observed,\n", " parameter_samples=q_samples,\n", " num_steps_forecast=ndays)\n", "\n", "decomp = tfp.sts.decompose_forecast_by_component(\n", " f_model,\n", " forecast_dist,\n", " q_samples\n", ")" ] }, { "cell_type": "markdown", "id": "c63347d9", "metadata": {}, "source": [ "The variable `decomp` now contains the forecasted values for the other model components. For this example, we only need the trend; for a more complicated model we would need everything *except* the cost component." ] }, { "cell_type": "code", "execution_count": 15, "id": "29561a6d", "metadata": {}, "outputs": [], "source": [ "means = {k.name: c.mean() for k,c in decomp.items()}\n", "trend = means[\"Trend/\"]\n", "# Also store the alpha value in a variable\n", "alpha = q_samples[\"Cost/_weights\"].numpy().mean()" ] }, { "cell_type": "markdown", "id": "92343937", "metadata": {}, "source": [ "Next we can use these values to say what the return would be given a particular pattern of spend.\n", "\n", "Remember that we are working with logs so the revenue we expect is\n", "\n", "```\n", "trend + alpha * log_costs\n", "```\n", "\n", "At this point working with logs can get a bit confusing; I certainly ended up face palming a few times.\n", "\n", "The optimisers we are using don't know that things like daily spend can't be negative so we can't `log` transform the values on the way in and then `exp` them on the way out. Or at least not without moving towards doing some kind of \"constraint optimisation\" which is way more complicated (I hope to look at this is a few weeks because it is necessary for questions like \"I have a budget of $X, how do I split it?\").\n", "\n", "But calculating things like \"total spend\" when all the daily spends are on a log scale gets complicated because doing this the naive way (`np.log(np.sum(np.exp(log_costs)))`) is *numerically unstable*. So in the code below you will see lots of weird tensorflow functions to avoid this." ] }, { "cell_type": "code", "execution_count": 16, "id": "0ea8a221", "metadata": {}, "outputs": [], "source": [ "def function_to_optimise(log_costs):\n", " log_revenue = trend + alpha * log_costs\n", " log_total_revenue = tf.math.reduce_logsumexp(log_revenue)\n", " log_total_spend = tf.math.reduce_logsumexp(log_costs)\n", " difference, sign = tfp.math.log_sub_exp([log_total_revenue], [log_total_spend], return_sign=True)\n", " total = tf.reduce_sum(sign*difference)\n", " return (-total)" ] }, { "cell_type": "markdown", "id": "c24f80a0", "metadata": {}, "source": [ "Another interesting thing about the Google data is that their revenue per click is lower than their cost per click. This is one reason why I'm working with clicks rather than revenue or conversions here (the other is that the data for conversions is very sparse with lots of days with 0 conversions).\n", "\n", "So in the above example we are effectively pretending that their revenue per click is `$1` (i.e. revenue number is the same as the clicks number). Their actual CPC is `$1.41` so in this case we would expect the optimiser to reduce spend down to a level where the forecasted CPC is lower than that.\n", "\n", "To make things a bit more interesting (and perhaps realistic) I'm going to fudge things by adding an extra `1` to the `log_revenue` variable. This is the same as saying they have a revenue per click of `exp(1)=$2.72`.\n", "\n", "So the actual `function_to_optimise` looks like this:" ] }, { "cell_type": "code", "execution_count": 17, "id": "9302e3ba", "metadata": {}, "outputs": [], "source": [ "def function_to_optimise(log_costs):\n", " # Add 1 here\n", " log_revenue = 1 + trend + alpha * log_costs\n", " log_total_revenue = tf.math.reduce_logsumexp(log_revenue)\n", " log_total_spend = tf.math.reduce_logsumexp(log_costs)\n", " difference, sign = tfp.math.log_sub_exp([log_total_revenue], [log_total_spend], return_sign=True)\n", " total = tf.reduce_sum(sign*difference)\n", " return (-total)" ] }, { "cell_type": "markdown", "id": "548a8697", "metadata": {}, "source": [ "One of the nice things about tensorflow is that it will calculate the gradients of this function automatically.\n", "\n", "I am going to show you two different optimisers here. The first is slightly easier to use, but I find it doesn't always work as reliably; particularly if the optimal daily spends are a long way away from what they were last year." ] }, { "cell_type": "code", "execution_count": 18, "id": "d4ccbee9", "metadata": {}, "outputs": [], "source": [ "# This optimiser needs a function that returns a (value, gradient) tuple\n", "def vals_and_grads(x):\n", " return(tfp.math.value_and_gradient(function_to_optimise,x))\n", "\n", "# Use the spend values for the last ndays as a starting point\n", "# Different starting points might give better results!\n", "start = raw[\"Cost\"][-ndays:].to_numpy(dtype=\"float32\")\n", "\n", "# Set a seed so the results are the same\n", "tf.random.set_seed(1234)\n", "\n", "optim_results = tfp.optimizer.bfgs_minimize(\n", " vals_and_grads,\n", " # log transform the cost values to start\n", " initial_position=tf.constant(np.log(start)),\n", " max_iterations=1000\n", " )" ] }, { "cell_type": "markdown", "id": "98281d04", "metadata": {}, "source": [ "If the optimiser has converged successfully then we should see `True` and `False` below:" ] }, { "cell_type": "code", "execution_count": 19, "id": "c041ac22", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'converged': True, 'failed': False}" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{\"converged\":optim_results.converged.numpy(), \"failed\":optim_results.failed.numpy()}" ] }, { "cell_type": "markdown", "id": "bed962e3", "metadata": {}, "source": [ "The algorithm claims to have converged. We can check the results by looking at the suggested daily spend values:" ] }, { "cell_type": "code", "execution_count": 20, "id": "0cc9ff8b", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib.ticker import ScalarFormatter\n", "ax = sns.lineplot(data=optim_results.position.numpy())\n", "ax.yaxis.set_major_formatter(ScalarFormatter(useOffset=False))" ] }, { "cell_type": "markdown", "id": "e41cd3e2", "metadata": {}, "source": [ "These are all quite close together as our outside knowledge of the forecasting model says they should be. But remember that the numbers on the y-axis are on a log scale; `exp(6.175)=$481` and `exp(6.350)=$572` so `bfgs_minimize` is still suggesting a fairly large change in daily spend when we know that the recommendation should be fore the same spend each day.\n", "\n", "An alternative optimiser which can work better for functions with a large number of variables (is 365 a large number?) is the Adam optimiser; this is commonly used for training large neural networks (365 is definitely not a large number in this context!). It is slightly harder to setup but should work for a wider variety of forecasts and starting points." ] }, { "cell_type": "code", "execution_count": 21, "id": "49171318", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Revenue: 397621.25 , Costs: 252977.84 , Return: 144643.4 , Steps: 0\n", "Revenue: 373285.6 , Costs: 213013.28 , Return: 160272.31 , Steps: 10\n", "Revenue: 355179.44 , Costs: 194678.69 , Return: 160500.75 , Steps: 20\n", "Revenue: 357978.12 , Costs: 197362.34 , Return: 160615.78 , Steps: 30\n", "Revenue: 362601.5 , Costs: 201724.2 , Return: 160877.3 , Steps: 40\n", "Revenue: 365516.2 , Costs: 204526.06 , Return: 160990.12 , Steps: 50\n", "Revenue: 366064.22 , Costs: 205054.17 , Return: 161010.05 , Steps: 60\n", "Revenue: 365675.53 , Costs: 204659.92 , Return: 161015.61 , Steps: 70\n", "Revenue: 365441.25 , Costs: 204421.55 , Return: 161019.7 , Steps: 80\n", "Revenue: 365259.72 , Costs: 204238.78 , Return: 161020.94 , Steps: 90\n", "Revenue: 365285.12 , Costs: 204263.5 , Return: 161021.62 , Steps: 100\n" ] } ], "source": [ "# Default learning rate is too low\n", "opt = tf.keras.optimizers.Adam(learning_rate=0.1)\n", "\n", "# Use the same start point but set it up as a tf variable\n", "log_costs = tf.Variable(np.log(start))\n", "\n", "# loss (to be minimised) needs to be a function of this variable\n", "loss = lambda: function_to_optimise(log_costs)\n", "\n", "# initialising some global vars for stopping rules\n", "step_count=0\n", "delta_return=10\n", "total_return=0\n", "\n", "# Set the seed so the results are always the same\n", "tf.random.set_seed(1234)\n", "\n", "# Record the starting point on the first loop\n", "# Useful for seeing how/if the optimiser has\n", "# improved the expected outcome\n", "start_revenue = None\n", "\n", "# while loop keeps optimising until the return is \n", "# changing by only a tiny amount\n", "while (delta_return>1e-12):\n", " old_return = total_return\n", " opt.minimize(loss, log_costs)\n", " log_revenue = 1 + trend + alpha * log_costs\n", " log_total_revenue = tf.math.reduce_logsumexp(log_revenue).numpy()\n", " log_total_cost = tf.math.reduce_logsumexp(log_costs).numpy()\n", " total_return = np.exp(log_total_revenue)-np.exp(log_total_cost)\n", " delta_return = abs(old_return-total_return)\n", " if start_revenue is None:\n", " start_revenue = np.exp(log_total_revenue)\n", " start_cost = np.exp(log_total_cost)\n", " start_return = total_return\n", " # Print out progress every 100 steps\n", " if(step_count % 10 == 0):\n", " print(\"Revenue:\", np.exp(log_total_revenue),\n", " \", Costs:\", np.exp(log_total_cost),\n", " \", Return:\", total_return,\n", " \", Steps:\", step_count \n", " )\n", " step_count = step_count+1\n", "\n", "# Print final result\n", "print(\"Revenue:\", np.exp(log_total_revenue),\n", " \", Costs:\", np.exp(log_total_cost),\n", " \", Return:\", total_return,\n", " \", Steps:\", step_count\n", " )" ] }, { "cell_type": "code", "execution_count": 22, "id": "2a7d8123", "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/markdown": [ "\n", "At the optimum point, revenue (based on our `$2.72` RPC estimate) is down by \n", "`$32,336` \n", "but because the optimiser suggests saving \n", "`$48,714`\n", "in media spend this works out as an overall predicted gain of \n", "`$16,378`\n", ".\n", "\n", "Plot the (log) of the daily spend to see how well the optimiser has worked:\n" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Markdown as md\n", "md(f\"\"\"\n", "At the optimum point, revenue (based on our `$2.72` RPC estimate) is down by \n", "`${start_revenue-np.exp(log_total_revenue):,.0f}` \n", "but because the optimiser suggests saving \n", "`${start_cost-np.exp(log_total_cost):,.0f}`\n", "in media spend this works out as an overall predicted gain of \n", "`${total_return-start_return:,.0f}`\n", ".\n", "\n", "Plot the (log) of the daily spend to see how well the optimiser has worked:\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 23, "id": "ac2f99fa", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ax = sns.lineplot(data=log_costs.numpy())\n", "ax.yaxis.set_major_formatter(ScalarFormatter(useOffset=False))" ] }, { "cell_type": "markdown", "id": "978d0029", "metadata": {}, "source": [ "In this case `Adam` has worked better than `bfgs_minimise` with daily spend recommendations between `exp(6.334)=$563` and `exp(6.320)=$556`.\n", "\n", "This kind of difference between the two different optimisation algorithms is quite common in my experience. Sometimes `bfgs_minimise` absolutely nails it with a perfect solution but other times it can be quite far off. `Adam` struggles to match `bfgs_minimise` at it's best but is also more reliable and generally finds itself in roughly the right area.\n", "\n", "In summary, **if** you have a good forecasting model then you can use it to optimise your daily spend across the year. However, it is *very* important that your forecasting model is good otherwise the optimiser will make recommendations based on false assumptions. For example, this image compares the \"optimised\" spend with the spend for the previous 12 months for a client:\n", "\n", "![](https://www.forecastforge.com/files/too-smooth-forecast.png)\n", "\n", "This has the problem where the forecast is too \"smooth\" so it misses out two important features:\n", "\n", "1. Demand drops off steeply in December\n", "2. It rises again *very* rapidly in the New Year\n", "\n", "In both these cases the forecasting algorithm has not learned how quickly things change so the optimiser ends up recommending that spend is reduced too early in Q4 and then it rises again too slowly in Q1. All this is fixable by tweaking the forecasting algorithm but it underlines how important it is to have a good forecast to start with; this is what allows the optimisers to do good work." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.9.6" } }, "nbformat": 4, "nbformat_minor": 5 }