Skip to content

Instantly share code, notes, and snippets.

@avidale
Last active May 25, 2023 21:23
Show Gist options
  • Save avidale/2aa018e6264a3e3887132d522b783561 to your computer and use it in GitHub Desktop.
Save avidale/2aa018e6264a3e3887132d522b783561 to your computer and use it in GitHub Desktop.
micro_segments.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "micro_segments.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPGpgoCSwJAdfRpy9ck68my",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"d5704653ebc8401181381c3a1d770285": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_509388a136054f9e9e4f880f6e1c08c5",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_6727b6dbc88a48e986b220cbd4c09c47",
"IPY_MODEL_3d486747308a4264b75131b5c8106554"
]
}
},
"509388a136054f9e9e4f880f6e1c08c5": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"6727b6dbc88a48e986b220cbd4c09c47": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_c4f04b9d42994e25a4f33bdc418e8db0",
"_dom_classes": [],
"description": "100%",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 131,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 131,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_ea70bcd7a2504ce295ce001201b2e67c"
}
},
"3d486747308a4264b75131b5c8106554": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_03db337abd384a07a426b5171947a9df",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 131/131 [11:16<00:00, 5.16s/it]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_62f89de11c794b859bbb58cf1764b1ac"
}
},
"c4f04b9d42994e25a4f33bdc418e8db0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "initial",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"ea70bcd7a2504ce295ce001201b2e67c": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"03db337abd384a07a426b5171947a9df": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"62f89de11c794b859bbb58cf1764b1ac": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/avidale/2aa018e6264a3e3887132d522b783561/micro_segments.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "I-KZFqkfUk-H"
},
"source": [
"В этом блокноте решается следующая задача: разделить пользователей на интерпретируемые микро-сегменты в зависимости от того, насколько в них выражена определённая характеристика. Делать это будем с помощью деревьев решений. \n",
"\n",
"Данные для примера возьмём из репозитория UCI: https://archive.ics.uci.edu/ml/datasets/Bank+Marketing.\n",
"\n",
"Они описывают маркетинговую кампанию банка. Целевая переменная - удалось ли впарить клиенту депозит. \n",
"\n",
"Получается, что мы должны выделить интерпретируемые сегментов, такие, которые или очень хорошо, или очень плохо откликаются на кампанию. Примеры этих сегментов могут выглядеть, например, так:\n",
"\n",
"* \"если исход прошлой маркетинговой кампании для данного клиента был успешным, и разговор длится больше 8 минут, то с вероятностью 80% клиент откроет депозит\"\n",
"* \"если у клиента есть ипотека, разговор шёл меньше 4 минут и был не в мае, то клиент откроет депозит только с вероятностью 0.3%\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "S_6F9eJdkwXE"
},
"source": [
"# Обучение классификаторов"
]
},
{
"cell_type": "code",
"metadata": {
"id": "F2AvqtgwUOsp",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a9f4a744-04ed-4150-f754-e541e878630f"
},
"source": [
"!wget https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip\n",
"!unzip bank.zip"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"--2021-04-10 22:26:02-- https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip\n",
"Resolving archive.ics.uci.edu (archive.ics.uci.edu)... 128.195.10.252\n",
"Connecting to archive.ics.uci.edu (archive.ics.uci.edu)|128.195.10.252|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 579043 (565K) [application/x-httpd-php]\n",
"Saving to: ‘bank.zip’\n",
"\n",
"bank.zip 100%[===================>] 565.47K 1.72MB/s in 0.3s \n",
"\n",
"2021-04-10 22:26:03 (1.72 MB/s) - ‘bank.zip’ saved [579043/579043]\n",
"\n",
"Archive: bank.zip\n",
" inflating: bank-full.csv \n",
" inflating: bank-names.txt \n",
" inflating: bank.csv \n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "T74eJHdpUZ5z"
},
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import sklearn\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.base import BaseEstimator, TransformerMixin\n",
"from sklearn.pipeline import make_pipeline\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.metrics import roc_auc_score\n",
"import copy\n",
"from tqdm.auto import tqdm, trange"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "273VyZtjUdzm"
},
"source": [
"df = pd.read_csv('bank-full.csv', sep=';')"
],
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 136
},
"id": "xW57fr-DUybF",
"outputId": "054cff36-c613-46a4-f27a-1d7ee1ddcf6b"
},
"source": [
"df.sample(3)"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>age</th>\n",
" <th>job</th>\n",
" <th>marital</th>\n",
" <th>education</th>\n",
" <th>default</th>\n",
" <th>balance</th>\n",
" <th>housing</th>\n",
" <th>loan</th>\n",
" <th>contact</th>\n",
" <th>day</th>\n",
" <th>month</th>\n",
" <th>duration</th>\n",
" <th>campaign</th>\n",
" <th>pdays</th>\n",
" <th>previous</th>\n",
" <th>poutcome</th>\n",
" <th>y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>33063</th>\n",
" <td>32</td>\n",
" <td>services</td>\n",
" <td>single</td>\n",
" <td>secondary</td>\n",
" <td>no</td>\n",
" <td>49</td>\n",
" <td>yes</td>\n",
" <td>no</td>\n",
" <td>cellular</td>\n",
" <td>17</td>\n",
" <td>apr</td>\n",
" <td>184</td>\n",
" <td>4</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>unknown</td>\n",
" <td>no</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21261</th>\n",
" <td>51</td>\n",
" <td>blue-collar</td>\n",
" <td>married</td>\n",
" <td>secondary</td>\n",
" <td>no</td>\n",
" <td>193</td>\n",
" <td>no</td>\n",
" <td>no</td>\n",
" <td>cellular</td>\n",
" <td>18</td>\n",
" <td>aug</td>\n",
" <td>146</td>\n",
" <td>5</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>unknown</td>\n",
" <td>no</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37061</th>\n",
" <td>42</td>\n",
" <td>blue-collar</td>\n",
" <td>divorced</td>\n",
" <td>secondary</td>\n",
" <td>no</td>\n",
" <td>-580</td>\n",
" <td>yes</td>\n",
" <td>yes</td>\n",
" <td>cellular</td>\n",
" <td>13</td>\n",
" <td>may</td>\n",
" <td>172</td>\n",
" <td>1</td>\n",
" <td>-1</td>\n",
" <td>0</td>\n",
" <td>unknown</td>\n",
" <td>no</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" age job marital education ... pdays previous poutcome y\n",
"33063 32 services single secondary ... -1 0 unknown no\n",
"21261 51 blue-collar married secondary ... -1 0 unknown no\n",
"37061 42 blue-collar divorced secondary ... -1 0 unknown no\n",
"\n",
"[3 rows x 17 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "l-2dUQT0aEvG"
},
"source": [
"Из 45 тысяч клиентов 5 в итоге окрыли депозит. Крутая конверсия!"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "T62tISn7U5iY",
"outputId": "c8c60cd0-ab46-4683-fb30-43703d8984d5"
},
"source": [
"df.y.value_counts()"
],
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"no 39922\n",
"yes 5289\n",
"Name: y, dtype: int64"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "XPVmX_OeV-Fx"
},
"source": [
"X = df.drop('y', axis=1)\n",
"y = (df.y == 'yes').astype(int)\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)"
],
"execution_count": 6,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "KfP5ydUcU7n4"
},
"source": [
"class DummyTransformer(BaseEstimator, TransformerMixin):\n",
" def fit(self, X, y=None):\n",
" assert isinstance(X, pd.DataFrame)\n",
" self.columns_ = pd.get_dummies(X).columns\n",
" return self\n",
"\n",
" def transform(self, X, y=None):\n",
" X = pd.get_dummies(X)\n",
" return X.reindex(self.columns_, axis=1).fillna(0)"
],
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "AIcvjfrmV7L3"
},
"source": [
"dt = DummyTransformer()\n",
"X_train2 = dt.fit_transform(X_train)\n",
"X_test2 = dt.transform(X_test)"
],
"execution_count": 8,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "YABrczaxZHSK"
},
"source": [
"Обучаем большой Random Forest. Его точность классификации - это примерно бейзлайн, на который мы можем равняться, оценивая качество решающего дерева. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CZYbGGLzW5Cu",
"outputId": "07dfea09-0efc-420c-c966-cbab905b0079"
},
"source": [
"clf = RandomForestClassifier(n_estimators=300, min_samples_leaf=5, random_state=1)\n",
"clf.fit(X_train2, y_train)\n",
"print(roc_auc_score(y_test, clf.predict_proba(X_test2)[:, 1]))"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"0.9324686481623802\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dfq7pS_dZQES"
},
"source": [
"Сложность деревьев можно контролировать параметром min_samples_leaf, контролирующим размер минимально возможный размер листа. \n",
"\n",
"Чем этот параметр больше, тем раньше будет дерево прекращать отращивать новые ветки. Это сокращает возможность дерева подогнаться под обучающую выборку, но зато и сокращает возможность переобучения. \n",
"\n",
"Конкретно на нашем датасете оптимальная сложность дерева наступает при примерно 150 наблюдениях в листе. Качество всё ещё ниже, чем у random forest, но не сильно - 91% против 93%. Ради интерпретируемости на такую жертву пойти можно. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ErkhVLs2X0Kq",
"outputId": "501fbb10-5ad2-4d21-fe50-2be401c35657"
},
"source": [
"for msl in np.logspace(0, 3, num=16):\n",
" msl = int(msl)\n",
" clf = DecisionTreeClassifier(min_samples_leaf=msl)\n",
" clf.fit(X_train2, y_train)\n",
" print('{}\\t {:2.4f}\\t {:2.4f}'.format(\n",
" msl, \n",
" roc_auc_score(y_test, clf.predict_proba(X_test2)[:, 1]),\n",
" roc_auc_score(y_train, clf.predict_proba(X_train2)[:, 1])\n",
" ))"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"1\t 0.7278\t 1.0000\n",
"1\t 0.7197\t 1.0000\n",
"2\t 0.7545\t 0.9976\n",
"3\t 0.7790\t 0.9932\n",
"6\t 0.8279\t 0.9802\n",
"10\t 0.8569\t 0.9689\n",
"15\t 0.8749\t 0.9611\n",
"25\t 0.8955\t 0.9507\n",
"39\t 0.8992\t 0.9432\n",
"63\t 0.9056\t 0.9355\n",
"100\t 0.9069\t 0.9284\n",
"158\t 0.9096\t 0.9222\n",
"251\t 0.9062\t 0.9136\n",
"398\t 0.8954\t 0.9006\n",
"630\t 0.8883\t 0.8930\n",
"1000\t 0.8665\t 0.8737\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IvZKlBFKfINf"
},
"source": [
"Нарисуем оптимальное дерево. Оно получается довольно сложным, несмотря на ограничения. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "IcTDnlo6fG-n"
},
"source": [
"clf = DecisionTreeClassifier(min_samples_leaf=150)\n",
"clf.fit(X_train2, y_train);"
],
"execution_count": 11,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 357
},
"id": "t1oFa0NTfHoz",
"outputId": "1d0c676d-7bd7-4c36-f309-5bf9d136736f"
},
"source": [
"plt.figure(figsize=(12, 6))\n",
"sklearn.tree.plot_tree(clf, feature_names=dt.columns_, filled=True, );"
],
"execution_count": 12,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "I-dsFdPzk1C-"
},
"source": [
"# Извлечение листьев"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gnYmGgcgYlAi"
},
"source": [
"Теперь извлечём из нашего дерева листья.\n",
"\n",
"Структура дерева хранится в `clf.tree_` в виде списков cвойств узлов:\n",
"* `feature` - номер признака, по которому шло ветвление\n",
"* `threshold` - порог ветвления\n",
"* `children_left` - левые дочерние узлы\n",
"* `children_right` - правые дочерние узлы\n",
"* `value` - частоты классов в этом узле\n",
"\n",
"Листья - это те узлы, у которых нет дочерних. \n",
"\n",
"Оказывается, у нас 131 лист, и значит потенциально 131 микросегмент. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OCXD9TMvcF6M",
"outputId": "a8947e09-b0f8-4d5d-a797-75531df5411c"
},
"source": [
"\n",
"print('nodes:', len(clf.tree_.children_left))\n",
"leaf_indices = np.where(clf.tree_.children_left == -1)[0]\n",
"leaf_indices\n",
"print('leaves:', len(leaf_indices))"
],
"execution_count": 13,
"outputs": [
{
"output_type": "stream",
"text": [
"nodes: 261\n",
"leaves: 131\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OA45v39Yd7t0"
},
"source": [
"Очень много листьев с около-нулевой конверсией, но есть и много листьев с очень высокой конверсией. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 281
},
"id": "KH6leNvrcJan",
"outputId": "221c9ff7-e2f5-40c5-9799-48c20f48daab"
},
"source": [
"node_conversion = clf.tree_.value[:, 0, 1] / clf.tree_.value[:, 0, :].sum(axis=-1)\n",
"leaf_conversion = node_conversion[leaf_indices]\n",
"root_conversion = node_conversion[0]\n",
"plt.hist(leaf_conversion, bins=20)\n",
"plt.vlines([root_conversion], *plt.ylim())\n",
"plt.title('Распределение листьев по конверсии в них')\n",
"plt.legend(['средняя конверсия', 'листья']);"
],
"execution_count": 14,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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BZd13HHH1STG3Bb1T3/6U04++WQ6d+7M8uXLaxJ7beX5OnXqxIQJE7jsssu4+OKL692m3/zmNzXLqu5CgQ0t8HfeeYd9992X448/vtZtnTt3bsF9U5d169bxk5/8hHvvvZdjjjmmpvyGG27gy1/+MmVlZSxatIgf/vCH9W5DXdwHbrYZOfjgg5k1axbLlydfJJ972T9r1izWr1/PggULeP3119l99905/PDDueGGG/j00+TL4l999VU+/PBDIoK77rqrwd0AO+64I7169aKiooLjjjuu3vJ85557LhdccAH33HMP8+bNo2vXrmy33XY8/vjjANx66601rfFidOnShdWrV7NmzZpatxWSLpSFCxeyfv16Zs6cyVe+8hWGDh3KY489xsKFC4GN9+Vtt93GEUccUXOlU22HHXZg4MCBPP/88xx44IFFx1kbt8DNNiN77bUX559/PsOHD6d9+/bss88+NTcMd955Z4YMGcL777/PjTfeSOfOnRk3bhxVVVUMHjyYiKCsrIy7776bc845hwceeIAlS5bQrl07VqxYwerVqxk7dmyt616zZg1jxozhpptu2qg1XFt5bTp16sQvfvELxo8fz+OPP86MGTOYOHEiH330Ef369au5uVmX6i6Ujz/+mDPPPJOuXbvWuq0A++23H5MmTWL+/PkcdNBBHH300bRr146pU6fyzW9+k/Xr19OjRw8eeughAN5++23OPHPjr7Jdvnw5Z5xxBrNnz6Z9+/b1xliUiGixn3333Tc2B8OHD4/hw4e3dhjWBr300kutHUJBY8aMiVmzZjWo/sKFCzcqu+6662LOnDnNG1gbMGfOnBg1alSLra/QOQJURIGc6ha4mTXYaaedRlnZxt/wdfjhh9O1a9dWimjz5ARuZgWfu67L/vvvv0lZ//79mymatqUtfzAvMwm8z+T7Gj1v1eWjmjESM7O2wU+hmJlllBO4mVlGOYGbmWVUZvrAzT6LmnJvpxDf79m8uAVuZpZRRSVwSdtKulPSK5JelvQlSd0kPSTptfT3dqUO1syarqqqii233HKj18Dmvnr1ggsu2OgTkVdccQVf/OIXGThwIJMnT675FOOee+5Zs5xBgwYB0KdPH955551N1tncr1G1RLFdKNcCD0TEMZI6Al2A84BHIuJySZOBycA5JYrTzJrJunXr6N+/P5WVlZu8Bnbp0qU8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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1UQNCzigegoG"
},
"source": [
"Восстановим правила, соответствующие каждому ветвлению, и заодно запишем номер родительского для каждого узла. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Dr5Xz-4VeYRF",
"outputId": "304ed095-57b8-432d-ef6f-f5200ac9a28c"
},
"source": [
"t = clf.tree_\n",
"n = len(t.threshold)\n",
"named_feaures = [dt.columns_[f_id] for f_id in t.feature]\n",
"parents = [-1] * n\n",
"\n",
"rules = [[]] * n\n",
"for i in range(0, n):\n",
" if t.children_left[i] < 0:\n",
" continue\n",
" rules[t.children_left[i]] = [named_feaures[i], '<=', t.threshold[i]]\n",
" rules[t.children_right[i]] = [named_feaures[i], '>', t.threshold[i]]\n",
" parents[t.children_left[i]] = i\n",
" parents[t.children_right[i]] = i\n",
"\n",
"print(rules[1:5])"
],
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": [
"[['duration', '<=', 473.5], ['poutcome_success', '<=', 0.5], ['age', '<=', 60.5], ['month_mar', '<=', 0.5]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "E0GOO6BVdhfK"
},
"source": [
"Напишем функцию, составляющую путь до узла с заданным номером"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "g4wVp58rjOl8",
"outputId": "10d03e4c-374f-4035-b63d-b924f2f1cf31"
},
"source": [
"def get_path(i):\n",
" parent = parents[i]\n",
" if parent > 0:\n",
" result = get_path(parent)\n",
" else:\n",
" result = []\n",
" result.append(i)\n",
" return result\n",
"\n",
"print(get_path(127))"
],
"execution_count": 16,
"outputs": [
{
"output_type": "stream",
"text": [
"[1, 2, 3, 4, 5, 115, 116, 117, 118, 120, 121, 122, 123, 127]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "spTnO5utjzoj"
},
"source": [
"Теперь мы можем описать, в каких листьях конверсия самая большая..."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dZeJiNDq4-dm",
"outputId": "4f4bc592-abd0-4de2-8c02-f876dcc58b19"
},
"source": [
"leaf_indices"
],
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([ 12, 13, 15, 16, 19, 21, 22, 28, 29, 30, 34, 35, 38,\n",
" 39, 40, 42, 45, 47, 49, 51, 52, 54, 55, 56, 61, 63,\n",
" 65, 66, 68, 69, 71, 72, 74, 76, 78, 79, 81, 86, 87,\n",
" 89, 90, 92, 93, 95, 96, 100, 101, 103, 104, 105, 108, 111,\n",
" 112, 113, 114, 119, 125, 126, 127, 130, 131, 132, 136, 137, 138,\n",
" 139, 141, 142, 145, 146, 147, 151, 152, 154, 155, 157, 158, 163,\n",
" 164, 166, 172, 173, 175, 176, 178, 179, 182, 184, 185, 187, 188,\n",
" 190, 192, 193, 195, 196, 197, 199, 200, 201, 203, 206, 207, 208,\n",
" 210, 212, 214, 215, 222, 224, 225, 228, 229, 230, 234, 235, 237,\n",
" 238, 239, 242, 244, 245, 246, 247, 250, 251, 254, 255, 257, 259,\n",
" 260])"
]
},
"metadata": {
"tags": []
},
"execution_count": 17
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3XpbffyPimzN",
"outputId": "9d36bfb4-2b21-4af3-f486-3d5cac670d54"
},
"source": [
"ranks = np.argsort(leaf_conversion)\n",
"for id in ranks[:-4:-1]:\n",
" print(leaf_conversion[id])\n",
" print([rules[i] for i in get_path(leaf_indices[id])])"
],
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"text": [
"0.8175438596491228\n",
"[['duration', '<=', 473.5], ['poutcome_success', '>', 0.5], ['duration', '>', 132.5], ['housing_no', '>', 0.5], ['duration', '>', 254.0]]\n",
"0.8012422360248447\n",
"[['duration', '>', 473.5], ['duration', '<=', 827.5], ['poutcome_success', '>', 0.5]]\n",
"0.7316017316017316\n",
"[['duration', '>', 473.5], ['duration', '>', 827.5], ['contact_cellular', '>', 0.5], ['day', '<=', 15.5], ['day', '>', 8.5]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "otEK1Ha9jp7Z"
},
"source": [
"И самая маленькая"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6xwIIS4bkOQM",
"outputId": "41e0d59c-4048-4551-eb54-e78c6682cebb"
},
"source": [
"ranks = np.argsort(leaf_conversion)\n",
"for id in ranks[:3]:\n",
" print(leaf_conversion[id])\n",
" print([rules[i] for i in get_path(leaf_indices[id])])"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": [
"0.0\n",
"[['duration', '<=', 473.5], ['poutcome_success', '<=', 0.5], ['age', '<=', 60.5], ['month_mar', '<=', 0.5], ['month_oct', '<=', 0.5], ['duration', '<=', 204.5], ['month_apr', '<=', 0.5], ['month_feb', '<=', 0.5], ['pdays', '<=', 9.0], ['age', '>', 28.5], ['day', '>', 3.5], ['duration', '<=', 149.5], ['month_jan', '<=', 0.5], ['balance', '>', 150.5], ['age', '>', 34.5], ['balance', '>', 196.5], ['job_admin.', '>', 0.5], ['day', '>', 17.5]]\n",
"0.0\n",
"[['duration', '<=', 473.5], ['poutcome_success', '<=', 0.5], ['age', '<=', 60.5], ['month_mar', '<=', 0.5], ['month_oct', '<=', 0.5], ['duration', '>', 204.5], ['housing_no', '>', 0.5], ['month_apr', '<=', 0.5], ['pdays', '<=', 20.0], ['age', '>', 29.5], ['day', '>', 3.5], ['contact_unknown', '<=', 0.5], ['duration', '<=', 313.5], ['balance', '<=', 1027.0], ['day', '>', 19.5], ['balance', '<=', 195.5]]\n",
"0.0\n",
"[['duration', '<=', 473.5], ['poutcome_success', '<=', 0.5], ['age', '<=', 60.5], ['month_mar', '<=', 0.5], ['month_oct', '<=', 0.5], ['duration', '<=', 204.5], ['month_apr', '<=', 0.5], ['month_feb', '<=', 0.5], ['pdays', '>', 9.0], ['pdays', '>', 100.5], ['housing_no', '<=', 0.5], ['duration', '<=', 155.5], ['day', '>', 12.5], ['duration', '>', 38.5]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VFTavBfU4yAu"
},
"source": [
"Проблема в том, что из-за высокой глубины дерева большинство листьев содержит довольно много правил (половина листьев - больше 12 правил). \n",
"\n",
"Более того, часть этих правил - избыточные, например, если разговор был дольше 827 секунд, то он автоматически дольше 473 секунд. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 432
},
"id": "uJhyU7KK45LY",
"outputId": "b115f1de-01b8-42c0-edfc-5425d785f2e4"
},
"source": [
"plt.hist([len(get_path(i)) for i in leaf_indices])\n",
"plt.title('распределение глубин листов');\n",
"pd.Series([len(get_path(i)) for i in leaf_indices]).describe()"
],
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"count 131.000000\n",
"mean 11.778626\n",
"std 4.354114\n",
"min 3.000000\n",
"25% 8.000000\n",
"50% 12.000000\n",
"75% 15.000000\n",
"max 21.000000\n",
"dtype: float64"
]
},
"metadata": {
"tags": []
},
"execution_count": 21
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cAxhwXjTkPln"
},
"source": [
"# Упрощение микросегментов"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mcPLG3a-kV8v"
},
"source": [
"Мы получили больше сотни сегментов, каждый из которых описывается довольно большой последовательностью фильтров. Попытаемся упростить наши сегменты, действуя по примерно следующими принципам:\n",
"\n",
"* Фильтры, которые минимально влияют на конверсию сегмента не слишком сильно, можно выкинуть. \n",
"* Можно выкидывать такие фильтры, пока разница конверсии микросегмента со средней по больнице не сократится на a%"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7tj2v6lHlu8o"
},
"source": [
"a = 0.10 # максимальное приближение конверсии в листе к средней - 10% от разницы между ними"
],
"execution_count": 24,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ToGcJLkUmDJu"
},
"source": [
"Напишем функцию, которая применяет фильтры к датасету и возвращает булеву маску наблюдений, относительно которых все фильтры сработали. \n",
"\n",
"Протестируем её на первом же листе - всё нормально, у отфильтрованных наблюдений конверсия такая же, как у соответствующего листа. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "okDiZxXMmMR7",
"outputId": "cecbe6ad-7965-4fce-a294-1f2bbedf5843"
},
"source": [
"def apply_filters(filters, data):\n",
" where = np.array([True] * data.shape[0])\n",
" for feature, side, threshold in filters:\n",
" f = data[feature] <= threshold\n",
" if side == '>':\n",
" f = ~f\n",
" where = where & f\n",
" return where\n",
"\n",
"j = 0\n",
"segment_rules = [rules[i] for i in get_path(leaf_indices[j])]\n",
"\n",
"ff = apply_filters(segment_rules, X_train2)\n",
"print(j, sum(ff), np.mean(y_train[ff]), leaf_conversion[j])"
],
"execution_count": 25,
"outputs": [
{
"output_type": "stream",
"text": [
"0 219 0.0182648401826484 0.0182648401826484\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DDd1N68NuezJ"
},
"source": [
"Теперь напишем функцию, которая упрощает лист. Оказалось, что 12 правил из этого листа можно упростить всего до двух, и микросегмент от этого станет только контрастнее. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "AZuVI27Kp1Ys",
"outputId": "6695c333-aaa2-4994-e005-2204f4af58cf"
},
"source": [
"def trim_rules(rules, threshold, above, data, labels):\n",
" is_ok = lambda conv: conv >= threshold if above else conv <= threshold\n",
"\n",
" while True:\n",
" best_id = -1\n",
" best_conv = None\n",
" for i in range(len(rules)):\n",
" new_rules = copy.copy(rules)\n",
" new_rules.pop(i)\n",
" ff = apply_filters(new_rules, data)\n",
" new_conv = np.mean(labels[ff])\n",
" if not is_ok(new_conv):\n",
" continue\n",
" if best_conv is None or (above and new_conv > best_conv) or (not above and new_conv < best_conv):\n",
" best_conv = new_conv\n",
" best_id = i\n",
"\n",
" if best_id >= 0:\n",
" rules = copy.copy(rules)\n",
" rules.pop(best_id)\n",
" else:\n",
" break\n",
" return rules\n",
"\n",
"threshold = leaf_conversion[j] * (1-a) + root_conversion * a\n",
"above = threshold > root_conversion\n",
"\n",
"ff = apply_filters(segment_rules, X_train2)\n",
"print(len(segment_rules), sum(ff), np.mean(y_train[ff]))\n",
"\n",
"new_rules = trim_rules(segment_rules, threshold, above, X_train2, y_train)\n",
"ff = apply_filters(new_rules, X_train2)\n",
"print(len(new_rules), sum(ff), np.mean(y_train[ff]))"
],
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"text": [
"12 219 0.0182648401826484\n",
"2 11226 0.015766969535008016\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ColEiwxywBlw"
},
"source": [
"Применим эту функцию ко всем листьм. Оказывается, ни для одного из результирующих микросегментов на самом деле не нужно больше 6 правил!"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000,
"referenced_widgets": [
"d5704653ebc8401181381c3a1d770285",
"509388a136054f9e9e4f880f6e1c08c5",
"6727b6dbc88a48e986b220cbd4c09c47",
"3d486747308a4264b75131b5c8106554",
"c4f04b9d42994e25a4f33bdc418e8db0",
"ea70bcd7a2504ce295ce001201b2e67c",
"03db337abd384a07a426b5171947a9df",
"62f89de11c794b859bbb58cf1764b1ac"
]
},
"id": "rN_dbd5cpgsZ",
"outputId": "c51cdf96-e063-4b2d-9b6c-6136ac44d04c"
},
"source": [
"simplified_rules = []\n",
"for leaf_id, node_id in enumerate(tqdm(leaf_indices)):\n",
" segment_rules = [rules[i] for i in get_path(node_id)]\n",
" threshold = leaf_conversion[leaf_id] * (1-a) + root_conversion * a\n",
" above = threshold > root_conversion \n",
" ff0 = apply_filters(segment_rules, X_train2)\n",
" new_rules = trim_rules(segment_rules, threshold, above, X_train2, y_train)\n",
" simplified_rules.append(new_rules)\n",
" ff1 = apply_filters(new_rules, X_train2)\n",
" print('{:3d}: {:5d} -> {:5d} {:2.4f} -> {:2.4f}'.format(\n",
" node_id, len(segment_rules), len(new_rules), np.mean(y_train[ff0]), np.mean(y_train[ff1])\n",
" ))"
],
"execution_count": 27,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d5704653ebc8401181381c3a1d770285",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"HBox(children=(FloatProgress(value=0.0, max=131.0), HTML(value='')))"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
" 12: 12 -> 2 0.0183 -> 0.0158\n",
" 13: 12 -> 4 0.0000 -> 0.0068\n",
" 15: 12 -> 1 0.0332 -> 0.0135\n",
" 16: 12 -> 1 0.1502 -> 0.1859\n",
" 19: 12 -> 1 0.1000 -> 0.0357\n",
" 21: 13 -> 2 0.0253 -> 0.0158\n",
" 22: 13 -> 3 0.0000 -> 0.0091\n",
" 28: 16 -> 2 0.0060 -> 0.0128\n",
" 29: 16 -> 3 0.0000 -> 0.0098\n",
" 30: 15 -> 3 0.0000 -> 0.0100\n",
" 34: 17 -> 4 0.0000 -> 0.0115\n",
" 35: 17 -> 1 0.0245 -> 0.0225\n",
" 38: 18 -> 1 0.0067 -> 0.0164\n",
" 39: 18 -> 2 0.0000 -> 0.0104\n",
" 40: 17 -> 1 0.0132 -> 0.0225\n",
" 42: 16 -> 1 0.0134 -> 0.0225\n",
" 45: 18 -> 4 0.0000 -> 0.0100\n",
" 47: 19 -> 2 0.0000 -> 0.0114\n",
" 49: 20 -> 4 0.0000 -> 0.0100\n",
" 51: 21 -> 1 0.0061 -> 0.0073\n",
" 52: 21 -> 1 0.0131 -> 0.0225\n",
" 54: 18 -> 1 0.0152 -> 0.0225\n",
" 55: 18 -> 4 0.0000 -> 0.0089\n",
" 56: 13 -> 1 0.0128 -> 0.0225\n",
" 61: 16 -> 1 0.0979 -> 0.0357\n",
" 63: 17 -> 1 0.0394 -> 0.0357\n",
" 65: 18 -> 2 0.0065 -> 0.0064\n",
" 66: 18 -> 2 0.0067 -> 0.0064\n",
" 68: 16 -> 3 0.0000 -> 0.0102\n",
" 69: 16 -> 1 0.0287 -> 0.0357\n",
" 71: 15 -> 2 0.0067 -> 0.0089\n",
" 72: 15 -> 2 0.0000 -> 0.0089\n",
" 74: 14 -> 2 0.0197 -> 0.0049\n",
" 76: 15 -> 2 0.0000 -> 0.0049\n",
" 78: 16 -> 2 0.0116 -> 0.0049\n",
" 79: 16 -> 2 0.0000 -> 0.0049\n",
" 81: 10 -> 1 0.1588 -> 0.2313\n",
" 86: 14 -> 2 0.0045 -> 0.0123\n",
" 87: 14 -> 1 0.0200 -> 0.0245\n",
" 89: 14 -> 2 0.0065 -> 0.0123\n",
" 90: 14 -> 3 0.0000 -> 0.0097\n",
" 92: 13 -> 1 0.0596 -> 0.0357\n",
" 93: 13 -> 2 0.0134 -> 0.0158\n",
" 95: 12 -> 1 0.0359 -> 0.0158\n",
" 96: 12 -> 1 0.1316 -> 0.2313\n",
"100: 11 -> 3 0.0000 -> 0.0059\n",
"101: 11 -> 1 0.0133 -> 0.0155\n",
"103: 11 -> 2 0.0164 -> 0.0158\n",
"104: 11 -> 1 0.0721 -> 0.0357\n",
"105: 9 -> 2 0.1931 -> 0.4028\n",
"108: 9 -> 1 0.0437 -> 0.0357\n",
"111: 11 -> 1 0.0000 -> 0.0038\n",
"112: 11 -> 1 0.0130 -> 0.0154\n",
"113: 10 -> 2 0.0258 -> 0.0158\n",
"114: 8 -> 2 0.2412 -> 0.4209\n",
"119: 10 -> 1 0.1306 -> 0.2211\n",
"125: 15 -> 1 0.1097 -> 0.0650\n",
"126: 15 -> 1 0.1647 -> 0.2211\n",
"127: 14 -> 2 0.0259 -> 0.0282\n",
"130: 15 -> 2 0.0269 -> 0.0282\n",
"131: 15 -> 4 0.0068 -> 0.0136\n",
"132: 14 -> 2 0.0468 -> 0.0282\n",
"136: 15 -> 2 0.0000 -> 0.0103\n",
"137: 15 -> 2 0.0067 -> 0.0103\n",
"138: 14 -> 2 0.0198 -> 0.0126\n",
"139: 13 -> 2 0.0521 -> 0.0172\n",
"141: 12 -> 1 0.1792 -> 0.2211\n",
"142: 12 -> 2 0.0252 -> 0.0282\n",
"145: 11 -> 1 0.1828 -> 0.3509\n",
"146: 11 -> 1 0.1261 -> 0.3509\n",
"147: 10 -> 2 0.0485 -> 0.0280\n",
"151: 11 -> 2 0.0040 -> 0.0063\n",
"152: 11 -> 2 0.0267 -> 0.0063\n",
"154: 11 -> 2 0.0000 -> 0.0063\n",
"155: 11 -> 2 0.0063 -> 0.0063\n",
"157: 10 -> 1 0.0559 -> 0.0420\n",
"158: 10 -> 2 0.0202 -> 0.0079\n",
"163: 11 -> 1 0.1404 -> 0.2211\n",
"164: 11 -> 3 0.3307 -> 0.4286\n",
"166: 11 -> 2 0.2905 -> 0.3050\n",
"172: 16 -> 3 0.0166 -> 0.0172\n",
"173: 16 -> 1 0.0876 -> 0.0563\n",
"175: 16 -> 5 0.0000 -> 0.0075\n",
"176: 16 -> 5 0.0067 -> 0.0147\n",
"178: 15 -> 1 0.1465 -> 0.2211\n",
"179: 15 -> 1 0.0581 -> 0.0563\n",
"182: 15 -> 1 0.0693 -> 0.0709\n",
"184: 16 -> 1 0.1625 -> 0.2951\n",
"185: 16 -> 1 0.1015 -> 0.0726\n",
"187: 15 -> 1 0.2564 -> 0.2951\n",
"188: 15 -> 1 0.1509 -> 0.2951\n",
"190: 13 -> 2 0.0268 -> 0.0079\n",
"192: 14 -> 2 0.0000 -> 0.0061\n",
"193: 14 -> 2 0.0200 -> 0.0079\n",
"195: 10 -> 2 0.2917 -> 0.4130\n",
"196: 10 -> 2 0.4051 -> 0.4130\n",
"197: 8 -> 3 0.4865 -> 0.5853\n",
"199: 6 -> 1 0.2316 -> 0.4541\n",
"200: 6 -> 2 0.5513 -> 0.6006\n",
"201: 4 -> 1 0.4764 -> 0.5282\n",
"203: 4 -> 1 0.0647 -> 0.0163\n",
"206: 6 -> 1 0.3136 -> 0.4277\n",
"207: 6 -> 1 0.4013 -> 0.4277\n",
"208: 5 -> 2 0.5629 -> 0.6114\n",
"210: 3 -> 1 0.2065 -> 0.6466\n",
"212: 4 -> 1 0.5758 -> 0.6466\n",
"214: 5 -> 1 0.6940 -> 0.6466\n",
"215: 5 -> 2 0.8175 -> 0.7814\n",
"222: 7 -> 2 0.4700 -> 0.4731\n",
"224: 8 -> 1 0.2634 -> 0.4136\n",
"225: 8 -> 1 0.3827 -> 0.4136\n",
"228: 8 -> 1 0.2284 -> 0.4136\n",
"229: 8 -> 1 0.1680 -> 0.4136\n",
"230: 7 -> 1 0.3438 -> 0.4136\n",
"234: 8 -> 1 0.4208 -> 0.4952\n",
"235: 8 -> 1 0.5325 -> 0.4952\n",
"237: 8 -> 1 0.2955 -> 0.4952\n",
"238: 8 -> 1 0.3873 -> 0.5323\n",
"239: 6 -> 2 0.5756 -> 0.5432\n",
"242: 6 -> 1 0.2108 -> 0.4136\n",
"244: 7 -> 1 0.0655 -> 0.0420\n",
"245: 7 -> 1 0.1467 -> 0.4496\n",
"246: 5 -> 1 0.2872 -> 0.5214\n",
"247: 3 -> 2 0.8012 -> 0.8102\n",
"250: 4 -> 1 0.4415 -> 0.5850\n",
"251: 4 -> 1 0.5971 -> 0.5850\n",
"254: 5 -> 1 0.6144 -> 0.5850\n",
"255: 5 -> 3 0.7316 -> 0.6724\n",
"257: 5 -> 1 0.5155 -> 0.5850\n",
"259: 6 -> 1 0.5455 -> 0.6042\n",
"260: 6 -> 2 0.6625 -> 0.6417\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SJsi11jDvKbB"
},
"source": [
"Упрощённых правил по-прежнему 131, но уникальных из них - только 77. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Un98ypziwIDu",
"outputId": "8d78490b-c97b-4590-f9bc-ab4f0b1f6323"
},
"source": [
"print(len(simplified_rules))\n",
"sr = list({\n",
" tuple(tuple(item) for item in rule)\n",
" for rule in simplified_rules\n",
"})\n",
"print(len(sr))"
],
"execution_count": 28,
"outputs": [
{
"output_type": "stream",
"text": [
"131\n",
"77\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fe-Du6MC2SAi"
},
"source": [
"Теперь самые \"горячие\" и \"холодные\" микросегменты выглядят значительно компактнее, а значит, интерпретируемее!\n",
"\n",
"Не все из них, конечно, логичные (в частности, зависимость от дат выглядит очень подозрительно). Но такие закономерности действительно есть в данных, так что вот так вот. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "6ZKL2z-P1QfF"
},
"source": [
"final_conversions = [\n",
" np.mean(y_train[apply_filters(r, X_train2)])\n",
" for r in sr\n",
"]\n",
"ranks = np.argsort(final_conversions)"
],
"execution_count": 29,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eTkahwQj1-Y_",
"outputId": "ac15e24a-edb2-43f4-fa1c-19280b901c34"
},
"source": [
"for id in ranks[:-6:-1]:\n",
" print(final_conversions[id])\n",
" print(list(sr[id]))"
],
"execution_count": 30,
"outputs": [
{
"output_type": "stream",
"text": [
"0.8101851851851852\n",
"[('duration', '>', 473.5), ('poutcome_success', '>', 0.5)]\n",
"0.7814029363784666\n",
"[('poutcome_success', '>', 0.5), ('duration', '>', 254.0)]\n",
"0.6723768736616702\n",
"[('duration', '>', 827.5), ('contact_cellular', '>', 0.5), ('day', '<=', 15.5)]\n",
"0.6466165413533834\n",
"[('poutcome_success', '>', 0.5)]\n",
"0.64171974522293\n",
"[('contact_cellular', '>', 0.5), ('duration', '>', 956.5)]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cuMg9zkQ2Geo",
"outputId": "172ee9b6-4d7f-414d-b08a-b1e3bf141f3a"
},
"source": [
"for id in ranks[:6]:\n",
" print(final_conversions[id])\n",
" print(list(sr[id]))"
],
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"text": [
"0.0038335158817086527\n",
"[('duration', '<=', 75.5)]\n",
"0.004943743607228094\n",
"[('duration', '<=', 204.5), ('contact_unknown', '>', 0.5)]\n",
"0.005905511811023622\n",
"[('month_feb', '>', 0.5), ('day', '<=', 7.0), ('duration', '<=', 124.5)]\n",
"0.006050674398083953\n",
"[('contact_unknown', '>', 0.5), ('duration', '<=', 324.5)]\n",
"0.0062871114215857496\n",
"[('contact_unknown', '>', 0.5), ('duration', '<=', 393.5)]\n",
"0.006416751097602162\n",
"[('duration', '<=', 204.5), ('month_may', '>', 0.5)]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d3LzRc0E2PIQ"
},
"source": [
"Обладая такими \"приметами\" интересных сегментов, судить о закономерностях в данных довольно легко. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oHTOFDM86v0G"
},
"source": [
"Остался последний вопрос: а насколько наши правила сохранили свою предсказательную силу после упрощения? Не стало ли дерево решений бесполезным?\n",
"\n",
"Ответить на этот вопрос можно с помощью очень простой предсказательной модели: для каждого наблюдения предсказываем конверсию как среднее арифметическое конверсий по всем микросегментам, в которые оно попало. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "AJM3yPSm8dBC"
},
"source": [
"def predict(rules, data, scores):\n",
" obs2rules = np.stack([\n",
" apply_filters(r, data)\n",
" for r in rules\n",
" ]).astype(int).T\n",
" return (obs2rules * np.array(scores)).sum(axis=1) / obs2rules.sum(axis=1)"
],
"execution_count": 45,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "UWWdDJYl9prO"
},
"source": [
"Применив такую максимально упрощённую модель, мы получаем 88.8% ROC AUC на обучающей выборке, и 87.8% на тестовой. Причём на самом деле непонятно, сколько мы потеряли за счёт упрощения правил, а сколько - за счёт того, что мы очень наивно агрегируем предсказания в случае, когда правил сработало несколько. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "36ogVUf6880a",
"outputId": "0a0dc8b5-b0df-497e-96e2-6c5b07d846e5"
},
"source": [
"print(roc_auc_score(y_train, predict(sr, X_train2, final_conversions)))\n",
"print(roc_auc_score(y_test, predict(sr, X_test2, final_conversions)))"
],
"execution_count": 49,
"outputs": [
{
"output_type": "stream",
"text": [
"0.8878048311233366\n",
"0.8788157494950939\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4rFlLci3-T0d"
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment