{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "Tce3stUlHN0L" }, "source": [ "##### Copyright 2023 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2025-02-26T12:05:34.142530Z", "iopub.status.busy": "2025-02-26T12:05:34.142096Z", "iopub.status.idle": "2025-02-26T12:05:34.145903Z", "shell.execute_reply": "2025-02-26T12:05:34.145343Z" }, "id": "tuOe1ymfHZPu" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "36EdAGhThQov" }, "source": [ "# Uplifting with Decision Forests\n", "\n", "\n", " \n", " \n", " \n", " \n", "
\n", " View on TensorFlow.org\n", " \n", " Run in Google Colab\n", " \n", " View on GitHub\n", " \n", " Download notebook\n", "
\n" ] }, { "cell_type": "markdown", "metadata": { "id": "2j8GzKvfVvF8" }, "source": [ "Welcome to the *Uplifting* Tutorial for TensorFlow Decision Forests (TF-DF). In this tutorial, you will learn what uplifting is, why it is so important, and how to do it in TF-DF.\n", "\n", "This tutorial assumes you are familiar with the fundaments of TF-DF, in particular the installation procedure. The [beginner tutorial](https://www.tensorflow.org/decision_forests/tutorials/beginner_colab) is a great place to start learning about TF-DF.\n", "\n", "In this colab, you will:\n", "\n", "- Learn what an uplift modeling is.\n", "- Train a Uplift Random Forest model on the **Hillstrom Email Marketing** dataset.\n", "- Evaluate the quality of this model.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "MQIPhTQVW19g" }, "source": [ "## Installing TensorFlow Decision Forests\n", "\n", "Install TF-DF by running the following cell.\n", "\n", "[Wurlitzer](https://pypi.org/project/wurlitzer/) is needed to display the detailed training logs in Colabs (when using `verbose=2` in the model constructor).\n", "\n", "Tensorflow Datasets is needed download the dataset used in this tutorial." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:34.148710Z", "iopub.status.busy": "2025-02-26T12:05:34.148172Z", "iopub.status.idle": "2025-02-26T12:05:36.720368Z", "shell.execute_reply": "2025-02-26T12:05:36.719589Z" }, "id": "oiz5HmMyWxgd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting tensorflow_decision_forests\r\n", " Using cached tensorflow_decision_forests-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.0 kB)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Collecting wurlitzer\r\n", " Using cached wurlitzer-3.1.1-py3-none-any.whl.metadata (2.5 kB)\r\n", "Requirement already satisfied: tensorflow-datasets in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (4.9.3)\r\n", "Requirement already satisfied: numpy in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (2.0.2)\r\n", "Requirement already satisfied: pandas in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (2.2.3)\r\n", "Requirement already satisfied: tensorflow==2.18.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (2.18.0)\r\n", "Requirement already satisfied: six in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (1.17.0)\r\n", "Requirement already satisfied: absl-py in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (2.1.0)\r\n", "Requirement already satisfied: wheel in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (0.45.1)\r\n", "Requirement already satisfied: tf-keras~=2.17 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow_decision_forests) (2.18.0)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Collecting ydf (from tensorflow_decision_forests)\r\n", " Using cached ydf-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.5 kB)\r\n", "Requirement already satisfied: astunparse>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (1.6.3)\r\n", "Requirement already satisfied: flatbuffers>=24.3.25 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (25.2.10)\r\n", "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (0.6.0)\r\n", "Requirement already satisfied: google-pasta>=0.1.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (0.2.0)\r\n", "Requirement already satisfied: libclang>=13.0.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (18.1.1)\r\n", "Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (3.4.0)\r\n", "Requirement already satisfied: packaging in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (24.2)\r\n", "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (3.20.3)\r\n", "Requirement already satisfied: requests<3,>=2.21.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (2.32.3)\r\n", "Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (75.8.1)\r\n", "Requirement already satisfied: termcolor>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (2.5.0)\r\n", "Requirement already satisfied: typing-extensions>=3.6.6 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (4.12.2)\r\n", "Requirement already satisfied: wrapt>=1.11.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (1.17.2)\r\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (1.71.0rc2)\r\n", "Requirement already satisfied: tensorboard<2.19,>=2.18 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (2.18.0)\r\n", "Requirement already satisfied: keras>=3.5.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (3.8.0)\r\n", "Requirement already satisfied: h5py>=3.11.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (3.13.0)\r\n", "Requirement already satisfied: ml-dtypes<0.5.0,>=0.4.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (0.4.1)\r\n", "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.18.0->tensorflow_decision_forests) (0.37.1)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: array-record in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (0.5.1)\r\n", "Requirement already satisfied: click in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (8.1.8)\r\n", "Requirement already satisfied: dm-tree in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (0.1.8)\r\n", "Requirement already satisfied: etils>=0.9.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from etils[enp,epath,etree]>=0.9.0->tensorflow-datasets) (1.5.2)\r\n", "Requirement already satisfied: promise in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (2.3)\r\n", "Requirement already satisfied: psutil in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (7.0.0)\r\n", "Requirement already satisfied: tensorflow-metadata in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (1.16.1)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: toml in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (0.10.2)\r\n", "Requirement already satisfied: tqdm in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow-datasets) (4.67.1)\r\n", "Requirement already satisfied: fsspec in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from etils[enp,epath,etree]>=0.9.0->tensorflow-datasets) (2025.2.0)\r\n", "Requirement already satisfied: importlib_resources in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from etils[enp,epath,etree]>=0.9.0->tensorflow-datasets) (6.5.2)\r\n", "Requirement already satisfied: zipp in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from etils[enp,epath,etree]>=0.9.0->tensorflow-datasets) (3.21.0)\r\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorflow==2.18.0->tensorflow_decision_forests) (3.4.1)\r\n", "Requirement already satisfied: idna<4,>=2.5 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorflow==2.18.0->tensorflow_decision_forests) (3.10)\r\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorflow==2.18.0->tensorflow_decision_forests) (2.3.0)\r\n", "Requirement already satisfied: certifi>=2017.4.17 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorflow==2.18.0->tensorflow_decision_forests) (2025.1.31)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: python-dateutil>=2.8.2 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from pandas->tensorflow_decision_forests) (2.9.0.post0)\r\n", "Requirement already satisfied: pytz>=2020.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from pandas->tensorflow_decision_forests) (2025.1)\r\n", "Requirement already satisfied: tzdata>=2022.7 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from pandas->tensorflow_decision_forests) (2025.1)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO: pip is looking at multiple versions of ydf to determine which version is compatible with other requirements. This could take a while.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Downloading ydf-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.2 kB)\r\n", "Requirement already satisfied: rich in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (13.9.4)\r\n", "Requirement already satisfied: namex in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (0.0.8)\r\n", "Requirement already satisfied: optree in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (0.14.0)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.19,>=2.18->tensorflow==2.18.0->tensorflow_decision_forests) (3.7)\r\n", "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.19,>=2.18->tensorflow==2.18.0->tensorflow_decision_forests) (0.7.2)\r\n", "Requirement already satisfied: werkzeug>=1.0.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.19,>=2.18->tensorflow==2.18.0->tensorflow_decision_forests) (3.1.3)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: importlib-metadata>=4.4 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from markdown>=2.6.8->tensorboard<2.19,>=2.18->tensorflow==2.18.0->tensorflow_decision_forests) (8.6.1)\r\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from werkzeug>=1.0.1->tensorboard<2.19,>=2.18->tensorflow==2.18.0->tensorflow_decision_forests) (3.0.2)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: markdown-it-py>=2.2.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from rich->keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (3.0.0)\r\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from rich->keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (2.19.1)\r\n", "Requirement already satisfied: mdurl~=0.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow==2.18.0->tensorflow_decision_forests) (0.1.2)\r\n", "Using cached tensorflow_decision_forests-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB)\r\n", "Using cached wurlitzer-3.1.1-py3-none-any.whl (8.6 kB)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Downloading ydf-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.5 MB)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Installing collected packages: ydf, wurlitzer, tensorflow_decision_forests\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Successfully installed tensorflow_decision_forests-1.11.0 wurlitzer-3.1.1 ydf-0.9.0\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install tensorflow_decision_forests wurlitzer tensorflow-datasets" ] }, { "cell_type": "markdown", "metadata": { "id": "2LIE3UDMXeB4" }, "source": [ "## Importing libraries" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:36.723749Z", "iopub.status.busy": "2025-02-26T12:05:36.723235Z", "iopub.status.idle": "2025-02-26T12:05:39.940194Z", "shell.execute_reply": "2025-02-26T12:05:39.939424Z" }, "id": "ue7Q-ysiPOmG" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-02-26 12:05:36.978454: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", "E0000 00:00:1740571537.000097 9083 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", "E0000 00:00:1740571537.006625 9083 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n" ] }, { "data": { "text/html": [ "\n", "

🌲 Try YDF, the successor of\n", " TensorFlow\n", " Decision Forests using the same algorithms but with more features and faster\n", " training!\n", "

\n", "
\n", "
\n", " \n", " Old code

\n", "
\n",
       "import tensorflow_decision_forests as tfdf\n",
       "\n",
       "tf_ds = tfdf.keras.pd_dataframe_to_tf_dataset(ds, label=\"l\")\n",
       "model = tfdf.keras.RandomForestModel(label=\"l\")\n",
       "model.fit(tf_ds)\n",
       "
\n", "
\n", "
\n", "
\n", " \n", " New code

\n", "
\n",
       "import ydf\n",
       "\n",
       "model = ydf.RandomForestLearner(label=\"l\").train(ds)\n",
       "
\n", "
\n", "
\n", "

(Learn more in the migration\n", " guide)

\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import tensorflow_decision_forests as tfdf\n", "\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import tensorflow as tf\n", "import math\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": { "id": "bN7quUfTXjaA" }, "source": [ "The hidden code cell limits the output height in colab.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2025-02-26T12:05:39.943454Z", "iopub.status.busy": "2025-02-26T12:05:39.942847Z", "iopub.status.idle": "2025-02-26T12:05:39.951028Z", "shell.execute_reply": "2025-02-26T12:05:39.950382Z" }, "id": "nFP4KJ79Xl3J" }, "outputs": [], "source": [ "#@title\n", "\n", "from IPython.core.magic import register_line_magic\n", "from IPython.display import Javascript\n", "from IPython.display import display as ipy_display\n", "\n", "# Some of the model training logs can cover the full\n", "# screen if not compressed to a smaller viewport.\n", "# This magic allows setting a max height for a cell.\n", "@register_line_magic\n", "def set_cell_height(size):\n", " ipy_display(\n", " Javascript(\"google.colab.output.setIframeHeight(0, true, {maxHeight: \" +\n", " str(size) + \"})\"))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:39.953701Z", "iopub.status.busy": "2025-02-26T12:05:39.953146Z", "iopub.status.idle": "2025-02-26T12:05:39.956821Z", "shell.execute_reply": "2025-02-26T12:05:39.956173Z" }, "id": "jnpiCdRKXvir" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found TensorFlow Decision Forests v1.11.0\n" ] } ], "source": [ "# Check the version of TensorFlow Decision Forests\n", "print(\"Found TensorFlow Decision Forests v\" + tfdf.__version__)" ] }, { "cell_type": "markdown", "metadata": { "id": "9SqXMEGLX0ry" }, "source": [ "## What is uplift modeling?\n", "\n", "[Uplift modeling](https://en.wikipedia.org/wiki/Uplift_modelling) is a statistical modeling technique to predict the **incremental impact of an action** on a subject. The action is often referred to as a **treatment** that may or may not be applied.\n", "\n", "Uplift modeling is often used in targeted marketing campaigns to predict the increase in the likelihood of a person making a purchase (or any other desired action) based on the marketing exposition they receive.\n", "\n", "For example, uplift modeling can predict the **effect** of an email. The effect is defined as the **conditional probability**\n", "\\begin{align}\n", "\\text{effect}(\\text{email}) = &\\Pr(\\text{outcome}=\\text{purchase}\\ \\vert\\ \\text{treatment}=\\text{with email})\\\\ &- \\Pr(\\text{outcome}=\\text{purchase} \\ \\vert\\ \\text{treatment}=\\text{no email}),\n", "\\end{align}\n", "where $\\Pr(\\text{outcome}=\\text{purchase}\\ \\vert\\ ...)$\n", "is the probability of purchase depending on the receiving or not an email.\n", "\n", "Compare this to a classification model: With a classification model, one can predict the probability of a purchase. However, customers with a high probability are likely to spend money in the store regardless of whether or not they received an email.\n", "\n", "Similarly, one can use **numerical uplifting** to predict the numerical **increase in spend** when receiving an email. In comparison, a regression model can only increase the expected spend, which is a less useful metric in many cases.\n", "\n", "### Defining uplift models in TF-DF\n", "\n", "TF-DF expects uplifting datasets to be presented in a \"flat\" format.\n", "A dataset of customers might look like this\n", "\n", "treatment | outcome | feature_1 | feature_2\n", "--------- | ------- | --------- | ---------\n", "0 | 1 | 0.1 | blue \n", "0 | 0 | 0.2 | blue \n", "1 | 1 | 0.3 | blue \n", "1 | 1 | 0.4 | blue \n", "\n", "\n", "The **treatment** is a binary variable indicating whether or not the example has received treatment. In the above example, the treatment indicates if the customer has received an email or not. The **outcome** (label) indicates the status of the example after receiving the treatment (or not). TF-DF supports categorical outcomes for categorical uplifting and numerical outcomes for numerical uplifting.\n", "\n", "**Note**: Uplifting is also frequently used in medical contexts. Here the *treatment* can be a medical treatment (e.g. administering a vaccine), the label can be an indicator of quality of life (e.g. whether the patient got sick). This also explains the nomenclature of uplift modeling." ] }, { "cell_type": "markdown", "metadata": { "id": "kVaDog4ldPEY" }, "source": [ "## Training an uplifting model\n", "\n", "In this example, we will use the *Hillstrom Email Marketing dataset*.\n", "\n", "This dataset contains 64,000 customers who last purchased within twelve months. The customers were involved in an e-mail test:\n", "\n", "- 1/3 were randomly chosen to receive an e-mail campaign featuring Mens merchandise.\n", "- 1/3 were randomly chosen to receive an e-mail campaign featuring Womens merchandise.\n", "- 1/3 were randomly chosen to not receive an e-mail campaign.\n", "\n", "During a period of two weeks following the e-mail campaign, results were tracked. The task is to tell if the Mens or Womens e-mail campaign was successful.\n", "\n", "Read more about dataset [in its documentation]( https://blog.minethatdata.com/2008/03/minethatdata-e-mail-analytics-and-data.html). This tutorial uses the dataset as curated by [TensorFlow Datasets](https://www.tensorflow.org/datasets/catalog/hillstrom)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:39.959559Z", "iopub.status.busy": "2025-02-26T12:05:39.959130Z", "iopub.status.idle": "2025-02-26T12:05:43.623758Z", "shell.execute_reply": "2025-02-26T12:05:43.623127Z" }, "id": "1veZ9nJZPGsv" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "I0000 00:00:1740571542.697544 9083 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 13638 MB memory: -> device: 0, name: Tesla T4, pci bus id: 0000:00:05.0, compute capability: 7.5\n", "I0000 00:00:1740571542.699822 9083 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:1 with 13756 MB memory: -> device: 1, name: Tesla T4, pci bus id: 0000:00:06.0, compute capability: 7.5\n", "I0000 00:00:1740571542.701960 9083 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:2 with 13756 MB memory: -> device: 2, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5\n", "I0000 00:00:1740571542.703996 9083 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:3 with 13756 MB memory: -> device: 3, name: Tesla T4, pci bus id: 0000:00:08.0, compute capability: 7.5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2025-02-26 12:05:43.599785: W tensorflow/core/kernels/data/cache_dataset_ops.cc:914] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.\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", " \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", "
channelconversionhistoryhistory_segmentmensnewbierecencysegmentspendvisitwomenszip_code
0b'Web'029.990000b'1) $0 - $100'106b'Womens E-Mail'0.000b'Surburban'
1b'Web'0150.380005b'2) $100 - $200'019b'Womens E-Mail'0.001b'Surburban'
2b'Phone'0602.960022b'5) $500 - $750'114b'Womens E-Mail'0.000b'Surburban'
3b'Multichannel'0341.010010b'3) $200 - $350'009b'Womens E-Mail'0.011b'Urban'
4b'Phone'097.180000b'1) $0 - $100'013b'Womens E-Mail'0.011b'Surburban'
5b'Web'083.269997b'1) $0 - $100'105b'Mens E-Mail'0.000b'Urban'
6b'Web'0331.170013b'3) $200 - $350'108b'Womens E-Mail'0.000b'Surburban'
7b'Multichannel'0628.400024b'5) $500 - $750'119b'No E-Mail'0.010b'Surburban'
8b'Phone'0134.610001b'2) $100 - $200'106b'No E-Mail'0.010b'Rural'
9b'Web'0141.210007b'2) $100 - $200'019b'Mens E-Mail'0.011b'Surburban'
\n", "
" ], "text/plain": [ " channel conversion history history_segment mens newbie \\\n", "0 b'Web' 0 29.990000 b'1) $0 - $100' 1 0 \n", "1 b'Web' 0 150.380005 b'2) $100 - $200' 0 1 \n", "2 b'Phone' 0 602.960022 b'5) $500 - $750' 1 1 \n", "3 b'Multichannel' 0 341.010010 b'3) $200 - $350' 0 0 \n", "4 b'Phone' 0 97.180000 b'1) $0 - $100' 0 1 \n", "5 b'Web' 0 83.269997 b'1) $0 - $100' 1 0 \n", "6 b'Web' 0 331.170013 b'3) $200 - $350' 1 0 \n", "7 b'Multichannel' 0 628.400024 b'5) $500 - $750' 1 1 \n", "8 b'Phone' 0 134.610001 b'2) $100 - $200' 1 0 \n", "9 b'Web' 0 141.210007 b'2) $100 - $200' 0 1 \n", "\n", " recency segment spend visit womens zip_code \n", "0 6 b'Womens E-Mail' 0.0 0 0 b'Surburban' \n", "1 9 b'Womens E-Mail' 0.0 0 1 b'Surburban' \n", "2 4 b'Womens E-Mail' 0.0 0 0 b'Surburban' \n", "3 9 b'Womens E-Mail' 0.0 1 1 b'Urban' \n", "4 3 b'Womens E-Mail' 0.0 1 1 b'Surburban' \n", "5 5 b'Mens E-Mail' 0.0 0 0 b'Urban' \n", "6 8 b'Womens E-Mail' 0.0 0 0 b'Surburban' \n", "7 9 b'No E-Mail' 0.0 1 0 b'Surburban' \n", "8 6 b'No E-Mail' 0.0 1 0 b'Rural' \n", "9 9 b'Mens E-Mail' 0.0 1 1 b'Surburban' " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the dataset\n", "import tensorflow_datasets as tfds\n", "raw_train, raw_test = tfds.load('hillstrom', split=['train[:80%]', 'train[20%:]'])\n", "\n", "# Display the first 10 examples of the test fold.\n", "pd.DataFrame(list(raw_test.batch(10).take(1))[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "5stnFbyKaIgn" }, "source": [ "### Dataset preprocessing\n", "\n", "Since TF-DF currently only supports binary treatments, combine the \"Men's Email\" and the \"Women's Email\" campaign. This tutorial uses the binary variable `conversion` as outcome. This means that the problem is a **Categorical Uplifting** problem. If we were using the numerical variable `spend`, the problem would be a **Numerical Uplifting** problem." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:43.627514Z", "iopub.status.busy": "2025-02-26T12:05:43.626902Z", "iopub.status.idle": "2025-02-26T12:05:43.730947Z", "shell.execute_reply": "2025-02-26T12:05:43.730329Z" }, "id": "dLpAw7jibIrh" }, "outputs": [], "source": [ "def prepare_dataset(example):\n", " # Use a binary treatment class.\n", " example['treatment'] = 1 if example['segment'] == b'Mens E-Mail' or example['segment'] == b'Womens E-Mail' else 0\n", " outcome = example['conversion']\n", " # Restrict the dataset to the input features.\n", " input_features = ['channel', 'history', 'mens', 'womens', 'newbie', 'recency', 'zip_code', 'treatment']\n", " example = {feature: example[feature] for feature in input_features}\n", " return example, outcome\n", "\n", "train_ds = raw_train.map(prepare_dataset).batch(100)\n", "test_ds = raw_test.map(prepare_dataset).batch(100)" ] }, { "cell_type": "markdown", "metadata": { "id": "Z-mtKmd-RoOu" }, "source": [ "### Model training\n", "\n", "Finally, train and evaluate the model as usual. Note that TF-DF only supports Random Forest models for uplifting." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:43.734085Z", "iopub.status.busy": "2025-02-26T12:05:43.733710Z", "iopub.status.idle": "2025-02-26T12:05:52.260169Z", "shell.execute_reply": "2025-02-26T12:05:52.259536Z" }, "id": "-OZN8t8LRn38" }, "outputs": [ { "data": { "application/javascript": [ "google.colab.output.setIframeHeight(0, true, {maxHeight: 300})" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Warning: The `num_threads` constructor argument is not set and the number of CPU is os.cpu_count()=32 > 32. Setting num_threads to 32. Set num_threads manually to use more than 32 cpus.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:The `num_threads` constructor argument is not set and the number of CPU is os.cpu_count()=32 > 32. Setting num_threads to 32. Set num_threads manually to use more than 32 cpus.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Use /tmpfs/tmp/tmphsli6pat as temporary training directory\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Reading training dataset...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Training tensor examples:\n", "Features: {'channel': , 'history': , 'mens': , 'womens': , 'newbie': , 'recency': , 'zip_code': , 'treatment': }\n", "Label: Tensor(\"data_8:0\", shape=(None,), dtype=int64)\n", "Weights: None\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Normalized tensor features:\n", " {'channel': SemanticTensor(semantic=, tensor=), 'history': SemanticTensor(semantic=, tensor=), 'mens': SemanticTensor(semantic=, tensor=), 'womens': SemanticTensor(semantic=, tensor=), 'newbie': SemanticTensor(semantic=, tensor=), 'recency': SemanticTensor(semantic=, tensor=), 'zip_code': SemanticTensor(semantic=, tensor=)}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Training dataset read in 0:00:05.088312. Found 51200 examples.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Training model...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Standard output detected as not visible to the user e.g. running in a notebook. Creating a training log redirection. If training gets stuck, try calling tfdf.keras.set_training_logs_redirection(False).\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model trained in 0:00:02.392275\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Compiling model...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model compiled.\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%set_cell_height 300\n", "\n", "# Configure the model and its hyper-parameters.\n", "model = tfdf.keras.RandomForestModel(\n", " verbose=2,\n", " task=tfdf.keras.Task.CATEGORICAL_UPLIFT,\n", " uplift_treatment='treatment'\n", ")\n", "\n", "# Train the model.\n", "model.fit(train_ds)" ] }, { "cell_type": "markdown", "metadata": { "id": "XKhtZuLhGtv_" }, "source": [ "# Evaluating Uplift models.\n", "\n", "## Metrics for Uplift models\n", "\n", "The two most important metrics for evaluating upift models are the **AUUC** (Area Under the Uplift Curve) metric and the **Qini** (Area Under the Qini Curve) metric. This is similar to the use of AUC and accuracy for classification problems. For both metrics, the larger they are, the better.\n", "\n", "Both AUUC and Qini are **not** normalized metrics. This means that the best possible value of the metric can vary from dataset to dataset. This is different from, for example, the AUC matric that always varies between 0 and 1.\n", "\n", "A formal definition of AUUC is below. For more information about these metrics, see [Guelman](https://diposit.ub.edu/dspace/bitstream/2445/65123/1/Leo%20Guelman_PhD_THESIS.pdf) and [Betlei et al.](https://arxiv.org/pdf/2012.09897.pdf)" ] }, { "cell_type": "markdown", "metadata": { "id": "AMSpNTTZmuzv" }, "source": [ "## Model Self-Evaluation\n", "\n", "TF-DF Random Forest models perform self-evaluation on the out-of-bag examples of the training dataset. For uplift models, they expose the AUUC and the Qini metric. You can directly retrieve the two metrics on the training dataset through the inspector\n", "\n", "Later, we are going to recompute the AUUC metric \"manually\" on the test dataset. Note that two metrics are not expected to be exactly equal (out-of-bag on train vs test) since the AUUC is not a normalized metric." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:52.263559Z", "iopub.status.busy": "2025-02-26T12:05:52.262962Z", "iopub.status.idle": "2025-02-26T12:05:52.268670Z", "shell.execute_reply": "2025-02-26T12:05:52.267994Z" }, "id": "OsN1R9mT_8T6" }, "outputs": [ { "data": { "text/plain": [ "Evaluation(num_examples=51200, accuracy=None, loss=None, rmse=None, ndcg=None, aucs=None, auuc=0.0022032308892709586, qini=-0.00017325819500263418)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The self-evaluation is available through the model inspector\n", "insp = model.make_inspector()\n", "insp.evaluation()" ] }, { "cell_type": "markdown", "metadata": { "id": "WErGZZ27HWJN" }, "source": [ "## Manually computing the AUUC\n", "\n", "In this section, we manually compute the AUUC and plot the uplift curves.\n", "\n", "The next few paragraphs explain the AUUC metric in more detail and may be skipped.\n", "\n", "### Computing the AUUC\n", "\n", "Suppose you have a labeled dataset with $|T|$ examples with treatment and $|C|$ examples without treatment, called *control* examples. For each example, the uplift model $f$ produces the conditional probability that a treatment on the example will yield a positive outcome.\n", "\n", "Suppose a decision-maker needs to decide which clients to send an email using an uplift model $f$. The model produces a (conditional) probability that the email will result in a conversion. The decision-maker might therefore just pick the number $k$ of emails to send and send those $k$ emails to the clients with the highest probability.\n", "\n", "Using a labeled test dataset, it is possible to study the impact of $k$ on the success of the campaign. First, we are interested in the ratio $\\frac{|C \\cap T|}{|T|}$ of clients that received an email that converted versus total number of clients that received an email. Here $C$ is the set of clients that received an email and converted and $T$ is the total number of clients that received an email. We plot this ratio against $k$.\n", "\n", "Ideally, we like to have this curve increase steeply. This would mean that the model prioritizes sending email to those clients that will generate a conversion when receiving an email." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:52.271460Z", "iopub.status.busy": "2025-02-26T12:05:52.270937Z", "iopub.status.idle": "2025-02-26T12:05:57.534141Z", "shell.execute_reply": "2025-02-26T12:05:57.533530Z" }, "id": "xUGNWKkkkl-s" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", " 1/512 [..............................] - ETA: 3:23" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 10/512 [..............................] - ETA: 2s " ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 19/512 [>.............................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 28/512 [>.............................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 38/512 [=>............................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 48/512 [=>............................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 57/512 [==>...........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 66/512 [==>...........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 76/512 [===>..........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 85/512 [===>..........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", " 95/512 [====>.........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "105/512 [=====>........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "115/512 [=====>........................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "125/512 [======>.......................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "135/512 [======>.......................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "145/512 [=======>......................] - ETA: 2s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "154/512 [========>.....................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "164/512 [========>.....................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "174/512 [=========>....................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "184/512 [=========>....................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "193/512 [==========>...................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "202/512 [==========>...................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "211/512 [===========>..................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "221/512 [===========>..................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "230/512 [============>.................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "239/512 [=============>................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "248/512 [=============>................] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "257/512 [==============>...............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "266/512 [==============>...............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "275/512 [===============>..............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "284/512 [===============>..............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "293/512 [================>.............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "302/512 [================>.............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "311/512 [=================>............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "320/512 [=================>............] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "330/512 [==================>...........] - ETA: 1s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "339/512 [==================>...........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "349/512 [===================>..........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "358/512 [===================>..........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "368/512 [====================>.........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "378/512 [=====================>........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "388/512 [=====================>........] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "398/512 [======================>.......] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "407/512 [======================>.......] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "416/512 [=======================>......] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "425/512 [=======================>......] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "435/512 [========================>.....] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "444/512 [=========================>....] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "453/512 [=========================>....] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "462/512 [==========================>...] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "472/512 [==========================>...] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "482/512 [===========================>..] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "491/512 [===========================>..] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "500/512 [============================>.] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "509/512 [============================>.] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "512/512 [==============================] - 3s 6ms/step\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Compute all predictions on the test dataset\n", "predictions = model.predict(test_ds).flatten()\n", "# Extract outcomes and treatments\n", "outcomes = np.concatenate([outcome.numpy() for _, outcome in test_ds])\n", "treatment = np.concatenate([example['treatment'].numpy() for example,_ in test_ds])\n", "control = 1 - treatment\n", "\n", "num_treatments = np.sum(treatment)\n", "# Clients without treatment are called 'control' group\n", "num_control = np.sum(control)\n", "num_examples = len(predictions)\n", "\n", "# Sort labels and treatments according to predictions in descending order\n", "prediction_order = predictions.argsort()[::-1]\n", "outcomes_sorted = outcomes[prediction_order]\n", "treatment_sorted = treatment[prediction_order]\n", "control_sorted = control[prediction_order]\n", "ratio_treatment = np.cumsum(np.multiply(outcomes_sorted, treatment_sorted), axis=0)/num_treatments\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot(ratio_treatment, label='Conversion ratio of treatment')\n", "ax.set_xlabel('k')\n", "ax.set_ylabel('Ratio of conversion')\n", "ax.legend()" ] }, { "cell_type": "markdown", "metadata": { "id": "97IFpq5epHsx" }, "source": [ "Similarly, we can also compute and plot the conversion ratio of those not receiving an email, called the *control group*. Ideally, this curve is initially flat: This would mean that the model does not prioritize sending emails to clients that will generate a conversion despite **not** receiving a email" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:57.536830Z", "iopub.status.busy": "2025-02-26T12:05:57.536568Z", "iopub.status.idle": "2025-02-26T12:05:57.679805Z", "shell.execute_reply": "2025-02-26T12:05:57.679191Z" }, "id": "bIY-oA9alwzY" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratio_control = np.cumsum(np.multiply(outcomes_sorted, control_sorted), axis=0)/num_control\n", "ax.plot(ratio_control, label='Conversion ratio of control')\n", "ax.legend()\n", "fig" ] }, { "cell_type": "markdown", "metadata": { "id": "q9MopM5MnCK0" }, "source": [ "The AUUC metric measures the area between these two curves, normalizing the y-axis between 0 and 1" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2025-02-26T12:05:57.682362Z", "iopub.status.busy": "2025-02-26T12:05:57.682121Z", "iopub.status.idle": "2025-02-26T12:05:58.034921Z", "shell.execute_reply": "2025-02-26T12:05:58.034292Z" }, "id": "99XXGsq7nQgN" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_9083/1475983573.py:11: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", " auuc = np.trapz(ratio_treatment-ratio_control, dx=1/num_examples)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The AUUC on the test dataset is 0.007513949426065613\n" ] }, { "data": { "image/png": "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Cdu2bWvgiC2TKde5RYsWAoAKr7lz5zZ84BbI1J/pezFBqjlTr/P+/fuF8PBwQaVSCQEBAcLChQuF0tLSBo7a8phynUtKSoR58+YJLVu2FNRqtaDVaoXJkycLmZmZDR+4Bdm1a1el/+eWXduxY8cKvXr1qrBPaGiooFQqhYCAAGHt2rX1GqNMEFgHSERERHQv9kEiIiIiKocJEhEREVE5TJCIiIiIymGCRERERFQOEyQiIiKicpggEREREZXDBImIiIioHCZIREREROUwQSIi+lvv3r0xY8YMqcMgIjPABImIiIioHCZIREREROUwQSIiqsK2bdvg5OSE9evXSx0KETUwK6kDICIyRxs2bMALL7yADRs2YNCgQVKHQ0QNjDVIRETlrFq1CpMnT8ZPP/3E5IioiWINEhHRPb799lukpaVh37596Nq1q9ThEJFEWINERHSPTp06wcPDA1988QUEQZA6HCKSCBMkIqJ7tGzZErt27cIPP/yAadOmSR0OEUmETWxEROW0bt0au3btQu/evWFlZYXly5dLHRIRNTAmSERElWjTpg127tyJ3r17Q6FQYOnSpVKHREQNSCawkZ2IiIjICPsgEREREZXDBImIiIioHCZIREREROUwQSIiIiIqhwkSERERUTlMkIiIiIjKYYJEREREVA4TJCIiIqJymCARERERlcMEiYiIiKgcJkhERERE5fw/1/UQbwGKKdAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 1, num_examples)\n", "plt.plot(x,ratio_treatment, label='Conversion ratio of treatment')\n", "plt.plot(x,ratio_control, label='Conversion ratio of control')\n", "plt.fill_between(x, ratio_treatment, ratio_control, where=(ratio_treatment > ratio_control), color='C0', alpha=0.3)\n", "plt.fill_between(x, ratio_treatment, ratio_control, where=(ratio_treatment < ratio_control), color='C1', alpha=0.3)\n", "plt.xlabel('k')\n", "plt.ylabel('Ratio of conversion')\n", "plt.legend()\n", "\n", "# Approximate the integral of the difference between the two curves.\n", "auuc = np.trapz(ratio_treatment-ratio_control, dx=1/num_examples)\n", "print(f'The AUUC on the test dataset is {auuc}')" ] } ], "metadata": { "colab": { "name": "uplift_colab.ipynb", "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "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.21" } }, "nbformat": 4, "nbformat_minor": 0 }