{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "RxgD1bLv3QGc" }, "source": [ "# Обзор базовых подходов к решению задачи Uplift Моделирования\n", "\n", "
\n", "
\n", " \n", " \n", " \n", "
\n", " SCIKIT-UPLIFT REPO | \n", " SCIKIT-UPLIFT DOCS\n", "
\n", " ENGLISH VERSION\n", "
\n", " СТАТЬЯ НА HABR ЧАСТЬ 1 | \n", " СТАТЬЯ НА HABR ЧАСТЬ 2\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "45Q0Xrmq3QGu" }, "source": [ "## Содержание\n", "\n", "* [Введение](#Введение)\n", "* [1. Подходы с одной моделью](#1.-Подходы-с-одной-моделью)\n", " * [1.1 Одна модель](#1.1-Одна-модель-с-признаком-коммуникации)\n", " * [1.2 Трансформация классов](#1.2-Трансформация-классов)\n", "* [2. Подходы с двумя моделями](#2.-Подходы-с-двумя-моделями)\n", " * [2.1 Две независимые модели](#2.1-Две-независимые-модели)\n", " * [2.2 Две зависимые модели](#2.3-Две-зависимые-модели)\n", "* [Заключение](#Заключение)\n", "\n", "## Введение\n", "\n", "Прежде чем переходить к обсуждению uplift моделирования, представим некоторую ситуацию.\n", "\n", "К вам приходит заказчик с некоторой проблемой: необходимо с помощью sms рассылки прорекламировать достаточно популярный продукт.\n", "У вас как у самого настоящего, топового дата саентиста в голове уже вырисовался план:\n", "\n", "

\n", " \"Топовый\n", "

\n", "\n", "И тут вы начинаете понимать, что продукт и без того популярный, что без коммуникации продукт достаточно часто устанавливается клиентами, что обычная бинарная классификация обнаружит много таких клиентов, а стоимость коммуникация для нас критична...\n", "\n", "Исторически, по воздействию коммуникации маркетологи разделяют всех клиентов на 4 категории:\n", "\n", "

\n", " \"Категории\n", "

\n", "\n", "1. **Спящая собака** - человек, который будет реагировать негативно, если с ним прокоммуницировать. Яркий пример: клиенты, которые забыли про платную подписку. Получив напоминание об этом, они обязательно ее отключат. Но если их не трогать, то клиенты по-прежнему будут приносить деньги.\n", "2. **Потерянный** - человек, который не совершит целевое действие независимо от коммуникаций. Взаимодействие с такими клиентами не приносит дополнительного дохода, но создает дополнительные затраты.\n", "3. **Уверенный (Лояльный)** - человек, который будет реагировать положительно, несмотря ни на что - самый лояльный вид клиентов. По аналогии с предыдущим пунктом, такие клиенты также расходуют ресурсы. Однако в данном случае расходы гораздо больше, так как **уверенные** еще и пользуются маркетинговым предложением (скидками, купонами и другое).\n", "4. **Убеждаемый** - это человек, который положительно реагирует на предложение, но при его отсутствии не выполнил бы целевого действия. Это те люди, которых мы хотели бы определить нашей моделью, чтобы с ними прокоммуницировать.\n", "\n", "Стоит отметить, что в зависимости от клиентской базы и особенностей компании возможно отсутствие некоторых из этих типов клиентов.\n", "\n", "Таким образом, в данной задаче нам хочется не просто спрогнозировать вероятность выполнения целевого действия, а сосредоточить рекламный бюджет на клиентах, которые выполнят целевое действие только при нашем взаимодействии. Иначе говоря, для каждого клиента хочется отдельно оценить две условные вероятности:\n", "\n", "* Выполнение целевого действия при нашем воздействии на клиента. \n", " Таких клиентов будем относить к **тестовой группе (aka treatment)**: $P^T = P(Y=1 | W = 1)$,\n", "* Выполнение целевого действия без воздействия на клиента. \n", " Таких клиентов будем относить к **контрольной группе (aka control)**: $P^C = P(Y=1 | W = 0)$,\n", "\n", "где $Y$ - бинарный флаг выполнения целевого действия, $W$ - бинарный флаг наличия коммуникации (в англоязычной литературе - _treatment_)\n", "\n", "Сам же причинно-следственный эффект **называется uplift** и оценивается как разность двух этих вероятностей:\n", "\n", "$$ uplift = P^T - P^C = P(Y = 1 | W = 1) - P(Y = 1 | W = 0)$$\n", "\n", "Прогнозирование uplift - это задача причинно-следственного вывода. Дело в том, что нужно оценить разницу между двумя событиями, которые являются взаимоисключающими для конкретного клиента (либо мы взаимодействуем с человеком, либо нет; нельзя одновременно совершить два этих действия). Именно поэтому для построения моделей uplift предъявляются дополнительные требования к исходным данным.\n", "\n", "Для получения обучающей выборки для моделирования uplift необходимо провести эксперимент: \n", "1. Случайным образом разбить репрезентативную часть клиентской базы на тестовую и контрольную группу\n", "2. Прокоммуницировать с тестовой группой\n", "\n", "Данные, полученные в рамках дизайна такого пилота, позволят нам в дальнейшем построить модель прогнозирования uplift. Стоит также отметить, что эксперимент должен быть максимально похож на кампнию, которая будет запущена позже в более крупном масштабе. Единственным отличием эксперимента от кампании должен быть тот факт, что во время пилота для взаимодействия мы выбираем случайных клиентов, а во время кампании - на основе спрогнозированного значения Uplift. Если кампания, которая в конечном итоге запускается, существенно отличается от эксперимента, используемого для сбора данных о выполнении целевых действий клиентами, то построенная модель может быть менее надежной и точной.\n", "\n", "Итак, подходы к прогнозированию uplift направлены на оценку чистого эффекта от воздействия маркетинговых кампаний на клиентов.\n", "\n", "**Подробнее про uplift можно прочитать в [цикле статьй на хабре](https://habr.com/ru/company/ru_mts/blog/485980/).**\n", "\n", "Все классические подходы к моделированию uplift можно разделить на два класса:\n", "1. Подходы с применением одной моделью\n", "2. Подходы с применением двух моделей\n", "\n", "Скачаем и распакуем [данные конкурса RetailHero.ai](https://retailhero.ai/c/uplift_modeling/overview):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:07.634319Z", "start_time": "2020-04-16T20:41:07.630711Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 712 }, "colab_type": "code", "id": "NDBSdnM05Nti", "outputId": "8508357f-2748-49d4-dff4-ff4cc54baf54" }, "outputs": [], "source": [ "import urllib.request\n", "\n", "url = 'https://drive.google.com/u/0/uc?id=1fkxNmihuS15kk0PP0QcphL_Z3_z8LLeb&export=download'\n", "urllib.request.urlretrieve(url, '/content/retail_hero.zip')\n", "\n", "!unzip /content/retail_hero.zip\n", "!pip install scikit-uplift==0.1.0 catboost=0.22" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "L2_hAJho6IHC" }, "source": [ "Импортируем нужные библиотеки и предобработаем данные:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:10.715080Z", "start_time": "2020-04-16T20:41:07.644388Z" }, "colab": {}, "colab_type": "code", "id": "VT5IYIZU3QGx" }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import pandas as pd; pd.set_option('display.max_columns', None)\n", "from sklearn.model_selection import train_test_split\n", "\n", "\n", "# Чтение данных\n", "df_clients = pd.read_csv('/content/uplift_data/clients.csv', index_col='client_id')\n", "df_train = pd.read_csv('/content/uplift_data/uplift_train.csv', index_col='client_id')\n", "df_test = pd.read_csv('/content/uplift_data/uplift_test.csv', index_col='client_id')\n", "\n", "# Извлечение признаков\n", "df_features = df_clients.copy()\n", "df_features['first_issue_time'] = \\\n", " (pd.to_datetime(df_features['first_issue_date'])\n", " - pd.Timestamp('1970-01-01')) // pd.Timedelta('1s')\n", "df_features['first_redeem_time'] = \\\n", " (pd.to_datetime(df_features['first_redeem_date'])\n", " - pd.Timestamp('1970-01-01')) // pd.Timedelta('1s')\n", "df_features['issue_redeem_delay'] = df_features['first_redeem_time'] \\\n", " - df_features['first_issue_time']\n", "df_features = df_features.drop(['first_issue_date', 'first_redeem_date'], axis=1)\n", "\n", "indices_train = df_train.index\n", "indices_test = df_test.index\n", "indices_learn, indices_valid = train_test_split(df_train.index, test_size=0.3, random_state=123)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qS78JgIO3QHP" }, "source": [ "Для удобства объявим некоторые переменные:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:11.873021Z", "start_time": "2020-04-16T20:41:10.717336Z" }, "colab": {}, "colab_type": "code", "id": "VsvmpLd13QHW" }, "outputs": [], "source": [ "X_train = df_features.loc[indices_learn, :]\n", "y_train = df_train.loc[indices_learn, 'target']\n", "treat_train = df_train.loc[indices_learn, 'treatment_flg']\n", "\n", "X_val = df_features.loc[indices_valid, :]\n", "y_val = df_train.loc[indices_valid, 'target']\n", "treat_val = df_train.loc[indices_valid, 'treatment_flg']\n", "\n", "X_train_full = df_features.loc[indices_train, :]\n", "y_train_full = df_train.loc[:, 'target']\n", "treat_train_full = df_train.loc[:, 'treatment_flg']\n", "\n", "X_test = df_features.loc[indices_test, :]\n", "\n", "cat_features = ['gender']\n", "\n", "models_results = {\n", " 'approach': [],\n", " 'uplift@30%': []\n", "}" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ZUBv8tHI3QHu" }, "source": [ "## 1. Подходы с одной моделью\n", "\n", "### 1.1 Одна модель с признаком коммуникации\n", "\n", "Самое простое и интуитивное решение: модель обучается одновременно на двух группах, при этом бинарный флаг коммуникации выступает в качестве дополнительного признака. Каждый объект из тестовой выборки скорим дважды: с флагом коммуникации равным 1 и равным 0. Вычитая вероятности по каждому наблюдению, получим искомы uplift.\n", "\n", "\n", "

\n", " \"Solo\n", "

" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:14.061983Z", "start_time": "2020-04-16T20:41:11.875565Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 359 }, "colab_type": "code", "id": "Pqquz4nU3QHx", "outputId": "fadb441f-902f-4523-9c18-79b77f08693e" }, "outputs": [ { "data": { "image/png": "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e+211/Le976XIUOGLNe6FTF16lSefPJJRo4cuVzbjRgxgrPPPpvhw4d3SRzdKTPnlL/PRMQ1wI7A0xHRPzPnliFwz5Tqc4DNajYfWMrmACNalN9W59AlrcSabmvq2v2NaH9/s2bN4hOf+AQPPvjgkm2amlh33XX5xje+0eo2P//5z5kyZQo//OEPueiii1hnnXU46KCD+Nvf/sbo0aOJCH76059y11138fWvf71LzsMhcpK0nPr27cvUqVOZOnUqhx12GMccc8zi983Jpczk7bffXu59T5gwgaeeeqqrQ5YkdcBaa63F1VdfzbPPPrvsysW1117LQw89tNzrFi1atNzxTZ06leuvv365t+utIuKdEbFe8zKwJ/AgMAkYU6qNAX5dlicBB0XlQ8ALZSjdjcCeEbFRRGxU9nNjN56KJDXUYYcdxkEHHQRUbdP+++/P/fffT9++ffnxj3/cZccxwSRJXWTGjBkMGTKEL37xi2yzzTbMnTuX3/zmN3z4wx9m++2354ADDuDll18G4NRTT2WHHXZg22235bDDDiMzmThxIlOnTuWAAw5g2LBhvPHGG9xzzz3867/+Kx/84AfZZ599ePrppwG45557GDp0KMOGDeOiiy5q5GlL0kpjjTXW4NBDD+Xcc8/9h3WzZs1it912Y+jQoey+++48/vjj3HHHHUyaNInjjz+eYcOG8eijjy6u39q6ESNGcPTRRzN8+HDOP/985s2bx2c/+1l22GEHdthhB/70pz8BVW/YD3/4w2y33XbsvPPOPPzww7zxxht8+9vfZuLEiQwbNoyJEyfy8ssv85WvfIUdd9yR7bbbjl//usqzvPrqq4wePZqtt96aT3/607z66qvd8wF2vU2B2yPiL8DdwP9l5g3AmcAeEfEI8PHyHuB64DFgBvAT4OsAmbkA+C5wT3mdVsokqdcbMWIERx11FMOGDWPbbbfl7rvv/oc6TU1NnH322Vx//fWcd955XHjhhey6666ceOKJPProowwbNozjjz++07E4RE6SutDf/vY3LrnkEoYPH84zzzzDmWeeyS233MI666zDGWecwfnnn8/JJ5/MUUcdxXe+8x0yky984QvccMMNHHDAAVxwwQX88Ic/ZNiwYbz++uscddRRTJo0iU022YTLLruMU045hXHjxvHlL3+ZcePGscsuu3DMMcc0+rQlaaVx+OGHM3ToUE444YSlyv/zP/+TMWPGMGbMGCZMmMCRRx7Jtddeyyc/+Uk+8YlPsP/++y9Vf+edd2513RtvvMGUKVMA+MIXvsAxxxzDRz7yER5//HH22msvpk+fzvvf/37++Mc/ssYaa3DzzTdz8sknc9VVV3HaaactHu4AcPLJJ7PbbrsxYcIEnn/+eXbccUc+/vGP8z//8z+ss846TJ8+nQceeIDtt9++zp9afWTmY8AHWimfD+zeSnkCh7exrwnAhK6OUZJ6gldeeYWpU6fyhz/8ga985StLDaWrNXLkSA477LDFQ+tmzZrFgw8+2GVTbZhgkqQutMUWWyye4+KOO+7goYceYueddwaqHxUf+chHALjllls466yzeO2113j22WcX91CqNX36dKZNm8bHP/5xAN566y0GDhzIs88+y6uvvsouu+wCwJe+9CVuvfXW7jpFSVqprb/++hx00EGMHTuWtddee3H5n//8Z66++mqguu62TEB11AEHHLB4+eabb15qCN2LL77ISy+9xAsvvMCYMWN45JFHiAjefPPNVvf129/+lkmTJnH22WcD1WO0H3/8cf7whz9w5JFHAjB06FCGDh26QrFKknqGtp7o1lx+4IEHAvCxj32MF198keeff77bYqtlgkmSutA73/nOxcuZyd57782ll166VJ1XXnmFI444gvvuu48BAwbwrW99i9dee+0f9pWZDB06lD/+8Y9LlS/P3CCSpOV39NFHs/3223PwwQd3+b5r24m3336bO++8kz59+ixV54gjjmDXXXflmmuuYdasWYwYMaLVfWUmV111Fe973/u6PE5JUs/Rt29fnnvuuaXKFixYwODBg4F/TEC1lZCqN+dgkqQ62Xnnnfn973/PY489BsDLL7/MI488wquvvspqq63GJptswsKFC7nqqqsWb7PeeuuxcOFCAIYMGcKcOXMWj6N+4403mDZtGptssglrr702f/7znwG47LLLuvnMJGnltvHGG/P5z3+e8ePHLy7beeedufzyy4HquvvRj34UWPq63VJ76wD23HNPLrjggsXvm4covPDCCwwYMACongLU1v722msvLrjgAqqRYXD//fcD1R3sX/7ylwA8+OCDPPDAAx07cUlSj7TuuuvSv39/fve73wFVcumGG25YPDpi4sSJANx+++1ssMEGbLDBBh3a77LaqeVlDyZJvd6o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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Инструкция по установке пакета: https://github.com/maks-sh/scikit-uplift\n", "# Ссылка на документацию: https://scikit-uplift.readthedocs.io/en/latest/\n", "from sklift.metrics import uplift_at_k\n", "from sklift.viz import plot_uplift_preds\n", "from sklift.models import SoloModel\n", "\n", "# sklift поддерживает любые модели, \n", "# которые удовлетворяют соглашениями scikit-learn\n", "# Для примера воспользуемся catboost\n", "from catboost import CatBoostClassifier\n", "\n", "\n", "sm = SoloModel(CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True))\n", "sm = sm.fit(X_train, y_train, treat_train, estimator_fit_params={'cat_features': cat_features})\n", "\n", "uplift_sm = sm.predict(X_val)\n", "\n", "sm_score = uplift_at_k(y_true=y_val, uplift=uplift_sm, treatment=treat_val, strategy='by_group', k=0.3)\n", "\n", "models_results['approach'].append('SoloModel')\n", "models_results['uplift@30%'].append(sm_score)\n", "\n", "# Получим условные вероятности выполнения целевого действия при взаимодействии для каждого объекта\n", "sm_trmnt_preds = sm.trmnt_preds_\n", "# И условные вероятности выполнения целевого действия без взаимодействия для каждого объекта\n", "sm_ctrl_preds = sm.ctrl_preds_\n", "\n", "# Отрисуем распределения вероятностей и их разность (uplift)\n", "plot_uplift_preds(trmnt_preds=sm_trmnt_preds, ctrl_preds=sm_ctrl_preds);" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:14.084652Z", "start_time": "2020-04-16T20:41:14.064998Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "colab_type": "code", "id": "bWlvkkcz3QIQ", "outputId": "7703680e-f880-4dbf-b7ee-230b6a182d02" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
feature_namefeature_score
0first_redeem_time65.214393
1issue_redeem_delay12.564364
2age7.891613
3first_issue_time7.262806
4treatment4.362077
5gender2.704747
\n", "
" ], "text/plain": [ " feature_name feature_score\n", "0 first_redeem_time 65.214393\n", "1 issue_redeem_delay 12.564364\n", "2 age 7.891613\n", "3 first_issue_time 7.262806\n", "4 treatment 4.362077\n", "5 gender 2.704747" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# С той же легкостью можно обратиться к обученной модели.\n", "# Например, чтобы построить важность признаков:\n", "sm_fi = pd.DataFrame({\n", " 'feature_name': sm.estimator.feature_names_,\n", " 'feature_score': sm.estimator.feature_importances_\n", "}).sort_values('feature_score', ascending=False).reset_index(drop=True)\n", "\n", "sm_fi" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2xqD6sLP3QIq" }, "source": [ "### 1.2 Трансформация классов\n", "\n", "Достаточно интересный и математически подтвержденный подход к построению модели, представленный еще в 2012 году. Метод заключается в прогнозировании немного измененного таргета:\n", "\n", "$$\n", "z_i = y_i * w_i + (1 - y_i) * (1 - w_i),\n", "$$\n", "где \n", "\n", "* $z_i$ - новая целевая переменная $i$-ого клиента; \n", "* $y_i$ - целевая перемнная $i$-ого клиента;\n", "* $w_i$ - флаг коммуникации $i$-ого клиента; \n", "\n", "\n", "Другими словами, новый класс равен 1, если мы знаем, что на конкретном наблюдении, результат при взаимодействии был бы таким же хорошим, как и в контрольной группе, если бы мы могли знать результат в обеих группах:\n", "\n", "$$\n", "z_i = \\begin{cases} \n", " 1, & \\mbox{если } w_i = 1 \\mbox{ и } y_i = 1 \\\\ \n", " 1, & \\mbox{если } w_i = 0 \\mbox{ и } y_i = 0 \\\\\n", " 0, & \\mbox{в остальных случаях} \n", " \\end{cases}\n", "$$\n", "\n", "Распишем подробнее, чему равна вероятность новой целевой переменной:\n", "\n", "$$ \n", "P(Z=1|X_1, ..., X_m) = \\\\\n", "= P(Z=1|X_1, ..., X_m, W = 1) * P(W = 1|X_1, ..., X_m, ) + \\\\\n", "+ P(Z=1|X_1, ..., X_m, W = 0) * P(W = 0|X_1, ..., X_m, ) = \\\\\n", "= P(Y=1|X_1, ..., X_m, W = 1) * P(W = 1|X_1, ..., X_m, ) + \\\\\n", "+ P(Y=0|X_1, ..., X_m, W = 0) * P(W = 0|X_1, ..., X_m, ).\n", "$$\n", "\n", "Выше мы обсуждали, что обучающая выборка для моделирования uplift собирается на основе рандомизированного разбиения части клиенской базы на тестовую и контрольную группы. Поэтому коммуникация $ W $ не может зависить от признаков клиента $ X_1, ..., X_m $. Принимая это, мы имеем: $ P(W | X_1, ..., X_m, ) = P(W) $ и \n", "\n", "$$\n", "P(Z=1|X_1, ..., X_m) = \\\\\n", "= P^T(Y=1|X_1, ..., X_m) * P(W = 1) + \\\\\n", "+ P^C(Y=0|X_1, ..., X_m) * P(W = 0).\n", "$$\n", "\n", "Также допустим, что $P(W = 1) = P(W = 0) = \\frac{1}{2}$, т.е. во время эксперимента контрольные и тестовые группы были разделены в равных пропорциях. Тогда получим следующее:\n", "\n", "$$\n", "P(Z=1|X_1, ..., X_m) = \n", "P^T(Y=1|X_1, ..., X_m) * \\frac{1}{2} + P^C(Y=0|X_1, ..., X_m) *\\frac{1}{2} \\Rightarrow \\\\\n", "\\Rightarrow 2 * P(Z=1|X_1, ..., X_m) = P^T(Y=1|X_1, ..., X_m) + P^C(Y=0|X_1, ..., X_m) = \\\\\n", "= P^T(Y=1|X_1, ..., X_m) + 1 - P^C(Y=1|X_1, ..., X_m) \\Rightarrow \\\\\n", "\\Rightarrow P^T(Y=1|X_1, ..., X_m) - P^C(Y=1|X_1, ..., X_m) = UPLIFT = 2 * P(Z=1|X_1, ..., X_m) - 1\n", "$$\n", "\n", "Таким образом, увеличив вдвое прогноз нового таргета и вычтя из него единицу мы получим значение самого uplift'a, т.е.\n", "\n", "$$\n", "UPLIFT = 2 * P(Z=1) - 1\n", "$$\n", "\n", "Исходя из допущения описанного выше: $P(W = 1) = P(W = 0) = \\frac{1}{2}$, данный подход следует использовать только в случаях, когда количество клиентов, с которыми мы прокоммуницировлаи, равно количеству клиентов, с которыми коммуникации не было. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:15.254843Z", "start_time": "2020-04-16T20:41:14.087893Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 71 }, "colab_type": "code", "id": "V6yPXbJs3QIu", "outputId": "3d8e6c74-f98d-459b-93cd-e1bfd00d1ad9" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/Maksim/Library/Python/3.6/lib/python/site-packages/ipykernel_launcher.py:5: UserWarning: It is recommended to use this approach on treatment balanced data. Current sample size is unbalanced.\n", " \"\"\"\n" ] } ], "source": [ "from sklift.models import ClassTransformation\n", "\n", "\n", "ct = ClassTransformation(CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True))\n", "ct = ct.fit(X_train, y_train, treat_train, estimator_fit_params={'cat_features': cat_features})\n", "\n", "uplift_ct = ct.predict(X_val)\n", "\n", "ct_score = uplift_at_k(y_true=y_val, uplift=uplift_ct, treatment=treat_val, strategy='by_group', k=0.3)\n", "\n", "models_results['approach'].append('ClassTransformation')\n", "models_results['uplift@30%'].append(ct_score)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "sAACdNv13QI_" }, "source": [ "## 2. Подходы с двумя моделями\n", "\n", "Подход с двумя моделями можно встретить почти в любой работе по uplift моделированию, он часто используется в качестве бейзлайна. Однако использование двух моделей может привести к некоторым неприятным последствиям: если для обучения будут использоваться принципиально разные модели или природа данных тестовой и контрольной групп будут сильно отличаться, то возвращаемые моделями скоры будут не сопоставимы между собой. Вследствие чего расчет uplift будет не совсем корректным. Для избежания такого эффекта необходимо калибровать модели, чтобы их скоры можно было интерпертировать как вероятности. Калибровка вероятностей модели отлично описана в [документации scikit-learn](https://scikit-learn.org/stable/modules/calibration.html).\n", "\n", "### 2.1 Две независимые модели\n", "\n", "Как понятно из названия, подход заключается в моделировании условных вероятностей тестовой и контрольной групп отдельно. В статьях утверждается, что такой подход достаточно слабый, так как обе модели фокусируются на прогнозировании результата отдельно и поэтому могут пропустить \"более слабые\" различия в выборках.\n", "\n", "

\n", " \"Two\n", "

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:17.230517Z", "start_time": "2020-04-16T20:41:15.257156Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 359 }, "colab_type": "code", "id": "S9mOrhPg3QJC", "outputId": "e1a8b38f-65f1-429d-da70-cc663e788324" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJsAAAGrCAYAAABntZYXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzde7xVZZ348c/XS6J5R6YMdGDKSmwYNNTSalArb5ldLNFGSTNzRkct09Rf5sm0bLxfJh0KSh0LzVvgUKYmlWkqKplAvkQhBVERL+Bd9Pv7Yz0HNsdzDgfc++xzOJ/367VfZ+1nPWut79roevb+rud5VmQmkiRJkiRJUj2s1uwAJEmSJEmStOow2SRJkiRJkqS6MdkkSZIkSZKkujHZJEmSJEmSpLox2SRJkiRJkqS6MdkkSZIkSZKkujHZJK0CIuLjETG75v0DEfHRldjPyIiYVtfgJGkVFxE/i4hTm3TswRGREbFGef/riBi9EvvZPCKej4jV6x+lJPVOtdf3iPhoRDxQs+59ETE1IhZFxJHNi3KpiJgcEYeU5S9FxG9Xcj8r1ZZItUw2qSHKF9bW1xsR8VLN+y814Hj/GxEt9d5vF4/9nojIZhy7I5n5vsz8Y2d1ImKN8gNlcM12kzNzq0bHJ0krKiL2j4gppR2ZV74If6QO+21aoqgRMnP3zLxkefUiYnZEfLxmu0cyc93MfL2xEUpS9ynfdd/TpqwlIv53RfeVmX/MzPfVFB0H3JKZ62Xm+T2tPcnMyzPzk8ur197n0dW2ROqMySY1RPnCum5mrgs8AuxVU3Z52/qtd2TlZyFJbUXEN4Bzge8D7wA2B34E7N0Nx+62a3JU/G4mSb3DPwINGxHgbwL1dn6hUVNExKkRcUVE/CIiFgH/FhGrRcSJEfFQRDwVEeMjYqNSf7WIuCoiHo+IZ0sX0S3Luv8A9gVOLHe8ry3lcyLimxFxfykfExHviIgbImJhRPw2IjasiWnHiPhz2f/UiPhYzbpbI+K7EXFb6Sr7m4jYuKz+Q6nT2nNr207O95dl+ykR8c816+dExLER8VfghVI2KCKujYj5ETErIg6vqb9ORFwWEc9ENeztg22ONyciRpblNSLipPK5LizHfldr3MC0Evfn483D8baKiN+Xz+SvEbFnzbr/jYjzS++CRRFxe0QMqfn3Oj8inoyI5yLivogY2rX/OiRpqYjYADgFODwzr8nMFzLztcycmJnHljprRcS5EfFYeZ0bEWuVdSPLNfGYck2aFxEHlXWHAl8CjivXwYmlfHZEfCsi7gNeKNfRLUvb82xETIuIT3cx/i9HxJ8i4sJyPfxbROxSs35yRJwWEX8CXgT+KSI2iIixJda5pQ1ZvdRfPSLOLO3kw8CebY63ZAhFef/ViJhRrtPTI2KbiLiMKmE3sZz3cfHm4XjviogJEfF0RMyMiK/W7LMlIq6MiEvLfqdFxIia9d8qcS+Kalj3LkhSD1TTRpxYrquzo4NRGK11y/LvgJ2AC8t1tN32pJ19ZEQcGREPl+OdEeUmQ017cU5ELABaSvnB5Tr+TFS/Y/6xZn+fKO3KcxFxIRA1674cEbfWvN8qIm4s1/UnyjnvBpwI7Fvi/kupWzscb7WI+HZE/L20o5eWtrl2KPfoiHiknNP/qznmdlH99lhYjnn2Cv8jqdcy2aRm+izwc2AD4Arg61Rfmj8GDAKeB86vqX89sAXwTuB+4DKAzPxR2f77pefUZ9scY2fg/cDngf+j6vL6D8BawOEAEbEZMAE4GdgYOB64JiL61+xrf2A01V31twPfKOUfK3G09ty6q4Pz/Vw5342Bq4BrY9k7FqOA3YENS6NzPXAXMBD4BHBszRf2U4DNgH8C9ihxdeRYYB9gN2BD4BDg5da4ga1K3FfXbhQRbysx/B8wgOrf54pYtivy/sBJ5ZweAb5XyncHPkT177VRObenO4lRkjryYaAfcG0ndf4f1TVnOPAvwHbAt2vWv5OqrRkIfAX474jYKDPHAJcD/1Wug3vVbLMfVZu0IdWX94nAb6naj/8ELo+I2uEUndkeeAjYhKqduSaW3rAAOAA4FFgP+DvwM2Ax8B5ga+CTVNdugK8CnyrlI6iu7+2KiC9Q/Vg5EFgf+DSwIDMPYNlex//VzubjgTnAu8oxvh8RO9es/3SpsyFV+3lhOeb7gCOAbTNzPWBXYHYnn40kNds7qa7PA6m+U49Z3vU9M3cG/ggcUa6jnbUnbX2W6vq9DVUP3YNr1m0PPEz1e+O0iNibKhn0Oarv438EfgEQEZsA11C1d5tQtTM7tnfAiFgPuAn4DdV1/T3AzZn5G6pew1eUuP+lnc2/XF47Uf32WJdyza/xEeB9wC7Ad6J0CgDOA87LzPWBdwNXdvK5aBVjsknNdGu5M/1GZr4EHAacmJlzM/Nl4LvAFyJitVLnZ5m5qKxrAT4YEW9fzjHOz8wnM3MOcCtwe2b+pezjOqov61B9EZ+QmTeUY/0G+AtVgqbV2Mx8MDNfBH5J9aNmRdyRmddm5mvAGVRf/Gt7QZ2XmXPKZ/FhYP3M/H5mvpqZM4GxVEkbgC8Cp2bmM5n5d958wa91CNXn+mA5t6mZ2ZXEz47A24AzSi+Cm4Bf18QAcFVmTinndDlLP5PXyvm9HyAzp2fm4104piS11R94KjMXd1LnS8Ap5Xo/n6r9OKBm/Wtl/WuZOYnqZsbyEkXnZ+aj5Zr8Iaov16eXa/LvqJLx+3XxHJ4Ezi3HvwJ4gGV7JP0sM6eVc9yY6ibC0aUX15PAOSx7/T+3xPY08INOjnsI1Q+fu7Iys7QZnSo3YHYEvpWZL2fmVOAnVG1lq1szc1KZ4+kyqiQfwOtUN3OGRsSamTk7Mx9a3jElqclOysxXMvP3VDdav9jAY/0wM5/OzEeohojXtiWPZeYFmbm45vfRDzJzRmkjvg8ML72b9gCmZeZV5bv4uUBH37c/BTyemWeV6/qizLyji/F+CTg7Mx/OzOeBE4BRbW6afzczX8rMv1D9hmptE14D3hMRm2Tm85n55y4eU6sAk01qpkfbvG/t0v9sRDwL/LWU/0MZNvBfpcvpQmBmWbfJco7xRM3yS+28X7cs/yOwX+uxy/E/RJX5b1V78X6xZtuuWnK+5cv53Db7r/08/hHYvE08x1HdeQHYtE39zn48bEZ1p2NFvQt4JDNrJz//O9Vdn1btfiaZ+VvgYuAi4ImIuLjcUZGkFbUA2CQ6n7viXSx7Hfw7y15fF7RJVnXlGl57jX0X8GhmvtHmGAPpmrntXEs7u/6vCcyruf7/D1WPqiWxtNlXR97K9f/pzFzU5jidXf/7RcQa5ebI0VQ3hZ6Makh87blKUnd6neqaWmtNqiRIq2cy84Wa922v0fXW9hreUXsAVZtwXk178DRVb9uBtGkPSjvTdvtWK9seQPtt7BpUva9adfQ76SvAe4G/RcRdEfGplYxBvZDJJjVT2ye4zQE+kZkb1rz6lR4xB1Jl73emGgrROpQrOtjXinoU+GmbY789M89YifPoyGatC2WY3EDgsQ728yjwYJt41qvpkvt47f6oEnUdeZSq2+qKxv0YsFlERE3Z5lRJsuXKzHMzcxvgA8BQlg47lKQVcTvwCvCZTuo8RvWFvNXmLHt97UxH18La8tbrYe33pi5fD4GB7VxLO7v+vwJsUnP9Xz+XPil0Hm/9+t/2mG09Bmzc5ibBilz/f56ZH6H6N0ngh13ZTpIa4BFgcJuyISybPNmozWiJFWlDaq3wb4J2jtV2H48CX2vzm2DtzLyNNu1BaWc2o32PUg2BW5m422tjF7PsTfz2d1yNrNiP6obJD4GrujAyRasIk03qSS6mmhNic4CI+IdYOgHrelRfvhcA6wCntdn2CTq+gHbFZcBnyyR7q0dEv4jYqYt3Y58EMiKWd/ztImLviFgT+CawiGpOpvbcDrwa1YS2/UpM/xwRrROBX0k1IfqG5fM6opPj/gQ4NSLeHZXhEbFx6V21gI4/t9uoGpJjImLNMlfHHlTzY3WqTAa4XemJ8ALwKvDGcjaTpDfJzOeA71DNs/SZqB6QsGZE7B4RrXMN/QL4dkQMKHNYfAfo6mOtu9J+3EF1p/a4cuyRwF5UcxZ1xT8AR5ZtvwBsCUxqr2JmzqOaG+qsiFi/TMz67oj411LlyrKvQVE9ROP4To77E+CbEfHBcv1/TyydWLbD887MR6nagB+UNmgY1d3p5X6mEfG+iNg5qgnaX6bqRez1X1KzXEHVPgwq19OPU12/r2pT77sR8baI+CjVkLNfrsSxuvp75NiI2KgMWT6Kzr9bXwycEBFbQfXQjNKOQDXcb6uI+Fz5zn0kS0dBtHU9sGlEHB3VQzXWi4jta+IeHB0/DfUXwNcjYkhErMvSOZ46G95OifffImJA6Rn8bCm2TegjTDapJzmbatK6m6N6Qt1tLJ3T6KdUWfXHqB4xelubbX8C/EtUT2lo23gsV2bOppqs7yRgPtVdkGPowv8jZZjBD4A7ShfXER1UvRb4N6rur/sCn+voIl3K96Ca5HY28BTVMIr1S5WTqe5mzKaaR+nSTkI8g2p+qpuBhcAYqsl2W/fz8xL359rE8ApVY7x3Of75wP6Z+WAnx2q1IdUcU8+WGOdR/ftK0grLzLOoekd+m+oa/ShVkv26UuVUYApwH9UQ7HtKWVeMpZpf6NmIuK69Cpn5KtX1cHeq6+GPgAMz829dPMYdVA9MeIrqZsk+mbmgk/oHUs2ZNx14hupH0aZl3Y+BG6jmxLiHanLYdmXmL8vxfk51g+M6qjmhoGq3vl3O+5vtbL4fVW+Ax6jar5PL3H3LsxZwOtW5Pk6VaDuhC9tJUiOcQvW74Vaq6+l/AV/KzPtr6jxe1j1GNQfpYStwfa+13Pak+BVwNzCVKmE0tqOKmXktVY+g8WUqkfup2iIy8yngC1TX3AVU7cyfOtjPIqoHDu1Fdb4PUk34DUsTawsi4p52Nh9HdWP+D8AsqhsJ/9nJ+dXajfLka6rJwkeVuajUB8SyUwhIaoSIOBUYlJlfbnYskqTuExFfBg4pw8okST1I6an6v5k5qJuOl8AWZX47aZVmzyZJkiRJkiTVjckmSZIkSZIk1Y3D6CRJkiRJklQ39mySJEmSJElS3azR7AAaYZNNNsnBgwc3OwxJ6pHuvvvupzJzQLPjaCbbCUnqmO2E7YQkdaSrbcQqmWwaPHgwU6ZMaXYYktQjRcTfmx1Ds9lOSFLHbCdsJySpI11tIxxGJ0mSJEmSpLox2SRJkiRJkqS6MdkkSZIkSZKkulkl52yStGp77bXXmDNnDi+//HKzQ+nR+vXrx6BBg1hzzTWbHYokLZfX9u5nOyFJXdMX26i32kaYbJLU68yZM4f11luPwYMHExHNDqdHykwWLFjAnDlzGDJkSLPDkaTl8trevWwnJKnr+lobVY82wmF0knqdl19+mf79+/eJC/3Kigj69+/fp+6+SOrdvLZ3L9sJSeq6vtZG1aONMNkkqVfqKxf6t8LPSFJv43Wre/l5S1LX9bVr5ls9X5NNkiRJkiRJqhvnbJLU602cWN/97bVX5+sXLFjALrvsAsDjjz/O6quvzoABAwC48847edvb3rbSxx43bhx77LEH73znO7u8zcyZM9lnn32YOnXqSh9XknqaWbNa6rq/IUOWv7+I4Bvf+AZnnXUWAGeeeSbPP/88LS0db3vdddfx3ve+l6FDh67QupUxdepUHnvsMfbYY48V2m7kyJGceeaZjBgxoi5xSFJf1zK5pb77G9n5/mbPns2nPvUp7r///qXbtLSw7rrr8s1vfrPdbX72s58xZcoULrzwQi6++GLWWWcdDjzwQP72t78xatQoIoKf/OQn3HHHHfzHf/xHPU8HsGeTJK2w/v37M3XqVKZOncphhx3G17/+9SXvWxNNmckbb7yxwvseN24cjz/+eL1DliR1wVprrcU111zDU0891eVtrrvuOqZPn77C6xYvXrzC8U2dOpVJkyat8HaSpL7tsMMO48ADDwSqtmmfffbh3nvvpX///vzoRz9qyDFNNklSncycOZOhQ4fypS99ia222op58+bx61//mg9/+MNss8027LvvvrzwwgsAnHzyyWy77bZ84AMf4LDDDiMzueKKK5g6dSr77rsvw4cP59VXX+Wuu+7iX//1X/ngBz/I7rvvzhNPPAHAXXfdxbBhwxg+fDgXX3xxM09bklYZa6yxBoceeijnnHPOm9bNnj2bnXfemWHDhrHLLrvwyCOPcNtttzFhwgSOPfZYhg8fzkMPPbSkfnvrRo4cydFHH82IESM477zzmD9/Pp///OfZdttt2XbbbfnTn/4EVL1kP/zhD7P11luzww478MADD/Dqq6/yne98hyuuuILhw4dzxRVX8MILL3DwwQez3XbbsfXWW/OrX/0KgJdeeolRo0ax5ZZb8tnPfpaXXnqpez5ASVK3GzlyJEcddRTDhw/nAx/4AHfeeeeb6rS0tHDmmWcyadIkzj33XC666CJ22mknjj/+eB566CGGDx/OscceW9e4HEYnSXX0t7/9jUsvvZQRI0bw5JNPcvrpp3PzzTezzjrrcNppp3Heeedx4oknctRRR/Hd736XzGT//ffnN7/5Dfvuuy8XXHABF154IcOHD+eVV17hqKOOYsKECWyyySZcfvnlnHTSSYwZM4Yvf/nLjBkzhh133JGvf/3rzT5tSVplHH744QwbNozjjjtumfL//M//ZPTo0YwePZpx48Zx5JFHct111/HpT3+aT33qU+yzzz7L1N9hhx3aXffqq68yZcoUAPbff3++/vWv85GPfIRHHnmEXXfdlRkzZvD+97+fP/7xj6yxxhrcdNNNnHjiiVx99dWccsopS4ZEAJx44onsvPPOjBs3jmeffZbtttuOj3/84/zP//wP66yzDjNmzOC+++5jm222afCnJklqphdffJGpU6fyhz/8gYMPPniZ4Xa19thjDw477LAlw+9mz57N/fff35DpOEw2SVIdvfvd714yJ8Ztt93G9OnT2WGHHYDqB8ZHPvIRAG6++WbOOOMMXn75ZZ566qklPZdqzZgxg2nTpvHxj38cgNdff51Bgwbx1FNP8dJLL7HjjjsCcMABB3DLLbd01ylK0ipt/fXX58ADD+T8889n7bXXXlJ+++23c8011wDVdbdtMqqr9t133yXLN9100zLD7BYuXMjzzz/Pc889x+jRo3nwwQeJCF577bV29/Xb3/6WCRMmcOaZZwLVo7kfeeQR/vCHP3DkkUcCMGzYMIYNG7ZSsUqSeoaOngzXWr7ffvsB8LGPfYyFCxfy7LPPdltsHTHZJEl19Pa3v33Jcmay2267cdllly1T58UXX+SII47gnnvuYeDAgXz729/m5ZdfftO+MpNhw4bxxz/+cZnyFZlLRJK04o4++mi22WYbDjrooLrvu7adeOONN/jzn/9Mv379lqlzxBFHsNNOO3Httdcye/ZsRo4c2e6+MpOrr76a973vfXWPU5LUc/Tv359nnnlmmbKnn36aIUOGAG9ORnWUnOpOztkkSQ2yww478Pvf/56HH34YgBdeeIEHH3yQl156idVWW41NNtmERYsWcfXVVy/ZZr311mPRokUADB06lLlz5y4Zd/3qq68ybdo0NtlkE9Zee21uv/12AC6//PJuPjNJWrVtvPHGfPGLX2Ts2LFLynbYYQfGjx8PVNfdj370o8Cy1+22OlsH8MlPfpILLrhgyfvWYQzPPfccAwcOBKqnCXW0v1133ZULLriAzATg3nvvBao72z//+c8BuP/++7nvvvu6duKSpB5p3XXXZdNNN+V3v/sdUCWafvOb3ywZNXHFFVcAcOutt7LBBhuwwQYbdGm/y2un3gp7Nknq9fbaq9kRtO8d73gHY8eOZd999+XVV18F4Pvf/z577rkno0ePZujQoWy66aZsv/32S7Y56KCDOOSQQ1h77bW58847ueqqqzjyyCNZuHAhr7/+OscccwxbbbUVP/3pTznkkENYbbXV+MQnPtGsU5SkhhkypKWpxz/mmGOWzI0EcMEFF3DQQQdxxhlnMGDAAH76058CMGrUKL761a9y/vnnc9VVV/Hud797yTZt17V1/vnnL5kjavHixXzsYx/j4osv5rjjjmP06NGceuqp7Lnnnkvq77TTTpx++ukMHz6cE044gZNOOomjjz6aYcOG8cYbbzBkyBCuv/56/v3f/52DDjqILbfcki233JIPfvCDDfykJKnvaRnZ0u3HvPTSSzn88MP5xje+AVQPHGptc/r168fWW2/Na6+9xrhx47q8z/79+7PjjjvygQ98gN13350zzjijbvFG652QVcmIESOydeJFqa+aOHHpck9NxqysGTNmsOWWWzY7jF6h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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklift.models import TwoModels\n", "\n", "\n", "tm = TwoModels(\n", " estimator_trmnt=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " estimator_ctrl=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " method='vanilla'\n", ")\n", "tm = tm.fit(\n", " X_train, y_train, treat_train,\n", " estimator_trmnt_fit_params={'cat_features': cat_features}, \n", " estimator_ctrl_fit_params={'cat_features': cat_features}\n", ")\n", "\n", "uplift_tm = tm.predict(X_val)\n", "\n", "tm_score = uplift_at_k(y_true=y_val, uplift=uplift_tm, treatment=treat_val, strategy='by_group', k=0.3)\n", "\n", "models_results['approach'].append('TwoModels')\n", "models_results['uplift@30%'].append(tm_score)\n", "\n", "plot_uplift_preds(trmnt_preds=tm.trmnt_preds_, ctrl_preds=tm.ctrl_preds_);" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "BVdXAMsO3QLM" }, "source": [ "### 2.2 Две зависимые модели\n", "\n", "Подход зависимого представления данных основан на методе цепочек классификаторов, первоначально разработанном для задач многоклассовой классификации. Идея состоит в том, что при наличии $L$ различных меток можно построить $L$ различных классификаторов, каждый из которых решает задачу бинарной классификации и в процессе обучения каждый следующий классификатор использует предсказания предыдущих в качестве дополнительных признаков. Авторы данного метода предложили использовать ту же идею для решения проблемы uplift моделирования в два этапа. В начале мы обучаем классификатор по контрольным данным: \n", "$$\n", "P^C = P(Y=1| X, W = 0),\n", "$$\n", "затем исполним предсказания $P_C$ в качестве нового признака для обучения второго классификатора на тестовых данных, тем самым эффективно вводя зависимость между двумя наборами данных:\n", "\n", "$$\n", "P^T = P(Y=1| X, P_C(X), W = 1)\n", "$$\n", "\n", "Чтобы получить uplift для каждого наблюдения, вычислим разницу:\n", "\n", "$$\n", "uplift(x_i) = P^T(x_i, P_C(x_i)) - P^C(x_i)\n", "$$\n", "\n", "Интуитивно второй классификатор изучает разницу между ожидаемым результатом в тесте и контроле, т.е. сам uplift.\n", "\n", "

\n", " \"Two\n", "

" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:19.361999Z", "start_time": "2020-04-16T20:41:17.233889Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 359 }, "colab_type": "code", "id": "C654kkas3QLR", "outputId": "c81b0679-ecd4-44cb-e564-d81ec16a6de8" }, "outputs": [ { "data": { "image/png": "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adOW+zhJUt92yCGHsP/++wNV27T33nvzl7/8hQEDBvCTn/yk065jgEmSOsns2bMZNmwYX/ziF9lyyy1ZsGABv/3tb/nIRz7C1ltvzT777MOLL74IwIknnsg222zDBz7wAQ455BAyk8mTJzNjxgz22WcfRowYwWuvvcadd97Jv/3bv/GhD32IPfbYg8cffxyAO++8k+HDhzNixAjOP//87rxtSVpp9OvXj4MPPpgzzjjjbfvmzp3LTjvtxPDhw9l55515+OGHueWWW5gyZQpHH300I0aM4MEHH1ySv7V9o0aN4sgjj2TkyJGcddZZPPnkk3zuc59jm222YZtttuHPf/4zUPWG/chHPsJWW23F9ttvz/33389rr73Gd7/7XSZPnsyIESOYPHkyL774Il/5ylfYdttt2WqrrfjNb34DwMsvv8zYsWPZYost+MxnPsPLL7/cNR+gJKnLjRo1iiOOOIIRI0bwgQ98gDvuuONteZqamjj99NOZNm0aZ555Jueddx477rgjxx57LA8++CAjRozg6KOPrrssDpGTpE7097//nQsvvJCRI0fyxBNPcOqpp3L99dez5pprcsopp3DWWWdx/PHHc8QRR/C9732PzGS//fbjd7/7Hfvssw/nnHMO5557LiNGjODVV1/liCOOYMqUKWy44YZcfPHFnHDCCYwfP54vf/nLjB8/nh122IFvfOMb3X3bkrTSOPTQQxk+fDjHHHPMW9K//vWvM27cOMaNG8fEiRM5/PDDueqqq/jUpz7FJz/5Sfbee++35N9+++1b3ffaa68xffp0APbbbz++8Y1v8NGPfpSHH36Y3XbbjVmzZvH+97+fm266iX79+nHddddx/PHHc/nll3PSSSctGe4AcPzxx7PTTjsxceJEnnnmGbbddls+8YlP8NOf/pQ111yTWbNmcc8997D11ls3+FOTJHWnl156iRkzZvCnP/2Jr3zlK28ZSldr9OjRHHLIIUuG1s2dO5d7772306baMMAkSZ1os802WzLHxS233MJ9993H9ttvD1Q/Kj760Y8CcP3113Paaafxyiuv8NRTTy3poVRr1qxZzJw5k0984hMAvPHGGwwePJinnnqKl19+mR122AGAL33pS9xwww1ddYuStFJbZ5112H///Tn77LNZY401lqTfeuutXHHFFUBV77YMQHXUPvvss2T7uuuue8sQuueee44XXniBZ599lnHjxvHAAw8QEbz++uutnuv3v/89U6ZM4fTTTweqZbQffvhh/vSnP3H44YcDMHz4cIYPH75CZZUk9QxtrejWnL7vvvsC8PGPf5znnnuOZ555psvKVssAkyR1one+851LtjOT3XffnYsuuugteV566SUOO+ww7r77bgYNGsR3vvMdXnnllbedKzMZPnw4N91001vSl2duEEnS8jvyyCPZeuutOeCAAzr93LXtxJtvvsltt91G//7935LnsMMOY8cdd+TKK69k7ty5jBo1qtVzZSaXX34573vf+zq9nJKknmPAgAE8/fTTb0lbtGgRQ4cOBd4egGorINVozsEkSQ2y/fbb88c//pGHHnoIgBdffJEHHniAl19+mVVWWYUNN9yQ559/nssvv3zJMWuvvTbPP/88AMOGDWP+/PlLxlG/9tprzJw5kw033JA11liDW2+9FYCLL764i+9MklZuG2ywAV/4wheYMGHCkrTtt9+eSZMmAVW9+7GPfQx4a73dUnv7AHbddVfOOeecJe+bhyg8++yzDBo0CKhWAWrrfLvtthvnnHMOmQnAX/7yF6B6gn3JJZcAcO+993LPPfd07MYlST3SWmutxcYbb8wf/vAHoAou/e53v1syOmLy5MkA3Hzzzay77rqsu+66HTrvstqp5WUPJkm93pgx3V2C1m200UZMmDCBffbZh9deew2AH/zgB+y5556MGzeOYcOGsfHGG7PddtstOeaAAw7goIMOYo011uCOO+7gsssu4/DDD+e5557jjTfe4KijjmLLLbfkF7/4BQcddBCrrLIKu+yyS3fdoiQ1zNChTd16/aOOOmrJXEcA55xzDgcccACnnXYaAwcO5Be/+AUAY8eO5atf/Spnn302l112GZttttmSY1rua+nss89eMufT4sWL+fjHP87555/PMcccw7hx4zj55JPZc889l+TfcccdOfXUUxkxYgTHHXccJ5xwAkceeSTDhw/nzTffZOjQoVx99dX8x3/8BwcccABbbLEFW2yxBR/60Ica+ElJUt/TNKqpy6954YUXcuihh/LNb34TqBYNam5z+vfvz1ZbbcXrr7/OxIkTO3zOAQMGsMMOO/CBD3yAPfbYg9NOO62uMkbzE4+VyciRI7N58kSpJ5s6del2Tw2S9ESzZs1iiy226O5i9AqtfVYRcVdmjuym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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tm_ctrl = TwoModels(\n", " estimator_trmnt=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " estimator_ctrl=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " method='ddr_control'\n", ")\n", "tm_ctrl = tm_ctrl.fit(\n", " X_train, y_train, treat_train,\n", " estimator_trmnt_fit_params={'cat_features': cat_features}, \n", " estimator_ctrl_fit_params={'cat_features': cat_features}\n", ")\n", "\n", "uplift_tm_ctrl = tm_ctrl.predict(X_val)\n", "\n", "tm_ctrl_score = uplift_at_k(y_true=y_val, uplift=uplift_tm_ctrl, treatment=treat_val, strategy='by_group', k=0.3)\n", "\n", "models_results['approach'].append('TwoModels_ddr_control')\n", "models_results['uplift@30%'].append(tm_ctrl_score)\n", "\n", "plot_uplift_preds(trmnt_preds=tm_ctrl.trmnt_preds_, ctrl_preds=tm_ctrl.ctrl_preds_);" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Kcy2kN3T3QLg" }, "source": [ "Аналогичным образом можно сначала обучить классификатор $P^T$, а затем использовать его предсказания в качестве признака для классификатора $P^C$." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:21.519463Z", "start_time": "2020-04-16T20:41:19.366080Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 359 }, "colab_type": "code", "id": "z9Db6zMB3QLn", "outputId": "fae5f3cd-5ed8-42fe-e5ec-d39190705a20" }, "outputs": [ { "data": { "image/png": "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27y39yzbCUnquv7WRi1pG2GCSVKf1F9u7vXwbySpr/G+1bP8e0tS1/W3e+aSXK8JJkmSJEmSJNXFOZgk9XmTJ3fv8caO7Xz7nDlz2G67auqHJ598kmWXXZbBgwcDcOedd/Kud71ric89ceJExowZw3vf+94u7zNjxgx23313pk6dusTnlaTeZubMlm493vDhiz5eRPC1r32NH/zgBwCcdtppvPzyy7S0dLzv1VdfzQc/+EFGjBixWNuWxNSpU3n88ccZM2bMYu03evRoTjvtNEaNam8qI0nS4mq5paV7jze68+PNmjWLT3/609x///0L9mlpYaWVVuLrX/96u/v87Gc/Y8qUKZxzzjmcd955rLjiiuyzzz787W9/Y9y4cUQEP/nJT7jjjjv4yle+0i3XYQ8mSVpMgwYNYurUqUydOpWDDjqII444Yv56a3IpM3nnnXcW+9gTJ07kySef7O6QJUldsPzyy3PllVfy7LPPdnmfq6++mgceeGCxt82bN2+x45s6dSrXXnvtYu8nSerfDjroIPbZZx+gapt233137r33XgYNGsSPfvSjbjuPCSZJ6iYzZsxgxIgR7LXXXmy00UY88cQT/OY3v+FjH/sYm222GXvssQevvPIKACeccAKbb745G2+8MQcddBCZyaWXXsrUqVPZY489GDlyJG+++SZ33XUX//Zv/8ZHPvIRdt55Z5566ikA7rrrLjbZZBNGjhzJeeed18zLlqSlxoABAzjwwAM5/fTT/2nbrFmz2Hbbbdlkk03YbrvteOSRR7jtttuYNGkSRx11FCNHjuTvf//7/PrtbRs9ejSHH344o0aN4swzz+SZZ57hc5/7HJtvvjmbb745f/rTn4CqN+zHPvYxNt10U7baaisefPBB3nzzTb71rW9x6aWXMnLkSC699FJeeeUV9ttvP7bYYgs23XRTfv3rXwPw2muvMW7cODbccEM+85nP8Nprr/XMH1CS1ONGjx7NYYcdxsiRI9l444258847/6lOS0sLp512Gtdeey1nnHEG5557Lttssw3HHHMMf//73xk5ciRHHXVU3bE4RE6SutHf/vY3LrzwQkaNGsXTTz/NKaecwk033cSKK67IySefzJlnnslxxx3HYYcdxre//W0ykz333JPrrruOPfbYg7PPPptzzjmHkSNH8sYbb3DYYYcxadIk1lxzTS6++GKOP/54JkyYwJe+9CUmTJjA1ltvzRFHHNHsy5akpcbBBx/MJptswtFHH71Q+Ve/+lXGjx/P+PHjmThxIoceeihXX301u+66K5/+9KfZfffdF6q/1VZbtbvtzTffZMqUKQDsueeeHHHEEXz84x/nkUceYccdd2T69Ol86EMf4o9//CMDBgzgxhtv5LjjjuOKK67gxBNPnD/cAeC4445j2223ZeLEibzwwgtsscUWfOpTn+LHP/4xK664ItOnT+e+++5js802a/BfTZLUTK+++ipTp07lD3/4A/vtt99CQ+lqjRkzhoMOOmj+0LpZs2Zx//33d9tUGyaYJKkbfeADH5g/x8Vtt93GAw88wFZbbQVUXyo+/vGPA3DTTTdx6qmn8vrrr/Pss8/O76FUa/r06UybNo1PfepTALz99tsMHTqUZ599ltdee42tt94agL333pubb765py5RkpZqq6yyCvvssw9nnXUWK6ywwvzy22+/nSuvvBKo7rttE1Bdtccee8xfvvHGGxcaQvfSSy/x8ssv8+KLLzJ+/HgeeughIoK33nqr3WP99re/ZdKkSZx22mlA9RrtRx55hD/84Q8ceuihAGyyySZssskmSxSrJKl36OiNbq3lX/ziFwH45Cc/yUsvvcQLL7zQY7HVMsEkSd3o3e9+9/zlzGSnnXbioosuWqjOq6++yiGHHMI999zDkCFD+OY3v8nrr7/+T8fKTDbZZBP++Mc/LlS+OHODSJIW3+GHH85mm23Gvvvu2+3Hrm0n3nnnHf785z8zcODAheoccsghbLPNNlx11VXMmjWL0aNHt3uszOSKK65ggw026PY4JUm9x6BBg3j++ecXKnvuuecYPnw48M8JqI4SUo3mHEyS1CBbbbUVv//973n44YcBeOWVV3jooYd47bXXWGaZZVhzzTWZO3cuV1xxxfx9Vl55ZebOnQvAiBEjeOyxx+aPo37zzTeZNm0aa665JiussAK33347ABdffHEPX5kkLd3WWGMNvvCFL3D++efPL9tqq6245JJLgOq++4lPfAJY+L7dVmfbAHbYYQfOPvvs+eutQxRefPFFhgwZAlRvAeroeDvuuCNnn302mQnAvffeC1RPsH/xi18AcP/993Pfffd17cIlSb3SSiutxNprr83vfvc7oEouXXfddfNHR1x66aUA3Hrrray66qqsuuqqXTruotqp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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tm_trmnt = TwoModels(\n", " estimator_trmnt=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " estimator_ctrl=CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True), \n", " method='ddr_treatment'\n", ")\n", "tm_trmnt = tm_trmnt.fit(\n", " X_train, y_train, treat_train,\n", " estimator_trmnt_fit_params={'cat_features': cat_features}, \n", " estimator_ctrl_fit_params={'cat_features': cat_features}\n", ")\n", "\n", "uplift_tm_trmnt = tm_trmnt.predict(X_val)\n", "\n", "tm_trmnt_score = uplift_at_k(y_true=y_val, uplift=uplift_tm_trmnt, treatment=treat_val, strategy='by_group', k=0.3)\n", "\n", "models_results['approach'].append('TwoModels_ddr_treatment')\n", "models_results['uplift@30%'].append(tm_trmnt_score)\n", "\n", "plot_uplift_preds(trmnt_preds=tm_trmnt.trmnt_preds_, ctrl_preds=tm_trmnt.ctrl_preds_);" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ohv6eLRJ3QMh" }, "source": [ "## Заключение\n", "\n", "Рассмотрим, какой метод лучше всего показал себя в этой задаче, и проскорим им тестовую выборку:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:21.536036Z", "start_time": "2020-04-16T20:41:21.522709Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "X_u-k5i93QMp", "outputId": "0677e739-722a-429a-8021-7e287e84f4a4" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
approachuplift@30%
1ClassTransformation0.061775
2TwoModels0.051637
3TwoModels_ddr_control0.047793
0SoloModel0.041614
4TwoModels_ddr_treatment0.033752
\n", "
" ], "text/plain": [ " approach uplift@30%\n", "1 ClassTransformation 0.061775\n", "2 TwoModels 0.051637\n", "3 TwoModels_ddr_control 0.047793\n", "0 SoloModel 0.041614\n", "4 TwoModels_ddr_treatment 0.033752" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(data=models_results).sort_values('uplift@30%', ascending=False)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-RWfGK_v3QNB" }, "source": [ "Из таблички выше можно понять, что в текущей задаче лучше всего справился подход трансформации целевой перемнной. Обучим модель на всей выборке и предскажем на тест." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:24.150095Z", "start_time": "2020-04-16T20:41:21.539068Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 156 }, "colab_type": "code", "id": "xBtueUVW3QND", "outputId": "0cd8283c-f44a-4513-8876-010ce2c3af16" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/Maksim/Library/Python/3.6/lib/python/site-packages/ipykernel_launcher.py:2: UserWarning: It is recommended to use this approach on treatment balanced data. Current sample size is unbalanced.\n", " \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "client_id,uplift\r\n", "000048b7a6,0.03777380619745441\r\n", "000073194a,0.0402001184660159\r\n", "00007c7133,-0.001255842638942739\r\n", "00007f9014,0.03165865533189738\r\n" ] } ], "source": [ "cm_full = ClassTransformation(CatBoostClassifier(iterations=20, thread_count=2, random_state=42, silent=True))\n", "cm_full = cm_full.fit(X_train_full, y_train_full, treat_train_full, estimator_fit_params={'cat_features': [1]})\n", "\n", "X_test.loc[:, 'uplift'] = cm_full.predict(X_test.values)\n", "\n", "sub = X_test[['uplift']].to_csv('sub1.csv')\n", "\n", "!head -n 5 sub1.csv" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2020-04-16T20:41:24.171639Z", "start_time": "2020-04-16T20:41:24.153353Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "pyTbXyy03QNd", "outputId": "cbf6898f-4a23-465b-de1d-4434b7ee26c6" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
feature_namefeature_score
0first_redeem_time79.642055
1age8.808502
2issue_redeem_delay5.113192
3first_issue_time3.558522
4gender2.877728
\n", "
" ], "text/plain": [ " feature_name feature_score\n", "0 first_redeem_time 79.642055\n", "1 age 8.808502\n", "2 issue_redeem_delay 5.113192\n", "3 first_issue_time 3.558522\n", "4 gender 2.877728" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cm_full_fi = pd.DataFrame({\n", " 'feature_name': cm_full.estimator.feature_names_,\n", " 'feature_score': cm_full.estimator.feature_importances_\n", "}).sort_values('feature_score', ascending=False).reset_index(drop=True)\n", "\n", "cm_full_fi" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bPBY5dUL3QQp" }, "source": [ "Итак, мы познакомились с uplift моделированием и рассмотрели основные классические подходы его построения. Что дальше? Дальше можно с головй окунуться в разведывательный анализ данных, генерацию новых признаков, подбор моделей и их гиперпарметров, а также изучение новых подходов и библиотек.\n", "\n", "**Спасибо, что дочитали до конца.**\n", "\n", "**Мне будет приятно, если вы поддержите проект звездочкой на [гитхабе](https://github.com/maks-sh/scikit-uplift/) или расскажете о нем своим друзьям.**" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "RetailHero.ipynb", "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "python 3", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }