18752 lines
1.3 MiB
18752 lines
1.3 MiB
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ff8cc602-e733-4a31-bf46-a31087511fe0",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Predict sales - sports companies"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "415e466a-1a71-4150-bff7-2f8904766df4",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Importations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "b5aaf421-850a-4a86-8e99-2c1f0723bd6c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"import s3fs\n",
|
||
"import re\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.ensemble import RandomForestClassifier\n",
|
||
"from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, recall_score\n",
|
||
"from sklearn.utils import class_weight\n",
|
||
"from sklearn.neighbors import KNeighborsClassifier\n",
|
||
"from sklearn.pipeline import Pipeline\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from sklearn.preprocessing import OneHotEncoder\n",
|
||
"from sklearn.impute import SimpleImputer\n",
|
||
"from sklearn.model_selection import GridSearchCV\n",
|
||
"from sklearn.preprocessing import StandardScaler, MaxAbsScaler, MinMaxScaler\n",
|
||
"from sklearn.metrics import make_scorer, f1_score, balanced_accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score\n",
|
||
"from sklearn.exceptions import ConvergenceWarning, DataConversionWarning\n",
|
||
"from sklearn.naive_bayes import GaussianNB\n",
|
||
"\n",
|
||
"import pickle\n",
|
||
"import warnings"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c2f44070-451e-4109-9a08-3b80011d610f",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Load data "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "b5f8135f-b6e7-4d6d-b8e1-da185b944aff",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Create filesystem object\n",
|
||
"S3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n",
|
||
"fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "2668a243-4ff8-40c6-9de2-5c9c07bcf714",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def load_train_test():\n",
|
||
" BUCKET = \"projet-bdc2324-team1/Generalization/sport\"\n",
|
||
" File_path_train = BUCKET + \"/Train_set.csv\"\n",
|
||
" File_path_test = BUCKET + \"/Test_set.csv\"\n",
|
||
" \n",
|
||
" with fs.open( File_path_train, mode=\"rb\") as file_in:\n",
|
||
" dataset_train = pd.read_csv(file_in, sep=\",\")\n",
|
||
" # dataset_train['y_has_purchased'] = dataset_train['y_has_purchased'].fillna(0)\n",
|
||
"\n",
|
||
" with fs.open(File_path_test, mode=\"rb\") as file_in:\n",
|
||
" dataset_test = pd.read_csv(file_in, sep=\",\")\n",
|
||
" # dataset_test['y_has_purchased'] = dataset_test['y_has_purchased'].fillna(0)\n",
|
||
" \n",
|
||
" return dataset_train, dataset_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "13eba3e1-3ea5-435b-8b05-6d7d5744cbe2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/tmp/ipykernel_1481/2459610029.py:7: DtypeWarning: Columns (38) have mixed types. Specify dtype option on import or set low_memory=False.\n",
|
||
" dataset_train = pd.read_csv(file_in, sep=\",\")\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"customer_id 0\n",
|
||
"nb_tickets 0\n",
|
||
"nb_purchases 0\n",
|
||
"total_amount 0\n",
|
||
"nb_suppliers 0\n",
|
||
"vente_internet_max 0\n",
|
||
"purchase_date_min 0\n",
|
||
"purchase_date_max 0\n",
|
||
"time_between_purchase 0\n",
|
||
"nb_tickets_internet 0\n",
|
||
"street_id 0\n",
|
||
"structure_id 222825\n",
|
||
"mcp_contact_id 70874\n",
|
||
"fidelity 0\n",
|
||
"tenant_id 0\n",
|
||
"is_partner 0\n",
|
||
"deleted_at 224213\n",
|
||
"gender 0\n",
|
||
"is_email_true 0\n",
|
||
"opt_in 0\n",
|
||
"last_buying_date 66139\n",
|
||
"max_price 66139\n",
|
||
"ticket_sum 0\n",
|
||
"average_price 66023\n",
|
||
"average_purchase_delay 66139\n",
|
||
"average_price_basket 66139\n",
|
||
"average_ticket_basket 66139\n",
|
||
"total_price 116\n",
|
||
"purchase_count 0\n",
|
||
"first_buying_date 66139\n",
|
||
"country 23159\n",
|
||
"gender_label 0\n",
|
||
"gender_female 0\n",
|
||
"gender_male 0\n",
|
||
"gender_other 0\n",
|
||
"country_fr 23159\n",
|
||
"nb_campaigns 0\n",
|
||
"nb_campaigns_opened 0\n",
|
||
"time_to_open 123159\n",
|
||
"y_has_purchased 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"dataset_train, dataset_test = load_train_test()\n",
|
||
"dataset_train.isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "e46622e7-0fc1-43f8-a7e7-34a5e90068b2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def features_target_split(dataset_train, dataset_test):\n",
|
||
" \"\"\"\n",
|
||
" features_l = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', \n",
|
||
" 'time_between_purchase', 'nb_tickets_internet', 'fidelity', 'is_email_true', 'opt_in', #'is_partner',\n",
|
||
" 'gender_female', 'gender_male', 'gender_other', 'nb_campaigns', 'nb_campaigns_opened']\n",
|
||
" \"\"\"\n",
|
||
"\n",
|
||
" # we suppress fidelity, time between purchase, and gender other (colinearity issue)\n",
|
||
" features_l = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', \n",
|
||
" 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'is_email_true', \n",
|
||
" 'opt_in', 'gender_female', 'gender_male', 'nb_campaigns', 'nb_campaigns_opened']\n",
|
||
" \n",
|
||
" X_train = dataset_train[features_l]\n",
|
||
" y_train = dataset_train[['y_has_purchased']]\n",
|
||
"\n",
|
||
" X_test = dataset_test[features_l]\n",
|
||
" y_test = dataset_test[['y_has_purchased']]\n",
|
||
" return X_train, X_test, y_train, y_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "cec4f386-e643-4bd8-b8cd-8917d2c1b3d0",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Shape train : (224213, 14)\n",
|
||
"Shape test : (96096, 14)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train, X_test, y_train, y_test = features_target_split(dataset_train, dataset_test)\n",
|
||
"print(\"Shape train : \", X_train.shape)\n",
|
||
"print(\"Shape test : \", X_test.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c9e8edbd-7ff6-42f9-a8eb-10d27ca19c8a",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Logistic"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"id": "639b432a-c39c-4bf8-8ee2-e136d156e0dd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{0.0: 0.5837086520288036, 1.0: 3.486549107420539}"
|
||
]
|
||
},
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Compute Weights\n",
|
||
"weights = class_weight.compute_class_weight(class_weight = 'balanced', classes = np.unique(y_train['y_has_purchased']),\n",
|
||
" y = y_train['y_has_purchased'])\n",
|
||
"\n",
|
||
"weight_dict = {np.unique(y_train['y_has_purchased'])[i]: weights[i] for i in range(len(np.unique(y_train['y_has_purchased'])))}\n",
|
||
"weight_dict"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"id": "34644a00-85a5-41c9-98df-41178cb3ac69",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>140.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>373.540289</td>\n",
|
||
" <td>219.262269</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>50.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>90.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>78.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224208</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224209</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>20.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224210</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224211</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>97.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224212</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>224213 rows × 14 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 2.0 1.0 60.00 1.0 \n",
|
||
"1 8.0 3.0 140.00 1.0 \n",
|
||
"2 2.0 1.0 50.00 1.0 \n",
|
||
"3 3.0 1.0 90.00 1.0 \n",
|
||
"4 2.0 1.0 78.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 0.0 0.00 0.0 \n",
|
||
"224209 1.0 1.0 20.00 1.0 \n",
|
||
"224210 0.0 0.0 0.00 0.0 \n",
|
||
"224211 1.0 1.0 97.11 1.0 \n",
|
||
"224212 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 355.268981 355.268981 \n",
|
||
"1 0.0 373.540289 219.262269 \n",
|
||
"2 0.0 5.202442 5.202442 \n",
|
||
"3 0.0 5.178958 5.178958 \n",
|
||
"4 0.0 5.174039 5.174039 \n",
|
||
"... ... ... ... \n",
|
||
"224208 0.0 550.000000 550.000000 \n",
|
||
"224209 1.0 392.501030 392.501030 \n",
|
||
"224210 0.0 550.000000 550.000000 \n",
|
||
"224211 1.0 172.334074 172.334074 \n",
|
||
"224212 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"0 0.0 True False 0 \n",
|
||
"1 0.0 True False 0 \n",
|
||
"2 0.0 True False 0 \n",
|
||
"3 0.0 True False 0 \n",
|
||
"4 0.0 True False 1 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 True False 0 \n",
|
||
"224209 1.0 True False 0 \n",
|
||
"224210 0.0 True True 0 \n",
|
||
"224211 1.0 True False 0 \n",
|
||
"224212 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"0 1 0.0 0.0 \n",
|
||
"1 1 0.0 0.0 \n",
|
||
"2 1 0.0 0.0 \n",
|
||
"3 1 0.0 0.0 \n",
|
||
"4 0 0.0 0.0 \n",
|
||
"... ... ... ... \n",
|
||
"224208 1 34.0 3.0 \n",
|
||
"224209 1 23.0 6.0 \n",
|
||
"224210 1 8.0 4.0 \n",
|
||
"224211 1 13.0 5.0 \n",
|
||
"224212 1 4.0 4.0 \n",
|
||
"\n",
|
||
"[224213 rows x 14 columns]"
|
||
]
|
||
},
|
||
"execution_count": 97,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"id": "295676df-36ac-43d8-8b31-49ff08efd6e7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# preprocess data \n",
|
||
"# numeric features - standardize\n",
|
||
"# categorical features - encode\n",
|
||
"# encoded features - do nothing\n",
|
||
"\n",
|
||
"numeric_features = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', \n",
|
||
" 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'nb_campaigns', \n",
|
||
" 'nb_campaigns_opened' # , 'gender_male', 'gender_female'\n",
|
||
" ]\n",
|
||
"\n",
|
||
"numeric_transformer = Pipeline(steps=[\n",
|
||
" #(\"imputer\", SimpleImputer(strategy=\"mean\")), \n",
|
||
" (\"scaler\", StandardScaler()) \n",
|
||
"])\n",
|
||
"\n",
|
||
"categorical_features = ['opt_in', 'is_email_true'] \n",
|
||
"\n",
|
||
"# Transformer for the categorical features\n",
|
||
"categorical_transformer = Pipeline(steps=[\n",
|
||
" #(\"imputer\", SimpleImputer(strategy=\"most_frequent\")), # Impute missing values with the most frequent\n",
|
||
" (\"onehot\", OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n",
|
||
"])\n",
|
||
"\n",
|
||
"preproc = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" (\"num\", numeric_transformer, numeric_features),\n",
|
||
" (\"cat\", categorical_transformer, categorical_features)\n",
|
||
" ]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"id": "f46fb56e-c908-40b4-868f-9684d1ae01c2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"nb_tickets 0\n",
|
||
"nb_purchases 0\n",
|
||
"total_amount 0\n",
|
||
"nb_suppliers 0\n",
|
||
"vente_internet_max 0\n",
|
||
"purchase_date_min 0\n",
|
||
"purchase_date_max 0\n",
|
||
"nb_tickets_internet 0\n",
|
||
"nb_campaigns 0\n",
|
||
"nb_campaigns_opened 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train[numeric_features].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"id": "e729781b-4d65-42c5-bdc5-82b4d653aaf0",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Set loss\n",
|
||
"balanced_scorer = make_scorer(balanced_accuracy_score)\n",
|
||
"recall_scorer = make_scorer(recall_score)\n",
|
||
"f1_scorer = make_scorer(f1_score)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"id": "a7ebbe6f-70ba-4276-be18-f10e7bfd7423",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def draw_confusion_matrix(y_test, y_pred):\n",
|
||
" conf_matrix = confusion_matrix(y_test, y_pred)\n",
|
||
" sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Class 0', 'Class 1'], yticklabels=['Class 0', 'Class 1'])\n",
|
||
" plt.xlabel('Predicted')\n",
|
||
" plt.ylabel('Actual')\n",
|
||
" plt.title('Confusion Matrix')\n",
|
||
" plt.show()\n",
|
||
"\n",
|
||
"\n",
|
||
"def draw_roc_curve(X_test, y_test):\n",
|
||
" y_pred_prob = pipeline.predict_proba(X_test)[:, 1]\n",
|
||
"\n",
|
||
" # Calcul des taux de faux positifs (FPR) et de vrais positifs (TPR)\n",
|
||
" fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob, pos_label=1)\n",
|
||
" \n",
|
||
" # Calcul de l'aire sous la courbe ROC (AUC)\n",
|
||
" roc_auc = auc(fpr, tpr)\n",
|
||
" \n",
|
||
" plt.figure(figsize = (14, 8))\n",
|
||
" plt.plot(fpr, tpr, label=\"ROC curve(area = %0.3f)\" % roc_auc)\n",
|
||
" plt.plot([0, 1], [0, 1], color=\"red\",label=\"Random Baseline\", linestyle=\"--\")\n",
|
||
" plt.grid(color='gray', linestyle='--', linewidth=0.5)\n",
|
||
" plt.xlabel('Taux de faux positifs (FPR)')\n",
|
||
" plt.ylabel('Taux de vrais positifs (TPR)')\n",
|
||
" plt.title('Courbe ROC : modèle logistique')\n",
|
||
" plt.legend(loc=\"lower right\")\n",
|
||
" plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"id": "2334eb51-e6ea-4fd0-89ce-f54cd474d332",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def draw_features_importance(pipeline, model):\n",
|
||
" coefficients = pipeline.named_steps['logreg'].coef_[0]\n",
|
||
" feature_names = pipeline.named_steps['logreg'].feature_names_in_\n",
|
||
" \n",
|
||
" # Tracer l'importance des caractéristiques\n",
|
||
" plt.figure(figsize=(10, 6))\n",
|
||
" plt.barh(feature_names, coefficients, color='skyblue')\n",
|
||
" plt.xlabel('Importance des caractéristiques')\n",
|
||
" plt.ylabel('Caractéristiques')\n",
|
||
" plt.title('Importance des caractéristiques dans le modèle de régression logistique')\n",
|
||
" plt.grid(True)\n",
|
||
" plt.show()\n",
|
||
"\n",
|
||
"def draw_prob_distribution(X_test):\n",
|
||
" y_pred_prob = pipeline.predict_proba(X_test)[:, 1]\n",
|
||
" plt.figure(figsize=(8, 6))\n",
|
||
" plt.hist(y_pred_prob, bins=10, range=(0, 1), color='blue', alpha=0.7)\n",
|
||
" \n",
|
||
" plt.xlim(0, 1)\n",
|
||
" plt.ylim(0, None)\n",
|
||
" \n",
|
||
" plt.title('Histogramme des probabilités pour la classe 1')\n",
|
||
" plt.xlabel('Probabilité')\n",
|
||
" plt.ylabel('Fréquence')\n",
|
||
" plt.grid(True)\n",
|
||
" plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 103,
|
||
"id": "83917b97-4d9b-4e3c-ba27-1e546ce885d3",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Hyperparameter\n",
|
||
"\n",
|
||
"param_c = np.logspace(-10, 4, 15, base=2)\n",
|
||
"# param_penalty_type = ['l1', 'l2', 'elasticnet']\n",
|
||
"param_penalty_type = ['l1']\n",
|
||
"param_grid = {'logreg__C': param_c,\n",
|
||
" 'logreg__penalty': param_penalty_type} "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"id": "3ae25049-920c-4a6d-a59d-c26e3b45dec6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1024"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"2 ** 10"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 104,
|
||
"id": "ba4cde9f-a614-4a43-81b9-e16e78aa6c4c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-5 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-5 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-5 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-5 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> Pipeline<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler', StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases', 'total_amount',\n",
|
||
" 'nb_suppliers', 'vente_internet_max',\n",
|
||
" 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-7\" type=\"checkbox\" ><label for=\"sk-estimator-id-7\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">num</label><div class=\"sk-toggleable__content \"><pre>['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'nb_campaigns', 'nb_campaigns_opened']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-8\" type=\"checkbox\" ><label for=\"sk-estimator-id-8\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> StandardScaler<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></label><div class=\"sk-toggleable__content \"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" ><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> LogisticRegression<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content \"><pre>LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga')</pre></div> </div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])"
|
||
]
|
||
},
|
||
"execution_count": 104,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Pipeline\n",
|
||
"pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preproc),\n",
|
||
" ('logreg', LogisticRegression(solver='saga', class_weight = weight_dict,\n",
|
||
" max_iter=5000)) \n",
|
||
"])\n",
|
||
"\n",
|
||
"pipeline.set_output(transform=\"pandas\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"id": "1e4c1be5-176d-4222-9b3c-fe27225afe36",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>39626</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>158560</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>170411</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>62.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>350.010093</td>\n",
|
||
" <td>350.010093</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>40.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>220692</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>84.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.158787</td>\n",
|
||
" <td>5.158787</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>182741</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>194275</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>38.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>142915</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95021</th>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>250.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>382.280455</td>\n",
|
||
" <td>382.279877</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>197603</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>21.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>88679</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>10000 rows × 14 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"39626 0.0 0.0 0.00 0.0 \n",
|
||
"158560 0.0 0.0 0.00 0.0 \n",
|
||
"170411 1.0 1.0 62.11 1.0 \n",
|
||
"220692 1.0 1.0 84.00 1.0 \n",
|
||
"182741 0.0 0.0 0.00 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"194275 0.0 0.0 0.00 0.0 \n",
|
||
"142915 0.0 0.0 0.00 0.0 \n",
|
||
"95021 7.0 2.0 250.00 1.0 \n",
|
||
"197603 0.0 0.0 0.00 0.0 \n",
|
||
"88679 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"39626 0.0 550.000000 550.000000 \n",
|
||
"158560 0.0 550.000000 550.000000 \n",
|
||
"170411 1.0 350.010093 350.010093 \n",
|
||
"220692 0.0 5.158787 5.158787 \n",
|
||
"182741 0.0 550.000000 550.000000 \n",
|
||
"... ... ... ... \n",
|
||
"194275 0.0 550.000000 550.000000 \n",
|
||
"142915 0.0 550.000000 550.000000 \n",
|
||
"95021 0.0 382.280455 382.279877 \n",
|
||
"197603 0.0 550.000000 550.000000 \n",
|
||
"88679 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"39626 0.0 True True 0 \n",
|
||
"158560 0.0 True True 0 \n",
|
||
"170411 1.0 True False 0 \n",
|
||
"220692 0.0 True False 0 \n",
|
||
"182741 0.0 True True 0 \n",
|
||
"... ... ... ... ... \n",
|
||
"194275 0.0 True False 1 \n",
|
||
"142915 0.0 True True 0 \n",
|
||
"95021 0.0 True True 0 \n",
|
||
"197603 0.0 True True 0 \n",
|
||
"88679 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"39626 0 9.0 0.0 \n",
|
||
"158560 0 20.0 5.0 \n",
|
||
"170411 1 40.0 23.0 \n",
|
||
"220692 1 0.0 0.0 \n",
|
||
"182741 1 19.0 1.0 \n",
|
||
"... ... ... ... \n",
|
||
"194275 0 38.0 19.0 \n",
|
||
"142915 1 26.0 8.0 \n",
|
||
"95021 0 0.0 0.0 \n",
|
||
"197603 1 21.0 0.0 \n",
|
||
"88679 1 5.0 0.0 \n",
|
||
"\n",
|
||
"[10000 rows x 14 columns]"
|
||
]
|
||
},
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# reduce X_train to reduce the training time\n",
|
||
"\n",
|
||
"X_train_subsample = X_train.sample(n=10000, random_state=43)\n",
|
||
"y_train_subsample = y_train.loc[X_train_subsample.index]\n",
|
||
"X_train_subsample"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"id": "2b09c2cd-fd5c-49b3-be66-cec6c5ec1351",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>y_has_purchased</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>43000</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>183923</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>97373</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>66956</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>116487</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>140473</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>153768</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>110886</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>115390</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>24919</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1000 rows × 1 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" y_has_purchased\n",
|
||
"43000 0.0\n",
|
||
"183923 0.0\n",
|
||
"97373 0.0\n",
|
||
"66956 1.0\n",
|
||
"116487 0.0\n",
|
||
"... ...\n",
|
||
"140473 0.0\n",
|
||
"153768 0.0\n",
|
||
"110886 1.0\n",
|
||
"115390 0.0\n",
|
||
"24919 0.0\n",
|
||
"\n",
|
||
"[1000 rows x 1 columns]"
|
||
]
|
||
},
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_train_subsample"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 109,
|
||
"id": "6c33fcd8-17d8-4390-b836-faec9ada9acd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-6 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-6 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-6 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-6 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-6 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-6 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-6 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-6 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-6 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> Pipeline<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-13\" type=\"checkbox\" ><label for=\"sk-estimator-id-13\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler', StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases', 'total_amount',\n",
|
||
" 'nb_suppliers', 'vente_internet_max',\n",
|
||
" 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-14\" type=\"checkbox\" ><label for=\"sk-estimator-id-14\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">num</label><div class=\"sk-toggleable__content \"><pre>['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'nb_campaigns', 'nb_campaigns_opened']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-15\" type=\"checkbox\" ><label for=\"sk-estimator-id-15\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> StandardScaler<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></label><div class=\"sk-toggleable__content \"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-16\" type=\"checkbox\" ><label for=\"sk-estimator-id-16\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-17\" type=\"checkbox\" ><label for=\"sk-estimator-id-17\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-18\" type=\"checkbox\" ><label for=\"sk-estimator-id-18\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> LogisticRegression<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content \"><pre>LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga')</pre></div> </div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])"
|
||
]
|
||
},
|
||
"execution_count": 109,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pipeline"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 110,
|
||
"id": "710ccccc-50c9-4aba-8cf1-11483dbbdd1c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']}"
|
||
]
|
||
},
|
||
"execution_count": 110,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"param_grid"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"id": "ab078cf8-0d4c-4b23-9f33-2483cf605b06",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"make_scorer(f1_score, response_method='predict')"
|
||
]
|
||
},
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"f1_scorer"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"id": "8062169e-8305-42b0-aeff-8f714117da40",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>39626</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>158560</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>170411</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>62.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>350.010093</td>\n",
|
||
" <td>350.010093</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>40.0</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>220692</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>84.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.158787</td>\n",
|
||
" <td>5.158787</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>182741</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>194275</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>38.0</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>142915</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>26.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95021</th>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>250.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>382.280455</td>\n",
|
||
" <td>382.279877</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>197603</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>21.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>88679</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>10000 rows × 14 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"39626 0.0 0.0 0.00 0.0 \n",
|
||
"158560 0.0 0.0 0.00 0.0 \n",
|
||
"170411 1.0 1.0 62.11 1.0 \n",
|
||
"220692 1.0 1.0 84.00 1.0 \n",
|
||
"182741 0.0 0.0 0.00 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"194275 0.0 0.0 0.00 0.0 \n",
|
||
"142915 0.0 0.0 0.00 0.0 \n",
|
||
"95021 7.0 2.0 250.00 1.0 \n",
|
||
"197603 0.0 0.0 0.00 0.0 \n",
|
||
"88679 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"39626 0.0 550.000000 550.000000 \n",
|
||
"158560 0.0 550.000000 550.000000 \n",
|
||
"170411 1.0 350.010093 350.010093 \n",
|
||
"220692 0.0 5.158787 5.158787 \n",
|
||
"182741 0.0 550.000000 550.000000 \n",
|
||
"... ... ... ... \n",
|
||
"194275 0.0 550.000000 550.000000 \n",
|
||
"142915 0.0 550.000000 550.000000 \n",
|
||
"95021 0.0 382.280455 382.279877 \n",
|
||
"197603 0.0 550.000000 550.000000 \n",
|
||
"88679 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"39626 0.0 True True 0 \n",
|
||
"158560 0.0 True True 0 \n",
|
||
"170411 1.0 True False 0 \n",
|
||
"220692 0.0 True False 0 \n",
|
||
"182741 0.0 True True 0 \n",
|
||
"... ... ... ... ... \n",
|
||
"194275 0.0 True False 1 \n",
|
||
"142915 0.0 True True 0 \n",
|
||
"95021 0.0 True True 0 \n",
|
||
"197603 0.0 True True 0 \n",
|
||
"88679 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"39626 0 9.0 0.0 \n",
|
||
"158560 0 20.0 5.0 \n",
|
||
"170411 1 40.0 23.0 \n",
|
||
"220692 1 0.0 0.0 \n",
|
||
"182741 1 19.0 1.0 \n",
|
||
"... ... ... ... \n",
|
||
"194275 0 38.0 19.0 \n",
|
||
"142915 1 26.0 8.0 \n",
|
||
"95021 0 0.0 0.0 \n",
|
||
"197603 1 21.0 0.0 \n",
|
||
"88679 1 5.0 0.0 \n",
|
||
"\n",
|
||
"[10000 rows x 14 columns]"
|
||
]
|
||
},
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train_subsample"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"id": "0270013a-6523-4cf8-8de0-569c0d1c5db5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"warnings.filterwarnings('ignore')\n",
|
||
"warnings.filterwarnings(\"ignore\", category=ConvergenceWarning)\n",
|
||
"warnings.filterwarnings(\"ignore\", category=DataConversionWarning)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"id": "7a49d78a-5a9b-44a9-95cf-3fca1b3febfa",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Returned hyperparameter: {'logreg__C': 0.0625, 'logreg__penalty': 'l1'}\n",
|
||
"Best classification F1 score in train is: 0.462769170101807\n",
|
||
"Classification F1 score on test is: 0.46474681703251214\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# run the pipeline on the subsample\n",
|
||
"\n",
|
||
"logit_grid = GridSearchCV(pipeline, param_grid, cv=3, scoring = f1_scorer #, error_score=\"raise\"\n",
|
||
" )\n",
|
||
"logit_grid.fit(X_train_subsample, y_train_subsample)\n",
|
||
"\n",
|
||
"# print results\n",
|
||
"print('Returned hyperparameter: {}'.format(logit_grid.best_params_))\n",
|
||
"print('Best classification F1 score in train is: {}'.format(logit_grid.best_score_))\n",
|
||
"print('Classification F1 score on test is: {}'.format(logit_grid.score(X_test, y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 114,
|
||
"id": "b1d5e71d-1078-4370-86e8-52b1ae378898",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01])"
|
||
]
|
||
},
|
||
"execution_count": 114,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"param_c"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"id": "cfe04739-fe9c-4802-9d34-885a8cfce0dc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-12 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-12 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-12 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-12 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-12 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-12 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-12 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-12 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-12 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-12 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-12 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-12\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-75\" type=\"checkbox\" ><label for=\"sk-estimator-id-75\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> GridSearchCV<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-76\" type=\"checkbox\" ><label for=\"sk-estimator-id-76\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">estimator: Pipeline</label><div class=\"sk-toggleable__content \"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-77\" type=\"checkbox\" ><label for=\"sk-estimator-id-77\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler', StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases', 'total_amount',\n",
|
||
" 'nb_suppliers', 'vente_internet_max',\n",
|
||
" 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-78\" type=\"checkbox\" ><label for=\"sk-estimator-id-78\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">num</label><div class=\"sk-toggleable__content \"><pre>['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'nb_campaigns', 'nb_campaigns_opened']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-79\" type=\"checkbox\" ><label for=\"sk-estimator-id-79\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> StandardScaler<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></label><div class=\"sk-toggleable__content \"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-80\" type=\"checkbox\" ><label for=\"sk-estimator-id-80\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-81\" type=\"checkbox\" ><label for=\"sk-estimator-id-81\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-82\" type=\"checkbox\" ><label for=\"sk-estimator-id-82\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> LogisticRegression<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content \"><pre>LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga')</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))"
|
||
]
|
||
},
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"logit_grid = GridSearchCV(pipeline, param_grid, cv=3, scoring = f1_scorer #, error_score=\"raise\"\n",
|
||
" )\n",
|
||
"logit_grid"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"id": "6debc66c-a56d-41fa-8ef8-ba388e0e14fe",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']}"
|
||
]
|
||
},
|
||
"execution_count": 97,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"param_grid"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"id": "e394cc04-5d0b-4a64-9aa0-415dc8a3cbbc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Returned hyperparameter: {'logreg__C': 0.03125, 'logreg__penalty': 'l1'}\n",
|
||
"Best classification accuracy in train is: 0.42160313383818665\n",
|
||
"Classification accuracy on test is: 0.47078982841737305\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# run the pipeline on the full sample\n",
|
||
"\n",
|
||
"logit_grid = GridSearchCV(pipeline, param_grid, cv=3, scoring = f1_scorer #, error_score=\"raise\"\n",
|
||
" )\n",
|
||
"logit_grid.fit(X_train, y_train)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"id": "8e6cf558-a4f4-4159-9835-364ee3bb1ed2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Returned hyperparameter: {'logreg__C': 0.03125, 'logreg__penalty': 'l1'}\n",
|
||
"Best classification F1 score in train is: 0.42160313383818665\n",
|
||
"Classification F1 score on test is: 0.47078982841737305\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# print results\n",
|
||
"print('Returned hyperparameter: {}'.format(logit_grid.best_params_))\n",
|
||
"print('Best classification F1 score in train is: {}'.format(logit_grid.best_score_))\n",
|
||
"print('Classification F1 score on test is: {}'.format(logit_grid.score(X_test, y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"id": "e2ff26cb-f137-4a23-9add-bdb61bebdf9c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-13 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-13 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-13 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-13 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-13 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-13 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-13 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-13 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-13 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-13 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-13 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-13\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-83\" type=\"checkbox\" ><label for=\"sk-estimator-id-83\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-84\" type=\"checkbox\" ><label for=\"sk-estimator-id-84\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: Pipeline</label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-85\" type=\"checkbox\" ><label for=\"sk-estimator-id-85\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler', StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases', 'total_amount',\n",
|
||
" 'nb_suppliers', 'vente_internet_max',\n",
|
||
" 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-86\" type=\"checkbox\" ><label for=\"sk-estimator-id-86\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">num</label><div class=\"sk-toggleable__content fitted\"><pre>['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'nb_tickets_internet', 'nb_campaigns', 'nb_campaigns_opened']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-87\" type=\"checkbox\" ><label for=\"sk-estimator-id-87\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> StandardScaler<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div></div></div></div><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-88\" type=\"checkbox\" ><label for=\"sk-estimator-id-88\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">cat</label><div class=\"sk-toggleable__content fitted\"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-89\" type=\"checkbox\" ><label for=\"sk-estimator-id-89\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> OneHotEncoder<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-90\" type=\"checkbox\" ><label for=\"sk-estimator-id-90\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga')</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets',\n",
|
||
" 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[(...\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000,\n",
|
||
" solver='saga'))]),\n",
|
||
" param_grid={'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))"
|
||
]
|
||
},
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"logit_grid"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 105,
|
||
"id": "5d553da2-5c2a-491a-b4d2-f31c30c201a6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'scoring': make_scorer(f1_score, response_method='predict'),\n",
|
||
" 'estimator': Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, solver='saga'))]),\n",
|
||
" 'n_jobs': None,\n",
|
||
" 'refit': True,\n",
|
||
" 'cv': 3,\n",
|
||
" 'verbose': 0,\n",
|
||
" 'pre_dispatch': '2*n_jobs',\n",
|
||
" 'error_score': nan,\n",
|
||
" 'return_train_score': False,\n",
|
||
" 'param_grid': {'logreg__C': array([9.765625e-04, 1.953125e-03, 3.906250e-03, 7.812500e-03,\n",
|
||
" 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
|
||
" 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
|
||
" 4.000000e+00, 8.000000e+00, 1.600000e+01]),\n",
|
||
" 'logreg__penalty': ['l1']},\n",
|
||
" 'multimetric_': False,\n",
|
||
" 'best_index_': 5,\n",
|
||
" 'best_score_': 0.42160313383818665,\n",
|
||
" 'best_params_': {'logreg__C': 0.03125, 'logreg__penalty': 'l1'},\n",
|
||
" 'best_estimator_': Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler',\n",
|
||
" StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases',\n",
|
||
" 'total_amount',\n",
|
||
" 'nb_suppliers',\n",
|
||
" 'vente_internet_max',\n",
|
||
" 'purchase_date_min',\n",
|
||
" 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet',\n",
|
||
" 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('logreg',\n",
|
||
" LogisticRegression(C=0.03125,\n",
|
||
" class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, penalty='l1',\n",
|
||
" solver='saga'))]),\n",
|
||
" 'refit_time_': 305.1356477737427,\n",
|
||
" 'feature_names_in_': array(['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers',\n",
|
||
" 'vente_internet_max', 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'is_email_true', 'opt_in', 'gender_female',\n",
|
||
" 'gender_male', 'nb_campaigns', 'nb_campaigns_opened'], dtype=object),\n",
|
||
" 'scorer_': make_scorer(f1_score, response_method='predict'),\n",
|
||
" 'cv_results_': {'mean_fit_time': array([ 11.07076669, 13.15744201, 27.35094929, 40.0343461 ,\n",
|
||
" 94.58210254, 140.45846391, 159.83818332, 162.80178094,\n",
|
||
" 163.94260454, 171.08749111, 169.26621262, 166.36741408,\n",
|
||
" 167.91208776, 173.06720233, 170.93666704]),\n",
|
||
" 'std_fit_time': array([ 0.09462032, 1.51362591, 6.70859141, 22.68643753, 28.72690872,\n",
|
||
" 70.8434823 , 85.23159321, 79.71538593, 82.70486235, 84.79706797,\n",
|
||
" 86.79005212, 84.67956107, 83.94889047, 89.68716252, 89.41361431]),\n",
|
||
" 'mean_score_time': array([0.11632609, 0.10857773, 0.18140252, 0.1291213 , 0.11651532,\n",
|
||
" 0.07535577, 0.12481014, 0.16039928, 0.15685773, 0.07996233,\n",
|
||
" 0.12988146, 0.10067987, 0.1194102 , 0.09737802, 0.09390028]),\n",
|
||
" 'std_score_time': array([0.02131792, 0.03620144, 0.05853886, 0.06555575, 0.03228018,\n",
|
||
" 0.01433186, 0.03501336, 0.05466042, 0.06882891, 0.01002881,\n",
|
||
" 0.00495894, 0.00905774, 0.04075337, 0.03269379, 0.01990173]),\n",
|
||
" 'param_logreg__C': masked_array(data=[0.0009765625, 0.001953125, 0.00390625, 0.0078125,\n",
|
||
" 0.015625, 0.03125, 0.0625, 0.125, 0.25, 0.5, 1.0, 2.0,\n",
|
||
" 4.0, 8.0, 16.0],\n",
|
||
" mask=[False, False, False, False, False, False, False, False,\n",
|
||
" False, False, False, False, False, False, False],\n",
|
||
" fill_value='?',\n",
|
||
" dtype=object),\n",
|
||
" 'param_logreg__penalty': masked_array(data=['l1', 'l1', 'l1', 'l1', 'l1', 'l1', 'l1', 'l1', 'l1',\n",
|
||
" 'l1', 'l1', 'l1', 'l1', 'l1', 'l1'],\n",
|
||
" mask=[False, False, False, False, False, False, False, False,\n",
|
||
" False, False, False, False, False, False, False],\n",
|
||
" fill_value='?',\n",
|
||
" dtype=object),\n",
|
||
" 'params': [{'logreg__C': 0.0009765625, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.001953125, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.00390625, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.0078125, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.015625, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.03125, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.0625, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.125, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.25, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 0.5, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 1.0, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 2.0, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 4.0, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 8.0, 'logreg__penalty': 'l1'},\n",
|
||
" {'logreg__C': 16.0, 'logreg__penalty': 'l1'}],\n",
|
||
" 'split0_test_score': array([0.27289073, 0.2738913 , 0.27382853, 0.27409759, 0.27454764,\n",
|
||
" 0.27661894, 0.2766145 , 0.27584723, 0.27571682, 0.27576295,\n",
|
||
" 0.27580092, 0.27577943, 0.27581248, 0.27581909, 0.27581909]),\n",
|
||
" 'split1_test_score': array([0.4714244 , 0.47196015, 0.48362373, 0.48891733, 0.49066854,\n",
|
||
" 0.49091122, 0.49086284, 0.49065871, 0.49062783, 0.49049541,\n",
|
||
" 0.49048106, 0.49045238, 0.49043804, 0.49043804, 0.4904237 ]),\n",
|
||
" 'split2_test_score': array([0.50689906, 0.50092334, 0.4981377 , 0.49759178, 0.49725836,\n",
|
||
" 0.49727924, 0.49708801, 0.49738305, 0.49751781, 0.49738248,\n",
|
||
" 0.49738248, 0.49738248, 0.49738248, 0.49738248, 0.49738248]),\n",
|
||
" 'mean_test_score': array([0.4170714 , 0.4155916 , 0.41852999, 0.42020223, 0.42082484,\n",
|
||
" 0.42160313, 0.42152178, 0.42129633, 0.42128749, 0.42121361,\n",
|
||
" 0.42122149, 0.42120476, 0.421211 , 0.4212132 , 0.42120842]),\n",
|
||
" 'std_test_score': array([0.10297463, 0.1008925 , 0.10249081, 0.10337226, 0.10346859,\n",
|
||
" 0.10255226, 0.10249644, 0.10288467, 0.10297243, 0.10288758,\n",
|
||
" 0.10286646, 0.10287015, 0.10285136, 0.10284824, 0.10284503]),\n",
|
||
" 'rank_test_score': array([14, 15, 13, 12, 11, 1, 2, 3, 4, 6, 5, 10, 8, 7, 9],\n",
|
||
" dtype=int32)},\n",
|
||
" 'n_splits_': 3}"
|
||
]
|
||
},
|
||
"execution_count": 105,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"logit_grid.__dict__"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"id": "3573f34e-25d5-4afb-82cc-52323e2f63c6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 0.67553011, 0. , 0.14254288, 0.41574295, 0.03458744,\n",
|
||
" 0.64769185, -1.20510095, 0. , 0.01018587, 0.13959519,\n",
|
||
" 0.24222266, -0.68253886, 0. , 0. ]])"
|
||
]
|
||
},
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# coefficients trouvés pour le modèle optimal\n",
|
||
"logit_grid.best_estimator_.named_steps[\"logreg\"].coef_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 57,
|
||
"id": "0332a814-61fb-4b71-836a-e8ace70b1a44",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'preprocessor': ColumnTransformer(transformers=[('num',\n",
|
||
" Pipeline(steps=[('scaler', StandardScaler())]),\n",
|
||
" ['nb_tickets', 'nb_purchases', 'total_amount',\n",
|
||
" 'nb_suppliers', 'vente_internet_max',\n",
|
||
" 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'nb_campaigns',\n",
|
||
" 'nb_campaigns_opened']),\n",
|
||
" ('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])]),\n",
|
||
" 'logreg': LogisticRegression(C=0.0625,\n",
|
||
" class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539},\n",
|
||
" max_iter=5000, penalty='l1', solver='saga')}"
|
||
]
|
||
},
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"logit_grid.best_estimator_.named_steps"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 58,
|
||
"id": "287615b9-e062-4b84-be61-26b9364b2cf4",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([-0.44041477])"
|
||
]
|
||
},
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"logit_grid.best_estimator_.named_steps[\"logreg\"].intercept_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 115,
|
||
"id": "4d50899d-cc0b-4a71-9406-f8b0a277c4a6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>140.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>373.540289</td>\n",
|
||
" <td>219.262269</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>50.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>90.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>78.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224208</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224209</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>20.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224210</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224211</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>97.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224212</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>224213 rows × 14 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 2.0 1.0 60.00 1.0 \n",
|
||
"1 8.0 3.0 140.00 1.0 \n",
|
||
"2 2.0 1.0 50.00 1.0 \n",
|
||
"3 3.0 1.0 90.00 1.0 \n",
|
||
"4 2.0 1.0 78.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 0.0 0.00 0.0 \n",
|
||
"224209 1.0 1.0 20.00 1.0 \n",
|
||
"224210 0.0 0.0 0.00 0.0 \n",
|
||
"224211 1.0 1.0 97.11 1.0 \n",
|
||
"224212 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 355.268981 355.268981 \n",
|
||
"1 0.0 373.540289 219.262269 \n",
|
||
"2 0.0 5.202442 5.202442 \n",
|
||
"3 0.0 5.178958 5.178958 \n",
|
||
"4 0.0 5.174039 5.174039 \n",
|
||
"... ... ... ... \n",
|
||
"224208 0.0 550.000000 550.000000 \n",
|
||
"224209 1.0 392.501030 392.501030 \n",
|
||
"224210 0.0 550.000000 550.000000 \n",
|
||
"224211 1.0 172.334074 172.334074 \n",
|
||
"224212 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"0 0.0 True False 0 \n",
|
||
"1 0.0 True False 0 \n",
|
||
"2 0.0 True False 0 \n",
|
||
"3 0.0 True False 0 \n",
|
||
"4 0.0 True False 1 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 True False 0 \n",
|
||
"224209 1.0 True False 0 \n",
|
||
"224210 0.0 True True 0 \n",
|
||
"224211 1.0 True False 0 \n",
|
||
"224212 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"0 1 0.0 0.0 \n",
|
||
"1 1 0.0 0.0 \n",
|
||
"2 1 0.0 0.0 \n",
|
||
"3 1 0.0 0.0 \n",
|
||
"4 0 0.0 0.0 \n",
|
||
"... ... ... ... \n",
|
||
"224208 1 34.0 3.0 \n",
|
||
"224209 1 23.0 6.0 \n",
|
||
"224210 1 8.0 4.0 \n",
|
||
"224211 1 13.0 5.0 \n",
|
||
"224212 1 4.0 4.0 \n",
|
||
"\n",
|
||
"[224213 rows x 14 columns]"
|
||
]
|
||
},
|
||
"execution_count": 115,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# c'est la 2ème variable nb_purchases qui a été supprimée par le LASSO\n",
|
||
"X_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"id": "e53b1f79-762d-4f1f-8505-91de1088af42",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"16.0"
|
||
]
|
||
},
|
||
"execution_count": 59,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# best param : alpha = 32 (alpha =1/4 sur le petit subsample)\n",
|
||
"1/logit_grid.best_params_[\"logreg__C\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"id": "41bcaaf6-ab58-4004-a3c5-586d77e872d1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Accuracy Score: 0.7510718448218449\n",
|
||
"F1 Score: 0.46474681703251214\n",
|
||
"Recall Score: 0.7585829072315559\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# print results for the best model\n",
|
||
"\n",
|
||
"y_pred = logit_grid.predict(X_test)\n",
|
||
"\n",
|
||
"# Calculate the F1 score\n",
|
||
"acc = accuracy_score(y_test, y_pred)\n",
|
||
"print(f\"Accuracy Score: {acc}\")\n",
|
||
"\n",
|
||
"f1 = f1_score(y_test, y_pred)\n",
|
||
"print(f\"F1 Score: {f1}\")\n",
|
||
"\n",
|
||
"recall = recall_score(y_test, y_pred)\n",
|
||
"print(f\"Recall Score: {recall}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 60,
|
||
"id": "a454bb57-76eb-4a22-9950-0733d39e449f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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EVcanNNCREREBoGVFiIiIh1joUUaTFqIiIh0jBNxpcHhISIiIjIIrLQQERHpGOss0mDSQkREpGNcPSQNDg8RERGRQWClhYiISMdqsNAiiQolLdu3b6/wBf39/Z+4M0RERNURh4ekUaGkpXfv3hW6mEwmQ0lJydP0h4iIiKhcFUpaSktLdd0PIiKiaouFFmlwTgsREZGOcXhIGk+UtBQUFCAhIQFZWVkoKirSahszZowkHSMiIqouOBFXGpVOWo4ePYqePXvizp07KCgogK2tLa5duwZzc3M4ODgwaSEiIiKdqPQ+LR999BF69eqFGzduwMzMDElJSfjzzz/h6emJOXPm6KKPREREBk0mk0lyPO8qnbSkpqYiNDQURkZGMDIygkajgZOTE2bNmoVJkybpoo9EREQGTSbR8byrdNJiYmIiZnuOjo7IysoCACgUCvGfiYiIiKRW6TktLVu2xO+//46mTZvitddew9SpU3Ht2jWsW7cOHh4euugjERGRQavBoR1JVLrSMn36dNSpUwcA8Pnnn8POzg7Dhw9HTk4Oli1bJnkHiYiIDJ1MJs3xvKt0paVVq1biP9euXRs7d+6UtENERERE5eHmckRERDrGlT/SqHTS4uzs/Mgv//z580/VISIiouqGOYs0Kp20hISEaP1cXFyMo0ePIi4uDuPHj5eqX0RERERaKp20fPjhh+WeX7hwIX7//fen7hAREVF1w9VD0qj06qGH6dGjB2JiYqS6HBERUbXB1UPSkGwi7pYtW2BrayvV5YiIiKoNTsSVxhNtLvffL18QBKjValy9ehWLFi2StHNERERE91U6aXnjjTe0kpYaNWqgdu3a6NSpE1544QVJO/ekcpOj9N0FoipJnXdX310gei5JNhfjOVfppCUiIkIH3SAiIqq+ODwkjUonf0ZGRsjJySlz/vr16zAyMpKkU0REREQPqnSlRRCEcs9rNBqYmpo+dYeIiIiqmxostEiiwknLggULANwrca1YsQKWlpZiW0lJCX755ZcqM6eFiIioKmHSIo0KJy3z5s0DcK/SsmTJEq2hIFNTUzRs2BBLliyRvodEREREqETSkpmZCQB47bXXsHXrVtjY2OisU0RERNUJJ+JKo9JzWvbv36+LfhAREVVbHB6SRqVXD73zzjuYMWNGmfOzZ8/Gu+++K0mniIiIiB5U6aQlISEBvr6+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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# confusion matrix \n",
|
||
"\n",
|
||
"draw_confusion_matrix(y_test, y_pred)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"id": "25ec1701-ade5-4419-8b46-8a1bb109cf84",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAK8CAYAAACeK2TMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gUVfvG8e+mkwoBQgm9N+kCAekCUhQUEHkVUcHG+7OAFRsiKogFRV97b4gIgiIiICAiSJcqvXdCSSV15/fHwMKwARNJMrvZ+3NducicnU2eBO6d8OTMOQ7DMAxERERERERERMRn+NldgIiIiIiIiIiIFC41hEREREREREREfIwaQiIiIiIiIiIiPkYNIRERERERERERH6OGkIiIiIiIiIiIj1FDSERERERERETEx6ghJCIiIiIiIiLiY9QQEhERERERERHxMWoIiYiIiIiIiIj4GDWERERERLzc6NGjKVmyJHv27LG7FBEREfESagiJiIgUoHXr1nH77bdTtWpVQkJCCA8Pp2nTpowfP54TJ07YUtOnn36Kw+Fg5cqVBfp5du/ejcPhcL35+flRokQJOnfuzJw5cy76vNmzZ9OzZ09Kly5NcHAwFStWZPDgwWzatOmiz/n999+58cYbiY2NJSgoiKioKFq3bs0777xDSkpKQXx5tjj7d7d7927L+KhRo7j++uvp378/GRkZOT732WefxeFw5FstCxcuxOFwsHDhwnz7mDmpUqUKt912W56es2TJEp599llOnTrl9liHDh3o0KFDvtQmIiLizdQQEhERKSAffPABzZo1Y8WKFTzyyCPMnj2b77//nv79+/Puu+8yZMgQu0ssFPfddx9Lly7l999/55VXXmHbtm306NGDRYsWuZ376KOP0r17d5xOJ2+//TZz585l1KhRrFixgqZNmzJt2jS354waNYp27dpx4MABxowZw9y5c/nmm2/o3Lkzzz77LE899VRhfJm2e/fddyldujTDhw+3u5R89f333/P000/n6TlLlixh9OjROTaE3n77bd5+++18qk5ERMR7BdhdgIiISFG0dOlS7r33Xrp06cL06dMJDg52PdalSxceeughZs+eXag1ZWZm5usMkdyqVKkSrVq1AqBNmzbUrFmT9u3b89FHH9GuXTvXeZMmTeLll1/m3nvvtfyHvV27dgwcOJD27dszaNAg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TidffvklFSpUcC203bFjR3799VdL0yQ7O9uy8DRAt27dCAgIYM2aNdSpUyfHt4s5+9wdO3Zc9O83L2rXrk1sbCxff/215e8iJSWFqVOnunYeCwsLo3nz5kyfPt2SjeTkZGbOnJmnz1m8eHH69evHf//7X06cOMHu3bsBXDv75Wbx5o4dO5KUlMQPP/xgGf/666/dzq1SpQpbt261NGWPHz/OkiVLLOf16tWL48ePk52dneP3tXbt2nn6OkVERAqCZgiJiIgUgLi4ON555x2GDRtGs2bNuPfee6lfvz6ZmZmsWbOG999/nwYNGnDttddSu3Zt7rrrLt588038/Pzo3r07u3fv5umnn6ZixYqWBsigQYO45ZZbGDZsGH379mXPnj2MHz+e0qVL57nGlStXMnToUPr378++fft48skniY2NZdiwYYC5psubb77J4MGDOXHiBP369SMmJoZjx46xdu1ajh07xjvvvPOvvj8vvfQSLVu2ZMyYMXz44YcADBw4kNWrV/PKK6+we/du7rjjDsqUKcOWLVuYMGECO3bs4Ouvv6ZatWquj9O/f3+efvppxowZw+bNmxkyZAjVq1cnNTWVZcuW8d577zFgwIBLbj3/22+/0blzZ5555plcryP0b40dO5YuXbrQsWNHHn74YYKCgnj77bfZsGEDkyZNcs3oeuqpp/jhhx/o1KkTzzzzDKGhofzvf/9zW7OpSpUqPPfcczz99NPs2rWLHj16EB0dzZEjR1i2bBlhYWE899xzOdZy9rlPPvkkO3fu5JprrqFEiRIcOXKE5cuXExYWxujRo3P9tfn5+TF+/HhuvvlmevXqxd133016ejovv/wyp06dYty4ca5zn3vuOXr27Em3bt144IEHyM7O5uWXXyY8PJwTJ05c8vNce+21NGjQgObNm1O6dGn27NnD66+/TuXKlalZsyYAV1xxBQBvvPEGgwcPJjAwkNq1a+c4M+fWW29lwoQJ3HrrrbzwwgvUrFmTWbNm8csvv7idO2jQIN577z1uueUW7rzzTo4fP8748eOJjIy0nHfTTTfx1Vdf0aNHDx544AFatGhBYGAg+/fvZ8GCBfTu3Zvrr78+199bERGRAmHfetYiIiJF319//WUMHjzYqFSpkhEUFGSEhYUZTZo0MZ555hnj6NGjrvOys7ONl156yahVq5YRGBholCpVyrjl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04cGDRrw2WefkZGRwf/+9z9iYmLyfd7SpUu58sorueWWW6hSpQrdunXj5ptvZuXZCyxhjgC69dZb+eijjyhRokS+xxkwYIDz78t9993HZZddZjlOfHw8rVu3ZuLEiYX74v8hxKNHF485lW3OfB4RWsg9vZwc+OgjeOklOHwYKleGa66B8HAIDoZSpQr3fCKF6PDhw5oYUeQsyoSIK+VCxKowMnEyO5d6L/1QSBW5J+mVq4gKu7hfa7dv386cOXMIDQ11bps7dy5HjhzhiSeecNm/V69e1KpVi4kTJ9K/f3+mTJlCVlYWTz31VL7HL168eL7b8/Ly6NGjB+np6fz3v/+levXqJCUlERzs3nQgP/30E7GxscybN8/ZGHvjjTfYtm0b1atXB+CPP/5g/fr1fP311wB89NFHvPzyy7z77rs0adKENWvWcO+99xIdHc2AAQMAWLx4MbfeeqvlXOnp6QwYMICxY8cCMHLkSHr27MnWrVspVqyYc7+XX36ZESNGMHr0aIKDg/nhhx+47bbbGDt2LG3btmXbtm3cd999zn0BgoKCGDt2LFWqVGHHjh088MADPPXUUy6NqrP16NGDxYsXn/f9OVdTaceOHRw4cMAyR1J4eDjt27fn119/5bbbbst3HqE2bdrw3//+l+XLl9OiRQu2b9/O7Nmzne/baQ8++CBXX301Xbp0cTbF/nmcb775hrvuuoty5cqxYMECtmzZwr///W/Lfi1atLjga7xUagj5qYwss6N6sR9++frhB3PJ+L+vnaRuXfPysACaZV382+bNm2natKndZYj4DGVCxJVyIWIVaJmYNWsWMTEx5ObmOud+GTVqlPPxLVu2AFC3bt18n1+nTh3nPlu3biU2NpayZcu6VcOPP/7I8uXL2bhxo3NS72rVqrn9WqKjoxk/fjxhZ1290ahRI/73v/855//58ssvufzyy53nefXVVxk5ciR9+vQBoGrVqiQlJfHBBx8wYMAAjh07xrFjxyhXrpzlXJ06dbLc/+CDDyhRogQLFy7kmmuucW6/5ZZbuOuuu5z3b7/9dp555hln06RatWq8+uqrPPXUU86G0Nlz7FStWpVXX32V+++//7wNofHjx3Py5MkCv1dnO3DgAAAJCQmW7QkJCezatYtTp04RHR3t8rybbrqJv/76izZt2mAYBjk5Odx///0888wzzn0mTZrE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O3cuzZs3D6hv2mnNmze3uwQRn6JMiFgpEyKulAsRq0DKxMCBA3E4HDgcDkJCQqhUqRL333+/89Klomro0KHO1+1wOIiLi6Nt27YsXLjQ1rpWrFjBfffdZ2sN+YmOjra7BK+xddn5xx57jPHjx/PJJ5+wceNGhgwZwu7duxk0aBAAzz77LHfccYdz/0GDBrFr1y4ee+wxNm7cyCeffMLHH3/ME088YddLsNXp671FxKRMiFgpEyKulAsRq0DLRPfu3UlOTmbnzp2MHz+eb7/9lgceeMDusjyufv36JCcnk5yczNKlS6lZsybXXHONc24bO5QuXdo5t5MvOT2HTyCwtSHUv39/xowZwyuvvELjxo1ZtGgRs2fPpnLlygAkJyeze/du5/5Vq1Zl9uzZLFiwgMaNG/Pqq68yduzYgFpyXkRERERExCedOHHur78nOC7Qvn9PuHvBfS9CeHg4iYmJVKhQgW7dutG/f3/npPcAubm53H333VStWpXIyEhq167Nv//9b8sxBg4cSO/evXnnnXcoW7Ys8fHxPPjgg5aVrw8dOkSvXr2IjIykatWqfPnlly617N69m+uuu46YmBhiY2Pp168fBw8edD4+dOhQGjduzCeffEKlSpWIiYnh/vvvJzc3l7feeovExETKlCnD66+/fsHXHRISQmJiIomJidSrV49hw4Zx/Phx52IAAKNGjaJhw4ZER0dTsWJFHnjgAefkzQC7du2iV69elChRgujoaOrXr+9cBAAgKSmJnj17EhMTQ0JCArfffjuHDx8+Z03/vGTM4XAwfvx4rr/+eqKioqhZsybffPON5TnunkPOz9aGEMADDzzAzp07yczMZNWqVbRr18752IQJE5wrL5zWvn17Vq9eTWZmJjt27HCOJgpEzZo1s7sEEZ+iTIhYKRMirpQLEatCzURMzLm//vmf+GXKnHvfHj2s+1apkv9+l2j79u3MmTPHMv1IXl4eFSpU4KuvviIpKYmXXnqJ5557zrkS3mnz589n27ZtzJ8/n88++4wJEyYwYcIE5+MDBw5k586d/Pzzz3z99de89957HDp0yPm4YRj07t2blJQUFi5cyLx589i2bRv9+/e3nGfbtm18//33zJkzh4kTJ/LJJ59w9dVXs3fvXhYuXMibb77JCy+8wG+//Vbg152ZmcmECRMoXrw4tWvXdm4PCgpi7Nix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",
|
||
"text/plain": [
|
||
"<Figure size 1400x800 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# ROC curve\n",
|
||
"\n",
|
||
"# Calcul des taux de faux positifs (FPR) et de vrais positifs (TPR)\n",
|
||
"y_pred_prob = logit_grid.predict_proba(X_test)[:, 1]\n",
|
||
"\n",
|
||
"fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob, pos_label=1)\n",
|
||
"\n",
|
||
"# Calcul de l'aire sous la courbe ROC (AUC)\n",
|
||
"roc_auc = auc(fpr, tpr)\n",
|
||
"\n",
|
||
"plt.figure(figsize = (14, 8))\n",
|
||
"plt.plot(fpr, tpr, label=\"ROC curve(area = %0.3f)\" % roc_auc)\n",
|
||
"plt.plot([0, 1], [0, 1], color=\"red\",label=\"Random Baseline\", linestyle=\"--\")\n",
|
||
"plt.grid(color='gray', linestyle='--', linewidth=0.5)\n",
|
||
"plt.xlabel('Taux de faux positifs (FPR)')\n",
|
||
"plt.ylabel('Taux de vrais positifs (TPR)')\n",
|
||
"plt.title('Courbe ROC : modèle logistique')\n",
|
||
"plt.legend(loc=\"lower right\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"id": "3b5c9485-511b-4f6b-b667-154f4f519682",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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FwAQFxenNeeNn58fduzYgQkTJuC7776Dl5cXFi5ciD59+pjqLRAREVEZY9J5bkzBmPPcEBERkXGUi3luiIiIiIyBxQ0RERGZFRY3REREZFZY3BAREZFZYXFDREREZoXFDREREZkVFjdERERkVljcEBERkVlhcUNERERmxaTLL5hC4YTMaWlpJk5CREREuir83NZlYYUKV9ykp6cDAHx8fEychIiIiPSVnp4OR0fHp25T4daWUqvViI2Nhb29PSRJMuix09LS4OPjg7t373LdKiPieS4dPM+lg+e59PBclw5jnWchBNLT0+Hl5QWZ7Omjaipcz41MJkOVKlWM+hoODg78wSkFPM+lg+e5dPA8lx6e69JhjPP8rB6bQhxQTERERGaFxQ0RERGZFRY3BqRUKjFjxgwolUpTRzFrPM+lg+e5dPA8lx6e69JRFs5zhRtQTEREROaNPTdERERkVljcEBERkVlhcUNERERmhcUNERERmRUWN3pavHgx/Pz8YGVlhcDAQBw5cuSp2x86dAiBgYGwsrKCv78/vv/++1JKWr7pc563bNmCTp06oXLlynBwcEBwcDB27dpVimnLL32/nwsdO3YMFhYWaNy4sXEDmgl9z3NOTg6mT58OX19fKJVKVK9eHStWrCiltOWXvud53bp1aNSoEWxsbODp6YmhQ4ciKSmplNKWT4cPH0aPHj3g5eUFSZKwbdu2Z+5jks9BQTr75ZdfhKWlpfjxxx9FRESEGDdunLC1tRV37twpdvtbt24JGxsbMW7cOBERESF+/PFHYWlpKTZt2lTKycsXfc/zuHHjxBdffCFOnz4trl27JqZNmyYsLS3F2bNnSzl5+aLveS6UkpIi/P39RefOnUWjRo1KJ2w5VpLz3LNnT9G8eXOxZ88eERUVJU6dOiWOHTtWiqnLH33P85EjR4RMJhPffPONuHXrljhy5IioV6+e6NWrVyknL1927Nghpk+fLjZv3iwAiK1btz51e1N9DrK40UOzZs3EqFGjtNrq1Kkj3n///WK3nzp1qqhTp45W28iRI0WLFi2MltEc6Huei1O3bl0xc+ZMQ0czKyU9z/369RP/93//J2bMmMHiRgf6nue//vpLODo6iqSkpNKIZzb0Pc9ffvml8Pf312pbuHChqFKlitEymhtdihtTfQ7yspSOcnNzER4ejs6dO2u1d+7cGceP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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# utilisation d'une métrique plus adaptée aux modèles de marketing : courbe de lift\n",
|
||
"\n",
|
||
"# Tri des prédictions de probabilités et des vraies valeurs\n",
|
||
"sorted_indices = np.argsort(y_pred_prob)[::-1]\n",
|
||
"y_pred_prob_sorted = y_pred_prob[sorted_indices]\n",
|
||
"y_test_sorted = y_test.iloc[sorted_indices]\n",
|
||
"\n",
|
||
"# Calcul du gain cumulatif\n",
|
||
"cumulative_gain = np.cumsum(y_test_sorted) / np.sum(y_test_sorted)\n",
|
||
"\n",
|
||
"# Tracé de la courbe de lift\n",
|
||
"plt.plot(np.linspace(0, 1, len(cumulative_gain)), cumulative_gain, label='Courbe de lift')\n",
|
||
"plt.xlabel('Part de clients identifiés sans modèle ')\n",
|
||
"plt.ylabel('Part de clients identifiés avec modèle')\n",
|
||
"plt.title('Courbe de Lift')\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"id": "6e7cfb6c-8049-4bd1-8d82-61a2e97b257d",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# look at the distribution of the score \n",
|
||
"\n",
|
||
"plt.hist(y_pred_prob, bins=20)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 64,
|
||
"id": "99f7f70e-c3bb-445e-8889-e7547f6ebd1e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# number of observations\n",
|
||
"N = len(y_pred_prob)\n",
|
||
"\n",
|
||
"# sort the data in ascending order \n",
|
||
"y_pred_prob_sorted = np.sort(y_pred_prob) \n",
|
||
"\n",
|
||
"# get the cdf values of y \n",
|
||
"steps = np.arange(N) / N\n",
|
||
" \n",
|
||
"# plotting \n",
|
||
"plt.xlabel('X') \n",
|
||
"plt.ylabel('P(score<=X)') \n",
|
||
" \n",
|
||
"plt.title('CDF curve of the predicted probability of purchase (score) for sports companies') \n",
|
||
" \n",
|
||
"plt.plot(y_pred_prob_sorted, steps) \n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "bcb94066-9387-4a5f-af3a-ab86d534c885",
|
||
"metadata": {},
|
||
"source": [
|
||
"### K-means clustering"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"id": "dd7a4a9c-d7e3-4747-ae59-b2a5a0b77260",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-4 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-4 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-4 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-4 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-4 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=3, random_state=0)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-23\" type=\"checkbox\" checked><label for=\"sk-estimator-id-23\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> KMeans<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.cluster.KMeans.html\">?<span>Documentation for KMeans</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KMeans(n_clusters=3, random_state=0)</pre></div> </div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"KMeans(n_clusters=3, random_state=0)"
|
||
]
|
||
},
|
||
"execution_count": 66,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# K-means clustering \n",
|
||
"\n",
|
||
"from sklearn.cluster import KMeans\n",
|
||
"\n",
|
||
"kmeans = KMeans(n_clusters=3, random_state=0)\n",
|
||
"\n",
|
||
"kmeans.fit(y_pred_prob.reshape(-1,1))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"id": "10b6ece7-adcf-41c0-884b-a4aef42af378",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1, 0, 0, ..., 0, 1, 0], dtype=int32)"
|
||
]
|
||
},
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_clusters = kmeans.predict(y_pred_prob.reshape(-1,1))\n",
|
||
"y_clusters"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"id": "e4b3b16e-03b8-4883-9788-cb7296fe56cd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"seuil cluster 0 : 0.38635624748849917 (60.14%)\n",
|
||
"seuil cluster 1 : 0.7395110401019087 (30.69%)\n",
|
||
"seuil cluster 2 : 1.0 (9.16%)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# seuils des clusters et part de clients dans chacun d'eux\n",
|
||
"\n",
|
||
"print(f\"seuil cluster 0 : {y_pred_prob[y_clusters==0].max()} ({round(100 * (y_clusters==0).mean(), 2)}%)\")\n",
|
||
"print(f\"seuil cluster 1 : {y_pred_prob[y_clusters==1].max()} ({round(100 * (y_clusters==1).mean(), 2)}%)\")\n",
|
||
"print(f\"seuil cluster 2 : {y_pred_prob[y_clusters==2].max()} ({round(100* (y_clusters==2).mean(), 2)}%)\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"id": "3e404a5e-6734-4d98-8853-48b09c96e7e0",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>cluster</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers vente_internet_max \\\n",
|
||
"0 4.0 1.0 100.0 1.0 0.0 \n",
|
||
"1 1.0 1.0 55.0 1.0 0.0 \n",
|
||
"2 17.0 1.0 80.0 1.0 0.0 \n",
|
||
"3 4.0 1.0 120.0 1.0 0.0 \n",
|
||
"4 34.0 2.0 416.0 1.0 0.0 \n",
|
||
"\n",
|
||
" purchase_date_min purchase_date_max nb_tickets_internet is_email_true \\\n",
|
||
"0 5.177187 5.177187 0.0 True \n",
|
||
"1 426.265613 426.265613 0.0 True \n",
|
||
"2 436.033437 436.033437 0.0 True \n",
|
||
"3 5.196412 5.196412 0.0 True \n",
|
||
"4 478.693148 115.631470 0.0 True \n",
|
||
"\n",
|
||
" opt_in gender_female gender_male nb_campaigns nb_campaigns_opened \\\n",
|
||
"0 False 1 0 0.0 0.0 \n",
|
||
"1 True 0 1 0.0 0.0 \n",
|
||
"2 True 1 0 0.0 0.0 \n",
|
||
"3 False 1 0 0.0 0.0 \n",
|
||
"4 False 1 0 0.0 0.0 \n",
|
||
"\n",
|
||
" cluster \n",
|
||
"0 1 \n",
|
||
"1 0 \n",
|
||
"2 0 \n",
|
||
"3 1 \n",
|
||
"4 2 "
|
||
]
|
||
},
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# les individus des clusters sont-ils semblables ? def des marketing personae\n",
|
||
"\n",
|
||
"X_test_clustered = X_test.assign(cluster = y_clusters)\n",
|
||
"X_test_clustered.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"id": "b6f4638d-23c4-427a-88a4-b09528b3f91b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>cluster</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>222.437500</td>\n",
|
||
" <td>214.639152</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>209.26</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>418.270723</td>\n",
|
||
" <td>56.167392</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>18.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"cluster \n",
|
||
"0 0.0 0.0 0.00 0.0 \n",
|
||
"1 2.0 1.0 60.00 1.0 \n",
|
||
"2 13.0 4.0 209.26 1.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"cluster \n",
|
||
"0 0.0 550.000000 550.000000 \n",
|
||
"1 1.0 222.437500 214.639152 \n",
|
||
"2 1.0 418.270723 56.167392 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"cluster \n",
|
||
"0 0.0 1.0 1.0 0.0 \n",
|
||
"1 1.0 1.0 0.0 0.0 \n",
|
||
"2 3.0 1.0 0.0 0.0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"cluster \n",
|
||
"0 0.0 7.0 0.0 \n",
|
||
"1 1.0 3.0 0.0 \n",
|
||
"2 1.0 18.0 1.0 "
|
||
]
|
||
},
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test_clustered.groupby(\"cluster\").median().iloc[[0,1,2], :]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"id": "f80474be-c897-47f9-8fdd-f2fb8d724ee2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>cluster</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.311325</td>\n",
|
||
" <td>0.114404</td>\n",
|
||
" <td>6.707697</td>\n",
|
||
" <td>0.102898</td>\n",
|
||
" <td>0.048741</td>\n",
|
||
" <td>527.762945</td>\n",
|
||
" <td>527.621410</td>\n",
|
||
" <td>0.137313</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0.561640</td>\n",
|
||
" <td>0.239934</td>\n",
|
||
" <td>0.450610</td>\n",
|
||
" <td>12.881201</td>\n",
|
||
" <td>2.163647</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2.926055</td>\n",
|
||
" <td>1.395389</td>\n",
|
||
" <td>82.976104</td>\n",
|
||
" <td>1.000136</td>\n",
|
||
" <td>0.681539</td>\n",
|
||
" <td>228.303268</td>\n",
|
||
" <td>217.641649</td>\n",
|
||
" <td>1.736769</td>\n",
|
||
" <td>0.990202</td>\n",
|
||
" <td>0.145618</td>\n",
|
||
" <td>0.260553</td>\n",
|
||
" <td>0.536871</td>\n",
|
||
" <td>9.821800</td>\n",
|
||
" <td>2.811663</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>44.841472</td>\n",
|
||
" <td>11.576993</td>\n",
|
||
" <td>1942.145881</td>\n",
|
||
" <td>1.493641</td>\n",
|
||
" <td>0.742562</td>\n",
|
||
" <td>382.346041</td>\n",
|
||
" <td>87.811798</td>\n",
|
||
" <td>12.613786</td>\n",
|
||
" <td>0.971724</td>\n",
|
||
" <td>0.132637</td>\n",
|
||
" <td>0.199182</td>\n",
|
||
" <td>0.621735</td>\n",
|
||
" <td>20.781399</td>\n",
|
||
" <td>8.329548</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"cluster \n",
|
||
"0 0.311325 0.114404 6.707697 0.102898 \n",
|
||
"1 2.926055 1.395389 82.976104 1.000136 \n",
|
||
"2 44.841472 11.576993 1942.145881 1.493641 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"cluster \n",
|
||
"0 0.048741 527.762945 527.621410 \n",
|
||
"1 0.681539 228.303268 217.641649 \n",
|
||
"2 0.742562 382.346041 87.811798 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"cluster \n",
|
||
"0 0.137313 1.000000 0.561640 0.239934 \n",
|
||
"1 1.736769 0.990202 0.145618 0.260553 \n",
|
||
"2 12.613786 0.971724 0.132637 0.199182 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"cluster \n",
|
||
"0 0.450610 12.881201 2.163647 \n",
|
||
"1 0.536871 9.821800 2.811663 \n",
|
||
"2 0.621735 20.781399 8.329548 "
|
||
]
|
||
},
|
||
"execution_count": 80,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test_clustered.groupby(\"cluster\").mean().iloc[[0,1,2], :]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d0af77f8-ae66-43a5-bf04-b26667f911f6",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Quartile clustering"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"id": "2396ec51-4411-4fe3-9d41-449c4ffa75a0",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.695913</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.244205</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.279592</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696135</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers vente_internet_max \\\n",
|
||
"0 4.0 1.0 100.0 1.0 0.0 \n",
|
||
"1 1.0 1.0 55.0 1.0 0.0 \n",
|
||
"2 17.0 1.0 80.0 1.0 0.0 \n",
|
||
"3 4.0 1.0 120.0 1.0 0.0 \n",
|
||
"4 34.0 2.0 416.0 1.0 0.0 \n",
|
||
"\n",
|
||
" purchase_date_min purchase_date_max nb_tickets_internet is_email_true \\\n",
|
||
"0 5.177187 5.177187 0.0 True \n",
|
||
"1 426.265613 426.265613 0.0 True \n",
|
||
"2 436.033437 436.033437 0.0 True \n",
|
||
"3 5.196412 5.196412 0.0 True \n",
|
||
"4 478.693148 115.631470 0.0 True \n",
|
||
"\n",
|
||
" opt_in gender_female gender_male nb_campaigns nb_campaigns_opened \\\n",
|
||
"0 False 1 0 0.0 0.0 \n",
|
||
"1 True 0 1 0.0 0.0 \n",
|
||
"2 True 1 0 0.0 0.0 \n",
|
||
"3 False 1 0 0.0 0.0 \n",
|
||
"4 False 1 0 0.0 0.0 \n",
|
||
"\n",
|
||
" score \n",
|
||
"0 0.695913 \n",
|
||
"1 0.244205 \n",
|
||
"2 0.279592 \n",
|
||
"3 0.696135 \n",
|
||
"4 0.911844 "
|
||
]
|
||
},
|
||
"execution_count": 82,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# quartile clustering\n",
|
||
"\n",
|
||
"X_test[\"score\"] = y_pred_prob\n",
|
||
"X_test.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "bccddbd1-9d63-4d22-a3b3-daa6d83e90de",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df['new_column'] = np.where(df['col2']<9, 'value1',\n",
|
||
" np.where(df['col2']<12, 'value2',\n",
|
||
" np.where(df['col2']<15, 'value3', 'value4')))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 83,
|
||
"id": "f6334f99-725e-4e94-af86-60f161dd93a8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.695913</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.244205</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.279592</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696135</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" <td>4</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.140069</td>\n",
|
||
" <td>5.140069</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690015</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>105.053773</td>\n",
|
||
" <td>105.053773</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.663391</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>63.206030</td>\n",
|
||
" <td>63.206030</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.441604</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>44.698090</td>\n",
|
||
" <td>44.698090</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.441933</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>165.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.012106</td>\n",
|
||
" <td>258.012106</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.581348</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers vente_internet_max \\\n",
|
||
"0 4.0 1.0 100.0 1.0 0.0 \n",
|
||
"1 1.0 1.0 55.0 1.0 0.0 \n",
|
||
"2 17.0 1.0 80.0 1.0 0.0 \n",
|
||
"3 4.0 1.0 120.0 1.0 0.0 \n",
|
||
"4 34.0 2.0 416.0 1.0 0.0 \n",
|
||
"5 2.0 1.0 60.0 1.0 0.0 \n",
|
||
"6 5.0 1.0 61.0 1.0 1.0 \n",
|
||
"7 4.0 1.0 80.0 1.0 0.0 \n",
|
||
"8 1.0 1.0 10.0 1.0 0.0 \n",
|
||
"9 3.0 3.0 165.0 1.0 1.0 \n",
|
||
"\n",
|
||
" purchase_date_min purchase_date_max nb_tickets_internet is_email_true \\\n",
|
||
"0 5.177187 5.177187 0.0 True \n",
|
||
"1 426.265613 426.265613 0.0 True \n",
|
||
"2 436.033437 436.033437 0.0 True \n",
|
||
"3 5.196412 5.196412 0.0 True \n",
|
||
"4 478.693148 115.631470 0.0 True \n",
|
||
"5 5.140069 5.140069 0.0 True \n",
|
||
"6 105.053773 105.053773 5.0 True \n",
|
||
"7 63.206030 63.206030 0.0 True \n",
|
||
"8 44.698090 44.698090 0.0 True \n",
|
||
"9 266.012106 258.012106 3.0 True \n",
|
||
"\n",
|
||
" opt_in gender_female gender_male nb_campaigns nb_campaigns_opened \\\n",
|
||
"0 False 1 0 0.0 0.0 \n",
|
||
"1 True 0 1 0.0 0.0 \n",
|
||
"2 True 1 0 0.0 0.0 \n",
|
||
"3 False 1 0 0.0 0.0 \n",
|
||
"4 False 1 0 0.0 0.0 \n",
|
||
"5 False 0 1 0.0 0.0 \n",
|
||
"6 False 0 0 0.0 0.0 \n",
|
||
"7 True 0 1 0.0 0.0 \n",
|
||
"8 True 0 0 0.0 0.0 \n",
|
||
"9 False 0 0 0.0 0.0 \n",
|
||
"\n",
|
||
" score quartile \n",
|
||
"0 0.695913 3 \n",
|
||
"1 0.244205 1 \n",
|
||
"2 0.279592 2 \n",
|
||
"3 0.696135 3 \n",
|
||
"4 0.911844 4 \n",
|
||
"5 0.690015 3 \n",
|
||
"6 0.663391 3 \n",
|
||
"7 0.441604 2 \n",
|
||
"8 0.441933 2 \n",
|
||
"9 0.581348 3 "
|
||
]
|
||
},
|
||
"execution_count": 83,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"quartile\"] = np.where(X_test['score']<0.25, '1',\n",
|
||
" np.where(X_test['score']<0.5, '2',\n",
|
||
" np.where(X_test['score']<0.75, '3', '4')))\n",
|
||
"X_test.head(10)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 84,
|
||
"id": "0abec0ed-098b-4ecc-b6c3-6b25110c1493",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"quartile\n",
|
||
"1 47871\n",
|
||
"2 17224\n",
|
||
"3 22481\n",
|
||
"4 8520\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 84,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# size of each segment\n",
|
||
"\n",
|
||
"X_test.groupby(\"quartile\").size()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 87,
|
||
"id": "008a0040-8a27-4fd8-8dfa-46d39d6b88d9",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.017380</td>\n",
|
||
" <td>0.008586</td>\n",
|
||
" <td>0.475141</td>\n",
|
||
" <td>0.008439</td>\n",
|
||
" <td>0.001358</td>\n",
|
||
" <td>549.044552</td>\n",
|
||
" <td>549.044465</td>\n",
|
||
" <td>0.003071</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0.562157</td>\n",
|
||
" <td>0.232416</td>\n",
|
||
" <td>0.416536</td>\n",
|
||
" <td>11.860521</td>\n",
|
||
" <td>1.648430</td>\n",
|
||
" <td>0.169233</td>\n",
|
||
" <td>0.026780</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.085810</td>\n",
|
||
" <td>0.880283</td>\n",
|
||
" <td>49.701732</td>\n",
|
||
" <td>0.742336</td>\n",
|
||
" <td>0.420866</td>\n",
|
||
" <td>381.428495</td>\n",
|
||
" <td>379.188470</td>\n",
|
||
" <td>1.044473</td>\n",
|
||
" <td>0.998374</td>\n",
|
||
" <td>0.507083</td>\n",
|
||
" <td>0.264515</td>\n",
|
||
" <td>0.596435</td>\n",
|
||
" <td>14.593184</td>\n",
|
||
" <td>3.725732</td>\n",
|
||
" <td>0.360811</td>\n",
|
||
" <td>0.117452</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.118100</td>\n",
|
||
" <td>1.478893</td>\n",
|
||
" <td>88.811284</td>\n",
|
||
" <td>1.003292</td>\n",
|
||
" <td>0.703349</td>\n",
|
||
" <td>198.284116</td>\n",
|
||
" <td>184.197970</td>\n",
|
||
" <td>1.879098</td>\n",
|
||
" <td>0.988123</td>\n",
|
||
" <td>0.051777</td>\n",
|
||
" <td>0.264001</td>\n",
|
||
" <td>0.526534</td>\n",
|
||
" <td>9.773898</td>\n",
|
||
" <td>2.978115</td>\n",
|
||
" <td>0.626785</td>\n",
|
||
" <td>0.209332</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>46.046362</td>\n",
|
||
" <td>11.842254</td>\n",
|
||
" <td>2002.607230</td>\n",
|
||
" <td>1.508685</td>\n",
|
||
" <td>0.743192</td>\n",
|
||
" <td>386.401662</td>\n",
|
||
" <td>85.808238</td>\n",
|
||
" <td>12.894131</td>\n",
|
||
" <td>0.971479</td>\n",
|
||
" <td>0.130751</td>\n",
|
||
" <td>0.198239</td>\n",
|
||
" <td>0.622418</td>\n",
|
||
" <td>20.928286</td>\n",
|
||
" <td>8.367723</td>\n",
|
||
" <td>0.902055</td>\n",
|
||
" <td>0.666549</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"quartile \n",
|
||
"1 0.017380 0.008586 0.475141 0.008439 \n",
|
||
"2 2.085810 0.880283 49.701732 0.742336 \n",
|
||
"3 3.118100 1.478893 88.811284 1.003292 \n",
|
||
"4 46.046362 11.842254 2002.607230 1.508685 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"quartile \n",
|
||
"1 0.001358 549.044552 549.044465 \n",
|
||
"2 0.420866 381.428495 379.188470 \n",
|
||
"3 0.703349 198.284116 184.197970 \n",
|
||
"4 0.743192 386.401662 85.808238 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"quartile \n",
|
||
"1 0.003071 1.000000 0.562157 0.232416 \n",
|
||
"2 1.044473 0.998374 0.507083 0.264515 \n",
|
||
"3 1.879098 0.988123 0.051777 0.264001 \n",
|
||
"4 12.894131 0.971479 0.130751 0.198239 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened score \\\n",
|
||
"quartile \n",
|
||
"1 0.416536 11.860521 1.648430 0.169233 \n",
|
||
"2 0.596435 14.593184 3.725732 0.360811 \n",
|
||
"3 0.526534 9.773898 2.978115 0.626785 \n",
|
||
"4 0.622418 20.928286 8.367723 0.902055 \n",
|
||
"\n",
|
||
" has_purchased \n",
|
||
"quartile \n",
|
||
"1 0.026780 \n",
|
||
"2 0.117452 \n",
|
||
"3 0.209332 \n",
|
||
"4 0.666549 "
|
||
]
|
||
},
|
||
"execution_count": 87,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# check consistency of quartiles (we have an upward bias, which is explained by the fact that we want a decent recall)\n",
|
||
"\n",
|
||
"X_test[\"has_purchased\"] = y_test\n",
|
||
"X_test.groupby(\"quartile\").mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "e6bcaff3-0f47-46da-8873-a321d3382e63",
|
||
"metadata": {},
|
||
"source": [
|
||
"Méthode \\\n",
|
||
"On étudie le rythme d'achat des clients et on suppose qu'il sera le même dans le futur"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"id": "04218519-bffa-4340-87dc-e11332977067",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# purchasing pace by segment\n",
|
||
"\n",
|
||
"X_test[\"consumption_lifetime\"] = X_test[\"purchase_date_min\"] - X_test[\"purchase_date_max\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 113,
|
||
"id": "4ac3610d-8a22-4135-a127-328812c5198c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 96096.000000\n",
|
||
"mean 30.347912\n",
|
||
"std 95.435372\n",
|
||
"min 0.000000\n",
|
||
"25% 0.000000\n",
|
||
"50% 0.000000\n",
|
||
"75% 0.000000\n",
|
||
"max 547.122986\n",
|
||
"Name: consumption_lifetime, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 113,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"consumption_lifetime\"].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 149,
|
||
"id": "ee86cfb4-e2c4-4485-b27a-ecaec159a0b9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"X_test[\"avg_purchase_delay\"] = (X_test[\"consumption_lifetime\"]/X_test[\"nb_purchases\"]).replace([np.inf, -np.inf], 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "raw",
|
||
"id": "a2de6e96-4c92-42b2-8569-1c0f920e7a8c",
|
||
"metadata": {},
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 150,
|
||
"id": "256a684d-0117-4daa-ba38-ff48ac946798",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>165.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.012106</td>\n",
|
||
" <td>258.012106</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.581348</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>8.000000</td>\n",
|
||
" <td>2.666667</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>16</th>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>600.00</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>453.423519</td>\n",
|
||
" <td>15.225949</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.970052</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>438.197569</td>\n",
|
||
" <td>31.299826</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>21</th>\n",
|
||
" <td>21.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1075.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>431.817072</td>\n",
|
||
" <td>230.432350</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.599176</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>201.384722</td>\n",
|
||
" <td>67.128241</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>22</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>140.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>277.254745</td>\n",
|
||
" <td>12.438877</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.707939</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>264.815868</td>\n",
|
||
" <td>132.407934</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95943</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>545.673137</td>\n",
|
||
" <td>362.284745</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>46.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.707163</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>183.388391</td>\n",
|
||
" <td>91.694196</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95989</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>77.31</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>271.676632</td>\n",
|
||
" <td>6.289577</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>21.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>0.937049</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>265.387055</td>\n",
|
||
" <td>132.693527</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95996</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>273.76</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>202.691389</td>\n",
|
||
" <td>7.142274</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>25.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.916446</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>195.549115</td>\n",
|
||
" <td>65.183038</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96043</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>136.42</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.119815</td>\n",
|
||
" <td>173.225752</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>35.0</td>\n",
|
||
" <td>29.0</td>\n",
|
||
" <td>0.866743</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.894062</td>\n",
|
||
" <td>94.947031</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96079</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>355.131933</td>\n",
|
||
" <td>355.128542</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>50.0</td>\n",
|
||
" <td>42.0</td>\n",
|
||
" <td>0.720674</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.003391</td>\n",
|
||
" <td>0.001696</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>14734 rows × 19 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"9 3.0 3.0 165.00 1.0 \n",
|
||
"16 23.0 14.0 600.00 2.0 \n",
|
||
"21 21.0 3.0 1075.00 1.0 \n",
|
||
"22 4.0 2.0 140.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"95943 2.0 2.0 0.00 1.0 \n",
|
||
"95989 2.0 2.0 77.31 2.0 \n",
|
||
"95996 3.0 3.0 273.76 2.0 \n",
|
||
"96043 2.0 2.0 136.42 1.0 \n",
|
||
"96079 2.0 2.0 0.00 1.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"9 1.0 266.012106 258.012106 \n",
|
||
"16 1.0 453.423519 15.225949 \n",
|
||
"21 0.0 431.817072 230.432350 \n",
|
||
"22 0.0 277.254745 12.438877 \n",
|
||
"... ... ... ... \n",
|
||
"95943 0.0 545.673137 362.284745 \n",
|
||
"95989 1.0 271.676632 6.289577 \n",
|
||
"95996 1.0 202.691389 7.142274 \n",
|
||
"96043 1.0 363.119815 173.225752 \n",
|
||
"96079 0.0 355.131933 355.128542 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female gender_male \\\n",
|
||
"4 0.0 True False 1 0 \n",
|
||
"9 3.0 True False 0 0 \n",
|
||
"16 1.0 True False 0 1 \n",
|
||
"21 0.0 True True 0 1 \n",
|
||
"22 0.0 True True 0 1 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"95943 0.0 True False 1 0 \n",
|
||
"95989 1.0 True False 1 0 \n",
|
||
"95996 2.0 True False 0 1 \n",
|
||
"96043 2.0 True False 0 1 \n",
|
||
"96079 0.0 True False 1 0 \n",
|
||
"\n",
|
||
" nb_campaigns nb_campaigns_opened score quartile has_purchased \\\n",
|
||
"4 0.0 0.0 0.911844 4 1.0 \n",
|
||
"9 0.0 0.0 0.581348 3 0.0 \n",
|
||
"16 0.0 0.0 0.970052 4 1.0 \n",
|
||
"21 0.0 0.0 0.599176 3 0.0 \n",
|
||
"22 0.0 0.0 0.707939 3 1.0 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"95943 46.0 9.0 0.707163 3 0.0 \n",
|
||
"95989 21.0 6.0 0.937049 4 0.0 \n",
|
||
"95996 25.0 3.0 0.916446 4 1.0 \n",
|
||
"96043 35.0 29.0 0.866743 4 1.0 \n",
|
||
"96079 50.0 42.0 0.720674 3 0.0 \n",
|
||
"\n",
|
||
" consumption_lifetime avg_purchase_delay \n",
|
||
"4 363.061678 181.530839 \n",
|
||
"9 8.000000 2.666667 \n",
|
||
"16 438.197569 31.299826 \n",
|
||
"21 201.384722 67.128241 \n",
|
||
"22 264.815868 132.407934 \n",
|
||
"... ... ... \n",
|
||
"95943 183.388391 91.694196 \n",
|
||
"95989 265.387055 132.693527 \n",
|
||
"95996 195.549115 65.183038 \n",
|
||
"96043 189.894062 94.947031 \n",
|
||
"96079 0.003391 0.001696 \n",
|
||
"\n",
|
||
"[14734 rows x 19 columns]"
|
||
]
|
||
},
|
||
"execution_count": 150,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"avg_purchase_delay\"]>0]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 157,
|
||
"id": "55db2f02-37af-4809-a048-2528b7163f31",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_purchases</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2.000000</td>\n",
|
||
" <td>0.597093</td>\n",
|
||
" <td>0.298547</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.592668</td>\n",
|
||
" <td>26.192927</td>\n",
|
||
" <td>11.435486</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.203764</td>\n",
|
||
" <td>64.785322</td>\n",
|
||
" <td>25.490483</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>12.041836</td>\n",
|
||
" <td>306.126700</td>\n",
|
||
" <td>68.659817</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_purchases consumption_lifetime avg_purchase_delay\n",
|
||
"quartile \n",
|
||
"1 2.000000 0.597093 0.298547\n",
|
||
"2 2.592668 26.192927 11.435486\n",
|
||
"3 3.203764 64.785322 25.490483\n",
|
||
"4 12.041836 306.126700 68.659817"
|
||
]
|
||
},
|
||
"execution_count": 157,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"avg_purchase_delay\"]>0].groupby(\"quartile\")[[\"nb_purchases\", \"consumption_lifetime\", \"avg_purchase_delay\"]].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 156,
|
||
"id": "36c1d35d-3b51-4ddc-bcb7-a3ee2896167c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"nb_tickets 0\n",
|
||
"nb_purchases 0\n",
|
||
"total_amount 0\n",
|
||
"nb_suppliers 0\n",
|
||
"vente_internet_max 0\n",
|
||
"purchase_date_min 0\n",
|
||
"purchase_date_max 0\n",
|
||
"nb_tickets_internet 0\n",
|
||
"is_email_true 0\n",
|
||
"opt_in 0\n",
|
||
"gender_female 0\n",
|
||
"gender_male 0\n",
|
||
"nb_campaigns 0\n",
|
||
"nb_campaigns_opened 0\n",
|
||
"score 0\n",
|
||
"quartile 0\n",
|
||
"has_purchased 0\n",
|
||
"consumption_lifetime 0\n",
|
||
"avg_purchase_delay 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 156,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"avg_purchase_delay\"]>0].isna().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "1336c25b-1cf2-4041-b741-7c8c841fe1d2",
|
||
"metadata": {},
|
||
"source": [
|
||
"Etude du biais de surestimation"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 250,
|
||
"id": "9242f53b-1786-4a94-9d93-cb46d70d5fa6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 96096.000000\n",
|
||
"mean 3.362075\n",
|
||
"std 2.425080\n",
|
||
"min 1.000000\n",
|
||
"25% 1.000000\n",
|
||
"50% 2.000000\n",
|
||
"75% 5.000000\n",
|
||
"max 10.000000\n",
|
||
"Name: score, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 250,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"((10 * X_test[\"score\"]).astype(int)).describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 255,
|
||
"id": "22c2b1f6-0506-429e-af8c-3b1b5e05ff80",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"quartile\n",
|
||
"1 6.319295\n",
|
||
"2 3.071979\n",
|
||
"3 2.994212\n",
|
||
"4 1.353321\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 255,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# le biais de surestimation décroit avec le score \n",
|
||
"X_test.groupby(\"quartile\")[\"score\"].mean() / X_test.groupby(\"quartile\")[\"has_purchased\"].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 275,
|
||
"id": "ba363bf9-3169-4c89-a383-c2703436ff49",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.695913</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.244205</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.279592</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696135</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.584680</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.654520</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.116503</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.579827</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.254002</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 23 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... nb_campaigns_opened \\\n",
|
||
"0 0.0 True False ... 0.0 \n",
|
||
"1 0.0 True True ... 0.0 \n",
|
||
"2 0.0 True True ... 0.0 \n",
|
||
"3 0.0 True False ... 0.0 \n",
|
||
"4 0.0 True False ... 0.0 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 5.0 \n",
|
||
"96092 1.0 True False ... 9.0 \n",
|
||
"96093 0.0 True True ... 3.0 \n",
|
||
"96094 1.0 True False ... 4.0 \n",
|
||
"96095 0.0 True False ... 4.0 \n",
|
||
"\n",
|
||
" score quartile has_purchased consumption_lifetime \\\n",
|
||
"0 0.695913 3 0.0 0.000000 \n",
|
||
"1 0.244205 1 1.0 0.000000 \n",
|
||
"2 0.279592 2 0.0 0.000000 \n",
|
||
"3 0.696135 3 0.0 0.000000 \n",
|
||
"4 0.911844 4 1.0 363.061678 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 0.584680 3 1.0 0.000000 \n",
|
||
"96092 0.654520 3 0.0 0.000000 \n",
|
||
"96093 0.116503 1 0.0 0.000000 \n",
|
||
"96094 0.579827 3 0.0 0.000000 \n",
|
||
"96095 0.254002 2 0.0 0.000000 \n",
|
||
"\n",
|
||
" avg_purchase_delay avg_purchase_delay_all avg_tickets_delay \\\n",
|
||
"0 0.000000 5.177187 0.000000 \n",
|
||
"1 0.000000 426.265613 0.000000 \n",
|
||
"2 0.000000 436.033437 0.000000 \n",
|
||
"3 0.000000 5.196412 0.000000 \n",
|
||
"4 181.530839 239.346574 10.678285 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.000000 278.442257 0.000000 \n",
|
||
"96092 0.000000 189.207373 0.000000 \n",
|
||
"96093 NaN 0.000000 NaN \n",
|
||
"96094 0.000000 279.312905 0.000000 \n",
|
||
"96095 NaN 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_tickets_delay_all decile \n",
|
||
"0 1.294297 6 \n",
|
||
"1 426.265613 2 \n",
|
||
"2 25.649026 2 \n",
|
||
"3 1.299103 6 \n",
|
||
"4 14.079210 9 \n",
|
||
"... ... ... \n",
|
||
"96091 278.442257 5 \n",
|
||
"96092 189.207373 6 \n",
|
||
"96093 0.000000 1 \n",
|
||
"96094 279.312905 5 \n",
|
||
"96095 0.000000 2 \n",
|
||
"\n",
|
||
"[96096 rows x 23 columns]"
|
||
]
|
||
},
|
||
"execution_count": 275,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on prend un decoupage plus fin : deciles\n",
|
||
"\n",
|
||
"X_test[\"decile\"] = (10 * X_test[\"score\"]).astype(int)\n",
|
||
"X_test[\"decile\"] = X_test[\"decile\"].apply(lambda x : x-1 if x==10 else x)\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 276,
|
||
"id": "b8db5044-74b1-423b-b12f-798606674bfe",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"decile\n",
|
||
"1 17.863019\n",
|
||
"2 3.826401\n",
|
||
"3 3.179880\n",
|
||
"4 3.392496\n",
|
||
"5 3.260982\n",
|
||
"6 3.294104\n",
|
||
"7 1.850487\n",
|
||
"8 1.489675\n",
|
||
"9 1.268598\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 276,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test.groupby(\"decile\")[\"score\"].mean() / X_test.groupby(\"decile\")[\"has_purchased\"].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 277,
|
||
"id": "48a5b42e-fabf-44ae-ac88-fcb5a04d5d4f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.006422122322541649"
|
||
]
|
||
},
|
||
"execution_count": 277,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# pour les scores entre 0.1 et 0.2, la proba d'achat est de 0.6% elle est largement surestimée ici\n",
|
||
"X_test[X_test[\"decile\"]==1][\"has_purchased\"].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 284,
|
||
"id": "1091028b-0d07-4cfd-9081-696e289c29de",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.695913</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.244205</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.279592</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.696135</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.584680</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.654520</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.116503</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.579827</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.254002</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 24 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... score quartile \\\n",
|
||
"0 0.0 True False ... 0.695913 3 \n",
|
||
"1 0.0 True True ... 0.244205 1 \n",
|
||
"2 0.0 True True ... 0.279592 2 \n",
|
||
"3 0.0 True False ... 0.696135 3 \n",
|
||
"4 0.0 True False ... 0.911844 4 \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 0.584680 3 \n",
|
||
"96092 1.0 True False ... 0.654520 3 \n",
|
||
"96093 0.0 True True ... 0.116503 1 \n",
|
||
"96094 1.0 True False ... 0.579827 3 \n",
|
||
"96095 0.0 True False ... 0.254002 2 \n",
|
||
"\n",
|
||
" has_purchased consumption_lifetime avg_purchase_delay \\\n",
|
||
"0 0.0 0.000000 0.000000 \n",
|
||
"1 1.0 0.000000 0.000000 \n",
|
||
"2 0.0 0.000000 0.000000 \n",
|
||
"3 0.0 0.000000 0.000000 \n",
|
||
"4 1.0 363.061678 181.530839 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 0.000000 0.000000 \n",
|
||
"96092 0.0 0.000000 0.000000 \n",
|
||
"96093 0.0 0.000000 NaN \n",
|
||
"96094 0.0 0.000000 0.000000 \n",
|
||
"96095 0.0 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_purchase_delay_all avg_tickets_delay avg_tickets_delay_all \\\n",
|
||
"0 5.177187 0.000000 1.294297 \n",
|
||
"1 426.265613 0.000000 426.265613 \n",
|
||
"2 436.033437 0.000000 25.649026 \n",
|
||
"3 5.196412 0.000000 1.299103 \n",
|
||
"4 239.346574 10.678285 14.079210 \n",
|
||
"... ... ... ... \n",
|
||
"96091 278.442257 0.000000 278.442257 \n",
|
||
"96092 189.207373 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 279.312905 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" decile overshoot_coeff \n",
|
||
"0 6 3.294104 \n",
|
||
"1 2 3.826401 \n",
|
||
"2 2 3.826401 \n",
|
||
"3 6 3.294104 \n",
|
||
"4 9 1.268598 \n",
|
||
"... ... ... \n",
|
||
"96091 5 3.260982 \n",
|
||
"96092 6 3.294104 \n",
|
||
"96093 1 17.863019 \n",
|
||
"96094 5 3.260982 \n",
|
||
"96095 2 3.826401 \n",
|
||
"\n",
|
||
"[96096 rows x 24 columns]"
|
||
]
|
||
},
|
||
"execution_count": 284,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# create a variable to approximate the overestimation by decile\n",
|
||
"\n",
|
||
"# dictionnary mapping decile of the score and average overestimation\n",
|
||
"mapping_score_overshoot = dict(X_test.groupby(\"decile\")[\"score\"].mean() / X_test.groupby(\"decile\")[\"has_purchased\"].mean())\n",
|
||
"X_test[\"overshoot_coeff\"] = X_test[\"decile\"].map(mapping_score_overshoot)\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 285,
|
||
"id": "4892d585-c80e-472c-b2bc-dc441255a36d",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 25 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... quartile \\\n",
|
||
"0 0.0 True False ... 3 \n",
|
||
"1 0.0 True True ... 1 \n",
|
||
"2 0.0 True True ... 2 \n",
|
||
"3 0.0 True False ... 3 \n",
|
||
"4 0.0 True False ... 4 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 3 \n",
|
||
"96092 1.0 True False ... 3 \n",
|
||
"96093 0.0 True True ... 1 \n",
|
||
"96094 1.0 True False ... 3 \n",
|
||
"96095 0.0 True False ... 2 \n",
|
||
"\n",
|
||
" has_purchased consumption_lifetime avg_purchase_delay \\\n",
|
||
"0 0.0 0.000000 0.000000 \n",
|
||
"1 1.0 0.000000 0.000000 \n",
|
||
"2 0.0 0.000000 0.000000 \n",
|
||
"3 0.0 0.000000 0.000000 \n",
|
||
"4 1.0 363.061678 181.530839 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 0.000000 0.000000 \n",
|
||
"96092 0.0 0.000000 0.000000 \n",
|
||
"96093 0.0 0.000000 NaN \n",
|
||
"96094 0.0 0.000000 0.000000 \n",
|
||
"96095 0.0 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_purchase_delay_all avg_tickets_delay avg_tickets_delay_all \\\n",
|
||
"0 5.177187 0.000000 1.294297 \n",
|
||
"1 426.265613 0.000000 426.265613 \n",
|
||
"2 436.033437 0.000000 25.649026 \n",
|
||
"3 5.196412 0.000000 1.299103 \n",
|
||
"4 239.346574 10.678285 14.079210 \n",
|
||
"... ... ... ... \n",
|
||
"96091 278.442257 0.000000 278.442257 \n",
|
||
"96092 189.207373 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 279.312905 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" decile overshoot_coeff ajusted_score \n",
|
||
"0 6 3.294104 0.211260 \n",
|
||
"1 2 3.826401 0.063821 \n",
|
||
"2 2 3.826401 0.073069 \n",
|
||
"3 6 3.294104 0.211328 \n",
|
||
"4 9 1.268598 0.718781 \n",
|
||
"... ... ... ... \n",
|
||
"96091 5 3.260982 0.179296 \n",
|
||
"96092 6 3.294104 0.198694 \n",
|
||
"96093 1 17.863019 0.006522 \n",
|
||
"96094 5 3.260982 0.177808 \n",
|
||
"96095 2 3.826401 0.066382 \n",
|
||
"\n",
|
||
"[96096 rows x 25 columns]"
|
||
]
|
||
},
|
||
"execution_count": 285,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"ajusted_score\"] = X_test[\"score\"]/X_test[\"overshoot_coeff\"]\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 788,
|
||
"id": "8332e5c3-32ee-4492-91ee-0e49a15f94a1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"MSE for score : 0.15637498623391197\n",
|
||
"MSE for adjusted score : 0.08877832832116543\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# difference between proba estimated and y has purchased\n",
|
||
"# the calibration allows to half the MSE\n",
|
||
"\n",
|
||
"MSE_score = ((X_test[\"score\"]-X_test[\"has_purchased\"])**2).mean()\n",
|
||
"MSE_ajusted_score = ((X_test[\"score_adjusted\"]-X_test[\"has_purchased\"])**2).mean()\n",
|
||
"print(f\"MSE for score : {MSE_score}\")\n",
|
||
"print(f\"MSE for adjusted score : {MSE_ajusted_score}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 787,
|
||
"id": "89b41b80-c12a-46be-a7d1-59f4f63482e3",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"MAE for score : 0.32574831037767815\n",
|
||
"MAE for adjusted score : 0.17556035724742763\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# mean absolute error - divided by 2 with out method\n",
|
||
"\n",
|
||
"MAE_score = abs(X_test[\"score\"]-X_test[\"has_purchased\"]).mean()\n",
|
||
"MAE_ajusted_score = abs(X_test[\"score_adjusted\"]-X_test[\"has_purchased\"]).mean()\n",
|
||
"print(f\"MAE for score : {MAE_score}\")\n",
|
||
"print(f\"MAE for adjusted score : {MAE_ajusted_score}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "15f49d36-da8c-4c08-977e-8de4e438ed61",
|
||
"metadata": {},
|
||
"source": [
|
||
"New method to adjust - best way to fit the logit model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 317,
|
||
"id": "9e2e1f4c-d9dc-495a-9604-4009f1e4c53f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"somme des scores : 36092.22480054577\n",
|
||
"nombre d'achats : y_has_purchased 13690.0\n",
|
||
"dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# au global, la prbabilité d'achat est largement surestimée, il ft corriger\n",
|
||
"print(\"somme des scores :\", X_test[\"score\"].sum())\n",
|
||
"print(\"nombre d'achats : \", y_test.sum())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 311,
|
||
"id": "1573b9fd-c1be-4f9e-94a5-471ad6cb0726",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"36092.22480054577"
|
||
]
|
||
},
|
||
"execution_count": 311,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# 1. calcul du biais\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 375,
|
||
"id": "5d6d5101-95ce-4137-8349-0e3c6321bc84",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... consumption_lifetime \\\n",
|
||
"0 0.0 True False ... 0.000000 \n",
|
||
"1 0.0 True True ... 0.000000 \n",
|
||
"2 0.0 True True ... 0.000000 \n",
|
||
"3 0.0 True False ... 0.000000 \n",
|
||
"4 0.0 True False ... 363.061678 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 0.000000 \n",
|
||
"96092 1.0 True False ... 0.000000 \n",
|
||
"96093 0.0 True True ... 0.000000 \n",
|
||
"96094 1.0 True False ... 0.000000 \n",
|
||
"96095 0.0 True False ... 0.000000 \n",
|
||
"\n",
|
||
" avg_purchase_delay avg_purchase_delay_all avg_tickets_delay \\\n",
|
||
"0 0.000000 5.177187 0.000000 \n",
|
||
"1 0.000000 426.265613 0.000000 \n",
|
||
"2 0.000000 436.033437 0.000000 \n",
|
||
"3 0.000000 5.196412 0.000000 \n",
|
||
"4 181.530839 239.346574 10.678285 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.000000 278.442257 0.000000 \n",
|
||
"96092 0.000000 189.207373 0.000000 \n",
|
||
"96093 NaN 0.000000 NaN \n",
|
||
"96094 0.000000 279.312905 0.000000 \n",
|
||
"96095 NaN 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_tickets_delay_all decile overshoot_coeff ajusted_score \\\n",
|
||
"0 1.294297 6 3.294104 0.211260 \n",
|
||
"1 426.265613 2 3.826401 0.063821 \n",
|
||
"2 25.649026 2 3.826401 0.073069 \n",
|
||
"3 1.299103 6 3.294104 0.211328 \n",
|
||
"4 14.079210 9 1.268598 0.718781 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 278.442257 5 3.260982 0.179296 \n",
|
||
"96092 189.207373 6 3.294104 0.198694 \n",
|
||
"96093 0.000000 1 17.863019 0.006522 \n",
|
||
"96094 279.312905 5 3.260982 0.177808 \n",
|
||
"96095 0.000000 2 3.826401 0.066382 \n",
|
||
"\n",
|
||
" odd_ratio test_adjusted_score_2 \n",
|
||
"0 2.288530 0.533640 \n",
|
||
"1 0.323109 0.139085 \n",
|
||
"2 0.388102 0.162515 \n",
|
||
"3 2.290940 0.533902 \n",
|
||
"4 10.343538 0.837972 \n",
|
||
"... ... ... \n",
|
||
"96091 1.407779 0.413108 \n",
|
||
"96092 1.894523 0.486458 \n",
|
||
"96093 0.131865 0.061854 \n",
|
||
"96094 1.379973 0.408279 \n",
|
||
"96095 0.340487 0.145477 \n",
|
||
"\n",
|
||
"[96096 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 375,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# premier problème : certains scores valent 1, ce qui empeche de calculer un odd ratio \n",
|
||
"# on remplace les scores de 1 par 0.999\n",
|
||
"\n",
|
||
"X_test[\"score\"] = X_test[\"score\"].apply(lambda x : 0.9999999999999996 if x==1 else x)\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 377,
|
||
"id": "8a29f835-8e4f-45e9-9c91-e019f56fee5e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... consumption_lifetime \\\n",
|
||
"0 0.0 True False ... 0.000000 \n",
|
||
"1 0.0 True True ... 0.000000 \n",
|
||
"2 0.0 True True ... 0.000000 \n",
|
||
"3 0.0 True False ... 0.000000 \n",
|
||
"4 0.0 True False ... 363.061678 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 0.000000 \n",
|
||
"96092 1.0 True False ... 0.000000 \n",
|
||
"96093 0.0 True True ... 0.000000 \n",
|
||
"96094 1.0 True False ... 0.000000 \n",
|
||
"96095 0.0 True False ... 0.000000 \n",
|
||
"\n",
|
||
" avg_purchase_delay avg_purchase_delay_all avg_tickets_delay \\\n",
|
||
"0 0.000000 5.177187 0.000000 \n",
|
||
"1 0.000000 426.265613 0.000000 \n",
|
||
"2 0.000000 436.033437 0.000000 \n",
|
||
"3 0.000000 5.196412 0.000000 \n",
|
||
"4 181.530839 239.346574 10.678285 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.000000 278.442257 0.000000 \n",
|
||
"96092 0.000000 189.207373 0.000000 \n",
|
||
"96093 NaN 0.000000 NaN \n",
|
||
"96094 0.000000 279.312905 0.000000 \n",
|
||
"96095 NaN 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_tickets_delay_all decile overshoot_coeff ajusted_score \\\n",
|
||
"0 1.294297 6 3.294104 0.211260 \n",
|
||
"1 426.265613 2 3.826401 0.063821 \n",
|
||
"2 25.649026 2 3.826401 0.073069 \n",
|
||
"3 1.299103 6 3.294104 0.211328 \n",
|
||
"4 14.079210 9 1.268598 0.718781 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 278.442257 5 3.260982 0.179296 \n",
|
||
"96092 189.207373 6 3.294104 0.198694 \n",
|
||
"96093 0.000000 1 17.863019 0.006522 \n",
|
||
"96094 279.312905 5 3.260982 0.177808 \n",
|
||
"96095 0.000000 2 3.826401 0.066382 \n",
|
||
"\n",
|
||
" odd_ratio test_adjusted_score_2 \n",
|
||
"0 2.288530 0.533640 \n",
|
||
"1 0.323109 0.139085 \n",
|
||
"2 0.388102 0.162515 \n",
|
||
"3 2.290940 0.533902 \n",
|
||
"4 10.343538 0.837972 \n",
|
||
"... ... ... \n",
|
||
"96091 1.407779 0.413108 \n",
|
||
"96092 1.894523 0.486458 \n",
|
||
"96093 0.131865 0.061854 \n",
|
||
"96094 1.379973 0.408279 \n",
|
||
"96095 0.340487 0.145477 \n",
|
||
"\n",
|
||
"[96096 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 377,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"odd_ratio\"] = X_test[\"score\"]/(1-X_test[\"score\"])\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 378,
|
||
"id": "b5971afb-a6ef-4433-9cee-13ea978b22c8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 9.609600e+04\n",
|
||
"mean 2.117164e+11\n",
|
||
"std 2.179173e+13\n",
|
||
"min 1.207494e-01\n",
|
||
"25% 1.476621e-01\n",
|
||
"50% 3.337214e-01\n",
|
||
"75% 1.430245e+00\n",
|
||
"max 2.251800e+15\n",
|
||
"Name: odd_ratio, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 378,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"odd_ratio\"].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 381,
|
||
"id": "e878a711-5d7d-455f-9e0f-da50961568d9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def adjusted_score(odd_ratio, bias) :\n",
|
||
" adjusted_score = odd_ratio/(bias+odd_ratio)\n",
|
||
" return adjusted_score"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 424,
|
||
"id": "bff25885-1191-432a-976c-4b466dbc0ac7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def obj_function(bias) :\n",
|
||
" obj = sum([adjusted_score(element, bias) for element in X_test[\"odd_ratio\"]]) # - y_test.sum()[\"y_has_purchased\"]\n",
|
||
" return obj"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 380,
|
||
"id": "a9df55fc-e1c6-4462-9fa5-248d47f4957f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"13690.0"
|
||
]
|
||
},
|
||
"execution_count": 380,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_test.sum()[\"y_has_purchased\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 396,
|
||
"id": "ecae3be2-ddf4-4a76-940d-403a176fa8f5",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"13749.42306555955"
|
||
]
|
||
},
|
||
"execution_count": 396,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# le biais optimal se trouve aux alentours de 6\n",
|
||
"sum([adjusted_score(element, 6) for element in X_test[\"odd_ratio\"]])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 411,
|
||
"id": "5698b75b-759a-4cc5-8466-c513d2ae2aa2",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"36092.2248005385"
|
||
]
|
||
},
|
||
"execution_count": 411,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"sum([adjusted_score(element, 1) for element in X_test[\"odd_ratio\"]])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 412,
|
||
"id": "42840b8b-0314-4b15-afb9-09a9e550a729",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"13690.0"
|
||
]
|
||
},
|
||
"execution_count": 412,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_test.sum()[\"y_has_purchased\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 425,
|
||
"id": "8a61a53c-c98b-4c76-bcfe-a4bb0f3db42a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"36092.2248005385"
|
||
]
|
||
},
|
||
"execution_count": 425,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"obj_function(1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 423,
|
||
"id": "d29623ca-c9f7-4ef7-b5ea-45b2d2f65096",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"3.9020966429798136"
|
||
]
|
||
},
|
||
"execution_count": 423,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on devrait trouver un résultat autour de 6.04\n",
|
||
"sum([adjusted_score(element, 6.04) for element in X_test[\"odd_ratio\"]]) - y_test.sum()[\"y_has_purchased\"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 426,
|
||
"id": "6417f2a2-9e22-40c7-8297-2ed0b72e9b1d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# minimization\n",
|
||
"\n",
|
||
"from scipy.optimize import minimize\n",
|
||
"\n",
|
||
"\n",
|
||
"y_sum = y_test.sum()[\"y_has_purchased\"]\n",
|
||
"initial_guess = 6\n",
|
||
"estimated_biais = minimize(lambda bias : (obj_function(bias)-y_sum)**2 ,\n",
|
||
"initial_guess , method = \"BFGS\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 430,
|
||
"id": "937606df-1730-43b6-9a95-7c626aa7a3c5",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"bias estimated : 6.042826489667565\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(f\"bias estimated : {estimated_biais.x[0]}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 435,
|
||
"id": "ad6ebcee-f1f6-46fc-8d9a-008762acae28",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" <th>score_adjusted</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" <td>0.274689</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" <td>0.050756</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" <td>0.060349</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" <td>0.274899</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" <td>0.631228</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" <td>0.188948</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" <td>0.238685</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" <td>0.021356</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" <td>0.185910</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" <td>0.053340</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... avg_purchase_delay \\\n",
|
||
"0 0.0 True False ... 0.000000 \n",
|
||
"1 0.0 True True ... 0.000000 \n",
|
||
"2 0.0 True True ... 0.000000 \n",
|
||
"3 0.0 True False ... 0.000000 \n",
|
||
"4 0.0 True False ... 181.530839 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 0.000000 \n",
|
||
"96092 1.0 True False ... 0.000000 \n",
|
||
"96093 0.0 True True ... NaN \n",
|
||
"96094 1.0 True False ... 0.000000 \n",
|
||
"96095 0.0 True False ... NaN \n",
|
||
"\n",
|
||
" avg_purchase_delay_all avg_tickets_delay avg_tickets_delay_all \\\n",
|
||
"0 5.177187 0.000000 1.294297 \n",
|
||
"1 426.265613 0.000000 426.265613 \n",
|
||
"2 436.033437 0.000000 25.649026 \n",
|
||
"3 5.196412 0.000000 1.299103 \n",
|
||
"4 239.346574 10.678285 14.079210 \n",
|
||
"... ... ... ... \n",
|
||
"96091 278.442257 0.000000 278.442257 \n",
|
||
"96092 189.207373 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 279.312905 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" decile overshoot_coeff ajusted_score odd_ratio \\\n",
|
||
"0 6 3.294104 0.211260 2.288530 \n",
|
||
"1 2 3.826401 0.063821 0.323109 \n",
|
||
"2 2 3.826401 0.073069 0.388102 \n",
|
||
"3 6 3.294104 0.211328 2.290940 \n",
|
||
"4 9 1.268598 0.718781 10.343538 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 5 3.260982 0.179296 1.407779 \n",
|
||
"96092 6 3.294104 0.198694 1.894523 \n",
|
||
"96093 1 17.863019 0.006522 0.131865 \n",
|
||
"96094 5 3.260982 0.177808 1.379973 \n",
|
||
"96095 2 3.826401 0.066382 0.340487 \n",
|
||
"\n",
|
||
" test_adjusted_score_2 score_adjusted \n",
|
||
"0 0.533640 0.274689 \n",
|
||
"1 0.139085 0.050756 \n",
|
||
"2 0.162515 0.060349 \n",
|
||
"3 0.533902 0.274899 \n",
|
||
"4 0.837972 0.631228 \n",
|
||
"... ... ... \n",
|
||
"96091 0.413108 0.188948 \n",
|
||
"96092 0.486458 0.238685 \n",
|
||
"96093 0.061854 0.021356 \n",
|
||
"96094 0.408279 0.185910 \n",
|
||
"96095 0.145477 0.053340 \n",
|
||
"\n",
|
||
"[96096 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 435,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on corrige les scores trouvés en fonction\n",
|
||
"\n",
|
||
"X_test[\"score_adjusted\"] = adjusted_score(X_test[\"odd_ratio\"], bias=estimated_biais.x[0])\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 436,
|
||
"id": "2934bfff-23ac-4c4e-8fe6-2087afac1e0f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" <th>score_adjusted</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" <td>0.274689</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" <td>0.050756</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" <td>0.060349</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" <td>0.274899</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" <td>0.631228</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" <td>0.188948</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" <td>0.238685</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" <td>0.021356</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" <td>0.185910</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" <td>0.053340</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 28 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... avg_purchase_delay \\\n",
|
||
"0 0.0 True False ... 0.000000 \n",
|
||
"1 0.0 True True ... 0.000000 \n",
|
||
"2 0.0 True True ... 0.000000 \n",
|
||
"3 0.0 True False ... 0.000000 \n",
|
||
"4 0.0 True False ... 181.530839 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 0.000000 \n",
|
||
"96092 1.0 True False ... 0.000000 \n",
|
||
"96093 0.0 True True ... NaN \n",
|
||
"96094 1.0 True False ... 0.000000 \n",
|
||
"96095 0.0 True False ... NaN \n",
|
||
"\n",
|
||
" avg_purchase_delay_all avg_tickets_delay avg_tickets_delay_all \\\n",
|
||
"0 5.177187 0.000000 1.294297 \n",
|
||
"1 426.265613 0.000000 426.265613 \n",
|
||
"2 436.033437 0.000000 25.649026 \n",
|
||
"3 5.196412 0.000000 1.299103 \n",
|
||
"4 239.346574 10.678285 14.079210 \n",
|
||
"... ... ... ... \n",
|
||
"96091 278.442257 0.000000 278.442257 \n",
|
||
"96092 189.207373 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 279.312905 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" decile overshoot_coeff ajusted_score odd_ratio \\\n",
|
||
"0 6 3.294104 0.211260 2.288530 \n",
|
||
"1 2 3.826401 0.063821 0.323109 \n",
|
||
"2 2 3.826401 0.073069 0.388102 \n",
|
||
"3 6 3.294104 0.211328 2.290940 \n",
|
||
"4 9 1.268598 0.718781 10.343538 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 5 3.260982 0.179296 1.407779 \n",
|
||
"96092 6 3.294104 0.198694 1.894523 \n",
|
||
"96093 1 17.863019 0.006522 0.131865 \n",
|
||
"96094 5 3.260982 0.177808 1.379973 \n",
|
||
"96095 2 3.826401 0.066382 0.340487 \n",
|
||
"\n",
|
||
" test_adjusted_score_2 score_adjusted \n",
|
||
"0 0.533640 0.274689 \n",
|
||
"1 0.139085 0.050756 \n",
|
||
"2 0.162515 0.060349 \n",
|
||
"3 0.533902 0.274899 \n",
|
||
"4 0.837972 0.631228 \n",
|
||
"... ... ... \n",
|
||
"96091 0.413108 0.188948 \n",
|
||
"96092 0.486458 0.238685 \n",
|
||
"96093 0.061854 0.021356 \n",
|
||
"96094 0.408279 0.185910 \n",
|
||
"96095 0.145477 0.053340 \n",
|
||
"\n",
|
||
"[96096 rows x 28 columns]"
|
||
]
|
||
},
|
||
"execution_count": 436,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 549,
|
||
"id": "0dadc6f7-9c49-4188-9ae4-8b9c84770cf6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAGdCAYAAAAbudkLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4+ElEQVR4nO3df1xW9f3/8Sfy4xJILhUEvJJMP0OSsDJsiK60RNCPyKo1XfSh3JzaSImEWc71CfdpmL+dsfkxV9rHH9GWs/WZyqBWLPJnTJYKqRVL/QhiihdIBITn+0c3z7dLjLxQQY6P++123W67znmdc17nPep69r7OdY6HYRiGAAAALKhLRzcAAABwpRB0AACAZRF0AACAZRF0AACAZRF0AACAZRF0AACAZRF0AACAZRF0AACAZXl1dAMd6ezZszp27Ji6desmDw+Pjm4HAABcBMMwVFtbK4fDoS5dWp+zuaaDzrFjxxQWFtbRbQAAgDY4cuSI+vTp02rNNR10unXrJumrgQoICOjgbgAAwMWoqalRWFiY+Tnemms66Jz7uiogIICgAwBAJ3Mxl51wMTIAALAsgg4AALAsgg4AALCsa/oaHQDApTMMQ19++aWam5s7uhVYhKenp7y8vC7LrV8IOgCANmtsbFRFRYU+//zzjm4FFuPn56fevXvLx8fnkvZD0AEAtMnZs2dVXl4uT09PORwO+fj4cPNVXDLDMNTY2KgTJ06ovLxc4eHh33pTwNYQdAAAbdLY2KizZ88qLCxMfn5+Hd0OLMTX11fe3t769NNP1djYqK5du7Z5X1yMDAC4JJfyX9vAN7lcf1f8dQIAAMsi6AAAAMviGh0AwGW3tOBgux7vidED2vV46DyY0QEAAJZF0AEA4Appamrq6BaueQQdAMA157XXXtOgQYPk6+urwMBAxcXFqa6uTpL00ksv6eabb5bNZlPv3r01ffp0c7vDhw/r+9//vq677joFBARowoQJOn78uLk+KytLt912m1566SX1799fNptNhmHI6XRq6tSpCg4OVkBAgO655x7985//bPfzvhZxjc6V9Pa8ju7AfXfP7ugOAOCKqqio0IMPPqgFCxbovvvuU21trd59910ZhqEVK1Zo5syZeu655zR27Fg5nU699957kr66kd29994rf39/FRYW6ssvv1RqaqomTpyod955x9z/Rx99pD/84Q/auHGjPD09JUnjxo1Tz549tWXLFtntdq1cuVKjRo3SwYMH1bNnz44YhmsGQQcAcE2pqKjQl19+qfvvv199+/aVJA0aNEiS9OyzzyojI0OPP/64WX/HHXdIkt5880198MEHKi8vV1hYmCRp7dq1uvnmm7V7926zrrGxUWvXrlWvXr0kSX/729+0d+9eVVVVyWazSZIWLVqk119/Xa+99pqmTp3aPid+jSLoAACuKbfeeqtGjRqlQYMGKSEhQfHx8XrggQfU1NSkY8eOadSoURfcrqysTGFhYWbIkaTIyEh1795dZWVlZtDp27evGXIkqbi4WGfOnFFgYKDL/urr6/Xxxx9fgTPE17l9jc7//d//6T/+4z8UGBgoPz8/3XbbbSouLjbXG4ahrKwsORwO+fr6auTIkdq/f7/LPhoaGjRjxgwFBQXJ399fSUlJOnr0qEtNdXW1UlJSZLfbZbfblZKSotOnT7vUHD58WOPHj5e/v7+CgoKUlpamxsZGd08JAHAN8fT0VEFBgbZu3arIyEg9//zzioiIcLnW5kIMw7jgs7zOX+7v7++y/uzZs+rdu7dKSkpcXgcOHNDPf/7zy3NS+EZuBZ3q6moNHz5c3t7e2rp1q0pLS7V48WJ1797drFmwYIGWLFminJwc7d69W6GhoRo9erRqa2vNmvT0dG3atEm5ubkqKirSmTNnlJiYqObmZrMmOTlZJSUlysvLU15enkpKSpSSkmKub25u1rhx41RXV6eioiLl5uZq48aNysjIuIThAABcCzw8PDR8+HDNnTtXe/bskY+PjwoKCnTjjTfqrbfeuuA2kZGROnz4sI4cOWIuKy0tldPp1MCBA7/xWLfffrsqKyvl5eWl73znOy6voKCgy35ucOXWV1fz589XWFiYVq9ebS678cYbzf9tGIaWLVumOXPm6P7775ckvfzyywoJCdGGDRs0bdo0OZ1Ovfjii1q7dq3i4uIkSevWrVNYWJjefPNNJSQkqKysTHl5edqxY4diYmIkSatWrVJsbKwOHDigiIgI5efnq7S0VEeOHJHD4ZAkLV68WJMmTdKvf/1rBQQEXNLAAACsaefOnXrrrbcUHx+v4OBg7dy5UydOnNDAgQOVlZWlRx99VMHBwRo7dqxqa2v13nvvacaMGYqLi9Mtt9yihx56SMuWLTMvRh4xYoSGDBnyjceLi4tTbGys7r33Xs2fP18RERE6duyYtmzZonvvvbfVbXHp3Ao6b7zxhhISEvTDH/5QhYWFuv7665WamqopU6ZIksrLy1VZWan4+HhzG5vNphEjRmjbtm2aNm2aiouL1dTU5FLjcDgUFRWlbdu2KSEhQdu3b5fdbjdDjiQNHTpUdrtd27ZtU0REhLZv366oqCgz5EhSQkKCGhoaVFxcrLvvvrtF/w0NDWpoaDDf19TUuHP6AICLdDXfqTggIEB///vftWzZMtXU1Khv375avHixxo4dK0n64osvtHTpUmVmZiooKEgPPPCApK9mgV5//XXNmDFDd911l7p06aIxY8bo+eefb/V4Hh4e2rJli+bMmaOf/OQnOnHihEJDQ3XXXXcpJCTkip/vtc6toPPJJ5+YP737xS9+oV27diktLU02m00PP/ywKisrJanF/3EhISH69NNPJUmVlZXy8fFRjx49WtSc276yslLBwcEtjh8cHOxSc/5xevToIR8fH7PmfPPmzdPcuXPdOWUAgMUMHDhQeXl537h+2rRpmjZt2gXX3XDDDfrzn//8jdtmZWUpKyurxfJu3bpp+fLlWr58udv94tK4dY3O2bNndfvttys7O1uDBw/WtGnTNGXKFK1YscKl7vyLtb7pAq7Wai7mgq+Lqfm62bNny+l0mq+vf88KAACsx62g07t3b0VGRrosGzhwoA4fPixJCg0NlaQWMypVVVXm7EtoaKgaGxtVXV3das2Frn4/ceKES835x6murlZTU9M3TgXabDYFBAS4vAAAgHW5FXSGDx+uAwcOuCw7ePCgecOlfv36KTQ0VAUFBeb6xsZGFRYWatiwYZKk6OhoeXt7u9RUVFRo3759Zk1sbKycTqd27dpl1uzcuVNOp9OlZt++faqoqDBr8vPzZbPZFB0d7c5pAQAAi3LrGp0nnnhCw4YNU3Z2tiZMmKBdu3bphRde0AsvvCDpq6+S0tPTlZ2drfDwcIWHhys7O1t+fn5KTk6WJNntdk2ePFkZGRkKDAxUz549lZmZqUGDBpm/who4cKDGjBmjKVOmaOXKlZKkqVOnKjExUREREZKk+Ph4RUZGKiUlRQsXLtSpU6eUmZmpKVOmMFMDAAAkuRl07rjjDm3atEmzZ8/Wr371K/Xr10/Lli3TQw89ZNbMmjVL9fX1Sk1NVXV1tWJiYpSfn69u3bqZNUuXLpWXl5cmTJig+vp6jRo1SmvWrDGfCSJJ69evV1pamvnrrKSkJOXk5JjrPT09tXnzZqWmpmr48OHy9fVVcnKyFi1a1ObBAAAA1uJhGIbR0U10lJqaGtntdjmdziszC8RDPQFY2BdffKHy8nL169dPXbt27eh2YDGt/X258/nt9iMgAAAAOguCDgAAsCyCDgAAF+Ff//qXPDw8VFJScsH3V5M1a9a4PIfyWubWxcgAAFyU9r5GsQOuLwwLC1NFRcVlezDnmjVrlJ6ertOnT1+W/eErzOgAANAGnp6eCg0NlZcXcwbfprGxscOOTdABAFxz8vLy9L3vfU/du3dXYGCgEhMT9fHHH7vU7Nq1S4MHD1bXrl01ZMgQ7dmzx2X9+V9dXejrotdff93lsUT//Oc/dffdd6tbt24KCAhQdHS03n//fb3zzjv68Y9/LKfTKQ8PD3l4eJjPzGpsbNSsWbN0/fXXy9/fXzExMXrnnXdcjrNmzRrdcMMN8vPz03333aeTJ0+2ev6NjY2aPn26evfura5du+rGG2/UvHn/fxbu9OnTmjp1qkJCQtS1a1dFRUXpL3/5i7l+48aNuvnmm2Wz2XTjjTdq8eLFLvu/8cYb9eyzz2rSpEmy2+3mw7+3bdumu+66S76+vgoLC1NaWprq6upa7fVSEXQAANecuro6zZw5U7t379Zbb72lLl266L777tPZs2fN9eduUltcXKysrCxlZmZe8nEfeugh9enTR7t371ZxcbGeeuopeXt7a9iwYVq2bJkCAgJUUVGhiooK83g//vGP9d577yk3N1cffPCBfvjDH2rMmDE6dOiQpK+eHPCTn/xEqampKikp0d13361nn3221T6WL1+uN954Q3/4wx904MABrVu3TjfeeKOkr55rOXbsWG3btk3r1q1TaWmpnnvuOfNed8XFxZowYYJ+9KMfae/evcrKytLTTz+tNWvWuBxj4cKFioqKUnFxsZ5++mnt3btXCQkJuv/++/XBBx/o1VdfVVFRkaZPn37J49oa5tsAANecH/zgBy7vX3zxRQUHB6u0tFRRUVFav369mpub9dJLL8nPz08333yzjh49qp/97GeXdNzDhw/r5z//uW666SZJUnh4uLnObrfLw8PDfG6kJH388cd65ZVXdPToUTkcDklSZmam8vLytHr1amVnZ+s3v/mNEhIS9NRTT0mSBgwYoG3btrX6hPbDhw8rPDxc3/ve9+Th4WE+ykmS3nzzTe3atUtlZWUaMGCAJKl///7m+iVLlmjUqFF6+umnzeOVlpZq4cKFmjRpkll3zz33uITDhx9+WMnJyUpPTzfPffny5RoxYoRWrFhxxe7FxIwOAOCa8/HHHys5OVn9+/dXQECA+vXrJ0nmQ6rLysp06623ys/Pz9wmNjb2ko87c+ZM/fSnP1VcXJyee+65Fl+Xne8f//iHDMPQgAEDdN1115mvwsJCc9uysrIWvX1br5MmTVJJSYkiIiKUlpam/Px8c11JSYn69OljhpzzlZWVafjw4S7Lhg8frkOHDqm5udlcNmTIEJea4uJirVmzxuU8EhISdPbsWZWXl7fa76VgRgcAcM0ZP368wsLCtGrVKjkcDp09e1ZRUVHmRbNteWhAly5dWmzX1NTk8j4rK0vJycnavHmztm7dqmeeeUa5ubm67777LrjPs2fPytPTU8XFxS6PSZKk6667rs293n777SovL9fWrVv15ptvasKECYqLi9Nrr70mX1/fVrc1DMPluqNv6sHf37/FuUybNk1paWktam+44Qa3z+FiEXQAANeUkydPqqysTCtXrtSdd94pSSoqKnKpiYyM1Nq1a1VfX29+8O/YsaPV/fbq1Uu1tbWqq6szP+QvdI+dAQMGaMCAAXriiSf04IMPavXq1brvvvvk4+PjMiMiSYMHD1Zzc7OqqqrMXs8XGRnZordv61WSAgICNHHiRE2cOFEPPPCAxowZo1OnTumWW27R0aNHdfDgwQvO6kRGRrYYr23btmnAgAEtwtjX3X777dq/f7++853vfGtvlxNfXQEArik9evRQYGCgXnjhBX300Uf629/+ppkzZ7rUJCcnq0uXLpo8ebJKS0u1ZcuWb31odExMjPz8/PSLX/xCH330kTZs2OBygW59fb2mT5+ud955R59++qnee+897d69WwMHDpT01S+Vzpw5o7feekufffaZPv/8cw0YMEAPPfSQHn74Yf3pT39SeXm5du/erfnz52vLli2SpLS0NOXl5WnBggU6ePCgcnJyWr0+R/rq4dq5ubn68MMPdfDgQf3xj39UaGiounfvrhEjRuiuu+7SD37wAxUUFJgzP+f2mZGRobfeekv/9V//pYMHD+rll19WTk7Ot16s/eSTT2r79u167LHHVFJSokOHDumNN97QjBkzWt3uUhF0AADXlC5duig3N1fFxcWKiorSE088oYULF7rUXHfddfrf//1flZaWavDgwZozZ47mz5/f6n579uypdevWacuWLRo0aJBeeeUV8yfi0lf33Tl58qQefvhhDRgwQBMmTNDYsWM1d+5cSdKwYcP06KOPauLEierVq5cWLFggSVq9erUefvhhZWRkKCIiQklJSdq5c6fCwsIkSUOHDtXvf/97Pf/887rtttuUn5+vX/7yl632et1112n+/PkaMmSI7rjjDv3rX//Sli1b1KXLV7Fg48aNuuOOO/Tggw8qMjJSs2bNMmebbr/9dv3hD39Qbm6uoqKi9J//+Z/61a9+5XIh8oXccsstKiws1KFDh3TnnXdq8ODBevrpp9W7d+9Wt7tUPL2cp5e74unlAC7Stf708gMHDuimm27SoUOH2v3rmGsBTy8HAKCDnDp1Sq+99poCAgLMmRVcnbgYGQAAN02ePFnFxcVasWKFbDZbR7eDVhB0AABw06ZNmzq6BVwkvroCAACWRdABAACWRdABAFySa/jHu7iCLtffFUEHANAm3t7ekqTPP/+8gzuBFZ37uzr3d9ZWXIwMAGgTT09Pde/eXVVVVZIkPz+/Fs9AAtxlGIY+//xzVVVVqXv37q0+VuJiEHQAAG0WGhoqSWbYAS6X7t27m39fl4KgAwBoMw8PD/Xu3VvBwcEtntQNtJW3t/clz+ScQ9ABAFwyT0/Py/bBBFxOXIwMAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsi6ADAAAsy62gk5WVJQ8PD5dXaGioud4wDGVlZcnhcMjX11cjR47U/v37XfbR0NCgGTNmKCgoSP7+/kpKStLRo0ddaqqrq5WSkiK73S673a6UlBSdPn3apebw4cMaP368/P39FRQUpLS0NDU2Nrp5+gAAwMrcntG5+eabVVFRYb727t1rrluwYIGWLFminJwc7d69W6GhoRo9erRqa2vNmvT0dG3atEm5ubkqKirSmTNnlJiYqObmZrMmOTlZJSUlysvLU15enkpKSpSSkmKub25u1rhx41RXV6eioiLl5uZq48aNysjIaOs4AAAAC/JyewMvL5dZnHMMw9CyZcs0Z84c3X///ZKkl19+WSEhIdqwYYOmTZsmp9OpF198UWvXrlVcXJwkad26dQoLC9Obb76phIQElZWVKS8vTzt27FBMTIwkadWqVYqNjdWBAwcUERGh/Px8lZaW6siRI3I4HJKkxYsXa9KkSfr1r3+tgICANg8IAACwDrdndA4dOiSHw6F+/frpRz/6kT755BNJUnl5uSorKxUfH2/W2mw2jRgxQtu2bZMkFRcXq6mpyaXG4XAoKirKrNm+fbvsdrsZciRp6NChstvtLjVRUVFmyJGkhIQENTQ0qLi4+Bt7b2hoUE1NjcsLAABYl1tBJyYmRv/zP/+jv/71r1q1apUqKys1bNgwnTx5UpWVlZKkkJAQl21CQkLMdZWVlfLx8VGPHj1arQkODm5x7ODgYJea84/To0cP+fj4mDUXMm/ePPO6H7vdrrCwMHdOHwAAdDJuBZ2xY8fqBz/4gQYNGqS4uDht3rxZ0ldfUZ3j4eHhso1hGC2Wne/8mgvVt6XmfLNnz5bT6TRfR44cabUvAADQuV3Sz8v9/f01aNAgHTp0yLxu5/wZlaqqKnP2JTQ0VI2Njaqurm615vjx4y2OdeLECZea849TXV2tpqamFjM9X2ez2RQQEODyAgAA1nVJQaehoUFlZWXq3bu3+vXrp9DQUBUUFJjrGxsbVVhYqGHDhkmSoqOj5e3t7VJTUVGhffv2mTWxsbFyOp3atWuXWbNz5045nU6Xmn379qmiosKsyc/Pl81mU3R09KWcEgAAsBC3fnWVmZmp8ePH64YbblBVVZWeffZZ1dTU6JFHHpGHh4fS09OVnZ2t8PBwhYeHKzs7W35+fkpOTpYk2e12TZ48WRkZGQoMDFTPnj2VmZlpfhUmSQMHDtSYMWM0ZcoUrVy5UpI0depUJSYmKiIiQpIUHx+vyMhIpaSkaOHChTp16pQyMzM1ZcoUZmkAAIDJraBz9OhRPfjgg/rss8/Uq1cvDR06VDt27FDfvn0lSbNmzVJ9fb1SU1NVXV2tmJgY5efnq1u3buY+li5dKi8vL02YMEH19fUaNWqU1qxZI09PT7Nm/fr1SktLM3+dlZSUpJycHHO9p6enNm/erNTUVA0fPly+vr5KTk7WokWLLmkwAACAtXgYhmF0dBMdpaamRna7XU6n88rMBL097/Lv80q7e3ZHdwAAQKvc+fzmWVcAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyCDoAAMCyLinozJs3Tx4eHkpPTzeXGYahrKwsORwO+fr6auTIkdq/f7/Ldg0NDZoxY4aCgoLk7++vpKQkHT161KWmurpaKSkpstvtstvtSklJ0enTp11qDh8+rPHjx8vf319BQUFKS0tTY2PjpZwSAACwkDYHnd27d+uFF17QLbfc4rJ8wYIFWrJkiXJycrR7926FhoZq9OjRqq2tNWvS09O1adMm5ebmqqioSGfOnFFiYqKam5vNmuTkZJWUlCgvL095eXkqKSlRSkqKub65uVnjxo1TXV2dioqKlJubq40bNyojI6OtpwQAACymTUHnzJkzeuihh7Rq1Sr16NHDXG4YhpYtW6Y5c+bo/vvvV1RUlF5++WV9/vnn2rBhgyTJ6XTqxRdf1OLFixUXF6fBgwdr3bp12rt3r958801JUllZmfLy8vT73/9esbGxio2N1apVq/SXv/xFBw4ckCTl5+ertLRU69at0+DBgxUXF6fFixdr1apVqqmpudRxAQAAFtCmoPPYY49p3LhxiouLc1leXl6uyspKxcfHm8tsNptGjBihbdu2SZKKi4vV1NTkUuNwOBQVFWXWbN++XXa7XTExMWbN0KFDZbfbXWqioqLkcDjMmoSEBDU0NKi4uPiCfTc0NKimpsblBQAArMvL3Q1yc3P1j3/8Q7t3726xrrKyUpIUEhLisjwkJESffvqpWePj4+MyE3Su5tz2lZWVCg4ObrH/4OBgl5rzj9OjRw/5+PiYNeebN2+e5s6dezGnCQAALMCtGZ0jR47o8ccf17p169S1a9dvrPPw8HB5bxhGi2XnO7/mQvVtqfm62bNny+l0mq8jR4602hMAAOjc3Ao6xcXFqqqqUnR0tLy8vOTl5aXCwkItX75cXl5e5gzL+TMqVVVV5rrQ0FA1Njaqurq61Zrjx4+3OP6JEydcas4/TnV1tZqamlrM9Jxjs9kUEBDg8gIAANblVtAZNWqU9u7dq5KSEvM1ZMgQPfTQQyopKVH//v0VGhqqgoICc5vGxkYVFhZq2LBhkqTo6Gh5e3u71FRUVGjfvn1mTWxsrJxOp3bt2mXW7Ny5U06n06Vm3759qqioMGvy8/Nls9kUHR3dhqEAAABW49Y1Ot26dVNUVJTLMn9/fwUGBprL09PTlZ2drfDwcIWHhys7O1t+fn5KTk6WJNntdk2ePFkZGRkKDAxUz549lZmZqUGDBpkXNw8cOFBjxozRlClTtHLlSknS1KlTlZiYqIiICElSfHy8IiMjlZKSooULF+rUqVPKzMzUlClTmKkBAACS2nAx8reZNWuW6uvrlZqaqurqasXExCg/P1/dunUza5YuXSovLy9NmDBB9fX1GjVqlNasWSNPT0+zZv369UpLSzN/nZWUlKScnBxzvaenpzZv3qzU1FQNHz5cvr6+Sk5O1qJFiy73KQEAgE7KwzAMo6Ob6Cg1NTWy2+1yOp1XZhbo7XmXf59X2t2zO7oDAABa5c7nN8+6AgAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAlkXQAQAAluVW0FmxYoVuueUWBQQEKCAgQLGxsdq6dau53jAMZWVlyeFwyNfXVyNHjtT+/ftd9tHQ0KAZM2YoKChI/v7+SkpK0tGjR11qqqurlZKSIrvdLrvdrpSUFJ0+fdql5vDhwxo/frz8/f0VFBSktLQ0NTY2unn6AADAytwKOn369NFzzz2n999/X++//77uueceff/73zfDzIIFC7RkyRLl5ORo9+7dCg0N1ejRo1VbW2vuIz09XZs2bVJubq6Kiop05swZJSYmqrm52axJTk5WSUmJ8vLylJeXp5KSEqWkpJjrm5ubNW7cONXV1amoqEi5ubnauHGjMjIyLnU8AACAhXgYhmFcyg569uyphQsX6ic/+YkcDofS09P15JNPSvpq9iYkJETz58/XtGnT5HQ61atXL61du1YTJ06UJB07dkxhYWHasmWLEhISVFZWpsjISO3YsUMxMTGSpB07dig2NlYffvihIiIitHXrViUmJurIkSNyOBySpNzcXE2aNElVVVUKCAi4qN5rampkt9vldDovehu3vD3v8u/zSrt7dkd3AABAq9z5/G7zNTrNzc3Kzc1VXV2dYmNjVV5ersrKSsXHx5s1NptNI0aM0LZt2yRJxcXFampqcqlxOByKiooya7Zv3y673W6GHEkaOnSo7Ha7S01UVJQZciQpISFBDQ0NKi4u/saeGxoaVFNT4/ICAADW5XbQ2bt3r6677jrZbDY9+uij2rRpkyIjI1VZWSlJCgkJcakPCQkx11VWVsrHx0c9evRotSY4OLjFcYODg11qzj9Ojx495OPjY9ZcyLx588zrfux2u8LCwtw8ewAA0Jm4HXQiIiJUUlKiHTt26Gc/+5keeeQRlZaWmus9PDxc6g3DaLHsfOfXXKi+LTXnmz17tpxOp/k6cuRIq30BAIDOze2g4+Pjo+985zsaMmSI5s2bp1tvvVW/+c1vFBoaKkktZlSqqqrM2ZfQ0FA1Njaqurq61Zrjx4+3OO6JEydcas4/TnV1tZqamlrM9HydzWYzfzF27gUAAKzrku+jYxiGGhoa1K9fP4WGhqqgoMBc19jYqMLCQg0bNkySFB0dLW9vb5eaiooK7du3z6yJjY2V0+nUrl27zJqdO3fK6XS61Ozbt08VFRVmTX5+vmw2m6Kjoy/1lAAAgEV4uVP8i1/8QmPHjlVYWJhqa2uVm5urd955R3l5efLw8FB6erqys7MVHh6u8PBwZWdny8/PT8nJyZIku92uyZMnKyMjQ4GBgerZs6cyMzM1aNAgxcXFSZIGDhyoMWPGaMqUKVq5cqUkaerUqUpMTFRERIQkKT4+XpGRkUpJSdHChQt16tQpZWZmasqUKczSAAAAk1tB5/jx40pJSVFFRYXsdrtuueUW5eXlafTo0ZKkWbNmqb6+XqmpqaqurlZMTIzy8/PVrVs3cx9Lly6Vl5eXJkyYoPr6eo0aNUpr1qyRp6enWbN+/XqlpaWZv85KSkpSTk6Oud7T01ObN29Wamqqhg8fLl9fXyUnJ2vRokWXNBgAAMBaLvk+Op0Z99G5AO6jAwC4yrXLfXQAAACudgQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWQQdAABgWV4d3QA6zvZPTrZYtuPLgx3QyTd7YvSAjm4BANCJEXRwVVtacHUFrwshjAHA1YuvrgAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGURdAAAgGW5FXTmzZunO+64Q926dVNwcLDuvfdeHThwwKXGMAxlZWXJ4XDI19dXI0eO1P79+11qGhoaNGPGDAUFBcnf319JSUk6evSoS011dbVSUlJkt9tlt9uVkpKi06dPu9QcPnxY48ePl7+/v4KCgpSWlqbGxkZ3TgkAAFiYW0GnsLBQjz32mHbs2KGCggJ9+eWXio+PV11dnVmzYMECLVmyRDk5Odq9e7dCQ0M1evRo1dbWmjXp6enatGmTcnNzVVRUpDNnzigxMVHNzc1mTXJyskpKSpSXl6e8vDyVlJQoJSXFXN/c3Kxx48aprq5ORUVFys3N1caNG5WRkXEp4wEAACzEwzAMo60bnzhxQsHBwSosLNRdd90lwzDkcDiUnp6uJ598UtJXszchISGaP3++pk2bJqfTqV69emnt2rWaOHGiJOnYsWMKCwvTli1blJCQoLKyMkVGRmrHjh2KiYmRJO3YsUOxsbH68MMPFRERoa1btyoxMVFHjhyRw+GQJOXm5mrSpEmqqqpSQEDAt/ZfU1Mju90up9N5UfVue3ve5d/nZbT9k5Mtlu24YWoHdNK5PTF6QEe3AADXFHc+vy/pGh2n0ylJ6tmzpySpvLxclZWVio+PN2tsNptGjBihbdu2SZKKi4vV1NTkUuNwOBQVFWXWbN++XXa73Qw5kjR06FDZ7XaXmqioKDPkSFJCQoIaGhpUXFx8wX4bGhpUU1Pj8gIAANbV5qBjGIZmzpyp733ve4qKipIkVVZWSpJCQkJcakNCQsx1lZWV8vHxUY8ePVqtCQ4ObnHM4OBgl5rzj9OjRw/5+PiYNeebN2+eec2P3W5XWFiYu6cNAAA6kTYHnenTp+uDDz7QK6+80mKdh4eHy3vDMFosO9/5NReqb0vN182ePVtOp9N8HTlypNWeAABA59amoDNjxgy98cYbevvtt9WnTx9zeWhoqCS1mFGpqqoyZ19CQ0PV2Nio6urqVmuOHz/e4rgnTpxwqTn/ONXV1Wpqamox03OOzWZTQECAywsAAFiXW0HHMAxNnz5df/rTn/S3v/1N/fr1c1nfr18/hYaGqqCgwFzW2NiowsJCDRs2TJIUHR0tb29vl5qKigrt27fPrImNjZXT6dSuXbvMmp07d8rpdLrU7Nu3TxUVFWZNfn6+bDaboqOj3TktAABgUV7uFD/22GPasGGD/vznP6tbt27mjIrdbpevr688PDyUnp6u7OxshYeHKzw8XNnZ2fLz81NycrJZO3nyZGVkZCgwMFA9e/ZUZmamBg0apLi4OEnSwIEDNWbMGE2ZMkUrV66UJE2dOlWJiYmKiIiQJMXHxysyMlIpKSlauHChTp06pczMTE2ZMoWZGgAAIMnNoLNixQpJ0siRI12Wr169WpMmTZIkzZo1S/X19UpNTVV1dbViYmKUn5+vbt26mfVLly6Vl5eXJkyYoPr6eo0aNUpr1qyRp6enWbN+/XqlpaWZv85KSkpSTk6Oud7T01ObN29Wamqqhg8fLl9fXyUnJ2vRokVuDQAAALCuS7qPTmfHfXS4j87lwH10AKB9tdt9dAAAAK5mBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZXh3dAK4uQw+/0NEtuG3HDVM7ugUAwFWKGR0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZBB0AAGBZXh3dAHCphh5+oWMbeDvQ/W3unn35+wAAtMCMDgAAsCyCDgAAsCyCDgAAsCy3g87f//53jR8/Xg6HQx4eHnr99ddd1huGoaysLDkcDvn6+mrkyJHav3+/S01DQ4NmzJihoKAg+fv7KykpSUePHnWpqa6uVkpKiux2u+x2u1JSUnT69GmXmsOHD2v8+PHy9/dXUFCQ0tLS1NjY6O4pAQAAi3I76NTV1enWW29VTk7OBdcvWLBAS5YsUU5Ojnbv3q3Q0FCNHj1atbW1Zk16ero2bdqk3NxcFRUV6cyZM0pMTFRzc7NZk5ycrJKSEuXl5SkvL08lJSVKSUkx1zc3N2vcuHGqq6tTUVGRcnNztXHjRmVkZLh7SgAAwKI8DMMw2ryxh4c2bdqke++9V9JXszkOh0Pp6el68sknJX01exMSEqL58+dr2rRpcjqd6tWrl9auXauJEydKko4dO6awsDBt2bJFCQkJKisrU2RkpHbs2KGYmBhJ0o4dOxQbG6sPP/xQERER2rp1qxITE3XkyBE5HA5JUm5uriZNmqSqqioFBAR8a/81NTWy2+1yOp0XVe+2t+dd/n1eRts/OdnRLVhCbH9+dQUA7cmdz+/Leo1OeXm5KisrFR8fby6z2WwaMWKEtm3bJkkqLi5WU1OTS43D4VBUVJRZs337dtntdjPkSNLQoUNlt9tdaqKiosyQI0kJCQlqaGhQcXHxBftraGhQTU2NywsAAFjXZQ06lZWVkqSQkBCX5SEhIea6yspK+fj4qEePHq3WBAcHt9h/cHCwS835x+nRo4d8fHzMmvPNmzfPvObHbrcrLCysDWcJAAA6iyvyqysPDw+X94ZhtFh2vvNrLlTflpqvmz17tpxOp/k6cuRIqz0BAIDO7bIGndDQUElqMaNSVVVlzr6EhoaqsbFR1dXVrdYcP368xf5PnDjhUnP+caqrq9XU1NRipuccm82mgIAAlxcAALCuyxp0+vXrp9DQUBUUFJjLGhsbVVhYqGHDhkmSoqOj5e3t7VJTUVGhffv2mTWxsbFyOp3atWuXWbNz5045nU6Xmn379qmiosKsyc/Pl81mU3R09OU8LQAA0Em5/ayrM2fO6KOPPjLfl5eXq6SkRD179tQNN9yg9PR0ZWdnKzw8XOHh4crOzpafn5+Sk5MlSXa7XZMnT1ZGRoYCAwPVs2dPZWZmatCgQYqLi5MkDRw4UGPGjNGUKVO0cuVKSdLUqVOVmJioiIgISVJ8fLwiIyOVkpKihQsX6tSpU8rMzNSUKVOYqQFwzVpacLCjW/hWT4we0NEt4BridtB5//33dffdd5vvZ86cKUl65JFHtGbNGs2aNUv19fVKTU1VdXW1YmJilJ+fr27dupnbLF26VF5eXpowYYLq6+s1atQorVmzRp6enmbN+vXrlZaWZv46KykpyeXePZ6entq8ebNSU1M1fPhw+fr6Kjk5WYsWLXJ/FAAAgCVd0n10Ojvuo8N9dC4H7qODqwkzOrgWuPP57faMDgBcqzpDiADgiod6AgAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAyyLoAAAAy+Lp5QCuCjwZHMCVwIwOAACwLIIOAACwLIIOAACwLIIOAACwLIIOAACwLH51BVwD+EUTgGsVMzoAAMCyCDoAAMCy+OoKuETbPznp9jY7vuSrJABoD8zoAAAAy2JGBwCATqoz/NDgidEDOvT4zOgAAADLIugAAADLIugAAADLIugAAADLIugAAADLIugAAADLIugAAADLIugAAADLIugAAADLIugAAADL4hEQAACcpzM8WgEXhxkdAABgWQQdAABgWXx1BQBoV3wthPZE0AE6wNDDL3R0C27bccPUjm4BANzGV1cAAMCymNEBgKsIs334Jp3xb+Mrizr06AQdABelM/5Llg9gAAQdAJbVGcMZgMuLoAMAuCQESlzNOv3FyL/73e/Ur18/de3aVdHR0Xr33Xc7uiUAAHCV6NRB59VXX1V6errmzJmjPXv26M4779TYsWN1+PDhjm4NAABcBTp10FmyZIkmT56sn/70pxo4cKCWLVumsLAwrVixoqNbAwAAV4FOe41OY2OjiouL9dRTT7ksj4+P17Zt2y64TUNDgxoaGsz3TqdTklRTU3Nlmqz74srs9zKpq2/49iIAAC7BlfiMPbdPwzC+tbbTBp3PPvtMzc3NCgkJcVkeEhKiysrKC24zb948zZ07t8XysLCwK9IjAADXvBk5V2zXtbW1stvtrdZ02qBzjoeHh8t7wzBaLDtn9uzZmjlzpvn+7NmzOnXqlAIDA79xmwupqalRWFiYjhw5ooCAgLY1jovGeLcvxrt9Md7ti/FuX1dqvA3DUG1trRwOx7fWdtqgExQUJE9PzxazN1VVVS1mec6x2Wyy2Wwuy7p3797mHgICAvgHpR0x3u2L8W5fjHf7Yrzb15UY72+byTmn016M7OPjo+joaBUUFLgsLygo0LBhwzqoKwAAcDXptDM6kjRz5kylpKRoyJAhio2N1QsvvKDDhw/r0Ucf7ejWAADAVaBTB52JEyfq5MmT+tWvfqWKigpFRUVpy5Yt6tu37xU9rs1m0zPPPNPiazBcGYx3+2K82xfj3b4Y7/Z1NYy3h3Exv80CAADohDrtNToAAADfhqADAAAsi6ADAAAsi6ADAAAsi6BzAb/73e/Ur18/de3aVdHR0Xr33XdbrS8sLFR0dLS6du2q/v3767//+7/bqVNrcGe8//SnP2n06NHq1auXAgICFBsbq7/+9a/t2G3n5+7f9znvvfeevLy8dNttt13ZBi3G3fFuaGjQnDlz1LdvX9lsNv3bv/2bXnrppXbqtvNzd7zXr1+vW2+9VX5+furdu7d+/OMf6+TJk+3Ubef297//XePHj5fD4ZCHh4def/31b92mQz4vDbjIzc01vL29jVWrVhmlpaXG448/bvj7+xuffvrpBes/+eQTw8/Pz3j88ceN0tJSY9WqVYa3t7fx2muvtXPnnZO74/34448b8+fPN3bt2mUcPHjQmD17tuHt7W384x//aOfOOyd3x/uc06dPG/379zfi4+ONW2+9tX2atYC2jHdSUpIRExNjFBQUGOXl5cbOnTuN9957rx277rzcHe93333X6NKli/Gb3/zG+OSTT4x3333XuPnmm4177723nTvvnLZs2WLMmTPH2LhxoyHJ2LRpU6v1HfV5SdA5z3e/+13j0UcfdVl20003GU899dQF62fNmmXcdNNNLsumTZtmDB069Ir1aCXujveFREZGGnPnzr3crVlSW8d74sSJxi9/+UvjmWeeIei4wd3x3rp1q2G3242TJ0+2R3uW4+54L1y40Ojfv7/LsuXLlxt9+vS5Yj1a1cUEnY76vOSrq69pbGxUcXGx4uPjXZbHx8dr27ZtF9xm+/btLeoTEhL0/vvvq6mp6Yr1agVtGe/znT17VrW1terZs+eVaNFS2jreq1ev1scff6xnnnnmSrdoKW0Z7zfeeENDhgzRggULdP3112vAgAHKzMxUfX19e7TcqbVlvIcNG6ajR49qy5YtMgxDx48f12uvvaZx48a1R8vXnI76vOzUd0a+3D777DM1Nze3eChoSEhIi4eHnlNZWXnB+i+//FKfffaZevfufcX67ezaMt7nW7x4serq6jRhwoQr0aKltGW8Dx06pKeeekrvvvuuvLz414U72jLen3zyiYqKitS1a1dt2rRJn332mVJTU3Xq1Cmu0/kWbRnvYcOGaf369Zo4caK++OILffnll0pKStLzzz/fHi1fczrq85IZnQvw8PBweW8YRotl31Z/oeW4MHfH+5xXXnlFWVlZevXVVxUcHHyl2rOcix3v5uZmJScna+7cuRowYEB7tWc57vx9nz17Vh4eHlq/fr2++93v6t///d+1ZMkSrVmzhlmdi+TOeJeWliotLU3/+Z//qeLiYuXl5am8vJznJV5BHfF5yX+ifU1QUJA8PT1bpP+qqqoWKfSc0NDQC9Z7eXkpMDDwivVqBW0Z73NeffVVTZ48WX/84x8VFxd3Jdu0DHfHu7a2Vu+//7727Nmj6dOnS/rqg9gwDHl5eSk/P1/33HNPu/TeGbXl77t37966/vrrZbfbzWUDBw6UYRg6evSowsPDr2jPnVlbxnvevHkaPny4fv7zn0uSbrnlFvn7++vOO+/Us88+y4z8ZdZRn5fM6HyNj4+PoqOjVVBQ4LK8oKBAw4YNu+A2sbGxLerz8/M1ZMgQeXt7X7FeraAt4y19NZMzadIkbdiwge/S3eDueAcEBGjv3r0qKSkxX48++qgiIiJUUlKimJiY9mq9U2rL3/fw4cN17NgxnTlzxlx28OBBdenSRX369Lmi/XZ2bRnvzz//XF26uH4Menp6Svr/Mw24fDrs8/KKXurcCZ37eeKLL75olJaWGunp6Ya/v7/xr3/9yzAMw3jqqaeMlJQUs/7cz+WeeOIJo7S01HjxxRf5ebkb3B3vDRs2GF5eXsZvf/tbo6KiwnydPn26o06hU3F3vM/Hr67c4+5419bWGn369DEeeOABY//+/UZhYaERHh5u/PSnP+2oU+hU3B3v1atXG15eXsbvfvc74+OPPzaKioqMIUOGGN/97nc76hQ6ldraWmPPnj3Gnj17DEnGkiVLjD179pg/579aPi8JOhfw29/+1ujbt6/h4+Nj3H777UZhYaG57pFHHjFGjBjhUv/OO+8YgwcPNnx8fIwbb7zRWLFiRTt33Lm5M94jRowwJLV4PfLII+3feCfl7t/31xF03OfueJeVlRlxcXGGr6+v0adPH2PmzJnG559/3s5dd17ujvfy5cuNyMhIw9fX1+jdu7fx0EMPGUePHm3nrjunt99+u9V/H18tn5cehsH8HAAAsCau0QEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJZF0AEAAJb1/wDUI80ZH3LMJAAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# histogramme des probas et des probas ajustées\n",
|
||
"\n",
|
||
"plt.hist(X_test[\"score\"], label = \"score\", alpha=0.5)\n",
|
||
"plt.hist(X_test[\"score_adjusted\"], label=\"adjusted score\", alpha=0.5)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 557,
|
||
"id": "646a8e9b-99dc-4e06-ab5a-42b21de6917b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.32260447885447885\n",
|
||
"0.06268731268731269\n",
|
||
"0.14246170496170496\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# on passe de 32% de scores supérieurs à 1/2 à 6%\n",
|
||
"\n",
|
||
"print((X_test[\"score\"]>0.5).mean())\n",
|
||
"print((X_test[\"score_adjusted\"]>0.5).mean())\n",
|
||
"print(y_test.mean()[\"y_has_purchased\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 437,
|
||
"id": "3a60fa17-c960-4702-baa1-a7dc6cd227b0",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"nombre de clients ayant acheté : 13690.0\n",
|
||
"somme des scores ajustés : 13690.000010280266\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# on vérifie que cette correction a permis d'avoir des résultats cohérents\n",
|
||
"\n",
|
||
"print(\"nombre de clients ayant acheté :\",y_sum)\n",
|
||
"print(\"somme des scores ajustés :\", X_test[\"score_adjusted\"].sum())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 440,
|
||
"id": "3a7479a5-b6a3-47a2-8f78-4259746498f1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"MSE for score : 0.15637498623391197\n",
|
||
"MSE for ajusted score : 0.08877832832116543\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# cet ajustement permet de plus de réduire drastiquement le MSE \n",
|
||
"\n",
|
||
"MSE_score = ((X_test[\"score\"]-X_test[\"has_purchased\"])**2).mean()\n",
|
||
"MSE_ajusted_score = ((X_test[\"score_adjusted\"]-X_test[\"has_purchased\"])**2).mean()\n",
|
||
"print(f\"MSE for score : {MSE_score}\")\n",
|
||
"print(f\"MSE for ajusted score : {MSE_ajusted_score}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 518,
|
||
"id": "fd963072-26f7-4805-84db-5612a40dcafd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>score</th>\n",
|
||
" <th>score_adjusted</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.169233</td>\n",
|
||
" <td>0.033442</td>\n",
|
||
" <td>0.026780</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.360811</td>\n",
|
||
" <td>0.088246</td>\n",
|
||
" <td>0.117452</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.626785</td>\n",
|
||
" <td>0.222962</td>\n",
|
||
" <td>0.209332</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.902055</td>\n",
|
||
" <td>0.652198</td>\n",
|
||
" <td>0.666549</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" score score_adjusted has_purchased\n",
|
||
"quartile \n",
|
||
"1 0.169233 0.033442 0.026780\n",
|
||
"2 0.360811 0.088246 0.117452\n",
|
||
"3 0.626785 0.222962 0.209332\n",
|
||
"4 0.902055 0.652198 0.666549"
|
||
]
|
||
},
|
||
"execution_count": 518,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on est bcp plus proche des probas d'achat moyennes\n",
|
||
"X_test.groupby(\"quartile\")[[\"score\",\"score_adjusted\", \"has_purchased\"]].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "0552d1c9-7edd-44ed-9954-0bc7810ec2f3",
|
||
"metadata": {},
|
||
"source": [
|
||
"Etape suivante : on peut donc calculer le potentiel de CA de chaque segment"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 473,
|
||
"id": "86f0740a-80b5-435b-a1ee-ae59d9143666",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" <th>score_adjusted</th>\n",
|
||
" <th>nb_tickets_projected</th>\n",
|
||
" <th>total_amount_projected</th>\n",
|
||
" <th>nb_tickets_expected</th>\n",
|
||
" <th>total_amount_expected</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" <td>0.274689</td>\n",
|
||
" <td>2.666667</td>\n",
|
||
" <td>66.666667</td>\n",
|
||
" <td>0.732503</td>\n",
|
||
" <td>18.312587</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" <td>0.050756</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>36.666667</td>\n",
|
||
" <td>0.033837</td>\n",
|
||
" <td>1.861053</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" <td>0.060349</td>\n",
|
||
" <td>11.333333</td>\n",
|
||
" <td>53.333333</td>\n",
|
||
" <td>0.683958</td>\n",
|
||
" <td>3.218627</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" <td>0.274899</td>\n",
|
||
" <td>2.666667</td>\n",
|
||
" <td>80.000000</td>\n",
|
||
" <td>0.733063</td>\n",
|
||
" <td>21.991884</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" <td>0.631228</td>\n",
|
||
" <td>22.666667</td>\n",
|
||
" <td>277.333333</td>\n",
|
||
" <td>14.307843</td>\n",
|
||
" <td>175.060667</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" <td>0.188948</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>44.873333</td>\n",
|
||
" <td>0.125966</td>\n",
|
||
" <td>8.478740</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" <td>0.238685</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>40.940000</td>\n",
|
||
" <td>0.159123</td>\n",
|
||
" <td>9.771748</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" <td>0.021356</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" <td>0.185910</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>52.953333</td>\n",
|
||
" <td>0.123940</td>\n",
|
||
" <td>9.844555</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" <td>0.053340</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 32 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... decile \\\n",
|
||
"0 0.0 True False ... 6 \n",
|
||
"1 0.0 True True ... 2 \n",
|
||
"2 0.0 True True ... 2 \n",
|
||
"3 0.0 True False ... 6 \n",
|
||
"4 0.0 True False ... 9 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 5 \n",
|
||
"96092 1.0 True False ... 6 \n",
|
||
"96093 0.0 True True ... 1 \n",
|
||
"96094 1.0 True False ... 5 \n",
|
||
"96095 0.0 True False ... 2 \n",
|
||
"\n",
|
||
" overshoot_coeff ajusted_score odd_ratio test_adjusted_score_2 \\\n",
|
||
"0 3.294104 0.211260 2.288530 0.533640 \n",
|
||
"1 3.826401 0.063821 0.323109 0.139085 \n",
|
||
"2 3.826401 0.073069 0.388102 0.162515 \n",
|
||
"3 3.294104 0.211328 2.290940 0.533902 \n",
|
||
"4 1.268598 0.718781 10.343538 0.837972 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 3.260982 0.179296 1.407779 0.413108 \n",
|
||
"96092 3.294104 0.198694 1.894523 0.486458 \n",
|
||
"96093 17.863019 0.006522 0.131865 0.061854 \n",
|
||
"96094 3.260982 0.177808 1.379973 0.408279 \n",
|
||
"96095 3.826401 0.066382 0.340487 0.145477 \n",
|
||
"\n",
|
||
" score_adjusted nb_tickets_projected total_amount_projected \\\n",
|
||
"0 0.274689 2.666667 66.666667 \n",
|
||
"1 0.050756 0.666667 36.666667 \n",
|
||
"2 0.060349 11.333333 53.333333 \n",
|
||
"3 0.274899 2.666667 80.000000 \n",
|
||
"4 0.631228 22.666667 277.333333 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.188948 0.666667 44.873333 \n",
|
||
"96092 0.238685 0.666667 40.940000 \n",
|
||
"96093 0.021356 0.000000 0.000000 \n",
|
||
"96094 0.185910 0.666667 52.953333 \n",
|
||
"96095 0.053340 0.000000 0.000000 \n",
|
||
"\n",
|
||
" nb_tickets_expected total_amount_expected \n",
|
||
"0 0.732503 18.312587 \n",
|
||
"1 0.033837 1.861053 \n",
|
||
"2 0.683958 3.218627 \n",
|
||
"3 0.733063 21.991884 \n",
|
||
"4 14.307843 175.060667 \n",
|
||
"... ... ... \n",
|
||
"96091 0.125966 8.478740 \n",
|
||
"96092 0.159123 9.771748 \n",
|
||
"96093 0.000000 0.000000 \n",
|
||
"96094 0.123940 9.844555 \n",
|
||
"96095 0.000000 0.000000 \n",
|
||
"\n",
|
||
"[96096 rows x 32 columns]"
|
||
]
|
||
},
|
||
"execution_count": 473,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on calcule d'abord pour chaque client le nombre de tickets achetés / montant total si achat\n",
|
||
"# comme la période d'étude est d'un an et demi, sur l'année à venir on espère vendre 1.5 fois le nbre de tickets vendu\n",
|
||
"\n",
|
||
"# ensuite, on multiplie par la proba d'achat pour avoir le nombre de tickets potentiellement acheté\n",
|
||
"# et le montant total associé\n",
|
||
"\n",
|
||
"\n",
|
||
"X_test[\"nb_tickets_projected\"] = X_test[\"nb_tickets\"] / 1.5\n",
|
||
"X_test[\"total_amount_projected\"] = X_test[\"total_amount\"] / 1.5\n",
|
||
"\n",
|
||
"X_test[\"nb_tickets_expected\"] = X_test[\"score_adjusted\"] * X_test[\"nb_tickets_projected\"]\n",
|
||
"X_test[\"total_amount_expected\"] = X_test[\"score_adjusted\"] * X_test[\"total_amount_projected\"]\n",
|
||
"\n",
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 474,
|
||
"id": "c8c8eec5-27d9-41cc-b62f-66246a24f1a4",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_tickets_expected</th>\n",
|
||
" <th>total_amount_expected</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.017380</td>\n",
|
||
" <td>0.475141</td>\n",
|
||
" <td>0.000590</td>\n",
|
||
" <td>0.016112</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.085810</td>\n",
|
||
" <td>49.701732</td>\n",
|
||
" <td>0.134566</td>\n",
|
||
" <td>3.298096</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.118100</td>\n",
|
||
" <td>88.811284</td>\n",
|
||
" <td>0.478898</td>\n",
|
||
" <td>13.258736</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>46.046362</td>\n",
|
||
" <td>2002.607230</td>\n",
|
||
" <td>26.753314</td>\n",
|
||
" <td>1246.363503</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets total_amount nb_tickets_expected total_amount_expected\n",
|
||
"quartile \n",
|
||
"1 0.017380 0.475141 0.000590 0.016112\n",
|
||
"2 2.085810 49.701732 0.134566 3.298096\n",
|
||
"3 3.118100 88.811284 0.478898 13.258736\n",
|
||
"4 46.046362 2002.607230 26.753314 1246.363503"
|
||
]
|
||
},
|
||
"execution_count": 474,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# potentiel de CA par segment, et comparaison avec le CA passé/1.5\n",
|
||
"\n",
|
||
"X_test.groupby(\"quartile\")[[\"nb_tickets\",\"total_amount\",\"nb_tickets_expected\",\"total_amount_expected\"]].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 519,
|
||
"id": "f7052cc7-054b-4b9d-935e-81611b1f6a61",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>quartile</th>\n",
|
||
" <th>nb_tickets</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>554.666667</td>\n",
|
||
" <td>1.516365e+04</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>23950.666667</td>\n",
|
||
" <td>5.707084e+05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>46732.000000</td>\n",
|
||
" <td>1.331044e+06</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>261543.333333</td>\n",
|
||
" <td>1.137481e+07</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" quartile nb_tickets total_amount\n",
|
||
"0 1 554.666667 1.516365e+04\n",
|
||
"1 2 23950.666667 5.707084e+05\n",
|
||
"2 3 46732.000000 1.331044e+06\n",
|
||
"3 4 261543.333333 1.137481e+07"
|
||
]
|
||
},
|
||
"execution_count": 519,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_expected_CA = (X_test.groupby(\"quartile\")[[\"nb_tickets\",\"total_amount\"]].sum()/1.5).reset_index()\n",
|
||
"df_expected_CA"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 520,
|
||
"id": "655c499e-29d2-4811-bba2-e4184bc123e5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df_expected_CA[[\"nb_tickets_expected\",\"total_amount_expected\"]] = (X_test.groupby(\"quartile\")[[\"nb_tickets_expected\",\"total_amount_expected\"]].sum()).reset_index()[[\"nb_tickets_expected\", \"total_amount_expected\"]]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 521,
|
||
"id": "917891a5-8906-4c19-96ff-5160fb437a86",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>quartile</th>\n",
|
||
" <th>nb_tickets</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_tickets_expected</th>\n",
|
||
" <th>total_amount_expected</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>554.666667</td>\n",
|
||
" <td>1.516365e+04</td>\n",
|
||
" <td>28.262185</td>\n",
|
||
" <td>7.713112e+02</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>23950.666667</td>\n",
|
||
" <td>5.707084e+05</td>\n",
|
||
" <td>2317.763439</td>\n",
|
||
" <td>5.680641e+04</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>46732.000000</td>\n",
|
||
" <td>1.331044e+06</td>\n",
|
||
" <td>10766.103277</td>\n",
|
||
" <td>2.980696e+05</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>261543.333333</td>\n",
|
||
" <td>1.137481e+07</td>\n",
|
||
" <td>227938.234982</td>\n",
|
||
" <td>1.061902e+07</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" quartile nb_tickets total_amount nb_tickets_expected \\\n",
|
||
"0 1 554.666667 1.516365e+04 28.262185 \n",
|
||
"1 2 23950.666667 5.707084e+05 2317.763439 \n",
|
||
"2 3 46732.000000 1.331044e+06 10766.103277 \n",
|
||
"3 4 261543.333333 1.137481e+07 227938.234982 \n",
|
||
"\n",
|
||
" total_amount_expected \n",
|
||
"0 7.713112e+02 \n",
|
||
"1 5.680641e+04 \n",
|
||
"2 2.980696e+05 \n",
|
||
"3 1.061902e+07 "
|
||
]
|
||
},
|
||
"execution_count": 521,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_expected_CA"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 532,
|
||
"id": "6b90ea7d-37be-49e4-b0c2-b38a37058e24",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# add number of customers of each segment\n",
|
||
"df_expected_CA.insert(1, \"size\", X_test.groupby(\"quartile\").size().values)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 535,
|
||
"id": "7efab307-0a98-4049-afe6-b292fa3c4036",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>quartile</th>\n",
|
||
" <th>size</th>\n",
|
||
" <th>nb_tickets</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_tickets_expected</th>\n",
|
||
" <th>total_amount_expected</th>\n",
|
||
" <th>total_amount_recovered</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>47871</td>\n",
|
||
" <td>554.666667</td>\n",
|
||
" <td>1.516365e+04</td>\n",
|
||
" <td>28.262185</td>\n",
|
||
" <td>7.713112e+02</td>\n",
|
||
" <td>0.050866</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>17224</td>\n",
|
||
" <td>23950.666667</td>\n",
|
||
" <td>5.707084e+05</td>\n",
|
||
" <td>2317.763439</td>\n",
|
||
" <td>5.680641e+04</td>\n",
|
||
" <td>0.099537</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>22481</td>\n",
|
||
" <td>46732.000000</td>\n",
|
||
" <td>1.331044e+06</td>\n",
|
||
" <td>10766.103277</td>\n",
|
||
" <td>2.980696e+05</td>\n",
|
||
" <td>0.223937</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>8520</td>\n",
|
||
" <td>261543.333333</td>\n",
|
||
" <td>1.137481e+07</td>\n",
|
||
" <td>227938.234982</td>\n",
|
||
" <td>1.061902e+07</td>\n",
|
||
" <td>0.933556</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" quartile size nb_tickets total_amount nb_tickets_expected \\\n",
|
||
"0 1 47871 554.666667 1.516365e+04 28.262185 \n",
|
||
"1 2 17224 23950.666667 5.707084e+05 2317.763439 \n",
|
||
"2 3 22481 46732.000000 1.331044e+06 10766.103277 \n",
|
||
"3 4 8520 261543.333333 1.137481e+07 227938.234982 \n",
|
||
"\n",
|
||
" total_amount_expected total_amount_recovered \n",
|
||
"0 7.713112e+02 0.050866 \n",
|
||
"1 5.680641e+04 0.099537 \n",
|
||
"2 2.980696e+05 0.223937 \n",
|
||
"3 1.061902e+07 0.933556 "
|
||
]
|
||
},
|
||
"execution_count": 535,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_expected_CA[\"total_amount_recovered\"] = df_expected_CA[\"total_amount_expected\"]/df_expected_CA[\"total_amount\"]\n",
|
||
"df_expected_CA"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 539,
|
||
"id": "00cc2db8-d20b-4a0b-846c-c6199c58a834",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>count</th>\n",
|
||
" <th>mean</th>\n",
|
||
" <th>std</th>\n",
|
||
" <th>min</th>\n",
|
||
" <th>25%</th>\n",
|
||
" <th>50%</th>\n",
|
||
" <th>75%</th>\n",
|
||
" <th>max</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>47871.0</td>\n",
|
||
" <td>0.033442</td>\n",
|
||
" <td>0.013951</td>\n",
|
||
" <td>0.019591</td>\n",
|
||
" <td>0.019867</td>\n",
|
||
" <td>0.023766</td>\n",
|
||
" <td>0.048136</td>\n",
|
||
" <td>0.052262</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17224.0</td>\n",
|
||
" <td>0.088246</td>\n",
|
||
" <td>0.028737</td>\n",
|
||
" <td>0.052283</td>\n",
|
||
" <td>0.060481</td>\n",
|
||
" <td>0.082054</td>\n",
|
||
" <td>0.115089</td>\n",
|
||
" <td>0.141983</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>22481.0</td>\n",
|
||
" <td>0.222962</td>\n",
|
||
" <td>0.048039</td>\n",
|
||
" <td>0.141993</td>\n",
|
||
" <td>0.183323</td>\n",
|
||
" <td>0.219550</td>\n",
|
||
" <td>0.268865</td>\n",
|
||
" <td>0.331754</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>8520.0</td>\n",
|
||
" <td>0.652198</td>\n",
|
||
" <td>0.201486</td>\n",
|
||
" <td>0.332049</td>\n",
|
||
" <td>0.473052</td>\n",
|
||
" <td>0.640295</td>\n",
|
||
" <td>0.827644</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" count mean std min 25% 50% 75% \\\n",
|
||
"quartile \n",
|
||
"1 47871.0 0.033442 0.013951 0.019591 0.019867 0.023766 0.048136 \n",
|
||
"2 17224.0 0.088246 0.028737 0.052283 0.060481 0.082054 0.115089 \n",
|
||
"3 22481.0 0.222962 0.048039 0.141993 0.183323 0.219550 0.268865 \n",
|
||
"4 8520.0 0.652198 0.201486 0.332049 0.473052 0.640295 0.827644 \n",
|
||
"\n",
|
||
" max \n",
|
||
"quartile \n",
|
||
"1 0.052262 \n",
|
||
"2 0.141983 \n",
|
||
"3 0.331754 \n",
|
||
"4 1.000000 "
|
||
]
|
||
},
|
||
"execution_count": 539,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# la part de CA recouvrée est tjs supérieure à la part de clients qui reviennent\n",
|
||
"# ça semble logique : ceux qui reviennent sont aussi ceux qui consomment le plus \n",
|
||
"# se voit srtt sur dernier quartile : on récupère 65% des clients (avec probas ajustées) mais 93% du CA \n",
|
||
"X_test.groupby(\"quartile\")[\"score_adjusted\"].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "59a0850a-c40d-472a-9361-e96840e2b046",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Study potential of each segment"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 180,
|
||
"id": "1773bac2-ab5e-4bca-bda5-aa13e36991e5",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1wAAAIjCAYAAAAX5hpkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB8hklEQVR4nO3dd3QV1eL28eek90MSSEIkQIDQQxcIoIB0jKiooHARBHuBKEW5XAUsVCleEQREooDEBlxskSJE6UUiUkRRqiSAGkJPINnvH7yZH4cESEIOoXw/a521cmb2zOw5s095smf22IwxRgAAAACAIudS3BUAAAAAgBsVgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQtAnrKystS8eXM1a9ZMp0+fLu7qAACuQ3yXAASu61p8fLxsNpv18PLyUlhYmFq2bKmRI0fq0KFDuZYZNmyYbDZbgbZz8uRJDRs2TMuXLy/Qcnltq3z58oqNjS3Qei7no48+0sSJE/OcZ7PZNGzYsCLd3pUozOvvLC1atFCLFi0uOn/IkCE6dOiQFi5cKC8vL4d55cuXV69evQq13StZFs5x4MABDRs2TMnJycVdFfXq1Uvly5cv7mpcNUX9mVjYz+uiUFTtKOe7bffu3UVSr+XLl8tmszm8JsOGDbtm2tm19j2VX5MnT1Z8fPxly13qu6QgLvedVVSK+3u6uLdfWLt375bNZtObb75ZZOvctm2bhg0bVmSfBcXJrbgrgCs3c+ZMVa1aVWfOnNGhQ4e0YsUKjR49Wm+++aY+/vhjtW7d2ir76KOPqn379gVa/8mTJzV8+HBJKtCHXWG2VRgfffSRtmzZori4uFzzVq9erTJlyji9Djear776SrNmzdKqVasUFBRUpOueP3++AgICinSduDIHDhzQ8OHDVb58edWpU6e4q4MrUNjP66JAOyqc6/V7avLkySpZsuQl/4HmzO+SG9XV+u10Pdi2bZuGDx+uFi1aXDP/ICksAtcNoGbNmmrQoIH1/L777tPzzz+vZs2aqXPnzvrtt98UGhoqSSpTpozTP9hPnjwpHx+fq7Kty2ncuHGxbv96deedd+rPP/90yrrr1q3rlPXi6sl5jwO4cjfy95Qzv0uuFwX9vCzq3058Xl8bOKXwBlW2bFmNGzdOx44d09SpU63peXVVf/fdd2rRooWCg4Pl7e2tsmXL6r777tPJkye1e/dulSpVSpI0fPhw6/TFnP9o5azvxx9/1P3336/AwEBVrFjxotvKMX/+fNWqVUteXl6qUKGC/vvf/zrMv9gpJReeGtKiRQt99dVX2rNnj8PplTnyOlVjy5YtuvvuuxUYGCgvLy/VqVNHH3zwQZ7bmTt3roYMGaLw8HAFBASodevW2rFjx8Vf+PN89dVXqlOnjjw9PRUZGXnRbnZjjCZPnqw6derI29tbgYGBuv/++/XHH384lNu0aZNiY2MVEhIiT09PhYeH684779T+/fsvWQ9jjMaMGaNy5crJy8tL9erV0zfffJNn2aNHj2rAgAGKjIyUh4eHbrnlFsXFxenEiROX3Mbp06fVv39/1alTR3a7XUFBQYqJidH//ve/XGUvPKUwOztbr7/+uqpUqSJvb2+VKFFCtWrV0ltvvXXJbeYco48++kgvvviiSpcuLT8/P9111106ePCgjh07pscff1wlS5ZUyZIl9cgjj+j48eO56j148GCH/X3mmWd05MgRq0yfPn0UFBSkkydP5qrDHXfcoRo1aljP83ssW7RooZo1a2r9+vW67bbb5OPjowoVKmjUqFHKzs6+5H4X9XaWL1+uW2+9VZL0yCOPWO+hnPdNr1695Ofnp59//llt27aVv7+/WrVqJUnKzMzU66+/rqpVq8rT01OlSpXSI488osOHD192H6Rz7/MqVarI09NT1apV04cffphnufxu52KnZp3f5owx6tixo4KDg7V3716rzMmTJ1WjRg1Vq1btku29IG09Oztbb7/9tnWcSpQoocaNG2vhwoW5yiYmJqpevXry9vZW1apV9f777zvMP3z4sJ5++mlVr15dfn5+CgkJ0R133KEffvjBKnO5z+vDhw/r8ccfV0REhPU6Nm3aVEuWLLno/ub47bff1K1bN+vzp1q1anrnnXes+ZdrRxezZs0aNW3aVF5eXgoPD9fgwYN15syZPMt+/PHHiomJka+vr/z8/NSuXTtt2rTpsnXPr3feeUe33367QkJC5Ovrq+joaI0ZMyZXfQry/j1y5Ij69++vChUqyNPTUyEhIerYsaN++eUXq0xer1NqaqqeeOIJlSlTRh4eHoqMjNTw4cN19uxZq8z5p3CNHz9ekZGR8vPzU0xMjNasWeOwvpz38c6dO9WxY0f5+fkpIiJC/fv3V0ZGhkPZ/Lzfypcvr61btyopKck61uf3QBT2u0TK/3dWfn8nXEpRf0/ntI3vv/9eTZo0kY+Pj3r37l2gY3Wx3075af+X+rzOy86dO/XII48oKipKPj4+uuWWW3TXXXfp559/zlU2P205x+X2ccOGDXrwwQdVvnx5eXt7q3z58nrooYe0Z88eq0x8fLweeOABSVLLli2tdpaf01ivSQbXrZkzZxpJZv369XnOP378uHF1dTWtWrWypg0dOtScf9h37dplvLy8TJs2bcyCBQvM8uXLzZw5c0yPHj1MWlqaOX36tElMTDSSTJ8+fczq1avN6tWrzc6dOx3WV65cOfPiiy+axYsXmwULFuS5LWOMKVeunLnllltM2bJlzfvvv2++/vpr0717dyPJjB07Nte+7dq1y2H5ZcuWGUlm2bJlxhhjtm7dapo2bWrCwsKsuq1evdoqL8kMHTrUev7LL78Yf39/U7FiRfPhhx+ar776yjz00ENGkhk9enSu7ZQvX950797dfPXVV2bu3LmmbNmyJioqypw9e/aSx2bJkiXG1dXVNGvWzMybN898+umn5tZbbzVly5bN9Zo89thjxt3d3fTv398kJiaajz76yFStWtWEhoaa1NRU61gGBwebBg0amE8++cQkJSWZjz/+2Dz55JNm27Ztl6xLznHo06eP+eabb8y0adPMLbfcYsLCwkzz5s2tcidOnDB16tQxJUuWNOPHjzdLliwxb731lrHb7eaOO+4w2dnZDsexZ8+e1vMjR46YXr16mVmzZpnvvvvOJCYmmgEDBhgXFxfzwQcfONTnwmVHjhxpXF1dzdChQ83SpUtNYmKimThxohk2bNgl9yvnGJUrV8706tXLJCYmmnfffdf4+fmZli1bmjZt2pgBAwaYRYsWmdGjRxtXV1fz3HPPWctnZ2ebdu3aGTc3N/Pyyy+bRYsWmTfffNP4+vqaunXrmtOnTxtjjPnpp5+MJDN9+nSH7W/dutVIMu+8806BjqUxxjRv3twEBwebqKgo8+6775rFixebp59+2kjK9XrlpSi3k56ebr3f/vOf/1jvoX379hljjOnZs6dxd3c35cuXNyNHjjRLly413377rcnKyjLt27c3vr6+Zvjw4Wbx4sXmvffeM7fccoupXr26OXny5CX3IWeb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unVzOHWmXLlyatKkSZFt51KaNm2qN954QxMnTtRTTz2lf/3rX+rTp0++ls1PW885BeqZZ5657Prq1KmjsmXLWs+9vLxUuXLlXMfo3XffVb169eTl5WVtd+nSpZd9j+Vo2LCh4uPj9frrr2vNmjUXPXXvfKdPn9bSpUt17733ysfHx+EYdOzYUadPn851ulB+LVu2TK1atbKuMZYkV1dXde3a1aHct99+q7Nnz+rhhx922L6Xl5eaN29eZCMybtq0SZ06dVJwcLBcXV3l7u6uhx9+WFlZWfr1118dyubnffXNN9+ocuXKDgNX5ceXX36pli1bKjw83GF/O3ToIElKSkpyKH/nnXfK1dXVoR5S7u8pm82W6zvowjoXxfvtSr5LCvKddSWc8T2dIzAwUHfccUee283vsTpfYdp/fn+TnT17ViNGjFD16tXl4eEhNzc3eXh46Lfffsv1eZbftpyffTx+/LhefPFFVapUSW5ubnJzc5Ofn59OnDiR78+z6w2B6wZ24sQJ/f333woPD79omYoVK2rJkiUKCQnRM888o4oVK6pixYqXvX7mQqVLl8532bCwsItO+/vvvwu03YL6+++/86xrzmt04faDg4Mdnnt6ekqSTp06ddFtpKWlKTs7+5L7mePgwYMyxig0NFTu7u4OjzVr1uivv/6SJNntdiUlJalOnTr697//rRo1aig8PFxDhw695I+mnP3Jb102b96cqx7+/v4yxlh1ycu8efPUpUsX3XLLLZo9e7ZWr16t9evXq3fv3pe978rgwYP15ptvas2aNerQoYOCg4PVqlUrbdiw4ZLL5bhw5CsPD49LTs+pz99//y03NzfrmpccNptNYWFhDm3h7rvvVvny5a1rVuLj43XixAmHH9P5PZY5Lmxb0rn2dam2dTW3cz4fH59cI0sePHhQR44ckYeHR656pKamXrK9FLRdFnY7l9O9e3d5eHgoIyNDAwcOzNcy+W3rhw8flqura577eKH8HKPx48frqaeeUqNGjfT5559rzZo1Wr9+vdq3b5/vY/nxxx+rZ8+eeu+99xQTE6OgoCA9/PDDSk1Nvegyf//9t86ePau333471+vfsWNHSSr0Mfj777/z3QYk6dZbb81Vh48//viK2kCOvXv36rbbbtOff/6pt956Sz/88IPWr19vvecvfI3zc8wOHz5cqMEPDh48qC+++CLXvuZcL3q59/jFvqd8fHxyDcvu6enp0G6L4v12Jd8lBflsuBLO+J7OcanfQ4X5TVHQ9p/X5/XFvPDCC3r55Zd1zz336IsvvtDatWu1fv161a5du9BtOT/72K1bN02aNEmPPvqovv32W61bt07r169XqVKlCvTddD1hlMIb2FdffaWsrKzLDg1822236bbbblNWVpY2bNigt99+W3FxcQoNDdWDDz6Yr20V5J4ReX2550zLeaPmfClceDHvlX6xBgcHKyUlJdf0AwcOSJJKlix5ReuXzv13y2azXXI/c5QsWVI2m00//PCD9aF0vvOnRUdHKyEhQcYYbd68WfHx8Xr11Vfl7e2tl156Kc+65LyeF6vL+Rc5lyxZUt7e3rku1j9//sXMnj1bkZGR+vjjjx3awoXHLy9ubm564YUX9MILL+jIkSNasmSJ/v3vf6tdu3bat2+f00ZXCg4O1tmzZ3X48GGH0GWMUWpqqjUAgCS5uLjomWee0b///W+NGzdOkydPVqtWrVSlShWrTEGO5ZW4Wts5X17v75IlSyo4OFiJiYl5LuPv73/R9V2uXRZ2O56ennm2ubz+kZOVlaXu3bsrMDBQnp6e6tOnj1auXGkF84vJb1svVaqUsrKylJqaWqB/SF1quy1atNCUKVMcph87dizf6yhZsqQmTpyoiRMnau/evVq4cKFeeuklHTp06KKvb2BgoFxdXdWjR4+L9tZFRkbmf0fOExwcnO82IEmfffZZkfZynG/BggU6ceKE5s2b57CNK7mnWKlSpS47qFFeSpYsqVq1aumNN97Ic/6l/ol6pa7kfX3+Ogr7XVKQ76wr+Z3grO9pqWC/h/KjoO2/INufPXu2Hn74YY0YMcJh+l9//aUSJUpYzwvblvOSnp6uL7/8UkOHDnX47ZKRkaF//vmnSLZxLSJw3aD27t2rAQMGyG6364knnsjXMq6urmrUqJGqVq2qOXPm6Mcff9SDDz6Yr//AFMTWrVv1008/OZxW+NFHH8nf31/16tWTJOtDdfPmzQ4/avMa3asg/61v1aqV5s+frwMHDjh8aX344Yfy8fEpkuF5fX191bBhQ82bN09jx461vhSOHTumL774wqFsbGysRo0apT///FNdunTJ1/ptNptq166tCRMmKD4+/pKnYTZu3FheXl6aM2eOwykGq1at0p49exy+vGJjYzVixAgFBwcX+AeUzWaTh4eHwwd9ampqniO3XUqJEiV0//33688//1RcXJx2796t6tWrF2gd+dWqVSuNGTNGs2fP1vPPP29N//zzz3XixIlcIzs9+uijGjZsmLp3764dO3Zo9OjRDvMLcywLwxnbKcx7PDY2VgkJCcrKylKjRo0KtL0qVaqodOnSmjt3rl544QWr3ezZs0erVq1yeG8WZDvly5fX5s2bHaZ99913uUanlKShQ4fqhx9+0KJFi+Tr66vbb79dAwcOvGzvfn7beocOHTRy5EhNmTJFr7766iXXmR82my3XD7vNmzdr9erVDqdI5/dYli1bVs8++6yWLl1qnSqbFx8fH7Vs2VKbNm1SrVq1LhlIC9qOWrZsqYULF+rgwYPWaYVZWVn6+OOPHcq1a9dObm5u+v333wt0+npB5BzP819jY4ymT59e6HV26NBBr7zyir777ruLnmKWl9jYWH399deqWLGiAgMDC739wijI++1i371X8l1SkO+sgvxOuJCzv6eLkjPbf16fK1999ZX+/PNPVapUyZpW2LZ8sW0aY3Jt97333lNWVpbDtKL+/VmcCFw3gC1btljn9B46dEg//PCDZs6cKVdXV82fPz/XKVPne/fdd/Xdd9/pzjvvVNmyZXX69Gnrv1I55+r6+/urXLly+t///qdWrVopKChIJUuWLPRN6MLDw9WpUycNGzZMpUuX1uzZs7V48WKNHj3a6s249dZbVaVKFQ0YMEBnz55VYGCg5s+frxUrVuRaX3R0tObNm6cpU6aofv36cnFxcbgv2fmGDh1qnR//yiuvKCgoSHPmzNFXX32lMWPGyG63F2qfLvTaa6+pffv2atOmjfr376+srCyNHj1avr6+Dv/Badq0qR5//HE98sgj2rBhg26//Xb5+voqJSVFK1asUHR0tJ566il9+eWXmjx5su655x5VqFBBxhjNmzdPR44cUZs2bS5aj8DAQA0YMECvv/66Hn30UT3wwAPat2+fhg0bluu0ibi4OH3++ee6/fbb9fzzz6tWrVrKzs7W3r17tWjRIvXv3/+iX8CxsbGaN2+enn76ad1///3at2+fXnvtNZUuXVq//fbbJV+ru+66y7qXXKlSpbRnzx5NnDhR5cqVU1RUVAFe9YJp06aN2rVrpxdffFFHjx5V06ZNtXnzZg0dOlR169ZVjx49HMqXKFFC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lLlkGQJXPvn7+0s696IGBAQUc20AAAAAFJejR48qIiLCygiXQuDKp5zTCAMCAghcAAAAAPJ1qRGDZgAAAACAkxC4AAAAAMBJCFwAAAAA4CRcwwUAAFBEsrKydObMmeKuBoAi4OHhcdkh3/ODwAUAAHCFjDFKTU3VkSNHirsqAIqIi4uLIiMj5eHhcUXrIXABAABcoZywFRISIh8fn3yNXAbg2pWdna0DBw4oJSVFZcuWvaL3NIELAADgCmRlZVlhKzg4uLirA6CIlCpVSgcOHNDZs2fl7u5e6PUwaAYAAMAVyLlmy8fHp5hrAqAo5ZxKmJWVdUXrIXABAAAUAU4jBG4sRfWeJnABAAAAgJMQuAAAAAAnGzZsmOrUqVPc1bis3bt3y2azKTk5Od/LtGjRQnFxcU6r0/WOQTMAAACcZMLiX6/atp5vU/mqbQtA/tHDBQAAgKsiKytL2dnZxV2NIpeZmVncVcA1jMAFAABwE0pMTFSzZs1UokQJBQcHKzY2Vr///rs1PyYmRi+99JLDMocPH5a7u7uWLVsm6VzQGDRokG655Rb5+vqqUaNGWr58uVU+Pj5eJUqU0Jdffqnq1avL09NTe/bs0fr169WmTRuVLFlSdrtdzZs3148//uiwrV9++UXNmjWTl5eXqlevriVLlshms2nBggVWmT///FNdu3ZVYGCggoODdffdd2v37t0X3efly5fLZrPpq6++Uu3ateXl5aVGjRrp559/tsrkderfxIkTVb58eet5r169dM8992jkyJEKDw9X5crnehf379+vBx98UEFBQfL19VWDBg20du1ah3XNmjVL5cuXl91u14MPPqhjx47l+5hkZmbq2WefVenSpeXl5aXy5ctr5MiR1vz09HQ9/vjjCgkJUUBAgO644w799NNPF309JGndunWqW7euvLy81KBBA23atClXmW3btqljx47y8/NTaGioevToob/++uui65w9e7YaNGggf39/hYWFqVu3bjp06JCkczcJr1Spkt58802HZbZs2SIXFxeH/b1RELgAAABuQidOnNALL7yg9evXa+nSpXJxcdG9995r9UB1795dc+fOlTHGWubjjz9WaGiomjdvLkl65JFHtHLlSiUkJGjz5s164IEH1L59e/3222/WMidPntTIkSP13nvvaevWrQoJCdGxY8fUs2dP/fDDD1qzZo2ioqLUsWNHK3xkZ2frnnvukY+Pj9auXatp06ZpyJAhDvU/efKkWrZsKT8/P33//fdasWKF/Pz81L59+8v2OA0cOFBvvvmm1q9fr5CQEHXq1Mka3j+/li5dqu3bt2vx4sX68ssvdfz4cTVv3lwHDhzQwoUL9dNPP2nQoEEOPXq///67FixYoC+//FJffvmlkpKSNGrUqHwfk//+979auHChPvnkE+3YsUOzZ8+2gqAxRnfeeadSU1P19ddfa+PGjapXr55atWqlf/75J899OHHihGJjY1WlShVt3LhRw4YN04ABAxzKpKSkqHnz5qpTp442bNigxMREHTx4UF26dLnoa5OZmanXXntNP/30kxYsWKBdu3apV69eks6N/Ne7d2/NnDnTYZn3339ft912mypWrJjvY3C94BouAACAm9B9993n8HzGjBkKCQnRtm3bVLNmTXXt2lXPP/+8VqxYodtuu02S9NFHH6lbt25WT8TcuXO1f/9+hYeHS5IGDBigxMREzZw5UyNGjJB07j5lkydPVu3ata1t3XHHHQ7bnjp1qgIDA5WUlKTY2FgtWrRIv//+u5YvX66wsDBJ0htvvKE2bdpYyyQkJMjFxUXvvfeeNXz3zJkzVaJECS1fvlxt27a96L4PHTrUWtcHH3ygMmXKaP78+ZcMERfy9fXVe++9Z92radq0aTp8+LDWr1+voKAgSVKlSpUclsnOzlZ8fLz8/f0lST169NDSpUv1xhtvSLr8Mdm7d6+ioqLUrFkz2Ww2lStXziq7bNky/fzzzzp06JA8PT0lSW+++aYWLFigzz77TI8//niufZgzZ46ysrL0/vvvy8fHRzVq1ND+/fv11FNPWWWmTJmievXqWcdTOheOIiIi9Ouvv1q9e+fr3bu39XeFChX03//+Vw0bNtTx48fl5+enRx55RK+88orWrVunhg0b6syZM5o9e7bGjh2bj1f++kMPFwAAwE3o999/V7du3VShQgUFBAQoMjJSkrR3715JUqlSpdSmTRvNmTNHkrRr1y6tXr1a3bt3lyT9+OOPMsaocuXK8vPzsx5JSUkOp4V5eHioVq1aDts+dOiQnnzySVWuXFl2u112u13Hjx+3tr1jxw5FRERYYUuSGjZs6LCOjRs3aufOnfL397e2HRQUpNOnT1/2tLSYmBjr76CgIFWpUkXbt28v0OsXHR1thS1JSk5OVt26da2wlZfy5ctbYUuSSpcubZ1qJ13+mPTq1UvJycmqUqWK+vbtq0WLFlnLbty4UcePH1dwcLDD8di1a9dFX4/t27erdu3aDjftPv+1yVnvsmXLHNZZtWpVq7552bRpk+6++26VK1dO/v7+atGihcN+lC5dWnfeeafef/99SdKXX36p06dP64EHHrjoa3c9K9YervLly2vPnj25pj/99NN65513ZIzR8OHDNW3aNKWlpalRo0Z65513VKNGDatsRkaGBgwYoLlz5+rUqVNq1aqVJk+erDJlylhl0tLS1LdvXy1cuFCS1KlTJ7399tsqUaKE0/cRAADgWnTXXXcpIiJC06dPV3h4uLKzs1WzZk2H0/G6d++ufv366e2339ZHH32kGjVqWD1V2dnZcnV11caNG+Xq6uqwbj8/P+tvb2/vXDeQ7dWrlw4fPqyJEyeqXLly8vT0VExMjLVtY8xlbzqbnZ2t+vXrW4HwfKVKlSrYi6H/u8mti4uLw2mUkvI83dDX19fhube392W34e7unmub559yeLljUq9ePe3atUvffPONlixZoi5duqh169b67LPPlJ2drdKlSztcQ5fjYr95L9zPvGRnZ+uuu+7S6NGjc80rXbp0rmknTpxQ27Zt1bZtW82ePVulSpXS3r171a5dO4e29eijj6pHjx6aMGGCZs6cqa5duzoEvxtJsQau9evXKysry3q+ZcsWtWnTxkq3Y8aM0fjx4xUfH6/KlSvr9ddfV5s2bbRjxw7rvwNxcXH64osvlJCQoODgYPXv31+xsbEOb/5u3bpp//79SkxMlCQ9/vjj6tGjh7744ourvMcAAADF7++//9b27ds1depU63TBFStW5Cp3zz336IknnlBiYqI++ugj9ejRw5pXt25dZWVl6dChQ9Y68uuHH37Q5MmT1bFjR0nSvn37HAZhqFq1qvbu3auDBw8qNDRU0rnfjeerV6+ePv74Y2uAiIJYs2aNypYtK+ncP+Z//fVXq9emVKlSSk1NdQh9+bknVa1atfTee+/pn3/+uWQv18Xk95gEBASoa9eu6tq1q+6//361b99e//zzj+rVq6fU1FS5ubk5DPBxKdWrV9esWbN06tQpKzCuWbPGoUy9evX0+eefq3z58nJzu3x0+OWXX/TXX39p1KhRioiIkCRt2LAhV7mOHTvK19dXU6ZM0TfffKPvv/8+X3W+HhVr4Lrwvw+jRo1SxYoV1bx5cxljNHHiRA0ZMkSdO3eWdO4c29DQUH300Ud64oknlJ6erhkzZmjWrFlq3bq1pHOjokRERGjJkiVq166dtm/frsTERK1Zs0aNGjWSJE2fPl0xMTHasWOHqlSpcnV3ughdzXt7XAr3/QAA4PqSM6rftGnTVLp0ae3duzfXiITSuV6cu+++Wy+//LK2b9+ubt26WfMqV66s7t276+GHH9a4ceNUt25d/fXXX/ruu+8UHR1tham8VKpUSbNmzVKDBg109OhRDRw40KGHqE2bNqpYsaJ69uypMWPG6NixY9agGTkhqHv37ho7dqzuvvtuvfrqqypTpoz27t2refPmaeDAgQ5nO13o1VdfVXBwsEJDQzVkyBCVLFlS99xzj6RzN/E9fPiwxowZo/vvv1+JiYn65ptvLhvqHnroIY0YMcIavbB06dLatGmTwsPDc52ml5f8HJMJEyaodOnSqlOnjlxcXPTpp58qLCxMJUqUUOvWrRUTE6N77rlHo0ePVpUqVXTgwAF9/fXXuueee9SgQYNc2+zWrZuGDBmiPn366D//+Y92796da/TAZ555RtOnT9dDDz2kgQMHqmTJktq5c6cSEhI0ffr0XL2bZcuWlYeHh95++209+eST2rJli1577bVc23Z1dVWvXr00ePBgVapUKV+v0fXqmrmGKzMzU7Nnz1bv3r1ls9m0a9cupaamOlzw6OnpqebNm2vVqlWSzp1TeubMGYcy4eHhqlmzplVm9erVstvtVtiSpMaNG8tut1tlAAAAbiYuLi5KSEjQxo0bVbNmTT3//PMXHbCge/fu+umnn3TbbbdZvUI5Zs6cqYcfflj9+/dXlSpV1KlTJ61du9bq2biY999/X2lpaapbt6569Oihvn37KiQkxJrv6uqqBQsW6Pjx47r11lv16KOP6j//+Y8kycvLS5Lk4+Oj77//XmXLllXnzp1VrVo19e7dW6dOnbpsOBo1apT69eun+vXrKyUlRQsXLrSux6pWrZomT56sd955R7Vr19a6detyjdyXFw8PDy1atEghISHq2LGjoqOjNWrUqFyB5GLyc0z8/Pw0evRoNWjQQLfeeqt2796tr7/+Wi4uLrLZbPr66691++23q3fv3qpcubIefPBB7d692+olvJCfn5+++OILbdu2TXXr1tWQIUNynToYHh6ulStXKisrS+3atVPNmjXVr18/2e12ubjkjhKlSpVSfHy8Pv30U1WvXl2jRo3KFeJy9OnTR5mZmQ6DbNyIbCY/J29eBZ988om6deumvXv3Kjw8XKtWrVLTpk31559/WiPfSOdOB9yzZ4++/fZbffTRR3rkkUeUkZHhsK62bdsqMjJSU6dO1YgRIxQfH69ff3XsDapcubIeeeQRDR48OM/6ZGRkOKz36NGjioiIUHp6eoG7rZ2FHi4AAIrf6dOntWvXLkVGRlphAEVv5cqVatasmXbu3FnoocOXL1+uli1bKi0tjWv5rwErV65UixYttH///ouGwuJ0qff20aNHZbfb85UNrplh4WfMmKEOHTo4hCtJuS6YzM9FlBeWyav85dYzcuRIDR8+PD9VBwAAQBGbP3++/Pz8FBUVpZ07d6pfv35q2rTpDXmfpptNRkaG9u3bp5dfflldunS5JsNWUbomTincs2ePlixZokcffdSaljMMaGpqqkPZQ4cOWQclLCxMmZmZSktLu2SZgwcP5trm4cOHL3lwBw8erPT0dOuxb9++wu0cAAAACuzYsWN6+umnVbVqVfXq1Uu33nqr/ve//xV3tVAE5s6dqypVqig9PV1jxowp7uo43TURuGbOnKmQkBDdeeed1rTIyEiFhYVp8eLF1rTMzEwlJSWpSZMmkqT69evL3d3doUxKSoq2bNlilYmJiVF6errWrVtnlVm7dq3S09OtMnnx9PRUQECAwwMAAABXx8MPP6zffvtNp0+f1v79+xUfH6/g4OArWmeLFi1kjOF0wmLWq1cvZWVlaePGjbrllluKuzpOV+ynFGZnZ2vmzJnq2bOnw1CTNptNcXFxGjFihKKiohQVFaURI0bIx8fHGiHHbrerT58+6t+/v4KDgxUUFKQBAwYoOjraGrWwWrVqat++vR577DFNnTpV0rnrwGJjY6/rEQoBAAAAXPuKPXAtWbJEe/fuzXN0kkGDBunUqVN6+umnrRsfL1q0yOEO3RMmTJCbm5u6dOli3fg4Pj7eYUSYOXPmqG/fvtZohp06ddKkSZOcv3MAAAAAbmrXzCiF17qCjERytTBKIQAAxY9RCoEbU1GNUnhNXMMFAAAAADciAhcAAAAAOAmBCwAAAACchMAFAACAm94vv/yixo0by8vLS3Xq1Mn3csuXL5fNZtORI0eKtD69evXSPffcU6TrvJbFx8ffsMP1F/sohQAAADesZSOv3rZaDr5627oBDR06VL6+vtqxY4f8/PzyLNOiRQvVqVNHEydOvLqVKwI2m03z58+/qULctYIeLgAAACgzM7O4q1Csfv/9dzVr1kzlypW74hssw9GZM2eKuwrFisAFAABwE2rRooWeffZZvfDCCypZsqTatGkjSdq2bZs6duwoPz8/hYaGqkePHvrrr7+s5bKzszV69GhVqlRJnp6eKlu2rN544w1r/p9//qmuXbsqMDBQwcHBuvvuu7V7925rfs6pcm+++aZKly6t4OBgPfPMMw4/yjMyMjRo0CBFRETI09NTUVFRmjFjhowxqlSpkt58802HfdmyZYtcXFz0+++/57mv2dnZevXVV1WmTBl5enqqTp06SkxMtObbbDZt3LhRr776qmw2m4YNG5ZrHb169VJSUpLeeust2Ww22Ww2h/3auHGjGjRoIB8fHzVp0kQ7duxwWP6LL75Q/fr15eXlpQoVKmj48OE6e/bsxQ/QBRITE9WsWTOVKFFCwcHBio2NddjfzMxMPfvssypdurS8vLxUvnx5jRx5roe1fPnykqR7771XNpvNen6h3bt3y2azKSEhQU2aNJGXl5dq1Kih5cuXW2XyOvVvwYIFstls1vNhw4apTp06ev/991WhQgV5enrKGKMjR47o8ccfV2hoqLy8vFSzZk19+eWXDuv69ttvVa1aNfn5+al9+/ZKSUmx5q1fv15t2rRRyZIlZbfb1bx5c/34448Oyw8bNkxly5aVp6enwsPD1bdvX4fXaNCgQbrlllvk6+urRo0aOeybsxC4AAAAblIffPCB3NzctHLlSk2dOlUpKSlq3ry56tSpow0bNigxMVEHDx5Uly5drGUGDx6s0aNH6+WXX9a2bdv00UcfKTQ0VJJ08uRJtWzZUn5+fvr++++1YsUK64fz+T1oy5Yt0++//65ly5bpgw8+UHx8vOLj4635Dz/8sBISEvTf//5X27dv17vvvis/Pz/ZbDb17t1bM2fOdNiP999/X7fddpsqVqyY536+9dZbGjdunN58801t3rxZ7dq1U6dOnfTbb79JklJSUlSjRg31799fKSkpGjBgQJ7riImJ0WOPPaaUlBSlpKQoIiLCmj9kyBCNGzdOGzZskJubm3r37m3N+/bbb/Wvf/1Lffv21bZt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xF2ubmvXrtXu3but0yXz45VXXlFsbKwiIiL0wAMPyMXFRZs3b9bPP/+s119//bLL54z4OG3aNJUuXVp79+7VSy+95FBmwoQJKl26tOrUqSMXFxd9+umnCgsLs0YULF++vJYuXaqmTZvK09NTgYGBF93eO++8o6ioKFWrVk0TJkxQWlqaNQhIo0aN5OPjo3//+9967rnntG7dOocBTy6mefPmuv3223Xfffdp/PjxqlSpkn755RfZbDa1b9/+sstL5645nDVrlho0aKCjR49q4MCBDj1n8fHxysrKsuo4a9YseXt7W0P9d+/eXQ8//LDGjRununXr6q+//tJ3332n6OhoK8Q5A9dwAQAAQJIUHh6ulStXKisrS+3atVPNmjXVr18/2e12ubic+9n48ssvq3///nrllVdUrVo1de3a1brOxsfHR99//73Kli2rzp07q1q1aurdu7dOnTpVoB6vKVOm6P7779fTTz+tqlWr6rHHHtOJEyccyvTp00eZmZkOowFeTN++fdW/f3/1799f0dHRSkxM1MKFCxUVFVWAV+fcIAuurq6qXr26SpUqZV07dDnt2rXTl19+qcWLF+vWW29V48aNNX78eIeBLS7FxcVFCQkJ2rhxo2rWrKnnn38+1yAhfn5+Gj16tBo0aKBbb71Vu3fv1tdff20dt3Hjxmnx4sWKiIhQ3bp1L7m9UaNGafTo0apdu7Z++OEH/e9//1PJkiUlSUFBQZo9e7a+/vprRUdHa+7cuXkOo5+Xzz//XLfeeqseeughVa9eXYMGDSpQj+H777+vtLQ01a1bVz169FDfvn0VEhJizS9RooSmT5+upk2bqlatWlq6dKm++OIL675qM2fO1MMPP6z+/furSpUq6tSpk9auXesw2qQz2MyFJ2EiT0ePHpXdbld6enqhu8iL2oTFvxZ3FSRJz7cpXLcwAAA3gtOnT2vXrl2KjIzM9/U4uHIrV65UixYttH//fmtYelyZ3bt3KzIyUps2bVKdOnWKuzrF7lLv7YJkA04pBAAAwHUjIyND+/bt08svv6wuXboQtnDN45RCAAAAXDfmzp2rKlWqKD093eEeYsC1ih4uAAAAXDd69eqlXr16FXc1bkjly5fPNeQ7rhw9XAAAAADgJAQuAACAIkDPAHBjKar3NIELAADgCri7u0uSTp48Wcw1AVCUMjMzJZ2779uV4BouAACAK+Dq6qoSJUo43IvKZrMVc60AXIns7GwdPnxYPj4+cnO7sshE4AIAALhCYWFhkmSFLgDXPxcXF5UtW/aK/4FC4AIAALhCNptNpUuXVkhIiM6cOVPc1QFQBDw8POTicuVXYBG4AAAAioirq+sVX+8B4MbCoBkAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADhJsQeuP//8U//6178UHBwsHx8f1alTRxs3brTmG2M0bNgwhYeHy9vbWy1atNDWrVsd1pGRkaHnnntOJUuWlK+vrzp16qT9+/c7lElLS1OPHj1kt9tlt9vVo0cPHTly5GrsIgAAAICbVLEGrrS0NDVt2lTu7u765ptvtG3bNo0bN04lSpSwyowZM0bjx4/XpEmTtH79eoWFhalNmzY6duyYVSYuLk7z589XQkKCVqxYoePHjys2NlZZWVlWmW7duik5OVmJiYlKTExUcnKyevTocTV3FwAAAMBNxmaMMcW18ZdeekkrV67UDz/8kOd8Y4zCw8MVFxenF198UdK53qzQ0FCNHj1aTzzxhNLT01WqVCnNmjVLXbt2lSQdOHBAERER+vrrr9WuXTtt375d1atX15o1a9SoUSNJ0po1axQTE6NffvlFVapUuWxdjx49KrvdrvT0dAUEBBTRK3BlJiz+tbirIEl6vk3l4q4CAAAAcNUUJBsUaw/XwoUL1aBBAz3wwAMKCQlR3bp1NX36dGv+rl27lJqaqrZt21rTPD091bx5c61atUqStHHjRp05c8ahTHh4uGrWrGmVWb16tex2uxW2JKlx48ay2+1WmQtlZGTo6NGjDg8AAAAAKIhiDVx//PGHpkyZoqioKH377bd68skn1bdvX3344YeSpNTUVElSaGiow3KhoaHWvNTUVHl4eCgwMPCSZUJCQnJtPyQkxCpzoZEjR1rXe9ntdkVERFzZzgIAAAC46RRr4MrOzla9evU0YsQI1a1bV0888YQee+wxTZkyxaGczWZzeG6MyTXtQheWyav8pdYzePBgpaenW499+/bld7cAAAAAQFIxB67SpUurevXqDtOqVaumvXv3SpLCwsIkKVcv1KFDh6xer7CwMGVmZiotLe2SZQ4ePJhr+4cPH87Ve5bD09NTAQEBDg8AAAAAKIhiDVxNmzbVjh07HKb9+uuvKleunCQpMjJSYWFhWrx4sTU/MzNTSUlJatKkiSSpfv36cnd3dyiTkpKiLVu2WGViYmKUnp6udevWWWXWrl2r9PR0qwwAAAAAFDW34tz4888/ryZNmmjEiBHq0qWL1q1bp2nTpmnatGmSzp0GGBcXpxEjRigqKkpRUVEaMWKEfHx81K1bN0mS3W5Xnz591L9/fwUHBysoKEgDBgxQdHS0WrduLelcr1n79u312GOPaerUqZKkxx9/XLGxsfkaoRAAAAAACqNYA9ett96q+fPna/DgwXr11VcVGRmpiRMnqnv37laZQYMG6dSpU3r66aeVlpamRo0aadGiRfL397fKTJgwQW5uburSpYtOnTqlVq1aKT4+Xq6urlaZOXPmqG/fvtZohp06ddKkSZOu3s4CAAAAuOkU6324rifch+viuA8XAAAAbibXzX24AAAAAOBGRuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACchcAEAAACAk7gV58aHDRum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AwcOVFBQkMqWLasxY8bo5MmT6tOnjySpUaNG8vHx0b///W8999xzWrdunTXq4qWsXbtWS5cuVdu2bRUSEqK1a9fq8OHDVpCTpB9++EG33XabdWohAKB40MMFACh2Y8eO1e23365OnTqpdevWatasmerXr+9QZty4cYqIiNDtt9+ubt26acCAAfLx8bnsuh999FG99957io+PV3R0tJo3b674+Hirh8vHx0fff/+9ypYtq86dO6tatWrq3bu3Tp06pYCAgIuu9/HHH1dCQoJ12mJeRo0apfvuu089evRQvXr1tHPnTn377bfWtVZBQUGaPXu2vv76a0VHR2vu3LkaNmzYZfcpICBA33//vTp27KjKlSvrP//5j8aNG2cNziFJc+fOdbhuDQBQPGwmvyfPAwAAizFGjRs3VlxcnB566CFJ0kMPPSRXV1fr/l/F5auvvtLAgQO1efNmublxMgsAFCd6uAAAKASbzaZp06bp7NmzOnv2rLZt26bVq1dfE9dMnThxQjNnziRsAcA1gB4uAACuUHJyspo0aaKWLVtq9uzZDsOzAwBubgQuAAAAAHASTikEAAAAACchcAEAAACAkxC4AAAAAMBJCFwAAAAA4CQELgAAAABwEgIXAAAAADgJgQsAAAAAnITABQAAAABOQuACAAAAACf5f4/4AmxYQ7bSAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 1000x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# is pace of purchase a good measure ? \n",
|
||
"# we ll compare the avg purchase delay and the purchase date max\n",
|
||
"\n",
|
||
"plt.figure(figsize = [10,6])\n",
|
||
"\n",
|
||
"plt.hist(X_test[X_test[\"avg_purchase_delay\"]>0][\"avg_purchase_delay\"], alpha = 0.5, label = \"average purchase delay\")\n",
|
||
"plt.hist(X_test[X_test[\"avg_purchase_delay\"]>0][\"purchase_date_max\"], alpha=0.5, label = \"recency of the last purchase\")\n",
|
||
"plt.legend()\n",
|
||
"plt.xlabel(\"durée (jours)\")\n",
|
||
"plt.ylabel(\"fréquence\")\n",
|
||
"plt.title(\"Distribution des délais moyen entre deux achats et de l'ancienneté du dernier achat\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 199,
|
||
"id": "3ef409fe-dcf7-4c07-9be3-28b3e8ca5546",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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XGlcXFxM/fr1zcKFC82XX35p7r//flO8eHGT9tKQ3XoyirFv375m8uTJJioqynz//fdm/PjxpnDhwqZbt27X3b6M7Nixw5QqVcpUq1bN2vc7duyw6vL29jZ///23wzIDBgwwHh4e5q+//jLG/N/5GhISYrp3726+++47M23aNBMQEGBCQkJMfHy8texnn31mbDabad26tVm4cKH55ptvTMuWLY2Li4tZuXJllrHGxcWZgIAAU6xYMTNz5kyzbNky06lTJ2sfr169Osvlu3btaj755BMTHR1toqOjzTvvvGM8PT3NsGHDHMoNGTLESDJt2rQxX375pVmxYoUZN26cGTJkiFUm9dpTpkwZM2XKFBMdHW1efPFFI8nMnj3bKvf333+brl27ms8++8x8//33JioqyvTv39/ky5fPodzGjRuNp6enadGihXUc9uzZk+m2fP7550aSeeWVV8yKFSvMypUrzZQpU0yvXr2sMqnXt7TSXl+MufpeLVq0qClVqpSZMWOGWb16tdmyZUum9d/MuZmRG7kWv/fee8Zms5nu3bubpUuXmoULF5rw8HDj7e3tsM+yuhanjf9Grp9dunQxNpvNDBgwwDo3ihUrZgoUKGC6dOlilYuNjTUhISGmRIkSZurUqWblypXmnXfeMe7u7qZr167X3SfZrScj2b3XxMTEGB8fHxMaGmqmTJliVq1aZebMmWPatWtnzp49a4z5v/OlVKlS5pVXXjHLly83H3/8sSlUqFC6+1927pMHDhwwTz75pJFknesbN2502MdpZee6cfToUfPKK68YSWbhwoXWehMSEjJdb1hYmCldurT57LPPzNq1a83XX39t+vXr53AtkWTeeuutdMuWKFHC4Tik7qdixYqZnj17mu+++8589dVX5sqVKxnWffDgQSPJzJw5M9P4jLmx893Nzc2UL1/evP/++2blypXmzTffNDabzeEal51rR3bP3dRtKFGihHn00UfN0qVLzZw5c0xgYKApW7asiYyMtO4JU6ZMMT4+PubRRx9Ntx+LFStmihcvbmbMmGFd1yWZMWPGZLm/9uzZY+x2u6lUqZL59NNPzYoVK0y/fv1Mvnz5zNChQ7PcrykpKaZRo0bG3d3dvPfee2bFihXmrbfeMqVKlUp3zG+mntRtvPZcye59ITOp95/g4GDz3//+1yxfvtz06tXLSDIvvfSSVe5GP69ldg9IG//JkydNsWLFTJEiRcyUKVNMVFSUefnll40k88ILL1jl/vnnH1O+fHljt9vNhx9+aMWZes++9lh+//33xs3NzTzwwANmwYIFJioqynTt2jVb75FrkYhlIC4uzkgyTz31VLbK79u3z0gyL774osP0zZs3G0nmP//5jzWtQYMGRpLZtm2bNe306dPGxcXFeHp6OiRdMTExRpL573//a01Lvfn37dvXoa65c+caSWbOnDkZxpiSkmIuX75s1q5daySZXbt2WfO6dOliJJkZM2ZkuZ2p6zh8+LCRZP73v/9Z89J+UNq2bZuRZBYvXpzp+qKioowkM3r0aIfpCxYsMJLMtGnTrGklSpQwHh4e5vDhw9a0ixcvGj8/P/Pcc89lGXfqRfzrr792mL5161YjyUyaNOmG6/nyyy8z/SCdeoxXrVrlMH3EiBEmX758ZuvWrQ7Tv/rqKyPJLFu2LMvtSPtBbOPGjUaSGTt2rEO5o0ePGk9PTzNw4MAs11e7dm0THBxsLl68aE07e/as8fPzc/gwfCP1XC+ZSk5ONpcvXzaffvqpcXFxMWfOnMn2ste67777TIMGDdJN//33302+fPnM+PHjrWkXL140/v7+Dh+uU8/Xxx9/3GH59evXG0nm3XffNcYYc+HCBePn55fuRpycnGyqVKliatWqlWWcr732mrHZbCYmJsZhekRERLYSsbR1Xr582bz99tvG39/fStz/+OMP4+LiYjp16pTl8qnn5ebNmx2mV6hQwTRr1izT5a5cuWIuX75sevToYapVq+Ywz9vb+7ofsFO9/PLLpmDBglmWudFEzMXFxezfvz9b9d/MuZlVrNe7Fh85csTkz5/fvPLKKw7lzp07Z4KCgky7du0cYszsWpw2/uxeP1PvT5nFee3xe+6554yPj4/D9c8YY95//30jKctE+0bquZ6s7jUPPfSQKViwoPXFV0ZSz5e09+TRo0cbSSY2NjbLejO6T7700ksZnpsZuZHrxpgxY9Kd25n566+/jCQzYcKELMvdaCLWuXPn69ZtTPYSsZyc71988YVD2RYtWpiwsDDrdXauHdk9d1O3oUqVKiY5OdkqN2HCBCPJtGrVymH5Pn36GEkOyXGJEiUyva4XKFDAXLhwwaGua/dXs2bNzD333JMu2X755ZeNh4dHlted7777zkgyH3zwgcP09957L90xv5l6Urcxq/dsVveFjKTef659Lxtz9UvefPnyWcftRj+vZXYPSBv/66+/nuH974UXXjA2m81ax+TJkzONM+2xLFeunKlWrZq5fPmyQ9mWLVuaokWLOpxfWaFrYi5YvXq1JKVrBq1Vq5bKly+frgtT0aJFVaNGDeu1n5+fAgICVLVqVQUHB1vTy5cvL0k6fPhwujo7derk8Lpdu3bKnz+/FYt0tQtDx44dFRQUJBcXF7m6uqpBgwaSpH379qVb5xNPPJFu2smTJ/X8888rJCRE+fPnl6urq0qUKJHpOlKVLl1ahQoV0muvvaYpU6Zo79696cp8//33ktLvt7Zt28rb2zvdfqtataqKFy9uvfbw8FDZsmUz3D/XWrp0qQoWLKhHH31UV65csf6qVq2qoKCgdN1AclrPtQoVKqSHHnooXRwVK1ZU1apVHeJo1qzZdbujZLZdNptNTz/9tMP6goKCVKVKlSzXd+HCBW3dulVt2rSRh4eHNd3X1zfdIAI3U490tYtqq1at5O/vb52HnTt3VnJycqZdKqSr3X2vrS9t94WMlCpVSi1bttSkSZOs7nvz5s3T6dOn9fLLL6crn/Z9VLduXZUoUcJ6H23YsEFnzpxRly5dHGJJSUlR8+bNtXXr1iy7la5evVr33XefqlSp4jC9Y8eO190W6ep7pEmTJrLb7da+e/PNN3X69Gmru0x0dLSSk5P10ksvXXd9QUFBqlWrlsO0ypUrpzu3v/zyS9WrV08+Pj7W+/6TTz7J8j1/PbVq1dLff/+tDh066H//+1+uDEVcuXJllS1bNsfL5/TcvNb1rsXLly/XlStX1LlzZ4dzyMPDQw0aNMjw/ZPRtTit7F4/U+PILM5rLV26VI0aNVJwcLBDrA8//LAkae3atZnGcyP1ZCQ795p//vlHa9euVbt27bL1TPK1jw9IV88XyfGeeqP3yey42etGZvz8/HTvvfdqzJgxGjdunHbu3JmuW1VOZOd8y64bPd9tNlu6e07aa1J2rh03eu62aNFC+fL930fg1M9bjzzyiEO51OlHjhxxmJ7Zdf3s2bPasWNHhvvm0qVLWrVqlR5//HF5eXk5xNmiRQtdunRJmzZtynBZKfP3WNr7yc3Wk5mbvS/4+vqme0927NhRKSkp+uGHHyTd+Oe17N4Dvv/+e1WoUCHd/a9r164yxljX09WrV2ca57UOHDigX375xToWafdxbGys9u/ff/2dIgbryFDhwoXl5eWlgwcPZqv86dOnJSnDEQODg4PTfcjx8/NLV87NzS3ddDc3N0lX31RpBQUFObzOnz+//P39rVjOnz+vBx54QB4eHnr33XdVtmxZeXl56ejRo2rTpo0uXrzosLyXl5cKFCjgMC0lJUVNmzbV8ePHNWTIEFWqVEne3t5KSUlRnTp10q3jWna7XWvXrtV7772n//znP4qPj1fRokX17LPP6o033pCrq6tOnz6t/Pnzp7uh2mw2BQUFWduSyt/fP1097u7uWcYhSSdOnNDff/9t7c+00l7Uc1rPtTI6F06cOKEDBw7I1dU1W3Fcz4kTJ2SMUWBgYIbzS5Uqlemy8fHxSklJSXceSenPrZup58iRI3rggQcUFhamDz74QKGhofLw8NCWLVv00ksvZblPu3fvrtmzZ1uvM/vQmlbv3r3VuHFjRUdHq2nTpvroo48UHh6u6tWrpyub2fannnsnTpyQJD355JOZ1nfmzBl5e3tnOO/06dMZjvaUUb1pbdmyRU2bNlXDhg01ffp067mHxYsX67333rP2XWq/+Xvuuee668zOub1w4UK1a9dObdu21YABAxQUFKT8+fNr8uTJ2X4mMyORkZG6cuWKpk+frieeeEIpKSm6//779e677yoiIiJH67yZUVpv5ty81vWuxannUGajjF77YVDK+FqckexeP1P/zSzOa504cULffPNNjq5RN1JPWtm918THxys5OTlb57qU/nxPfd47dX03ep/Mrpu9bmTGZrNp1apVevvttzV69Gj169dPfn5+6tSpk9577z35+vrmKN7cHO04J+f7tV8GSleP07Wfe7Jz7bjRczezz1vZ/RyW1b0z7WeXVKdPn9aVK1f04Ycf6sMPP8xWnGmXz+j9lDaWm60nI7lxX8joM0TafXajn9eye+6ePn06w2fQUxs/rr1eZhVnqtTzvH///urfv3+2Ys0MiVgGXFxc1LhxY3333Xc6duzYdS/6qW+K2NjYdGWPHz9+Q799kF1xcXEqVqyY9frKlSs6ffq0Fcv333+v48ePa82aNda3e5IyHSI3owfkf/75Z+3atUuzZs1Sly5drOkHDhzIVoyVKlXS/PnzZYzR7t27NWvWLL399tvy9PTU66+/Ln9/f125ckWnTp1y+DBhjFFcXFyuDY+e+qB2ZqNc5vTmlZWM9mfhwoXl6emZ6UXrRs+TwoULy2az6ccff8xwQJmMpqUqVKiQbDZbhg+gpp12M/UsXrxYFy5c0MKFC61vtyU5PFiemaFDhzq0YmX3OD300EOqWLGiJk6cKB8fH+3YsUNz5szJsGxm21+6dGlJ/3dMPvzwQ9WpUyfDdWSWoEpXrw3Z2ccZmT9/vlxdXbV06VKHDypph4tPfe8cO3ZMISEh113v9cyZM0clS5bUggULHM7j3HiAv1u3burWrZsuXLigH374QW+99ZZatmypX3/9VSVKlLC2MzEx0eG8yuyGdjMju93MuXmt612LU8+hr776yqGezGR3m7J7/UyNI7M4r1W4cGFVrlxZ7733XoZ1XttjI6N4sltPWtm91/j5+cnFxSXdIFg5daP3yey62etGVkqUKGENwvPrr7/qiy++0NChQ5WUlKQpU6ZIunpNzuj9mtlxyM0REm/0fM+u6107bubczYmsruuZffFQqFAhubi4KDIyMtMeDFkN0576nr/2+pJRLDdbT0Zy476QmrxcK+0+u9HPazdyvYyNjU03PXXwntTz1t/fP8MBhjL6XCRJgwYNUps2bTKsMywsLFuxkYhlYtCgQVq2bJmeffZZ/e9//0uXnV++fFlRUVF69NFHrS5oc+bMcUgetm7dqn379mnw4MG5Ht/cuXMdujd+8cUXunLlijVqWerJmfZD8tSpU7NdR26sI3U9VapU0fjx4zVr1iyr2b5x48YaPXq05syZo759+1rlv/76a124cMEaLexmtWzZUvPnz1dycvIN/YBqVtJ+s5rdOIYPHy5/f/8bvghmtr6RI0fqzz//VLt27W5oWW9vb9WqVUsLFy7UmDFjrA/A586d0zfffJNr9WR0DhljNH369OsuGxoamukoitdroezVq5eef/55JSQkKDAw0BrlMq25c+c6dMvZsGGDDh8+rGeeeUaSVK9ePRUsWFB79+7NsGvj9TRq1EijR4/Wrl27HLqxzJs377rL2mw25c+fXy4uLta0ixcv6rPPPnMo17RpU7m4uGjy5MkKDw+/4RgzqtfNzc3hBhcXF5fh6Fg32lKcytvbWw8//LCSkpLUunVr7dmzRyVKlLCO9+7dux2upWnPydxwM+fmta53LW7WrJny58+v33//PVe7gGX3+pkaR2ZxXqtly5ZatmyZ7r33XhUqVOiG4rmRetLK7r3G09NTDRo00Jdffqn33nvvpr/kvJF73LXX/Ov9RMKNXDdyci9JVbZsWb3xxhv6+uuvHbrDhYaGavfu3Q5lv//+e50/f/6G67hRt+p8T5XZteNmzt2c2LNnT4bXdV9f3wx7X0hXW/8aNWqknTt3qnLlypm2+mQm9X4yd+5c9erVy6He3KwnIzdyX8jMuXPntGTJEoduf/PmzVO+fPn04IMPSro1n9ekq9fLESNGaMeOHQ7H59NPP5XNZlOjRo0kXd3HX3zxRYZxXissLExlypTRrl27NHz48JuKjUQsE+Hh4Zo8ebJefPFF1ahRQy+88ILuu+8+Xb58WTt37tS0adNUsWJFPfroowoLC1PPnj314YcfKl++fHr44Yd16NAhDRkyRCEhIQ43ydyycOFC5c+fXxEREdqzZ4+GDBmiKlWqWB+U69atq0KFCun555/XW2+9JVdXV82dO1e7du3Kdh3lypXTvffeq9dff13GGPn5+embb75RdHT0dZddunSpJk2apNatW6tUqVIyxmjhwoX6+++/ra4EERERatasmV577TWdPXtW9erV0+7du/XWW2+pWrVqioyMzNnOSeOpp57S3Llz1aJFC/Xu3Vu1atWSq6urjh07ptWrV+uxxx7T448/fkPrrFixoiRp2rRp8vX1lYeHh0qWLJllF5w+ffro66+/1oMPPqi+ffuqcuXKSklJ0ZEjR7RixQr169fvhi489erVU8+ePdWtWzdt27ZNDz74oLy9vRUbG6t169apUqVKeuGFFzJd/p133lHz5s2t38VLTk7WqFGj5O3trTNnzuRKPREREXJzc1OHDh00cOBAXbp0SZMnT1Z8fHy2tzMjqa2tCxYsUKlSpeTh4aFKlSpZ859++mkNGjRIP/zwg954441Mb0Tbtm3TM888o7Zt2+ro0aMaPHiwihUrphdffFGS5OPjow8//FBdunTRmTNn9OSTTyogIECnTp3Srl27dOrUKU2ePDnTOPv06aMZM2bokUce0bvvvqvAwEDNnTtXv/zyy3W38ZFHHtG4cePUsWNH9ezZU6dPn9b777+f7kNjaGio/vOf/+idd97RxYsX1aFDB9ntdu3du1d//fXXDQ/pnjoc8Isvvqgnn3xSR48e1TvvvKOiRYum+w2sSpUqac2aNfrmm29UtGhR+fr6Zvot4LPPPitP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zp3pyuzdu1ctWrSQj4+PAgMDFRkZqb/++ivTdc6ZM0c1a9aUr6+vgoKC1LFjR508eVLS1cShdOnSev/99x2W+fnnn5UvXz6H7b1WSkqK3n77bd1zzz1yd3dX1apVFRUVZc1P7X63cOFCNWrUSF5eXqpSpYo2btyYaZypx/Txxx+XzWZzOMZS1sfKGKPRo0erVKlS8vT0VJUqVfTVV19lWldqfe+88446duwoHx8fBQcH68MPP0y3Ddd2Ifz7779ls9ms91XqObx8+XLVrFlT7u7u+vHHH5WSkqJRo0apdOnScnd3V/HixfXee+851P/HH39kum9Onz6tDh066J577pGXl5cqVaqkzz//3GH5r776SpUqVZKnp6f8/f3VpEkTXbhwQVL6bn0NGzZUr169NHDgQPn5+SkoKEhDhw51WF923uNpNWzYUC+//LJefvll633yxhtvOLRk5fS6lHYbEhMT1atXLwUEBMjDw0P169fX1q1bHeJZtmyZypYtK09PTzVq1CjL648zkIgBAPAvcOHCBb366qvaunWrVq1apXz58unxxx9XSkqKJKlTp076/PPPHT7gLFiwQIGBgWrQoIEkqVu3blq/fr3mz5+v3bt3q23btmrevLl+++03a5l//vlHI0aM0Mcff6w9e/YoICBA586dU5cuXfTjjz9q06ZNKlOmjFq0aGF90E1JSVHr1q3l5eWlzZs3a9q0aRo8eLBD/P/8848aNWokHx8f/fDDD1q3bp18fHzUvHlzJSUlZbntAwYM0Pvvv6+tW7cqICBArVq1sn6GILtWrVqlffv2KTo6WkuXLtX58+fVoEEDHT9+XEuWLNGuXbs0cOBAa39K0u+//67Fixdr6dKlWrp0qdauXauRI0dm+5j897//1ZIlS/TFF19o//79mjNnjpU8GGP0yCOPKC4uTsuWLdP27dtVvXp1NW7cWGfOnMlwGy5cuKCWLVsqLCxM27dv19ChQ9W/f3+HMrGxsWrQoIGqVq2qbdu2KSoqSidOnFC7du0y3TdJSUl65513tGvXLi1evFgHDx5U165dJV3tCti9e3fNnDnTYZkZM2bogQce0L333pvhOj/44AONHTtW77//vnbv3q1mzZqpVatWDueaJA0ePFj9+/dXTEyMypYtqw4dOujKlSsZrjP1Q/XMmTMVGxvr8CH7esfqjTfe0MyZMzV58mTt2bNHffv21dNPP621a9dmul8kacyYMapcubJ27NihQYMGqW/fvoqOjs5ymYwMHDhQI0aM0L59+1S5cmUNGjRIo0aN0pAhQ7R3717NmzdPgYGB2d43ly5dUo0aNbR06VL9/PPP6tmzpyIjI60vEmJjY9WhQwd1795d+/bt05o1a9SmTZssu/LNnj1b3t7e2rx5s0aPHq23337b2tbsvMezWm/+/Pm1efNm/fe//9X48eP18ccfW/Nzel3KaB9//fXXmj17tnbs2KHSpUurWbNm1vvp6NGjatOmjVq0aKGYmBg988wz6b68cjqDbElISDCSTEJCQl6HAgC4CRcvXjR79+41Fy9eTDdv3Ir9Tvu7WSdPnjSSzE8//WS9zp8/v/nhhx+sMuHh4WbAgAHGGGMOHDhgbDab+fPPPx3W07hxYzNo0CBjjDEzZ840kkxMTEyWdV+5csX4+vqab775xhhjzHfffWfy589vYmNjrTLR0dFGklm0aJExxphPPvnEhIWFmZSUFKtMYmKi8fT0NMuXL8+wntWrVxtJZv78+da006dPG09PT7NgwQJjjDFvvfWWqVKlisNy48ePNyVKlLBed+nSxQQGBprExERr2tSpU42vr685ffp0hnW/9dZbxsvLy5w9e9aaNmDAAFO7du1M90vaY/LKK6+Yhx56yGGbU61atcoUKFDAXLp0yWH6vffea6ZOnZrh+qdOnWr8/PzMhQsXrGmTJ082kszOnTuNMcYMGTLENG3a1GG5o0ePGklm//6r512DBg1M7969M92OLVu2GEnm3Llzxhhjjh8/blxcXMzmzZuNMcYkJSWZIkWKmFmzZmW6juDgYPPee+85TLv//vvNiy++aIwx5uDBg0aS+fjjj635e/bsMZLMvn37Ml3vtedUqusdq/PnzxsPDw+zYcMGh+V69OhhOnTokGldJUqUMM2bN3eY1r59e/Pwww87bEPqvjfGmPj4eCPJrF692hjzf+fw4sWLrTJnz5417u7uZvr06RnWm9N906JFC9OvXz9jjDHbt283ksyhQ4cyLNulSxfz2GOPWa8bNGhg6tev71Dm/vvvN6+99poxJnvv8Yw0aNDAlC9f3uE98Nprr5ny5csbY27uunTtNpw/f964urqauXPnWvOTkpJMcHCwGT16tDHGmEGDBmUYiyQTHx+fYfxZ3S9yIzegRQwAgH+B33//XR07dlSpUqVUoEABlSxZUpJ05MgRSVKRIkUUERGhuXPnSpIOHjyojRs3qlOnTpKkHTt2yBijsmXLysfHx/pbu3atQ/cyNzc3Va5c2aHukydP6vnnn1fZsmVlt9tlt9t1/vx5q+79+/crJCREQUFB1jK1atVyWMf27dt14MAB+fr6WnX7+fnp0qVLmXZvSxUeHm7938/PT2FhYdq3b98N7b9KlSo5PBcWExOjatWqyc/PL9NlQkND5evra70uWrSo1WVPuv4x6dq1q2JiYhQWFqZevXppxYoV1rLbt2/X+fPn5e/v73A8Dh48mOn+2Ldvn6pUqeLwY+TX7pvU9a5evdphneXKlbPizcjOnTv12GOPqUSJEvL19VXDhg0dtqNo0aJ65JFHNGPGDEnS0qVLdenSJbVt2zbD9Z09e1bHjx9XvXr1HKbXq1cv3XG79lwrWrSoJDns4+zK6ljt3btXly5dUkREhMN++fTTT2/o3Et9faPnniTVrFnT+v++ffuUmJioxo0bZ7lMVvsmOTlZ7733nipXrmydQytWrLCOWZUqVdS4cWNVqlRJbdu21fTp0xUfH5/t+lLrTK0vO+/xzNSpU8fh97jCw8P122+/KTk5+aauS9f6/fffdfnyZYdzztXVVbVq1bKO1759+zKMJS/l6ZOCoaGhOnz4cLrpL774oj766CMZYzRs2DBNmzZN8fHxql27tj766CPdd999VtnExET1799fn3/+uS5evKjGjRtr0qRJuueee6wy8fHx6tWrl5YsWSJJatWqlT788EMVLFjwlm8jAAC54dFHH1VISIimT5+u4OBgpaSkqGLFig7d+jp16qTevXvrww8/1Lx583TfffepSpUqkq52LXJxcdH27dvl4uLisG4fHx/r/56enul+xLRr1646deqUJkyYoBIlSsjd3V3h4eFW3caY6/7waUpKimrUqGElitcqUqTIje0M/d8PrebLly9dd6uMui16e3s7vPb09LxuHa6urunqvLbr4vWOSfXq1XXw4EF99913Wrlypdq1a6cmTZroq6++UkpKiooWLerwLEyqzD6fpN3OjKSkpOjRRx/VqFGj0s1L/TB/rQsXLqhp06Zq2rSp5syZoyJFiujIkSNq1qyZw7n1zDPPKDIyUuPHj9fMmTPVvn17h4QwI2nPiYzOk2v3ceq8a/dxdmV1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0nr//fcdlvn555+VL18+h+29VkpKit5++23dc889cnd3V9WqVRUVFWXNT+3Ct3DhQjVq1EheXl6qUqWKNm7cmGmcqcf08ccfl81mczjGUtbHyhij0aNHq1SpUvL09FSVKlX01VdfZVpXw4YNNXbsWP3www+y2Wxq2LChJKU7pyWpYMGCmjVrVqbruh6bzabJkyfr4Ycflqenp0qWLKkvv/zSocz13juZneNpuyYeOXJEjz32mHx8fFSgQAG1a9dOJ06ccKhr5MiRCgwMlK+vr3r06KFLly7leNuQNRIxAAD+BS5cuKBXX31VW7du1apVq5QvXz49/vjjSklJkSR16tRJn3/+ua79edAFCxYoMDBQDRo0kCR169ZN69ev1/z587V79261bdtWzZs312+//WYt888//2jEiBH6+OOPtWfPHgUEBOjcuXPq0qWLfvzxR23atEllypRRixYtrA+6KSkpat26tby8vLR582ZNmzZNgwcPdoj/n3/+UaNGjeTj46MffvhB69atk4+Pj5o3b66kpKQst33AgAF6//33tXXrVgUEBKhVq1a6fPnyDe2/VatWad++fYqOjtbSpUt1/vx5NWjQQMePH9eSJUu0a9cuDRw40Nqf0tUWkcWLF2vp0qVaunSp1q5dq5EjR2b7mPz3v//VkiVL9MUXX2j//v2aM2eOlTwYY/TII48oLi5Oy5Yt0/bt21W9enU1btxYZ86cyXAbLly4oJYtWyosLEzbt2/X0KFD1b9/f4cysbGxatCggapWrapt27YpKipKJ06cULt27TLdN0lJSXrnnXe0a9cuLV68WAcPHlTXrl0lXU0SunfvrpkzZzosM2PGDD3wwAO69957M1znBx98oLFjx+r999/X7t271axZM7Vq1crhXJOkwYMHq3///oqJiVHZsmXVoUMHXblyJcN1bt26VZI0c+ZMxcbGWq+l6x+rN954QzNnztTkyZO1Z88e9e3bV08//bTWrl2bYV0LFy7Us88+q/DwcMXGxmrhwoWZ7r/cMGTIED3xxBPatWuXnn76aXXo0EH79u2TlP33TtpzPC1jjFq3bq0zZ85o7dq1io6O1u+//6727dtbZb744gu99dZbeu+997Rt2zYVLVpUkyZNuqXbfjejayIAAP8CTzzxhMPrTz75RAEBAdq7d68qVqyo9u3bq2/fvlq3bp0eeOABSdK8efPUsWNHq+Xi888/17FjxxQcHCxJ6t+/v6KiojRz5kwNHz5cknT58mVNmjRJVapUsep66KGHHOqeOnWqChUqpLVr16ply5ZasWKFfv/9d61Zs0ZBQUGSpPfee08RERHWMvPnz1e+fPn08ccfy2azSbr6gbpgwYJas2aNmjZtmum2v/XWW9a6Zs+erXvuuUeLFi3KMrlIy9vbWx9//LHVJXHatGk6deqUtm7dKj8/P0lS6dKlHZZJSUnRrFmz5OvrK0mKjIzUqlWr9N5770m6/jE5cuSIypQpo/r168tms6lEiRJW2dWrV+unn37SyZMn5e7uLkl6//33tXjxYn311Vfq2bNnum2YO3eukpOTNWPGDHl5eem+++7TsWPH9MILL1hlJk+erOrVq1vHU7qaNIWEhOjXX3+1Wkqu1b17d+v/pUqV0n//+1/VqlVL58+fl4+Pj7p166Y333xTW7ZsUa1atXT58mXNmTNHY8aMyXR/v//++3rttdf01FNPSZJGjRql1atXa8KECfroo4+scv3799cjjzwiSRo2bJjuu+8+HThwQOXKlUu3ztRudgULFrTOs1RZHasLFy5o3Lhx+v777xUeHm5t57p16zR16lTri4pr+fn5ycvLS25ubunquhXatm2rZ555RpL0zjvvKDo6Wh9++KEmTZqU7fdO2nM8rZUrV2r37t06ePCgQkJCJF1tRbzvvvu0detW3X///ZowYYK6d+9uxfLuu+9q5cqVtIrdIrSIAQDwL/D777+rY8eOKlWqlAoUKKCSJUtKutrVSLr6ITUiIkJz586VJB08eFAbN25Up06dJEk7duyQMUZly5aVj4+P9bd27VqH7mVubm6qXLmyQ90nT57U888/r7Jly8put8tut+v8+fNW3fv371dISIjDB9ZatWo5rGP79u06cOCAfH19rbr9/Px06dKlTLu3pUr98Cxd/YAcFhZmtRZkV6VKlRw+oMbExKhatWpWEpaR0NBQ64O9JBUtWtTqsidd/5h07dpVMTExCgsLU69evbRixQpr2e3bt+v8+fPy9/d3OB4HDx7MdH/s27dPVapUkZeXlzXt2n2Tut7Vq1c7rDM1qclsvTt37tRjjz2mEiVKyNfX1+qGl7odRYsW1SOPPKIZM2ZIkpYuXapLly6pbdu2Ga7v7NmzOn78uOrVq+cwvV69eumO27XnWtGiRSXJYR9nV1bHau/evbp06ZIiIiIc9sunn3563XPPWdIex/DwcGtfZfe9k/YcT2vfvn0KCQmxkjBJqlChggoWLGjVtW/fvgxjwa1BixgAAP8Cjz76qEJCQjR9+nQFBwcrJSVFFStWdOia1KlTJ/Xu3Vsffvih5s2bp/vuu89q2UpJSZGLi4u2b98uFxcXh3X7+PhY//f09LS+dU/VtWtXnTp1ShMmTFCJEiXk7u6u8PBwq25jTLpl0kpJSVGNGjWsRPFaORlQILW+fPnyOXTHlJRht8W0I8d5enpetw5XV9d0dV7bdfF6x6R69eo6ePCgvvvuO61cuVLt2rVTkyZN9NVXXyklJUVFixZ1eEYvVcGCBTOMJ+12ZiQlJUWPPvqoRo0alW5eaqJzrQsXLqhp06Zq2rSp5syZoyJFiujIkSNq1qyZw7n1zDPPKDIyUuPHj9fMmTPVvn17h4QwI2nPiYzOk2v3ceq8a/dxdmV1rFL//fbbb1WsWDGHcqmtkdlls9mydb7lhmv3R3beO9cbHTGz92l23r+4NUjEAAC4zZ0+fVr79u3T1KlTrW6H69atS1eudevWeu655xQVFaV58+YpMjLSmletWjUlJyfr5MmT1jqy68cff9SkSZPUokULSdLRo0cdBn8oV66cjhw5ohMnTigwMFCSHJ7fka4mJQsWLLAGprgRmzZtUvHixSVJ8fHx+vXXX61WniJFiiguLs7hw2R2flOrcuXK+vjjj3XmzJksW8Uyk91jUqBAAbVv317t27fXk08+qebNm+vMmTOqXr264uLilD9//nSDTmSmQoUK+uyzz3Tx4kUrkdy0aZNDmerVq+vrr79WaGio8ue//se8X375RX/99ZdGjhxptZRs27YtXbkWLVrI29tbkydP1nfffacffvgh03UWKFBAwcHBWrdunR588EFr+oYNG9K1lN4oV1dXJScn39AyqQPPHDlyJMNuiDeiSJEiio2NtV7/9ttv+ueff25qndLV49i5c2eH19WqVZN0c++da1WoUEFHjhzR0aNHrWO9d+9eJSQkqHz58pKk8uXLZxgLbg26JgIAcJtLHSlt2rRpOnDggL7//nu9+uqr6cp5e3vrscce05AhQ7Rv3z517NjRmle2bFl16tRJnTt31sKFC3Xw4EFt3bpVo0aN0rJly7Ksv3Tp0vrss8+0b98+bd68WZ06dXJoUYqIiNC9996rLl26aPfu3Vq/fr01WEdqctSpUycVLlxYjz32mH788UcdPHhQa9euVe/evXXs2LEs63/77be1atUq/fzzz+ratasKFy5s/Y5Uw4YNderUKY0ePVq///67PvroI3333XfX3acdOnRQUFCQWrdurfXr1+uPP/7Q119/neWofdfKzjEZP3685s+fr19++UW//vqrvvzySwUFBalgwYJq0qSJwsPD1bp1ay1fvlyHDh3Shg0b9MYbb2SYCEmynvfr0aOH9u7dq2XLlqUbzfCll17SmTNn1KFDB23ZskV//PGHVqxYoe7du2eYwBQvXlxubm768MMP9ccff2jJkiV655130pVzcXFR165dNWjQIJUuXfq63dUGDBigUaNGacGCBdq/f79ef/11xcTEqHfv3tfbtVkKDQ3VqlWrFBcXp/j4+Gwt4+vrq/79+6tv376aPXu2fv/9d+3cuVMfffSRZs+efUP1P/TQQ5o4caJ27Nihbdu26fnnn0/XGpcTX375pWbMmKFff/1Vb731lrZs2aKXX35Z0s29d67VpEkTVa5cWZ06ddKOHTu0ZcsWde7cWQ0aNFDNmjUlSb1799aMGTMcYtmzZ89Nbx8yRiIGAMBtLl++fJo/f762b9+uihUrqm/fvpkOlNCpUyft2rVLDzzwgNWKlGrmzJnq3Lmz+vXrp7CwMLVq1UqbN292eGYkIzNmzFB8fLyqVaumyMhI9erVSwEBAdZ8FxcXLV68WOfPn9f999+vZ555Rm+88YYkycPDQ5Lk5eWlH374QcWLF1ebNm1Uvnx5de/eXRcvXrzut/wjR45U7969VaNGDcXGxmrJkiXWszDly5fXpEmT9NFHH6lKlSrasmVLupEEM+Lm5qYVK1YoICBALVq0UKVKlTRy5Mh03TYzk51j4uPjo1GjRqlmzZq6//77dejQIS1btkz58uWTzWbTsmXL9OCDD6p79+4qW7asnnrqKR06dMhqVUzLx8dH33zzjfbu3atq1app8ODB6bogBgcHa/369UpOTlazZs1UsWJF9e7dW3a7PcPfgytSpIhmzZqlL7/8UhUqVNDIkSPTJXepevTooaSkJIfBPTLTq1cv9evXT/369VOlSpUUFRWlJUuWqEyZMtddNitjx45VdHS0QkJCrBaj7HjnnXf05ptvasSIESpfvryaNWum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",
|
||
"text/plain": [
|
||
"<Figure size 1000x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize = [10,6])\n",
|
||
"\n",
|
||
"plt.hist(X_test[X_test[\"avg_purchase_delay\"]>0][\"avg_purchase_delay\"], alpha = 0.5, label = \"average purchase delay on the purchasing period\")\n",
|
||
"plt.hist(X_test[X_test[\"avg_purchase_delay\"]>0][\"purchase_date_min\"]/X_test[X_test[\"avg_purchase_delay\"]>0][\"nb_purchases\"], alpha=0.5, label = \"average purchase delay on the full period\")\n",
|
||
"plt.legend()\n",
|
||
"plt.xlabel(\"durée (jours)\")\n",
|
||
"plt.ylabel(\"fréquence\")\n",
|
||
"plt.title(\"Comparaison entre le délai-type d'achat sur la période d'achat et sur l'ensemble de la période\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2a46a811-9169-43e2-a759-461562f4f250",
|
||
"metadata": {},
|
||
"source": [
|
||
"Il vaut mieux prendre le rythme en considérant purchase date min au dénominateur plutôt que le délai entre le \n",
|
||
"1er et le dernier achat"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 192,
|
||
"id": "fad27180-e1f2-4876-b0b8-2254c342fc36",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 1.473400e+04\n",
|
||
"mean 9.011960e+07\n",
|
||
"std 8.222514e+08\n",
|
||
"min 0.000000e+00\n",
|
||
"25% 7.194159e-01\n",
|
||
"50% 3.564579e+00\n",
|
||
"75% 2.645439e+01\n",
|
||
"max 1.996151e+10\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 192,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(X_test[X_test[\"avg_purchase_delay\"]>0][\"purchase_date_max\"]/X_test[X_test[\"avg_purchase_delay\"]>0][\"avg_purchase_delay\"]).describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 196,
|
||
"id": "c232ced3-c9b2-4e35-b89b-c18f7c99dc7a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.boxplot(X_test[X_test[\"avg_purchase_delay\"]>0][\"purchase_date_max\"]/X_test[X_test[\"avg_purchase_delay\"]>0][\"avg_purchase_delay\"], showfliers=False)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 188,
|
||
"id": "cdc917b9-eb2e-443f-8376-9a4ec4d24074",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 14734.000000\n",
|
||
"mean 145.979256\n",
|
||
"std 123.403697\n",
|
||
"min 0.000000\n",
|
||
"25% 38.053773\n",
|
||
"50% 111.560918\n",
|
||
"75% 225.056992\n",
|
||
"max 546.378919\n",
|
||
"Name: purchase_date_max, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 188,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"avg_purchase_delay\"]>0][\"purchase_date_max\"].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d386e36f-deba-43c9-8a51-eba868b39f0e",
|
||
"metadata": {},
|
||
"source": [
|
||
"Il est plus pertinent de considérer l'ensemble de la période que de couper à la date du dernier achat \\\n",
|
||
"On définit donc avg purchase delay all comme le délai moyen entre deux achats depuis que le client est \n",
|
||
"connu et jusqu'a aujourd'hui"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 202,
|
||
"id": "71b6ff7e-c48c-45b7-bc1a-70dafd11fbf1",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"X_test[\"avg_purchase_delay_all\"] = (X_test[\"purchase_date_min\"]/X_test[\"nb_purchases\"]).replace([np.inf, -np.inf], 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "20c757fe-4f3a-406c-b3b9-dd12b57a474c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "e65af9b9-9266-4ec5-950f-2fc2ed14140c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "f0652202-f5bc-4141-a384-07afd96f146b",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "7b3b3398-3ddc-41ee-b669-aea86e7f6d4e",
|
||
"metadata": {},
|
||
"source": [
|
||
"Il faut aussi étudier le nombre de tickets acheté, pas seulement le nombre d'achats"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 203,
|
||
"id": "3b01367d-4fb0-46bb-90e8-307e6152e8bb",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# on def avg tickets delay de façon similaire à avg purchase delay mais en utilisant plutôt nb tickets\n",
|
||
"\n",
|
||
"X_test[\"avg_tickets_delay\"] = (X_test[\"consumption_lifetime\"]/X_test[\"nb_tickets\"]).replace([np.inf, -np.inf], 0)\n",
|
||
"X_test[\"avg_tickets_delay_all\"] = (X_test[\"purchase_date_min\"]/X_test[\"nb_tickets\"]).replace([np.inf, -np.inf], 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 204,
|
||
"id": "0eb59297-0ec2-4181-b743-0264f95a7bee",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.695913</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.244205</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.279592</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696135</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.911844</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.584680</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.654520</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>29.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.116503</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.579827</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>31.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.254002</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 22 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... nb_campaigns \\\n",
|
||
"0 0.0 True False ... 0.0 \n",
|
||
"1 0.0 True True ... 0.0 \n",
|
||
"2 0.0 True True ... 0.0 \n",
|
||
"3 0.0 True False ... 0.0 \n",
|
||
"4 0.0 True False ... 0.0 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 15.0 \n",
|
||
"96092 1.0 True False ... 12.0 \n",
|
||
"96093 0.0 True True ... 29.0 \n",
|
||
"96094 1.0 True False ... 20.0 \n",
|
||
"96095 0.0 True False ... 31.0 \n",
|
||
"\n",
|
||
" nb_campaigns_opened score quartile has_purchased \\\n",
|
||
"0 0.0 0.695913 3 0.0 \n",
|
||
"1 0.0 0.244205 1 1.0 \n",
|
||
"2 0.0 0.279592 2 0.0 \n",
|
||
"3 0.0 0.696135 3 0.0 \n",
|
||
"4 0.0 0.911844 4 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 5.0 0.584680 3 1.0 \n",
|
||
"96092 9.0 0.654520 3 0.0 \n",
|
||
"96093 3.0 0.116503 1 0.0 \n",
|
||
"96094 4.0 0.579827 3 0.0 \n",
|
||
"96095 4.0 0.254002 2 0.0 \n",
|
||
"\n",
|
||
" consumption_lifetime avg_purchase_delay avg_purchase_delay_all \\\n",
|
||
"0 0.000000 0.000000 5.177187 \n",
|
||
"1 0.000000 0.000000 426.265613 \n",
|
||
"2 0.000000 0.000000 436.033437 \n",
|
||
"3 0.000000 0.000000 5.196412 \n",
|
||
"4 363.061678 181.530839 239.346574 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.000000 0.000000 278.442257 \n",
|
||
"96092 0.000000 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 0.000000 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" avg_tickets_delay avg_tickets_delay_all \n",
|
||
"0 0.000000 1.294297 \n",
|
||
"1 0.000000 426.265613 \n",
|
||
"2 0.000000 25.649026 \n",
|
||
"3 0.000000 1.299103 \n",
|
||
"4 10.678285 14.079210 \n",
|
||
"... ... ... \n",
|
||
"96091 0.000000 278.442257 \n",
|
||
"96092 0.000000 189.207373 \n",
|
||
"96093 NaN 0.000000 \n",
|
||
"96094 0.000000 279.312905 \n",
|
||
"96095 NaN 0.000000 \n",
|
||
"\n",
|
||
"[96096 rows x 22 columns]"
|
||
]
|
||
},
|
||
"execution_count": 204,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 206,
|
||
"id": "d6ef721a-dac6-49e0-8e1c-518a3cf79cbc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_purchases</th>\n",
|
||
" <th>nb_tickets</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2.000000</td>\n",
|
||
" <td>2.714286</td>\n",
|
||
" <td>0.597093</td>\n",
|
||
" <td>450.171815</td>\n",
|
||
" <td>0.298547</td>\n",
|
||
" <td>225.085907</td>\n",
|
||
" <td>0.198968</td>\n",
|
||
" <td>174.041855</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.592668</td>\n",
|
||
" <td>5.446707</td>\n",
|
||
" <td>26.192927</td>\n",
|
||
" <td>329.247848</td>\n",
|
||
" <td>11.435486</td>\n",
|
||
" <td>147.533946</td>\n",
|
||
" <td>5.992807</td>\n",
|
||
" <td>88.757091</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.203764</td>\n",
|
||
" <td>6.791530</td>\n",
|
||
" <td>64.785322</td>\n",
|
||
" <td>266.488673</td>\n",
|
||
" <td>25.490483</td>\n",
|
||
" <td>107.753468</td>\n",
|
||
" <td>14.307458</td>\n",
|
||
" <td>65.942338</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>12.041836</td>\n",
|
||
" <td>46.274086</td>\n",
|
||
" <td>306.126700</td>\n",
|
||
" <td>391.637751</td>\n",
|
||
" <td>68.659817</td>\n",
|
||
" <td>92.058104</td>\n",
|
||
" <td>38.736644</td>\n",
|
||
" <td>53.575899</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_purchases nb_tickets consumption_lifetime purchase_date_min \\\n",
|
||
"quartile \n",
|
||
"1 2.000000 2.714286 0.597093 450.171815 \n",
|
||
"2 2.592668 5.446707 26.192927 329.247848 \n",
|
||
"3 3.203764 6.791530 64.785322 266.488673 \n",
|
||
"4 12.041836 46.274086 306.126700 391.637751 \n",
|
||
"\n",
|
||
" avg_purchase_delay avg_purchase_delay_all avg_tickets_delay \\\n",
|
||
"quartile \n",
|
||
"1 0.298547 225.085907 0.198968 \n",
|
||
"2 11.435486 147.533946 5.992807 \n",
|
||
"3 25.490483 107.753468 14.307458 \n",
|
||
"4 68.659817 92.058104 38.736644 \n",
|
||
"\n",
|
||
" avg_tickets_delay_all \n",
|
||
"quartile \n",
|
||
"1 174.041855 \n",
|
||
"2 88.757091 \n",
|
||
"3 65.942338 \n",
|
||
"4 53.575899 "
|
||
]
|
||
},
|
||
"execution_count": 206,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"avg_purchase_delay\"]>0].groupby(\"quartile\")[[\"nb_purchases\", \"nb_tickets\", \"consumption_lifetime\", \n",
|
||
" \"purchase_date_min\", \"avg_purchase_delay\", \n",
|
||
" \"avg_purchase_delay_all\", \"avg_tickets_delay\", \n",
|
||
" \"avg_tickets_delay_all\"]].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2ec816bf-852d-4fa7-a110-77d3e1b6f6a3",
|
||
"metadata": {},
|
||
"source": [
|
||
"Le délai moyen entre deux achats sur l'ensemble de la période"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 210,
|
||
"id": "8b57c418-31dc-4d0e-af80-304f4118a9e4",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>30</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>35.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>219.530451</td>\n",
|
||
" <td>193.553044</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.387177</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>25.977407</td>\n",
|
||
" <td>8.659136</td>\n",
|
||
" <td>73.176817</td>\n",
|
||
" <td>8.659136</td>\n",
|
||
" <td>73.176817</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>37</th>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>105.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>422.518935</td>\n",
|
||
" <td>422.474444</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.258480</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.044491</td>\n",
|
||
" <td>0.022245</td>\n",
|
||
" <td>211.259468</td>\n",
|
||
" <td>0.007415</td>\n",
|
||
" <td>70.419823</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>38</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>145.50</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>469.053773</td>\n",
|
||
" <td>337.012106</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.424641</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>132.041667</td>\n",
|
||
" <td>66.020833</td>\n",
|
||
" <td>234.526887</td>\n",
|
||
" <td>33.010417</td>\n",
|
||
" <td>117.263443</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>51</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>276.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>317.012106</td>\n",
|
||
" <td>294.012106</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.353000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>23.000000</td>\n",
|
||
" <td>5.750000</td>\n",
|
||
" <td>79.253027</td>\n",
|
||
" <td>5.750000</td>\n",
|
||
" <td>79.253027</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>67</th>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>210.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>373.627303</td>\n",
|
||
" <td>255.476065</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.463581</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>118.151238</td>\n",
|
||
" <td>59.075619</td>\n",
|
||
" <td>186.813652</td>\n",
|
||
" <td>10.741022</td>\n",
|
||
" <td>33.966118</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>71408</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>62.51</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>490.113715</td>\n",
|
||
" <td>489.507940</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>0.469953</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.605775</td>\n",
|
||
" <td>0.302888</td>\n",
|
||
" <td>245.056858</td>\n",
|
||
" <td>0.302888</td>\n",
|
||
" <td>245.056858</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>71439</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>28.54</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>505.334005</td>\n",
|
||
" <td>505.324873</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>0.499401</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.009132</td>\n",
|
||
" <td>0.004566</td>\n",
|
||
" <td>252.667002</td>\n",
|
||
" <td>0.004566</td>\n",
|
||
" <td>252.667002</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>74420</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>115.90</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>522.320521</td>\n",
|
||
" <td>522.318229</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>35.0</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.453181</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.002292</td>\n",
|
||
" <td>0.001146</td>\n",
|
||
" <td>261.160260</td>\n",
|
||
" <td>0.001146</td>\n",
|
||
" <td>261.160260</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>79490</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>73.06</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>541.175509</td>\n",
|
||
" <td>521.153692</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>36.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.463122</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>20.021817</td>\n",
|
||
" <td>10.010909</td>\n",
|
||
" <td>270.587755</td>\n",
|
||
" <td>10.010909</td>\n",
|
||
" <td>270.587755</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>89618</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>134.66</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>527.497685</td>\n",
|
||
" <td>506.694931</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>30.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.449862</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>20.802755</td>\n",
|
||
" <td>10.401377</td>\n",
|
||
" <td>263.748843</td>\n",
|
||
" <td>10.401377</td>\n",
|
||
" <td>263.748843</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1473 rows × 22 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"30 3.0 3.0 35.00 1.0 \n",
|
||
"37 6.0 2.0 105.00 1.0 \n",
|
||
"38 4.0 2.0 145.50 1.0 \n",
|
||
"51 4.0 4.0 276.00 1.0 \n",
|
||
"67 11.0 2.0 210.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"71408 2.0 2.0 62.51 1.0 \n",
|
||
"71439 2.0 2.0 28.54 1.0 \n",
|
||
"74420 2.0 2.0 115.90 1.0 \n",
|
||
"79490 2.0 2.0 73.06 1.0 \n",
|
||
"89618 2.0 2.0 134.66 1.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"30 0.0 219.530451 193.553044 \n",
|
||
"37 0.0 422.518935 422.474444 \n",
|
||
"38 1.0 469.053773 337.012106 \n",
|
||
"51 1.0 317.012106 294.012106 \n",
|
||
"67 0.0 373.627303 255.476065 \n",
|
||
"... ... ... ... \n",
|
||
"71408 1.0 490.113715 489.507940 \n",
|
||
"71439 1.0 505.334005 505.324873 \n",
|
||
"74420 0.0 522.320521 522.318229 \n",
|
||
"79490 1.0 541.175509 521.153692 \n",
|
||
"89618 1.0 527.497685 506.694931 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... nb_campaigns \\\n",
|
||
"30 0.0 True True ... 0.0 \n",
|
||
"37 0.0 True True ... 0.0 \n",
|
||
"38 4.0 True True ... 0.0 \n",
|
||
"51 4.0 True True ... 0.0 \n",
|
||
"67 0.0 True True ... 0.0 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"71408 2.0 True False ... 12.0 \n",
|
||
"71439 2.0 True False ... 16.0 \n",
|
||
"74420 0.0 True False ... 35.0 \n",
|
||
"79490 2.0 True False ... 36.0 \n",
|
||
"89618 2.0 True False ... 30.0 \n",
|
||
"\n",
|
||
" nb_campaigns_opened score quartile has_purchased \\\n",
|
||
"30 0.0 0.387177 2 1.0 \n",
|
||
"37 0.0 0.258480 2 0.0 \n",
|
||
"38 0.0 0.424641 2 1.0 \n",
|
||
"51 0.0 0.353000 2 0.0 \n",
|
||
"67 0.0 0.463581 2 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"71408 6.0 0.469953 2 0.0 \n",
|
||
"71439 13.0 0.499401 2 0.0 \n",
|
||
"74420 9.0 0.453181 2 1.0 \n",
|
||
"79490 4.0 0.463122 2 0.0 \n",
|
||
"89618 0.0 0.449862 2 0.0 \n",
|
||
"\n",
|
||
" consumption_lifetime avg_purchase_delay avg_purchase_delay_all \\\n",
|
||
"30 25.977407 8.659136 73.176817 \n",
|
||
"37 0.044491 0.022245 211.259468 \n",
|
||
"38 132.041667 66.020833 234.526887 \n",
|
||
"51 23.000000 5.750000 79.253027 \n",
|
||
"67 118.151238 59.075619 186.813652 \n",
|
||
"... ... ... ... \n",
|
||
"71408 0.605775 0.302888 245.056858 \n",
|
||
"71439 0.009132 0.004566 252.667002 \n",
|
||
"74420 0.002292 0.001146 261.160260 \n",
|
||
"79490 20.021817 10.010909 270.587755 \n",
|
||
"89618 20.802755 10.401377 263.748843 \n",
|
||
"\n",
|
||
" avg_tickets_delay avg_tickets_delay_all \n",
|
||
"30 8.659136 73.176817 \n",
|
||
"37 0.007415 70.419823 \n",
|
||
"38 33.010417 117.263443 \n",
|
||
"51 5.750000 79.253027 \n",
|
||
"67 10.741022 33.966118 \n",
|
||
"... ... ... \n",
|
||
"71408 0.302888 245.056858 \n",
|
||
"71439 0.004566 252.667002 \n",
|
||
"74420 0.001146 261.160260 \n",
|
||
"79490 10.010909 270.587755 \n",
|
||
"89618 10.401377 263.748843 \n",
|
||
"\n",
|
||
"[1473 rows x 22 columns]"
|
||
]
|
||
},
|
||
"execution_count": 210,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[(X_test[\"avg_purchase_delay\"]>0) & (X_test[\"quartile\"]==\"2\")]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 214,
|
||
"id": "5119ba18-9a89-4819-b98b-d0ae8e31291e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>136</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>50.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.179282</td>\n",
|
||
" <td>4.441181</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690843</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.738102</td>\n",
|
||
" <td>0.369051</td>\n",
|
||
" <td>2.589641</td>\n",
|
||
" <td>0.369051</td>\n",
|
||
" <td>2.589641</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>187</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>117.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.190961</td>\n",
|
||
" <td>4.422014</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.694387</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.768947</td>\n",
|
||
" <td>0.384473</td>\n",
|
||
" <td>2.595480</td>\n",
|
||
" <td>0.256316</td>\n",
|
||
" <td>1.730320</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>229</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>196.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.144676</td>\n",
|
||
" <td>5.123021</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.697071</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.021655</td>\n",
|
||
" <td>0.010828</td>\n",
|
||
" <td>2.572338</td>\n",
|
||
" <td>0.005414</td>\n",
|
||
" <td>1.286169</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>312</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>200.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.180069</td>\n",
|
||
" <td>5.061979</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.697224</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.118090</td>\n",
|
||
" <td>0.059045</td>\n",
|
||
" <td>2.590035</td>\n",
|
||
" <td>0.029523</td>\n",
|
||
" <td>1.295017</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>439</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>156.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.167558</td>\n",
|
||
" <td>5.112234</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696639</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.055324</td>\n",
|
||
" <td>0.027662</td>\n",
|
||
" <td>2.583779</td>\n",
|
||
" <td>0.013831</td>\n",
|
||
" <td>1.291889</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>613</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>156.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.285567</td>\n",
|
||
" <td>2.801887</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.478423</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.483681</td>\n",
|
||
" <td>0.241840</td>\n",
|
||
" <td>1.642784</td>\n",
|
||
" <td>0.120920</td>\n",
|
||
" <td>0.821392</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>713</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>100.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.183241</td>\n",
|
||
" <td>5.060972</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696068</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.122269</td>\n",
|
||
" <td>0.061134</td>\n",
|
||
" <td>2.591620</td>\n",
|
||
" <td>0.030567</td>\n",
|
||
" <td>1.295810</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>967</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>3.251076</td>\n",
|
||
" <td>3.127894</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.691127</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.123183</td>\n",
|
||
" <td>0.061591</td>\n",
|
||
" <td>1.625538</td>\n",
|
||
" <td>0.061591</td>\n",
|
||
" <td>1.625538</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1042</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>106.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.140903</td>\n",
|
||
" <td>5.133646</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690563</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.007257</td>\n",
|
||
" <td>0.003628</td>\n",
|
||
" <td>2.570451</td>\n",
|
||
" <td>0.003628</td>\n",
|
||
" <td>2.570451</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1096</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>110.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.190764</td>\n",
|
||
" <td>4.646551</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696727</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.544213</td>\n",
|
||
" <td>0.272106</td>\n",
|
||
" <td>2.595382</td>\n",
|
||
" <td>0.136053</td>\n",
|
||
" <td>1.297691</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1124</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>50.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.192303</td>\n",
|
||
" <td>5.144618</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.689933</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.047685</td>\n",
|
||
" <td>0.023843</td>\n",
|
||
" <td>2.596152</td>\n",
|
||
" <td>0.023843</td>\n",
|
||
" <td>2.596152</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1451</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.126782</td>\n",
|
||
" <td>5.118449</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690032</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.008333</td>\n",
|
||
" <td>0.004167</td>\n",
|
||
" <td>2.563391</td>\n",
|
||
" <td>0.004167</td>\n",
|
||
" <td>2.563391</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1728</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>100.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.137326</td>\n",
|
||
" <td>4.958299</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.696165</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.179028</td>\n",
|
||
" <td>0.089514</td>\n",
|
||
" <td>2.568663</td>\n",
|
||
" <td>0.044757</td>\n",
|
||
" <td>1.284332</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1740</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>60.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.183495</td>\n",
|
||
" <td>5.176933</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690001</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.006563</td>\n",
|
||
" <td>0.003281</td>\n",
|
||
" <td>2.591748</td>\n",
|
||
" <td>0.003281</td>\n",
|
||
" <td>2.591748</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1843</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>102.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.184803</td>\n",
|
||
" <td>5.180162</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690491</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.004641</td>\n",
|
||
" <td>0.002321</td>\n",
|
||
" <td>2.592402</td>\n",
|
||
" <td>0.002321</td>\n",
|
||
" <td>2.592402</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1862</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>106.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.197801</td>\n",
|
||
" <td>5.191470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690534</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.006331</td>\n",
|
||
" <td>0.003166</td>\n",
|
||
" <td>2.598900</td>\n",
|
||
" <td>0.003166</td>\n",
|
||
" <td>2.598900</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1984</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>88.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.189468</td>\n",
|
||
" <td>5.182257</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690328</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.007211</td>\n",
|
||
" <td>0.003605</td>\n",
|
||
" <td>2.594734</td>\n",
|
||
" <td>0.003605</td>\n",
|
||
" <td>2.594734</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2041</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>147.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>4.597095</td>\n",
|
||
" <td>4.373079</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.694326</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.224016</td>\n",
|
||
" <td>0.112008</td>\n",
|
||
" <td>2.298547</td>\n",
|
||
" <td>0.074672</td>\n",
|
||
" <td>1.532365</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2115</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>75.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.182986</td>\n",
|
||
" <td>5.129433</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.692971</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.053553</td>\n",
|
||
" <td>0.026777</td>\n",
|
||
" <td>2.591493</td>\n",
|
||
" <td>0.017851</td>\n",
|
||
" <td>1.727662</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2384</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>196.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.171771</td>\n",
|
||
" <td>4.604873</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.697762</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.566898</td>\n",
|
||
" <td>0.283449</td>\n",
|
||
" <td>2.585885</td>\n",
|
||
" <td>0.141725</td>\n",
|
||
" <td>1.292943</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>20 rows × 22 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"136 2.0 2.0 50.0 1.0 \n",
|
||
"187 3.0 2.0 117.0 1.0 \n",
|
||
"229 4.0 2.0 196.0 1.0 \n",
|
||
"312 4.0 2.0 200.0 1.0 \n",
|
||
"439 4.0 2.0 156.0 1.0 \n",
|
||
"613 4.0 2.0 156.0 1.0 \n",
|
||
"713 4.0 2.0 100.0 1.0 \n",
|
||
"967 2.0 2.0 60.0 1.0 \n",
|
||
"1042 2.0 2.0 106.0 1.0 \n",
|
||
"1096 4.0 2.0 110.0 1.0 \n",
|
||
"1124 2.0 2.0 50.0 1.0 \n",
|
||
"1451 2.0 2.0 60.0 1.0 \n",
|
||
"1728 4.0 2.0 100.0 1.0 \n",
|
||
"1740 2.0 2.0 60.0 1.0 \n",
|
||
"1843 2.0 2.0 102.0 1.0 \n",
|
||
"1862 2.0 2.0 106.0 1.0 \n",
|
||
"1984 2.0 2.0 88.0 1.0 \n",
|
||
"2041 3.0 2.0 147.0 1.0 \n",
|
||
"2115 3.0 2.0 75.0 1.0 \n",
|
||
"2384 4.0 2.0 196.0 1.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"136 0.0 5.179282 4.441181 \n",
|
||
"187 0.0 5.190961 4.422014 \n",
|
||
"229 0.0 5.144676 5.123021 \n",
|
||
"312 0.0 5.180069 5.061979 \n",
|
||
"439 0.0 5.167558 5.112234 \n",
|
||
"613 0.0 3.285567 2.801887 \n",
|
||
"713 0.0 5.183241 5.060972 \n",
|
||
"967 0.0 3.251076 3.127894 \n",
|
||
"1042 0.0 5.140903 5.133646 \n",
|
||
"1096 0.0 5.190764 4.646551 \n",
|
||
"1124 0.0 5.192303 5.144618 \n",
|
||
"1451 0.0 5.126782 5.118449 \n",
|
||
"1728 0.0 5.137326 4.958299 \n",
|
||
"1740 0.0 5.183495 5.176933 \n",
|
||
"1843 0.0 5.184803 5.180162 \n",
|
||
"1862 0.0 5.197801 5.191470 \n",
|
||
"1984 0.0 5.189468 5.182257 \n",
|
||
"2041 0.0 4.597095 4.373079 \n",
|
||
"2115 0.0 5.182986 5.129433 \n",
|
||
"2384 0.0 5.171771 4.604873 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... nb_campaigns \\\n",
|
||
"136 0.0 True False ... 0.0 \n",
|
||
"187 0.0 True False ... 0.0 \n",
|
||
"229 0.0 True False ... 0.0 \n",
|
||
"312 0.0 True False ... 0.0 \n",
|
||
"439 0.0 True False ... 0.0 \n",
|
||
"613 0.0 True True ... 0.0 \n",
|
||
"713 0.0 True False ... 0.0 \n",
|
||
"967 0.0 True False ... 0.0 \n",
|
||
"1042 0.0 True False ... 0.0 \n",
|
||
"1096 0.0 True False ... 0.0 \n",
|
||
"1124 0.0 True False ... 0.0 \n",
|
||
"1451 0.0 True False ... 0.0 \n",
|
||
"1728 0.0 True False ... 0.0 \n",
|
||
"1740 0.0 True False ... 0.0 \n",
|
||
"1843 0.0 True False ... 0.0 \n",
|
||
"1862 0.0 True False ... 0.0 \n",
|
||
"1984 0.0 True False ... 0.0 \n",
|
||
"2041 0.0 True False ... 0.0 \n",
|
||
"2115 0.0 True False ... 0.0 \n",
|
||
"2384 0.0 True False ... 0.0 \n",
|
||
"\n",
|
||
" nb_campaigns_opened score quartile has_purchased \\\n",
|
||
"136 0.0 0.690843 3 0.0 \n",
|
||
"187 0.0 0.694387 3 0.0 \n",
|
||
"229 0.0 0.697071 3 0.0 \n",
|
||
"312 0.0 0.697224 3 0.0 \n",
|
||
"439 0.0 0.696639 3 0.0 \n",
|
||
"613 0.0 0.478423 2 0.0 \n",
|
||
"713 0.0 0.696068 3 0.0 \n",
|
||
"967 0.0 0.691127 3 0.0 \n",
|
||
"1042 0.0 0.690563 3 0.0 \n",
|
||
"1096 0.0 0.696727 3 0.0 \n",
|
||
"1124 0.0 0.689933 3 1.0 \n",
|
||
"1451 0.0 0.690032 3 0.0 \n",
|
||
"1728 0.0 0.696165 3 0.0 \n",
|
||
"1740 0.0 0.690001 3 0.0 \n",
|
||
"1843 0.0 0.690491 3 0.0 \n",
|
||
"1862 0.0 0.690534 3 0.0 \n",
|
||
"1984 0.0 0.690328 3 0.0 \n",
|
||
"2041 0.0 0.694326 3 0.0 \n",
|
||
"2115 0.0 0.692971 3 0.0 \n",
|
||
"2384 0.0 0.697762 3 0.0 \n",
|
||
"\n",
|
||
" consumption_lifetime avg_purchase_delay avg_purchase_delay_all \\\n",
|
||
"136 0.738102 0.369051 2.589641 \n",
|
||
"187 0.768947 0.384473 2.595480 \n",
|
||
"229 0.021655 0.010828 2.572338 \n",
|
||
"312 0.118090 0.059045 2.590035 \n",
|
||
"439 0.055324 0.027662 2.583779 \n",
|
||
"613 0.483681 0.241840 1.642784 \n",
|
||
"713 0.122269 0.061134 2.591620 \n",
|
||
"967 0.123183 0.061591 1.625538 \n",
|
||
"1042 0.007257 0.003628 2.570451 \n",
|
||
"1096 0.544213 0.272106 2.595382 \n",
|
||
"1124 0.047685 0.023843 2.596152 \n",
|
||
"1451 0.008333 0.004167 2.563391 \n",
|
||
"1728 0.179028 0.089514 2.568663 \n",
|
||
"1740 0.006563 0.003281 2.591748 \n",
|
||
"1843 0.004641 0.002321 2.592402 \n",
|
||
"1862 0.006331 0.003166 2.598900 \n",
|
||
"1984 0.007211 0.003605 2.594734 \n",
|
||
"2041 0.224016 0.112008 2.298547 \n",
|
||
"2115 0.053553 0.026777 2.591493 \n",
|
||
"2384 0.566898 0.283449 2.585885 \n",
|
||
"\n",
|
||
" avg_tickets_delay avg_tickets_delay_all \n",
|
||
"136 0.369051 2.589641 \n",
|
||
"187 0.256316 1.730320 \n",
|
||
"229 0.005414 1.286169 \n",
|
||
"312 0.029523 1.295017 \n",
|
||
"439 0.013831 1.291889 \n",
|
||
"613 0.120920 0.821392 \n",
|
||
"713 0.030567 1.295810 \n",
|
||
"967 0.061591 1.625538 \n",
|
||
"1042 0.003628 2.570451 \n",
|
||
"1096 0.136053 1.297691 \n",
|
||
"1124 0.023843 2.596152 \n",
|
||
"1451 0.004167 2.563391 \n",
|
||
"1728 0.044757 1.284332 \n",
|
||
"1740 0.003281 2.591748 \n",
|
||
"1843 0.002321 2.592402 \n",
|
||
"1862 0.003166 2.598900 \n",
|
||
"1984 0.003605 2.594734 \n",
|
||
"2041 0.074672 1.532365 \n",
|
||
"2115 0.017851 1.727662 \n",
|
||
"2384 0.141725 1.292943 \n",
|
||
"\n",
|
||
"[20 rows x 22 columns]"
|
||
]
|
||
},
|
||
"execution_count": 214,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[(X_test[\"avg_purchase_delay\"]>0) & (X_test[\"purchase_date_min\"]<10)].head(20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 217,
|
||
"id": "91ec6a21-89dd-40cd-91fc-8dfab132a9e8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"y_has_purchased 13690.0\n",
|
||
"dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 217,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_test.sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 218,
|
||
"id": "3223968c-409e-4110-8dcc-fe319d34d44f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"36092.22480054577"
|
||
]
|
||
},
|
||
"execution_count": 218,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[\"score\"].sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 241,
|
||
"id": "0233ab78-81d7-41a2-b948-4bc24f51c9e9",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.20933232507450736"
|
||
]
|
||
},
|
||
"execution_count": 241,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test[X_test[\"quartile\"]==\"3\"][\"has_purchased\"].mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c3bf1a55-7d46-42c7-9436-b68ce8c7ef24",
|
||
"metadata": {},
|
||
"source": [
|
||
"Autre méthode \\\n",
|
||
"On considère la durée totale sur laquelle les features ont été observées (1 an et demi) sans se soucier de la \n",
|
||
"date du 1er achat. \n",
|
||
"Et on extrapole le rythme d'achat en considérant que le client devrait acheter nb_tickets/1.5 tickets durant l'année à venir. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 240,
|
||
"id": "d594a3ee-22cb-45b5-a6fa-4439c0aad01c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"period_duration_years = 1.5\n",
|
||
"\n",
|
||
"expected_tickets_purchased = X_test[\"nb_tickets\"]/period_duration_years\n",
|
||
"expected_amount = X_test[\"total_amount\"]/period_duration_years"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 297,
|
||
"id": "807f9810-a691-4e51-af51-cdb7f0b4bd40",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>quartile</th>\n",
|
||
" <th>has_purchased</th>\n",
|
||
" <th>consumption_lifetime</th>\n",
|
||
" <th>avg_purchase_delay</th>\n",
|
||
" <th>avg_purchase_delay_all</th>\n",
|
||
" <th>avg_tickets_delay</th>\n",
|
||
" <th>avg_tickets_delay_all</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.294297</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>25.649026</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1.299103</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>363.061678</td>\n",
|
||
" <td>181.530839</td>\n",
|
||
" <td>239.346574</td>\n",
|
||
" <td>10.678285</td>\n",
|
||
" <td>14.079210</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 25 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... quartile \\\n",
|
||
"0 0.0 True False ... 3 \n",
|
||
"1 0.0 True True ... 1 \n",
|
||
"2 0.0 True True ... 2 \n",
|
||
"3 0.0 True False ... 3 \n",
|
||
"4 0.0 True False ... 4 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 3 \n",
|
||
"96092 1.0 True False ... 3 \n",
|
||
"96093 0.0 True True ... 1 \n",
|
||
"96094 1.0 True False ... 3 \n",
|
||
"96095 0.0 True False ... 2 \n",
|
||
"\n",
|
||
" has_purchased consumption_lifetime avg_purchase_delay \\\n",
|
||
"0 0.0 0.000000 0.000000 \n",
|
||
"1 1.0 0.000000 0.000000 \n",
|
||
"2 0.0 0.000000 0.000000 \n",
|
||
"3 0.0 0.000000 0.000000 \n",
|
||
"4 1.0 363.061678 181.530839 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 0.000000 0.000000 \n",
|
||
"96092 0.0 0.000000 0.000000 \n",
|
||
"96093 0.0 0.000000 NaN \n",
|
||
"96094 0.0 0.000000 0.000000 \n",
|
||
"96095 0.0 0.000000 NaN \n",
|
||
"\n",
|
||
" avg_purchase_delay_all avg_tickets_delay avg_tickets_delay_all \\\n",
|
||
"0 5.177187 0.000000 1.294297 \n",
|
||
"1 426.265613 0.000000 426.265613 \n",
|
||
"2 436.033437 0.000000 25.649026 \n",
|
||
"3 5.196412 0.000000 1.299103 \n",
|
||
"4 239.346574 10.678285 14.079210 \n",
|
||
"... ... ... ... \n",
|
||
"96091 278.442257 0.000000 278.442257 \n",
|
||
"96092 189.207373 0.000000 189.207373 \n",
|
||
"96093 0.000000 NaN 0.000000 \n",
|
||
"96094 279.312905 0.000000 279.312905 \n",
|
||
"96095 0.000000 NaN 0.000000 \n",
|
||
"\n",
|
||
" decile overshoot_coeff ajusted_score \n",
|
||
"0 6 3.294104 0.211260 \n",
|
||
"1 2 3.826401 0.063821 \n",
|
||
"2 2 3.826401 0.073069 \n",
|
||
"3 6 3.294104 0.211328 \n",
|
||
"4 9 1.268598 0.718781 \n",
|
||
"... ... ... ... \n",
|
||
"96091 5 3.260982 0.179296 \n",
|
||
"96092 6 3.294104 0.198694 \n",
|
||
"96093 1 17.863019 0.006522 \n",
|
||
"96094 5 3.260982 0.177808 \n",
|
||
"96095 2 3.826401 0.066382 \n",
|
||
"\n",
|
||
"[96096 rows x 25 columns]"
|
||
]
|
||
},
|
||
"execution_count": 297,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ab7489e3-58e8-4be8-b870-60c869ba7953",
|
||
"metadata": {},
|
||
"source": [
|
||
"Estimation de l'overshoot : méthode plus rigoureuse \n",
|
||
"\n",
|
||
"on étudie le rapport entre le score et has purchased\n",
|
||
"plus exactement entre score/(1-score) et has_purchased/(1-has_purchased) - permet de coller à structure du logit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 301,
|
||
"id": "3587dd1d-73a7-4810-9330-4b29caeb1e9f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"quartile\n",
|
||
"1 0.203706\n",
|
||
"2 0.564483\n",
|
||
"3 1.679424\n",
|
||
"4 9.209851\n",
|
||
"Name: score, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 301,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"score_odd_ratio_quartile = X_test.groupby(\"quartile\")[\"score\"].mean()/(1-X_test.groupby(\"quartile\")[\"score\"].mean())\n",
|
||
"score_odd_ratio_quartile"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 302,
|
||
"id": "1a7dcc8c-33c5-4abf-828f-ba17dceb3287",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"quartile\n",
|
||
"1 0.027517\n",
|
||
"2 0.133083\n",
|
||
"3 0.264754\n",
|
||
"4 1.998944\n",
|
||
"Name: has_purchased, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 302,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_odd_ratio_quartile = X_test.groupby(\"quartile\")[\"has_purchased\"].mean()/(1-X_test.groupby(\"quartile\")[\"has_purchased\"].mean())\n",
|
||
"y_odd_ratio_quartile"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "6307f5f8-3597-422b-86ef-cdcac3648862",
|
||
"metadata": {},
|
||
"source": [
|
||
"### PB : a-t-on le même résultat de calcul du biais sur X_train et y_train ?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 478,
|
||
"id": "c857531d-3002-4047-b206-a31cc11c451c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>decile</th>\n",
|
||
" <th>overshoot_coeff</th>\n",
|
||
" <th>ajusted_score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" <th>test_adjusted_score_2</th>\n",
|
||
" <th>score_adjusted</th>\n",
|
||
" <th>nb_tickets_projected</th>\n",
|
||
" <th>total_amount_projected</th>\n",
|
||
" <th>nb_tickets_expected</th>\n",
|
||
" <th>total_amount_expected</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>100.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>5.177187</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211260</td>\n",
|
||
" <td>2.288530</td>\n",
|
||
" <td>0.533640</td>\n",
|
||
" <td>0.274689</td>\n",
|
||
" <td>2.666667</td>\n",
|
||
" <td>66.666667</td>\n",
|
||
" <td>0.732503</td>\n",
|
||
" <td>18.312587</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>55.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>426.265613</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.063821</td>\n",
|
||
" <td>0.323109</td>\n",
|
||
" <td>0.139085</td>\n",
|
||
" <td>0.050756</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>36.666667</td>\n",
|
||
" <td>0.033837</td>\n",
|
||
" <td>1.861053</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>17.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>80.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>436.033437</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.073069</td>\n",
|
||
" <td>0.388102</td>\n",
|
||
" <td>0.162515</td>\n",
|
||
" <td>0.060349</td>\n",
|
||
" <td>11.333333</td>\n",
|
||
" <td>53.333333</td>\n",
|
||
" <td>0.683958</td>\n",
|
||
" <td>3.218627</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>120.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>5.196412</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.211328</td>\n",
|
||
" <td>2.290940</td>\n",
|
||
" <td>0.533902</td>\n",
|
||
" <td>0.274899</td>\n",
|
||
" <td>2.666667</td>\n",
|
||
" <td>80.000000</td>\n",
|
||
" <td>0.733063</td>\n",
|
||
" <td>21.991884</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>416.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>478.693148</td>\n",
|
||
" <td>115.631470</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>1.268598</td>\n",
|
||
" <td>0.718781</td>\n",
|
||
" <td>10.343538</td>\n",
|
||
" <td>0.837972</td>\n",
|
||
" <td>0.631228</td>\n",
|
||
" <td>22.666667</td>\n",
|
||
" <td>277.333333</td>\n",
|
||
" <td>14.307843</td>\n",
|
||
" <td>175.060667</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96091</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>67.31</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>278.442257</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.179296</td>\n",
|
||
" <td>1.407779</td>\n",
|
||
" <td>0.413108</td>\n",
|
||
" <td>0.188948</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>44.873333</td>\n",
|
||
" <td>0.125966</td>\n",
|
||
" <td>8.478740</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96092</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>61.41</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>189.207373</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>3.294104</td>\n",
|
||
" <td>0.198694</td>\n",
|
||
" <td>1.894523</td>\n",
|
||
" <td>0.486458</td>\n",
|
||
" <td>0.238685</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>40.940000</td>\n",
|
||
" <td>0.159123</td>\n",
|
||
" <td>9.771748</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96093</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>17.863019</td>\n",
|
||
" <td>0.006522</td>\n",
|
||
" <td>0.131865</td>\n",
|
||
" <td>0.061854</td>\n",
|
||
" <td>0.021356</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96094</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>79.43</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>279.312905</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.260982</td>\n",
|
||
" <td>0.177808</td>\n",
|
||
" <td>1.379973</td>\n",
|
||
" <td>0.408279</td>\n",
|
||
" <td>0.185910</td>\n",
|
||
" <td>0.666667</td>\n",
|
||
" <td>52.953333</td>\n",
|
||
" <td>0.123940</td>\n",
|
||
" <td>9.844555</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96095</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3.826401</td>\n",
|
||
" <td>0.066382</td>\n",
|
||
" <td>0.340487</td>\n",
|
||
" <td>0.145477</td>\n",
|
||
" <td>0.053340</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>96096 rows × 32 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 4.0 1.0 100.00 1.0 \n",
|
||
"1 1.0 1.0 55.00 1.0 \n",
|
||
"2 17.0 1.0 80.00 1.0 \n",
|
||
"3 4.0 1.0 120.00 1.0 \n",
|
||
"4 34.0 2.0 416.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 1.0 1.0 67.31 1.0 \n",
|
||
"96092 1.0 1.0 61.41 1.0 \n",
|
||
"96093 0.0 0.0 0.00 0.0 \n",
|
||
"96094 1.0 1.0 79.43 1.0 \n",
|
||
"96095 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 5.177187 5.177187 \n",
|
||
"1 0.0 426.265613 426.265613 \n",
|
||
"2 0.0 436.033437 436.033437 \n",
|
||
"3 0.0 5.196412 5.196412 \n",
|
||
"4 0.0 478.693148 115.631470 \n",
|
||
"... ... ... ... \n",
|
||
"96091 1.0 278.442257 278.442257 \n",
|
||
"96092 1.0 189.207373 189.207373 \n",
|
||
"96093 0.0 550.000000 550.000000 \n",
|
||
"96094 1.0 279.312905 279.312905 \n",
|
||
"96095 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in ... decile \\\n",
|
||
"0 0.0 True False ... 6 \n",
|
||
"1 0.0 True True ... 2 \n",
|
||
"2 0.0 True True ... 2 \n",
|
||
"3 0.0 True False ... 6 \n",
|
||
"4 0.0 True False ... 9 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"96091 1.0 True False ... 5 \n",
|
||
"96092 1.0 True False ... 6 \n",
|
||
"96093 0.0 True True ... 1 \n",
|
||
"96094 1.0 True False ... 5 \n",
|
||
"96095 0.0 True False ... 2 \n",
|
||
"\n",
|
||
" overshoot_coeff ajusted_score odd_ratio test_adjusted_score_2 \\\n",
|
||
"0 3.294104 0.211260 2.288530 0.533640 \n",
|
||
"1 3.826401 0.063821 0.323109 0.139085 \n",
|
||
"2 3.826401 0.073069 0.388102 0.162515 \n",
|
||
"3 3.294104 0.211328 2.290940 0.533902 \n",
|
||
"4 1.268598 0.718781 10.343538 0.837972 \n",
|
||
"... ... ... ... ... \n",
|
||
"96091 3.260982 0.179296 1.407779 0.413108 \n",
|
||
"96092 3.294104 0.198694 1.894523 0.486458 \n",
|
||
"96093 17.863019 0.006522 0.131865 0.061854 \n",
|
||
"96094 3.260982 0.177808 1.379973 0.408279 \n",
|
||
"96095 3.826401 0.066382 0.340487 0.145477 \n",
|
||
"\n",
|
||
" score_adjusted nb_tickets_projected total_amount_projected \\\n",
|
||
"0 0.274689 2.666667 66.666667 \n",
|
||
"1 0.050756 0.666667 36.666667 \n",
|
||
"2 0.060349 11.333333 53.333333 \n",
|
||
"3 0.274899 2.666667 80.000000 \n",
|
||
"4 0.631228 22.666667 277.333333 \n",
|
||
"... ... ... ... \n",
|
||
"96091 0.188948 0.666667 44.873333 \n",
|
||
"96092 0.238685 0.666667 40.940000 \n",
|
||
"96093 0.021356 0.000000 0.000000 \n",
|
||
"96094 0.185910 0.666667 52.953333 \n",
|
||
"96095 0.053340 0.000000 0.000000 \n",
|
||
"\n",
|
||
" nb_tickets_expected total_amount_expected \n",
|
||
"0 0.732503 18.312587 \n",
|
||
"1 0.033837 1.861053 \n",
|
||
"2 0.683958 3.218627 \n",
|
||
"3 0.733063 21.991884 \n",
|
||
"4 14.307843 175.060667 \n",
|
||
"... ... ... \n",
|
||
"96091 0.125966 8.478740 \n",
|
||
"96092 0.159123 9.771748 \n",
|
||
"96093 0.000000 0.000000 \n",
|
||
"96094 0.123940 9.844555 \n",
|
||
"96095 0.000000 0.000000 \n",
|
||
"\n",
|
||
"[96096 rows x 32 columns]"
|
||
]
|
||
},
|
||
"execution_count": 478,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 479,
|
||
"id": "af371c21-a121-41ce-92a2-e01bdac8ad81",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"y_pred_prob_train = logit_grid.predict_proba(X_train)[:, 1]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 484,
|
||
"id": "1e1ddbe4-037a-4866-ae35-161e6ba14ffd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"somme des scores calculés sur X train : 84127.81461345348\n",
|
||
"somme des y train : 32154.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# globalement, on a toujours une somme de scores 3 fois supérieure (même si le biais semble atténué)\n",
|
||
"print(\"somme des scores calculés sur X train : \",y_pred_prob_train.sum())\n",
|
||
"print(\"somme des y train : \", y_train.sum()[\"y_has_purchased\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 493,
|
||
"id": "ff61821b-b643-4002-88d8-8a0ec1268e73",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.493834</td>\n",
|
||
" <td>0.975638</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>140.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>373.540289</td>\n",
|
||
" <td>219.262269</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.722704</td>\n",
|
||
" <td>2.606253</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>50.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.689866</td>\n",
|
||
" <td>2.224409</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>90.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.693078</td>\n",
|
||
" <td>2.258158</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>78.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690209</td>\n",
|
||
" <td>2.227980</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224208</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.250218</td>\n",
|
||
" <td>0.333721</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224209</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>20.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>0.524745</td>\n",
|
||
" <td>1.104135</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224210</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.117175</td>\n",
|
||
" <td>0.132728</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224211</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>97.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.643851</td>\n",
|
||
" <td>1.807814</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224212</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.250170</td>\n",
|
||
" <td>0.333636</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>224213 rows × 16 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 2.0 1.0 60.00 1.0 \n",
|
||
"1 8.0 3.0 140.00 1.0 \n",
|
||
"2 2.0 1.0 50.00 1.0 \n",
|
||
"3 3.0 1.0 90.00 1.0 \n",
|
||
"4 2.0 1.0 78.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 0.0 0.00 0.0 \n",
|
||
"224209 1.0 1.0 20.00 1.0 \n",
|
||
"224210 0.0 0.0 0.00 0.0 \n",
|
||
"224211 1.0 1.0 97.11 1.0 \n",
|
||
"224212 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 355.268981 355.268981 \n",
|
||
"1 0.0 373.540289 219.262269 \n",
|
||
"2 0.0 5.202442 5.202442 \n",
|
||
"3 0.0 5.178958 5.178958 \n",
|
||
"4 0.0 5.174039 5.174039 \n",
|
||
"... ... ... ... \n",
|
||
"224208 0.0 550.000000 550.000000 \n",
|
||
"224209 1.0 392.501030 392.501030 \n",
|
||
"224210 0.0 550.000000 550.000000 \n",
|
||
"224211 1.0 172.334074 172.334074 \n",
|
||
"224212 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"0 0.0 True False 0 \n",
|
||
"1 0.0 True False 0 \n",
|
||
"2 0.0 True False 0 \n",
|
||
"3 0.0 True False 0 \n",
|
||
"4 0.0 True False 1 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 True False 0 \n",
|
||
"224209 1.0 True False 0 \n",
|
||
"224210 0.0 True True 0 \n",
|
||
"224211 1.0 True False 0 \n",
|
||
"224212 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened score odd_ratio \n",
|
||
"0 1 0.0 0.0 0.493834 0.975638 \n",
|
||
"1 1 0.0 0.0 0.722704 2.606253 \n",
|
||
"2 1 0.0 0.0 0.689866 2.224409 \n",
|
||
"3 1 0.0 0.0 0.693078 2.258158 \n",
|
||
"4 0 0.0 0.0 0.690209 2.227980 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"224208 1 34.0 3.0 0.250218 0.333721 \n",
|
||
"224209 1 23.0 6.0 0.524745 1.104135 \n",
|
||
"224210 1 8.0 4.0 0.117175 0.132728 \n",
|
||
"224211 1 13.0 5.0 0.643851 1.807814 \n",
|
||
"224212 1 4.0 4.0 0.250170 0.333636 \n",
|
||
"\n",
|
||
"[224213 rows x 16 columns]"
|
||
]
|
||
},
|
||
"execution_count": 493,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train[\"score\"] = y_pred_prob_train\n",
|
||
"# X_train[\"odd_ratio\"] = X_train[\"score\"]/(1-X_train[\"score\"])\n",
|
||
"X_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 491,
|
||
"id": "240afa08-692d-4c2d-93c7-c8c8a46afdb3",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 2.241790e+05\n",
|
||
"mean 5.824134e+10\n",
|
||
"std 1.462083e+13\n",
|
||
"min 1.207494e-01\n",
|
||
"25% 1.476621e-01\n",
|
||
"50% 3.338869e-01\n",
|
||
"75% 1.427047e+00\n",
|
||
"max 4.503600e+15\n",
|
||
"Name: odd_ratio, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 491,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train[\"odd_ratio\"][X_train[\"odd_ratio\"]<np.inf].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 494,
|
||
"id": "863ff04a-c4de-44cd-af9d-1e5032624592",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" <th>score</th>\n",
|
||
" <th>odd_ratio</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>60.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>355.268981</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.493834</td>\n",
|
||
" <td>0.975638</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>140.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>373.540289</td>\n",
|
||
" <td>219.262269</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.722704</td>\n",
|
||
" <td>2.606253</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>50.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>5.202442</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.689866</td>\n",
|
||
" <td>2.224409</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>90.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>5.178958</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.693078</td>\n",
|
||
" <td>2.258158</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>78.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>5.174039</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.690209</td>\n",
|
||
" <td>2.227980</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224208</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>34.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.250218</td>\n",
|
||
" <td>0.333721</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224209</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>20.00</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>392.501030</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>0.524745</td>\n",
|
||
" <td>1.104135</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224210</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.117175</td>\n",
|
||
" <td>0.132728</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224211</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>97.11</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>172.334074</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>13.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.643851</td>\n",
|
||
" <td>1.807814</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>224212</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.250170</td>\n",
|
||
" <td>0.333636</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>224213 rows × 16 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"0 2.0 1.0 60.00 1.0 \n",
|
||
"1 8.0 3.0 140.00 1.0 \n",
|
||
"2 2.0 1.0 50.00 1.0 \n",
|
||
"3 3.0 1.0 90.00 1.0 \n",
|
||
"4 2.0 1.0 78.00 1.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 0.0 0.00 0.0 \n",
|
||
"224209 1.0 1.0 20.00 1.0 \n",
|
||
"224210 0.0 0.0 0.00 0.0 \n",
|
||
"224211 1.0 1.0 97.11 1.0 \n",
|
||
"224212 0.0 0.0 0.00 0.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"0 0.0 355.268981 355.268981 \n",
|
||
"1 0.0 373.540289 219.262269 \n",
|
||
"2 0.0 5.202442 5.202442 \n",
|
||
"3 0.0 5.178958 5.178958 \n",
|
||
"4 0.0 5.174039 5.174039 \n",
|
||
"... ... ... ... \n",
|
||
"224208 0.0 550.000000 550.000000 \n",
|
||
"224209 1.0 392.501030 392.501030 \n",
|
||
"224210 0.0 550.000000 550.000000 \n",
|
||
"224211 1.0 172.334074 172.334074 \n",
|
||
"224212 0.0 550.000000 550.000000 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"0 0.0 True False 0 \n",
|
||
"1 0.0 True False 0 \n",
|
||
"2 0.0 True False 0 \n",
|
||
"3 0.0 True False 0 \n",
|
||
"4 0.0 True False 1 \n",
|
||
"... ... ... ... ... \n",
|
||
"224208 0.0 True False 0 \n",
|
||
"224209 1.0 True False 0 \n",
|
||
"224210 0.0 True True 0 \n",
|
||
"224211 1.0 True False 0 \n",
|
||
"224212 0.0 True False 0 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened score odd_ratio \n",
|
||
"0 1 0.0 0.0 0.493834 0.975638 \n",
|
||
"1 1 0.0 0.0 0.722704 2.606253 \n",
|
||
"2 1 0.0 0.0 0.689866 2.224409 \n",
|
||
"3 1 0.0 0.0 0.693078 2.258158 \n",
|
||
"4 0 0.0 0.0 0.690209 2.227980 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"224208 1 34.0 3.0 0.250218 0.333721 \n",
|
||
"224209 1 23.0 6.0 0.524745 1.104135 \n",
|
||
"224210 1 8.0 4.0 0.117175 0.132728 \n",
|
||
"224211 1 13.0 5.0 0.643851 1.807814 \n",
|
||
"224212 1 4.0 4.0 0.250170 0.333636 \n",
|
||
"\n",
|
||
"[224213 rows x 16 columns]"
|
||
]
|
||
},
|
||
"execution_count": 494,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on utilise le second score comme valeur de remplacement quand score = 1\n",
|
||
"X_train_second_score = X_train[\"score\"][X_train[\"score\"]<1].max()\n",
|
||
"\n",
|
||
"X_train[\"score\"] = X_train[\"score\"].apply(lambda x : X_train_second_score if x==1 else x)\n",
|
||
"X_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 498,
|
||
"id": "b2690332-9f2e-4597-ab13-cef073de367f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.9999999999999998"
|
||
]
|
||
},
|
||
"execution_count": 498,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train[\"score\"].max()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 499,
|
||
"id": "e749e3b5-f5f9-4ab5-a0c1-ee99c5e88a26",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"count 2.242130e+05\n",
|
||
"mean 7.411652e+11\n",
|
||
"std 5.734858e+13\n",
|
||
"min 1.207494e-01\n",
|
||
"25% 1.476621e-01\n",
|
||
"50% 3.338869e-01\n",
|
||
"75% 1.427525e+00\n",
|
||
"max 4.503600e+15\n",
|
||
"Name: odd_ratio, dtype: float64"
|
||
]
|
||
},
|
||
"execution_count": 499,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train[\"odd_ratio\"] = X_train[\"score\"]/(1-X_train[\"score\"])\n",
|
||
"X_train[\"odd_ratio\"].describe()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 500,
|
||
"id": "84fea40a-896f-4e74-8d3c-18ecbe9f4c5f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def obj_function_X_train(bias) :\n",
|
||
" obj = sum([adjusted_score(element, bias) for element in X_train[\"odd_ratio\"]]) # - y_test.sum()[\"y_has_purchased\"]\n",
|
||
" return obj"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 501,
|
||
"id": "9886995b-59d7-4fdf-acb0-981338a4e083",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# minimization\n",
|
||
"\n",
|
||
"from scipy.optimize import minimize\n",
|
||
"\n",
|
||
"\n",
|
||
"y_train_sum = y_train.sum()[\"y_has_purchased\"]\n",
|
||
"initial_guess = 6\n",
|
||
"estimated_biais_train = minimize(lambda bias : (obj_function_X_train(bias)-y_train_sum)**2 ,\n",
|
||
"initial_guess , method = \"BFGS\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 502,
|
||
"id": "80cb872f-2aac-4c77-b935-2d05e0199837",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"bias estimated on train set: 5.947447991192572\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# biais de 5.95 contre 6.04 pour le test set, OK\n",
|
||
"print(f\"bias estimated on train set: {estimated_biais_train.x[0]}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "25d8c4e0-ca60-4aeb-8aa9-9cfa8efdf52a",
|
||
"metadata": {},
|
||
"source": [
|
||
"### construction d'une fonction de généralisation de la méthode de calcul du biais\n",
|
||
"\n",
|
||
"Le biais est calculé de la façon suivante. \n",
|
||
"En notant $\\hat{p(x_i)}$ le score calculé et $p(x_i)$ le vrai score (sans biais), et $\\beta$ le logarithme du biais, on a : \\\n",
|
||
"$\\ln{\\frac{\\hat{p(x_i)}}{1-\\hat{p(x_i)}}} = \\beta + \\ln{\\frac{p(x_i)}{1-p(x_i)}}$ \\\n",
|
||
"$ \\frac{\\hat{p(x_i)}}{1-\\hat{p(x_i)}} = \\exp(\\beta) . \\frac{p(x_i)}{1-p(x_i)} $ \\\n",
|
||
"Ce qu'on appelle biais et qu'on estime dans le code par la suite est : $B=\\exp(\\beta) $. Les probabilités ne sont donc pas biaisées si $B=1$. Il y a surestimation si $B>1$. \n",
|
||
"\n",
|
||
"On cherche le B qui permette d'ajuster les probabilités de telle sorte que la somme des scores soit égale à la somme des y_has_purchased. Cela revient à résoudre : \n",
|
||
"\n",
|
||
"\\begin{equation}\n",
|
||
"\\sum_{i}{\\frac{\\frac{\\hat{p(x_i)}}{1-\\hat{p(x_i)}}}{B+\\frac{\\hat{p(x_i)}}{1-\\hat{p(x_i)}}}} = \\sum_{i}{Y_i}\n",
|
||
"\\end{equation}\n",
|
||
"\n",
|
||
"C'est ce que fait la fonction find_bias"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 733,
|
||
"id": "41f588ad-b093-47f9-a2c9-52428c61d8d8",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def adjusted_score(odd_ratio, bias) :\n",
|
||
" adjusted_score = odd_ratio/(bias+odd_ratio)\n",
|
||
" return adjusted_score"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 734,
|
||
"id": "208900ab-0211-4e0a-a235-e4ea3a6957ce",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# fonction qui prend un vecteur en entrée et remplace les 1 par la seconde plus grande valeur\n",
|
||
"# permet de remplacer les 1 par une valeur de score très proche, et d'ainsi éviter des odd ratio infinis\n",
|
||
"\n",
|
||
"def adjust_score_1(score) :\n",
|
||
" second_best_score = np.array([element for element in score if element !=1]).max()\n",
|
||
" new_score = np.array([element if element!=1 else second_best_score for element in score])\n",
|
||
" \n",
|
||
" return new_score\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 735,
|
||
"id": "942c3952-577e-4e18-87a8-e15ed3040241",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def odd_ratio(score) :\n",
|
||
" return score / (1 - score)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 768,
|
||
"id": "f34e16f6-1596-492e-8ff2-0703173e815e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# definition of a function that automatically detects the bias\n",
|
||
"\n",
|
||
"def find_bias(odd_ratios, y_objective, initial_guess=6) :\n",
|
||
" \"\"\"\n",
|
||
" results = minimize(lambda bias : (sum([adjusted_score(element, bias) for element in list(odd_ratios)]) - y_objective)**2 ,\n",
|
||
" initial_guess , method = \"BFGS\")\n",
|
||
"\n",
|
||
" estimated_bias = results.x[0]\n",
|
||
" \"\"\"\n",
|
||
"\n",
|
||
" # faster method\n",
|
||
" bias_estimated = fsolve(lambda bias : sum([adjusted_score(element, bias) for element in list(odd_ratios)]) - y_objective, x0=6)\n",
|
||
" \n",
|
||
" return bias_estimated[0]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 761,
|
||
"id": "8cc3a658-5ab5-482b-ba26-b12a3bf9c81b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([6.0428265])"
|
||
]
|
||
},
|
||
"execution_count": 761,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# autre méthode : avec fsolve\n",
|
||
"\n",
|
||
"from scipy.optimize import fsolve\n",
|
||
"\n",
|
||
"bias_estimated = fsolve(lambda bias : sum([adjusted_score(element, bias) for element in list(odd_ratios)]) - y_objective, x0=6)\n",
|
||
"bias_estimated"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 760,
|
||
"id": "92be0759-2583-411d-a0b0-f09fd53ff367",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import time"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 763,
|
||
"id": "58eb3320-fd4a-4b21-9cfe-6b9f7533a730",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"résultat : [6.0428265]\n",
|
||
"tps de calcul 2.112041473388672\n",
|
||
"résultat : 6.042826489667565\n",
|
||
"tps de calcul 3.9603891372680664\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# comparaison du temps pris par les deux opérations\n",
|
||
"\n",
|
||
"temps_debut = time.time()\n",
|
||
"bias_estimated_1 = fsolve(lambda bias : sum([adjusted_score(element, bias) for element in list(odd_ratios)]) - y_objective, x0=6)\n",
|
||
"temps_fin = time.time()\n",
|
||
"\n",
|
||
"temps_ecoule = temps_fin - temps_debut\n",
|
||
"print(\"résultat : \",bias_estimated_1)\n",
|
||
"print(\"tps de calcul\", temps_ecoule)\n",
|
||
"\n",
|
||
"temps_debut = time.time()\n",
|
||
"bias_estimated_2 = minimize(lambda bias : (sum([adjusted_score(element, bias) for element in list(odd_ratios)]) - y_objective)**2 ,\n",
|
||
" x0=6 , method = \"BFGS\").x[0]\n",
|
||
"temps_fin = time.time()\n",
|
||
"\n",
|
||
"temps_ecoule = temps_fin - temps_debut\n",
|
||
"print(\"résultat : \",bias_estimated_2)\n",
|
||
"print(\"tps de calcul\", temps_ecoule)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 755,
|
||
"id": "5e6c5b4a-4a13-43ed-af96-e5892563057a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([2.28853049, 0.3231094 , 0.38810178, ..., 0.13186529, 1.37997272,\n",
|
||
" 0.34048672])"
|
||
]
|
||
},
|
||
"execution_count": 755,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"odd_ratios"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 749,
|
||
"id": "6ef9088a-3ae7-419a-b009-cb5aae4ab4c7",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"36092.2248005385"
|
||
]
|
||
},
|
||
"execution_count": 749,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"sum([adjusted_score(element, 1) for element in list(odd_ratios)]) # - y_objective"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 704,
|
||
"id": "5fcd2467-9119-4bba-af38-f7833173c2d7",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[0, 1]"
|
||
]
|
||
},
|
||
"execution_count": 704,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"[element for element in np.array([0,1])]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 544,
|
||
"id": "e20820a3-30a4-4e24-8c65-6178c4d7e9c1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"5.947447991192572"
|
||
]
|
||
},
|
||
"execution_count": 544,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# the function works well !!\n",
|
||
"\n",
|
||
"bias_train_set = find_bias(odd_ratios = X_train[\"odd_ratio\"], y_objective = y_train_sum, initial_guess = 6)\n",
|
||
"bias_train_set"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 716,
|
||
"id": "c17e4a3c-a3de-425b-a3da-1e15e33cb403",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([2.28853049, 0.3231094 , 0.38810178, ..., 0.13186529, 1.37997272,\n",
|
||
" 0.34048672])"
|
||
]
|
||
},
|
||
"execution_count": 716,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"odd_ratio = odd_ratio(adjust_score_1(X_test[\"score\"]))\n",
|
||
"odd_ratio"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 751,
|
||
"id": "0aad15bd-e820-4eda-b229-64bd1f90f7f5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# definition of the values for the pb\n",
|
||
"\n",
|
||
"new_score = adjust_score_1(X_test[\"score\"])\n",
|
||
"\n",
|
||
"odd_ratios = odd_ratio(np.array(new_score))\n",
|
||
"\n",
|
||
"y_objective = y_test[\"y_has_purchased\"].sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 752,
|
||
"id": "498560c3-e446-4dcc-bb19-47f2910d5fbb",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(array([0.69591281, 0.2442046 , 0.27959173, ..., 0.11650264, 0.57982712,\n",
|
||
" 0.25400231]),\n",
|
||
" array([2.28853049, 0.3231094 , 0.38810178, ..., 0.13186529, 1.37997272,\n",
|
||
" 0.34048672]),\n",
|
||
" 13690.0)"
|
||
]
|
||
},
|
||
"execution_count": 752,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"new_score, odd_ratios, y_objective"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 769,
|
||
"id": "03f4a8f1-f568-4a7d-9501-8a7467a9a864",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"6.042826497117542"
|
||
]
|
||
},
|
||
"execution_count": 769,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# computation with the function defined\n",
|
||
"\n",
|
||
"bias_test_set = find_bias(odd_ratios = odd_ratios, \n",
|
||
" y_objective = y_objective,\n",
|
||
" initial_guess=6)\n",
|
||
"bias_test_set"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 770,
|
||
"id": "d0ea666d-33e8-46e8-9a4d-f17091dbfa93",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"5.947447998640124"
|
||
]
|
||
},
|
||
"execution_count": 770,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"biais_train_set = find_bias(odd_ratios = odd_ratio(adjust_score_1(X_train[\"score\"])), \n",
|
||
" y_objective = y_train[\"y_has_purchased\"].sum(),\n",
|
||
" initial_guess=6)\n",
|
||
"biais_train_set"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 772,
|
||
"id": "1c1bdbc6-4fa7-45fb-ba27-b4c02ff1ff9c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"5.947447991192572"
|
||
]
|
||
},
|
||
"execution_count": 772,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"bias_train_set"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 776,
|
||
"id": "eced1d08-5230-4449-8024-105111fe5873",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"betâ test - betâ train = 0.015909647078591174\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# différence des beta (log du biais)\n",
|
||
"print(\"betâ test - betâ train = \",np.log(bias_test_set/bias_train_set))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d2d5aca0-7e8b-4039-9bb2-ff5011c436a6",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Random forest"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"id": "da8873e5-c4e7-4580-8567-70e411c029ab",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"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>nb_tickets</th>\n",
|
||
" <th>nb_purchases</th>\n",
|
||
" <th>total_amount</th>\n",
|
||
" <th>nb_suppliers</th>\n",
|
||
" <th>vente_internet_max</th>\n",
|
||
" <th>purchase_date_min</th>\n",
|
||
" <th>purchase_date_max</th>\n",
|
||
" <th>nb_tickets_internet</th>\n",
|
||
" <th>is_email_true</th>\n",
|
||
" <th>opt_in</th>\n",
|
||
" <th>gender_female</th>\n",
|
||
" <th>gender_male</th>\n",
|
||
" <th>nb_campaigns</th>\n",
|
||
" <th>nb_campaigns_opened</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>43000</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>183923</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>19.0</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>97373</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>66956</th>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>254.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>378.343062</td>\n",
|
||
" <td>370.453947</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>116487</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>83146</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>35.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>37.474040</td>\n",
|
||
" <td>37.474040</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>223586</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>23.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>56489</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>141236</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>550.000000</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>False</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6999</th>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>20.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>171.446921</td>\n",
|
||
" <td>171.446921</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>True</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>10000 rows × 14 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" nb_tickets nb_purchases total_amount nb_suppliers \\\n",
|
||
"43000 0.0 0.0 0.0 0.0 \n",
|
||
"183923 0.0 0.0 0.0 0.0 \n",
|
||
"97373 0.0 0.0 0.0 0.0 \n",
|
||
"66956 7.0 2.0 254.0 1.0 \n",
|
||
"116487 0.0 0.0 0.0 0.0 \n",
|
||
"... ... ... ... ... \n",
|
||
"83146 1.0 1.0 35.0 1.0 \n",
|
||
"223586 0.0 0.0 0.0 0.0 \n",
|
||
"56489 0.0 0.0 0.0 0.0 \n",
|
||
"141236 0.0 0.0 0.0 0.0 \n",
|
||
"6999 2.0 1.0 20.0 1.0 \n",
|
||
"\n",
|
||
" vente_internet_max purchase_date_min purchase_date_max \\\n",
|
||
"43000 0.0 550.000000 550.000000 \n",
|
||
"183923 0.0 550.000000 550.000000 \n",
|
||
"97373 0.0 550.000000 550.000000 \n",
|
||
"66956 1.0 378.343062 370.453947 \n",
|
||
"116487 0.0 550.000000 550.000000 \n",
|
||
"... ... ... ... \n",
|
||
"83146 1.0 37.474040 37.474040 \n",
|
||
"223586 0.0 550.000000 550.000000 \n",
|
||
"56489 0.0 550.000000 550.000000 \n",
|
||
"141236 0.0 550.000000 550.000000 \n",
|
||
"6999 0.0 171.446921 171.446921 \n",
|
||
"\n",
|
||
" nb_tickets_internet is_email_true opt_in gender_female \\\n",
|
||
"43000 0.0 True True 0 \n",
|
||
"183923 0.0 True True 0 \n",
|
||
"97373 0.0 True False 0 \n",
|
||
"66956 7.0 True False 0 \n",
|
||
"116487 0.0 True False 1 \n",
|
||
"... ... ... ... ... \n",
|
||
"83146 1.0 True False 0 \n",
|
||
"223586 0.0 True True 0 \n",
|
||
"56489 0.0 True True 0 \n",
|
||
"141236 0.0 True False 0 \n",
|
||
"6999 0.0 True True 1 \n",
|
||
"\n",
|
||
" gender_male nb_campaigns nb_campaigns_opened \n",
|
||
"43000 1 14.0 12.0 \n",
|
||
"183923 1 19.0 11.0 \n",
|
||
"97373 0 7.0 2.0 \n",
|
||
"66956 1 0.0 0.0 \n",
|
||
"116487 0 5.0 0.0 \n",
|
||
"... ... ... ... \n",
|
||
"83146 1 9.0 3.0 \n",
|
||
"223586 1 23.0 1.0 \n",
|
||
"56489 1 4.0 0.0 \n",
|
||
"141236 1 6.0 0.0 \n",
|
||
"6999 0 0.0 0.0 \n",
|
||
"\n",
|
||
"[10000 rows x 14 columns]"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train_subsample"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "fcbb8bea-e9d3-4fd4-8b47-7e796c788a1f",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Preprocessing"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "55e0c6d8-9e98-47be-9d5d-41e06505ceba",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# no need to standardize variables in a random forest\n",
|
||
"# we just encode categorical variables\n",
|
||
"\n",
|
||
"categorical_features = ['opt_in', 'is_email_true'] \n",
|
||
"\n",
|
||
"# Transformer for the categorical features\n",
|
||
"categorical_transformer = Pipeline(steps=[\n",
|
||
" #(\"imputer\", SimpleImputer(strategy=\"most_frequent\")), # Impute missing values with the most frequent\n",
|
||
" (\"onehot\", OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n",
|
||
"])\n",
|
||
"\n",
|
||
"preproc = ColumnTransformer(\n",
|
||
" transformers=[\n",
|
||
" (\"cat\", categorical_transformer, categorical_features)\n",
|
||
" ]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"id": "27af28da-d2bb-4eff-b842-18cec9740c84",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-2 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-2 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-2 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-2 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-2 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-2 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-2 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for ColumnTransformer</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preproc"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "0cb46acb-647f-469d-b5e1-510bf1283196",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "1ce9acf4-3514-4056-a71a-c7654e25b9de",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "dfdd4601-4866-4102-b620-4f10648e7981",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Pipeline"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "eeefae73-afe7-4441-a04c-bd6a04beedd2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Define models and parameters for GridSearch\n",
|
||
"model = {\n",
|
||
" 'model': RandomForestClassifier(),\n",
|
||
" 'params': {\n",
|
||
" 'randforest__n_estimators': [100, 150, 200, 250, 300],\n",
|
||
" 'randforest__max_depth': [None, 15, 20, 25, 30, 35, 40],\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
"# Test each model using GridSearchCV\n",
|
||
"pipe = Pipeline(steps=[('preprocessor', preproc), ('randforest', model['model'])])\n",
|
||
"clf = GridSearchCV(pipe, model['params'], cv=3)\n",
|
||
"clf.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"print(f\"Model: {model['model']}\")\n",
|
||
"print(f\"Best parameters: {clf.best_params_}\")\n",
|
||
"print('Best classification accuracy in train is: {}'.format(clf.best_score_))\n",
|
||
"print('Classification accuracy on test is: {}'.format(clf.score(X_test, y_test)))\n",
|
||
"print(\"------\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"id": "2a88f13b-05bc-4a70-b08b-8b07c118cedc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-7 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-7 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-7 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-7 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-7 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-7 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-7 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-7 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-7 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-7 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-7 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-7\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-27\" type=\"checkbox\" ><label for=\"sk-estimator-id-27\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> Pipeline<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-28\" type=\"checkbox\" ><label for=\"sk-estimator-id-28\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-29\" type=\"checkbox\" ><label for=\"sk-estimator-id-29\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-30\" type=\"checkbox\" ><label for=\"sk-estimator-id-30\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-31\" type=\"checkbox\" ><label for=\"sk-estimator-id-31\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> RandomForestClassifier<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content \"><pre>RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539})</pre></div> </div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))])"
|
||
]
|
||
},
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Pipeline - on joue sur : max_depth\n",
|
||
"\n",
|
||
"param_grid = {\"random_forest__max_depth\" : [None, 10, 20, 40, 50, 60]}\n",
|
||
"\n",
|
||
"pipeline = Pipeline(steps=[\n",
|
||
" ('preprocessor', preproc),\n",
|
||
" ('random_forest', RandomForestClassifier(bootstrap = False, class_weight = weight_dict,\n",
|
||
" )) \n",
|
||
"])\n",
|
||
"\n",
|
||
"pipeline.set_output(transform=\"pandas\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "494dca83-4d60-4e49-8689-7d7ac612bb83",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'estimator': DecisionTreeClassifier(),\n",
|
||
" 'n_estimators': 100,\n",
|
||
" 'estimator_params': ('criterion',\n",
|
||
" 'max_depth',\n",
|
||
" 'min_samples_split',\n",
|
||
" 'min_samples_leaf',\n",
|
||
" 'min_weight_fraction_leaf',\n",
|
||
" 'max_features',\n",
|
||
" 'max_leaf_nodes',\n",
|
||
" 'min_impurity_decrease',\n",
|
||
" 'random_state',\n",
|
||
" 'ccp_alpha',\n",
|
||
" 'monotonic_cst'),\n",
|
||
" 'bootstrap': True,\n",
|
||
" 'oob_score': False,\n",
|
||
" 'n_jobs': None,\n",
|
||
" 'random_state': None,\n",
|
||
" 'verbose': 0,\n",
|
||
" 'warm_start': False,\n",
|
||
" 'class_weight': None,\n",
|
||
" 'max_samples': None,\n",
|
||
" 'criterion': 'gini',\n",
|
||
" 'max_depth': None,\n",
|
||
" 'min_samples_split': 2,\n",
|
||
" 'min_samples_leaf': 1,\n",
|
||
" 'min_weight_fraction_leaf': 0.0,\n",
|
||
" 'max_features': 'sqrt',\n",
|
||
" 'max_leaf_nodes': None,\n",
|
||
" 'min_impurity_decrease': 0.0,\n",
|
||
" 'monotonic_cst': None,\n",
|
||
" 'ccp_alpha': 0.0}"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"RandomForestClassifier().__dict__"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"id": "ee7cbc1c-7c31-4111-82a3-995141e2f13f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-8 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-8 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-8 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-8 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-8 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-8 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-8 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-8 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-8 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-8 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-8 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-8\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))]),\n",
|
||
" param_grid={'random_forest__max_depth': [None, 10, 20, 40, 50,\n",
|
||
" 60]},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-32\" type=\"checkbox\" ><label for=\"sk-estimator-id-32\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> GridSearchCV<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link \">i<span>Not fitted</span></span></label><div class=\"sk-toggleable__content \"><pre>GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))]),\n",
|
||
" param_grid={'random_forest__max_depth': [None, 10, 20, 40, 50,\n",
|
||
" 60]},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-33\" type=\"checkbox\" ><label for=\"sk-estimator-id-33\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">estimator: Pipeline</label><div class=\"sk-toggleable__content \"><pre>Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-34\" type=\"checkbox\" ><label for=\"sk-estimator-id-34\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> preprocessor: ColumnTransformer<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.compose.ColumnTransformer.html\">?<span>Documentation for preprocessor: ColumnTransformer</span></a></label><div class=\"sk-toggleable__content \"><pre>ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in', 'is_email_true'])])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-35\" type=\"checkbox\" ><label for=\"sk-estimator-id-35\" class=\"sk-toggleable__label sk-toggleable__label-arrow \">cat</label><div class=\"sk-toggleable__content \"><pre>['opt_in', 'is_email_true']</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-36\" type=\"checkbox\" ><label for=\"sk-estimator-id-36\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> OneHotEncoder<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.preprocessing.OneHotEncoder.html\">?<span>Documentation for OneHotEncoder</span></a></label><div class=\"sk-toggleable__content \"><pre>OneHotEncoder(handle_unknown='ignore', sparse_output=False)</pre></div> </div></div></div></div></div></div></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-37\" type=\"checkbox\" ><label for=\"sk-estimator-id-37\" class=\"sk-toggleable__label sk-toggleable__label-arrow \"> RandomForestClassifier<a class=\"sk-estimator-doc-link \" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a></label><div class=\"sk-toggleable__content \"><pre>RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539})</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GridSearchCV(cv=3,\n",
|
||
" estimator=Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))]),\n",
|
||
" param_grid={'random_forest__max_depth': [None, 10, 20, 40, 50,\n",
|
||
" 60]},\n",
|
||
" scoring=make_scorer(f1_score, response_method='predict'))"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# pipeline on the subsample\n",
|
||
"\n",
|
||
"random_forest_grid = GridSearchCV(pipeline, param_grid, cv=3, scoring = f1_scorer #, error_score=\"raise\"\n",
|
||
" )\n",
|
||
"\n",
|
||
"random_forest_grid"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"id": "3f149137-6313-4b4e-99d6-b3af7f296ad7",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n",
|
||
"/opt/mamba/lib/python3.11/site-packages/sklearn/base.py:1351: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Returned hyperparameter: {'random_forest__max_depth': None}\n",
|
||
"Best classification F1 score in train is: 0.33107422141513826\n",
|
||
"Classification F1 score on test is: 0.31752789604029275\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# run the pipeline on the full sample\n",
|
||
"\n",
|
||
"random_forest_grid.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"# print results\n",
|
||
"print('Returned hyperparameter: {}'.format(random_forest_grid.best_params_))\n",
|
||
"print('Best classification F1 score in train is: {}'.format(random_forest_grid.best_score_))\n",
|
||
"print('Classification F1 score on test is: {}'.format(random_forest_grid.score(X_test, y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"id": "cd79f942-abd0-48c9-aa0d-0d22673abeec",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'scoring': make_scorer(f1_score, response_method='predict'),\n",
|
||
" 'estimator': Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(bootstrap=False,\n",
|
||
" class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))]),\n",
|
||
" 'n_jobs': None,\n",
|
||
" 'refit': True,\n",
|
||
" 'cv': 3,\n",
|
||
" 'verbose': 0,\n",
|
||
" 'pre_dispatch': '2*n_jobs',\n",
|
||
" 'error_score': nan,\n",
|
||
" 'return_train_score': False,\n",
|
||
" 'param_grid': {'random_forest__max_depth': [None, 10, 20, 40, 50, 60]},\n",
|
||
" 'multimetric_': False,\n",
|
||
" 'best_index_': 0,\n",
|
||
" 'best_score_': 0.33107422141513826,\n",
|
||
" 'best_params_': {'random_forest__max_depth': None},\n",
|
||
" 'best_estimator_': Pipeline(steps=[('preprocessor',\n",
|
||
" ColumnTransformer(transformers=[('cat',\n",
|
||
" Pipeline(steps=[('onehot',\n",
|
||
" OneHotEncoder(handle_unknown='ignore',\n",
|
||
" sparse_output=False))]),\n",
|
||
" ['opt_in',\n",
|
||
" 'is_email_true'])])),\n",
|
||
" ('random_forest',\n",
|
||
" RandomForestClassifier(bootstrap=False,\n",
|
||
" class_weight={0.0: 0.5837086520288036,\n",
|
||
" 1.0: 3.486549107420539}))]),\n",
|
||
" 'refit_time_': 2.2247676849365234,\n",
|
||
" 'feature_names_in_': array(['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers',\n",
|
||
" 'vente_internet_max', 'purchase_date_min', 'purchase_date_max',\n",
|
||
" 'nb_tickets_internet', 'is_email_true', 'opt_in', 'gender_female',\n",
|
||
" 'gender_male', 'nb_campaigns', 'nb_campaigns_opened'], dtype=object),\n",
|
||
" 'scorer_': make_scorer(f1_score, response_method='predict'),\n",
|
||
" 'cv_results_': {'mean_fit_time': array([1.64734515, 1.4220806 , 1.43256299, 1.68632547, 1.4271005 ,\n",
|
||
" 1.42404906]),\n",
|
||
" 'std_fit_time': array([0.32811727, 0.01915 , 0.02151065, 0.2729267 , 0.02447776,\n",
|
||
" 0.02384922]),\n",
|
||
" 'mean_score_time': array([0.14065607, 0.13571024, 0.13531415, 0.17512798, 0.13398822,\n",
|
||
" 0.13499872]),\n",
|
||
" 'std_score_time': array([0.00759402, 0.00653712, 0.00743453, 0.04901062, 0.00848726,\n",
|
||
" 0.00789539]),\n",
|
||
" 'param_random_forest__max_depth': masked_array(data=[None, 10, 20, 40, 50, 60],\n",
|
||
" mask=[False, False, False, False, False, False],\n",
|
||
" fill_value='?',\n",
|
||
" dtype=object),\n",
|
||
" 'params': [{'random_forest__max_depth': None},\n",
|
||
" {'random_forest__max_depth': 10},\n",
|
||
" {'random_forest__max_depth': 20},\n",
|
||
" {'random_forest__max_depth': 40},\n",
|
||
" {'random_forest__max_depth': 50},\n",
|
||
" {'random_forest__max_depth': 60}],\n",
|
||
" 'split0_test_score': array([0.19168873, 0.19168873, 0.19168873, 0.19168873, 0.19168873,\n",
|
||
" 0.19168873]),\n",
|
||
" 'split1_test_score': array([0.34428494, 0.34428494, 0.34428494, 0.34428494, 0.34428494,\n",
|
||
" 0.34428494]),\n",
|
||
" 'split2_test_score': array([0.45724899, 0.45724899, 0.45724899, 0.45724899, 0.45724899,\n",
|
||
" 0.45724899]),\n",
|
||
" 'mean_test_score': array([0.33107422, 0.33107422, 0.33107422, 0.33107422, 0.33107422,\n",
|
||
" 0.33107422]),\n",
|
||
" 'std_test_score': array([0.10881622, 0.10881622, 0.10881622, 0.10881622, 0.10881622,\n",
|
||
" 0.10881622]),\n",
|
||
" 'rank_test_score': array([1, 1, 1, 1, 1, 1], dtype=int32)},\n",
|
||
" 'n_splits_': 3}"
|
||
]
|
||
},
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"random_forest_grid.__dict__"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"id": "1806fe6d-cf98-459d-b05a-eb95972281dc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Accuracy Score: 0.48955211455211456\n",
|
||
"F1 Score: 0.31752789604029275\n",
|
||
"Recall Score: 0.8335281227173119\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# print results for the best model\n",
|
||
"\n",
|
||
"y_pred = random_forest_grid.predict(X_test)\n",
|
||
"\n",
|
||
"# Calculate the F1 score\n",
|
||
"acc = accuracy_score(y_test, y_pred)\n",
|
||
"print(f\"Accuracy Score: {acc}\")\n",
|
||
"\n",
|
||
"f1 = f1_score(y_test, y_pred)\n",
|
||
"print(f\"F1 Score: {f1}\")\n",
|
||
"\n",
|
||
"recall = recall_score(y_test, y_pred)\n",
|
||
"print(f\"Recall Score: {recall}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"id": "1a6a8e07-bd93-496b-986e-d219c03b82c5",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAHFCAYAAAA+FskAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhdklEQVR4nO3deVxU5f4H8M/IMgLCyCIMKJomkoRbmICWu4CyZFZqGEkZet2IBO2i5VIp7pZiaqZiLtFimqlxUVGKiygiJCipJYpeGXEZByEcEM/vD3+eGgEFPeMw+nnf13m9nHO+5znPmdvU1+/zPOfIBEEQQERERNTANTJ0B4iIiIjqgkkLERERGQUmLURERGQUmLQQERGRUWDSQkREREaBSQsREREZBSYtREREZBSYtBAREZFRYNJCRERERoFJCz3Wjh49irfeegutW7dG48aN0aRJEzz33HOYP38+rl69qtdrZ2dno1evXlAoFJDJZPj0008lv4ZMJsPMmTMlb/d+EhISIJPJIJPJsH///mrHBUFA27ZtIZPJ0Lt37we6xueff46EhIR6nbN///5a+0RExs/U0B0g0pfVq1dj3LhxcHd3x+TJk+Hh4YHKykocPnwYK1euxIEDB7B161a9Xf/tt99GWVkZEhMTYWtri6eeekryaxw4cAAtWrSQvN26sra2xpo1a6olJqmpqfjzzz9hbW39wG1//vnncHBwQHh4eJ3Pee6553DgwAF4eHg88HWJqOFi0kKPpQMHDmDs2LEYMGAAtm3bBrlcLh4bMGAAoqOjkZSUpNc+5OXlISIiAgMHDtTbNXx8fPTWdl0MGzYMmzZtwvLly2FjYyPuX7NmDXx9fVFSUvJI+lFZWQmZTAYbGxuDfydEpD8cHqLH0pw5cyCTyfDFF1/oJCx3mJubIyQkRPx869YtzJ8/H8888wzkcjkcHR3x5ptv4vz58zrn9e7dG56ensjMzMSLL74IS0tLtGnTBnPnzsWtW7cA/D10cvPmTaxYsUIcRgGAmTNnin/+pzvnnDlzRtyXkpKC3r17w97eHhYWFmjZsiVeeeUV/PXXX2JMTcNDeXl5eOmll2Bra4vGjRujc+fOWL9+vU7MnWGUr7/+GtOmTYOLiwtsbGzQv39/nDhxom5fMoDXX38dAPD111+L+zQaDbZs2YK33367xnNmzZoFb29v2NnZwcbGBs899xzWrFmDf7679amnnsKxY8eQmpoqfn93KlV3+r5hwwZER0ejefPmkMvl+OOPP6oND12+fBmurq7o3r07KisrxfaPHz8OKysrhIWF1fleicjwmLTQY6eqqgopKSnw8vKCq6trnc4ZO3Ys3n//fQwYMADbt2/Hxx9/jKSkJHTv3h2XL1/WiVWpVBgxYgTeeOMNbN++HQMHDkRsbCw2btwIAAgMDMSBAwcAAK+++ioOHDggfq6rM2fOIDAwEObm5li7di2SkpIwd+5cWFlZoaKiotbzTpw4ge7du+PYsWNYunQpfvjhB3h4eCA8PBzz58+vFj916lScPXsWX375Jb744gucOnUKwcHBqKqqqlM/bWxs8Oqrr2Lt2rXivq+//hqNGjXCsGHDar23MWPG4Ntvv8UPP/yAIUOGYOLEifj444/FmK1bt6JNmzbo0qWL+P3dPZQXGxuLwsJCrFy5Ej/99BMcHR2rXcvBwQGJiYnIzMzE+++/DwD466+/8Nprr6Fly5ZYuXJlne6TiBoIgegxo1KpBADC8OHD6xSfn58vABDGjRuns//gwYMCAGHq1Knivl69egkAhIMHD+rEenh4CP7+/jr7AAjjx4/X2Tdjxgyhpp/dunXrBABCQUGBIAiC8P333wsAhJycnHv2HYAwY8YM8fPw4cMFuVwuFBYW6sQNHDhQsLS0FK5duyYIgiDs27dPACAMGjRIJ+7bb78VAAgHDhy453Xv9DczM1NsKy8vTxAEQXj++eeF8PBwQRAE4dlnnxV69epVaztVVVVCZWWl8NFHHwn29vbCrVu3xGO1nXvnej179qz12L59+3T2z5s3TwAgbN26VRg5cqRgYWEhHD169J73SEQNDyst9MTbt28fAFSb8NmtWze0b98ee/fu1dmvVCrRrVs3nX0dO3bE2bNnJetT586dYW5ujtGjR2P9+vU4ffp0nc5LSUlBv379qlWYwsPD8ddff1Wr+PxziAy4fR8A6nUvvXr1wtNPP421a9ciNzcXmZmZtQ4N3elj//79oVAoYGJiAjMzM0yfPh1XrlxBcXFxna/7yiuv1Dl28uTJCAwMxOuvv47169dj2bJl6NChQ53PJ6KGgUkLPXYcHBxgaWmJgoKCOsVfuXIFAODs7FztmIuLi3j8Dnt7+2pxcrkc5eXlD9Dbmj399NPYs2cPHB0dMX78eDz99NN4+umn8dlnn93zvCtXrtR6H3eO/9Pd93Jn/k997kUmk+Gtt97Cxo0bsXLlSrRr1w4vvvhijbGHDh2Cn58fgNuru/773/8iMzMT06ZNq/d1a7rPe/UxPDwcN27cgFKp5FwWIiPFpIUeOyYmJujXrx+ysrKqTaStyZ3/cBcVFVU7duHCBTg4OEjWt8aNGwMAtFqtzv67580AwIsvvoiffvoJGo0GGRkZ8PX1RVRUFBITE2tt397evtb7ACDpvfxTeHg4Ll++jJUrV+Ktt96qNS4xMRFmZmbYsWMHhg4diu7du6Nr164PdM2aJjTXpqioCOPHj0fnzp1x5coVxMTEPNA1iciwmLTQYyk2NhaCICAiIqLGiauVlZX46aefAAB9+/YFAHEi7R2ZmZnIz89Hv379JOvXnRUwR48e1dl/py81MTExgbe3N5YvXw4AOHLkSK2x/fr1Q0pKipik3PHVV1/B0tJSb8uBmzdvjsmTJyM4OBgjR46sNU4mk8HU1BQmJibivvLycmzYsKFarFTVq6qqKrz++uuQyWT4+eefERcXh2XLluGHH3546LaJ6NHic1roseTr64sVK1Zg3Lhx8PLywtixY/Hss8+isrIS2dnZ+OKLL+Dp6Yng4GC4u7tj9OjRWLZsGRo1aoSBAwfizJkz+PDDD+Hq6or33ntPsn4NGjQIdnZ2GDVqFD766COYmpoiISEB586d04lbuXIlUlJSEBgYiJYtW+LGjRviCp3+/fvX2v6MGTOwY8cO9OnTB9OnT4ednR02bdqEnTt3Yv78+VAoFJLdy93mzp1735jAwEAsXrwYoaGhGD16NK5cuYKFCxfWuCy9Q4cOSExMxDfffIM2bdqgcePGDzQPZcaMGfj111+RnJwMpVKJ6OhopKamYtSoUejSpQtat25d7zaJyDCYtNBjKyIiAt26dcOSJUswb948qFQqmJmZoV27dggNDcWECRPE2BUrVuDpp5/GmjVrsHz5cigUCgQEBCAuLq7GOSwPysbGBklJSYiKisIbb7yBpk2b4p133sHAgQPxzjvviHGdO3dGcnIyZsyYAZVKhSZNmsDT0xPbt28X54TUxN3dHenp6Zg6dSrGjx+P8vJytG/fHuvWravXk2X1pW/fvli7di3mzZuH4OBgNG/eHBEREXB0dMSoUaN0YmfNmoWioiJERETg+vXraNWqlc5zbOpi9+7diIuLw4cffqhTMUtISECXLl0wbNgwpKWlwdzcXIrbIyI9kwnCP57oRERERNRAcU4LERERGQUmLURERGQUmLQQERGRUWDSQkREREaBSQsREREZBSYtREREZBSYtBAREZFReCwfLtdm0i5Dd4GoQSrax98G0d3Ks+P1fg2LLhPuH1QHj6KvDRkrLURERGQUHstKCxERUYMiY41ACkxaiIiI9E0mM3QPHgtMWoiIiPSNlRZJ8FskIiIio8BKCxERkb5xeEgSTFqIiIj0jcNDkuC3SEREREaBlRYiIiJ94/CQJJi0EBER6RuHhyTBb5GIiOgJEBcXB5lMhqioKHFfeHg4ZDKZzubj46NznlarxcSJE+Hg4AArKyuEhITg/PnzOjFqtRphYWFQKBRQKBQICwvDtWvXdGIKCwsRHBwMKysrODg4IDIyEhUVFfW6ByYtRERE+iaTSbM9oMzMTHzxxRfo2LFjtWMBAQEoKioSt127dN9RFhUVha1btyIxMRFpaWkoLS1FUFAQqqqqxJjQ0FDk5OQgKSkJSUlJyMnJQVhYmHi8qqoKgYGBKCsrQ1paGhITE7FlyxZER0fX6z44PERERKRvBhweKi0txYgRI7B69Wp88skn1Y7L5XIolcoaz9VoNFizZg02bNiA/v37AwA2btwIV1dX7NmzB/7+/sjPz0dSUhIyMjLg7e0NAFi9ejV8fX1x4sQJuLu7Izk5GcePH8e5c+fg4uICAFi0aBHCw8Mxe/Zs2NjY1OleWGkhIiIyElqtFiUlJTqbVqu95znjx49HYGCgmHTcbf/+/XB0dES7du0QERGB4uJi8VhWVhYqKyvh5+cn7nNxcYGnpyfS09MBAAcOHIBCoRATFgDw8fGBQqHQifH09BQTFgDw9/eHVqtFVlZWne+fSQsREZG+STQ8FBcXJ84bubPFxcXVetnExEQcOXKk1piBAwdi06ZNSElJwaJFi5CZmYm+ffuKiZBKpYK5uTlsbW11znNycoJKpRJjHB0dq7Xt6OioE+Pk5KRz3NbWFubm5mJMXXB4iIiISN8kGh6KjY3FpEmTdPbJ5fIaY8+dO4d3330XycnJaNy4cY0xw4YNE//s6emJrl27olWrVti5cyeGDBlSaz8EQYDsH3NsZDXMt3mQmPthpYWIiEjfJKq0yOVy2NjY6Gy1JS1ZWVkoLi6Gl5cXTE1NYWpqitTUVCxduhSmpqY6E2nvcHZ2RqtWrXDq1CkAgFKpREVFBdRqtU5ccXGxWDlRKpW4ePFitbYuXbqkE3N3RUWtVqOysrJaBeZemLQQERE9hvr164fc3Fzk5OSIW9euXTFixAjk5OTAxMSk2jlXrlzBuXPn4OzsDADw8vKCmZkZdu/eLcYUFRUhLy8P3bt3BwD4+vpCo9Hg0KFDYszBgweh0Wh0YvLy8lBUVCTGJCcnQy6Xw8vLq873xOEhIiIifTPA6iFra2t4enrq7LOysoK9vT08PT1RWlqKmTNn4pVXXoGzszPOnDmDqVOnwsHBAS+//DIAQKFQYNSoUYiOjoa9vT3s7OwQExODDh06iBN727dvj4CAAERERGDVqlUAgNGjRyMoKAju7u4AAD8/P3h4eCAsLAwLFizA1atXERMTg4iIiDqvHAKYtBAREelfA3wiromJCXJzc/HVV1/h2rVrcHZ2Rp8+ffDNN9/A2tpajFuyZAlMTU0xdOhQlJeXo1+/fkhISNCp1GzatAmRkZHiKqOQkBDEx8frXGvnzp0YN24cevToAQsLC4SGhmLhwoX16rNMEAThIe+7wWkzadf9g4ieQEX7+Nsgult5dvz9gx6SRa+PJGmnPHW6JO0YK1ZaiIiI9K0RX5goBSYtRERE+tYAh4eMEb9FIiIiMgqstBAREenbQ7zskP7GpIWIiEjfODwkCX6LREREZBRYaSEiItI3Dg9JgkkLERGRvnF4SBJMWoiIiPSNlRZJMPUjIiIio8BKCxERkb5xeEgSTFqIiIj0jcNDkmDqR0REREaBlRYiIiJ94/CQJJi0EBER6RuHhyTB1I+IiIiMAistRERE+sbhIUkwaSEiItI3Ji2S4LdIRERERoGVFiIiIn3jRFxJMGkhIiLSNw4PSYJJCxERkb6x0iIJpn5ERERkFFhpISIi0jcOD0mCSQsREZG+cXhIEkz9iIiIyCiw0kJERKRnMlZaJMGkhYiISM+YtEiDw0NERERkFFhpISIi0jcWWiTBSgsREZGeyWQySbaHERcXB5lMhqioKHGfIAiYOXMmXFxcYGFhgd69e+PYsWM652m1WkycOBEODg6wsrJCSEgIzp8/rxOjVqsRFhYGhUIBhUKBsLAwXLt2TSemsLAQwcHBsLKygoODAyIjI1FRUVGve2DSQkRE9JjLzMzEF198gY4dO+rsnz9/PhYvXoz4+HhkZmZCqVRiwIABuH79uhgTFRWFrVu3IjExEWlpaSgtLUVQUBCqqqrEmNDQUOTk5CApKQlJSUnIyclBWFiYeLyqqgqBgYEoKytDWloaEhMTsWXLFkRHR9frPpi0EBER6ZkhKy2lpaUYMWIEVq9eDVtbW3G/IAj49NNPMW3aNAwZMgSenp5Yv349/vrrL2zevBkAoNFosGbNGixatAj9+/dHly5dsHHjRuTm5mLPnj0AgPz8fCQlJeHLL7+Er68vfH19sXr1auzYsQMnTpwAACQnJ+P48ePYuHEjunTpgv79+2PRokVYvXo1SkpK6nwvTFqIiIj0TKqkRavVoqSkRGfTarX3vPb48eMRGBiI/v376+wvKCiASqWCn5+fuE8ul6NXr15IT08HAGRlZaGyslInxsXFBZ6enmLMgQMHoFAo4O3tLcb4+PhAoVDoxHh6esLFxUWM8ff3h1arRVZWVp2/RyYtREREeiZV0hIXFyfOG7mzxcXF1XrdxMREHDlypMYYlUoFAHByctLZ7+TkJB5TqVQwNzfXqdDUFOPo6FitfUdHR52Yu69ja2sLc3NzMaYuuHqIiIjISMTGxmLSpEk6++RyeY2x586dw7vvvovk5GQ0bty41jbvHnYSBOG+Q1F3x9QU/yAx98NKCxERkb7JpNnkcjlsbGx0ttqSlqysLBQXF8PLywumpqYwNTVFamoqli5dClNTU7HycXelo7i4WDymVCpRUVEBtVp9z5iLFy9Wu/6lS5d0Yu6+jlqtRmVlZbUKzL0waSEiItIzQ0zE7devH3Jzc5GTkyNuXbt2xYgRI5CTk4M2bdpAqVRi9+7d4jkVFRVITU1F9+7dAQBeXl4wMzPTiSkqKkJeXp4Y4+vrC41Gg0OHDokxBw8ehEaj0YnJy8tDUVGRGJOcnAy5XA4vL6863xOHh4iIiB5D1tbW8PT01NlnZWUFe3t7cX9UVBTmzJkDNzc3uLm5Yc6cObC0tERoaCgAQKFQYNSoUYiOjoa9vT3s7OwQExODDh06iBN727dvj4CAAERERGDVqlUAgNGjRyMoKAju7u4AAD8/P3h4eCAsLAwLFizA1atXERMTg4iICNjY2NT5npi0EBER6VlDfffQlClTUF5ejnHjxkGtVsPb2xvJycmwtrYWY5YsWQJTU1MMHToU5eXl6NevHxISEmBiYiLGbNq0CZGRkeIqo5CQEMTHx4vHTUxMsHPnTowbNw49evSAhYUFQkNDsXDhwnr1VyYIgvCQ99zgtJm0y9BdIGqQivbxt0F0t/Ls+PsHPSS7sM2StHN1Q6gk7RgrzmkhIiIio8DhISIiIj1rqMNDxoZJCxERkb4xZ5EEh4eIiIjIKLDSQkREpGccHpIGkxYiIiI9Y9IiDSYtREREesakRRoGTVrKysqwefNmpKenQ6VSQSaTwcnJCT169MDrr78OKysrQ3aPiIiIGhCDTcQ9fvw42rVrhylTpkCtVqNly5Zo0aIF1Go1Jk+eDHd3dxw/ftxQ3SMiIpKORC9MfNIZrNIyfvx49OzZE+vXr4e5ubnOsYqKCoSHh2P8+PHYt2+fgXpIREQkDQ4PScNgScvBgwdx+PDhagkLAJibm2Pq1Kno1q2bAXpGREREDZHBhodsbW1x6tSpWo//8ccfsLW1fYQ9IiIi0g+ZTCbJ9qQzWKUlIiICI0eOxAcffIABAwbAyckJMpkMKpUKu3fvxpw5cxAVFWWo7hEREUmGCYc0DJa0zJw5ExYWFli8eDGmTJki/h8qCAKUSiX+/e9/Y8qUKYbqHhERETUwBl3y/P777+P9999HQUEBVCoVAECpVKJ169aG7BYREZGkWGmRRoN4uFzr1q2ZqBAR0eOLOYsk+MJEIiIiMgoNotJCRET0OOPwkDSYtBAREekZkxZpMGkhIiLSMyYt0jD4nJakpCSkpaWJn5cvX47OnTsjNDQUarXagD0jIiKihsTgScvkyZNRUlICAMjNzUV0dDQGDRqE06dPY9KkSQbuHRERkQT4wkRJGHx4qKCgAB4eHgCALVu2ICgoCHPmzMGRI0cwaNAgA/eOiIjo4XF4SBoGr7SYm5vjr7/+AgDs2bMHfn5+AAA7OzuxAkNERERk8ErLCy+8gEmTJqFHjx44dOgQvvnmGwDAyZMn0aJFCwP37skyontLjOjeEs3tLAAAp1SlWJb8B1J/vwQAmD+8I17tpvv/SfZZNV757IDOvi6tmiJ6UDt0btkUN28JOP6/Ery1OhPaylsAgC/e9oJHcxvYNzGHprwS/z15BfN2/I7iEi0AoKmlGZa80RnPOFujqZUZrlyvwJ5jF7Fw50mUam/q+2sguqeYt/3w8cQQxG/ah8kLt4j73Vs74ZN3B+PF59qiUSMZ8v8swhvvr8U5lRotne1wYtdHNbY3YvIa/LAnGy96uSH5y3drjHlhxHxkHS+EncIK62aPRId2zWGnsMSlq6XYsf8opsf/hOtlN/RyvyQNVlqkYfCkJT4+HuPGjcP333+PFStWoHnz5gCAn3/+GQEBAQbu3ZOl6NoNzN95Amcv3658DenaHKve9kLwojSculgKANifX4wpiUfFcyqrBJ02urRqioTRz2PF3j8x64fjqKy6hfYuNhBu/R2T8ccVfL73TxSX3IBS0Rixwe2xfORzeG3Z7eTnliBgT95FLN51ElfKtHjKwQqzhjyLpq+ZI2pjjn6/BKJ78PJoiVFDuuPoyfM6+1u3cMDetZOwfls6PlmxE5rScjzTWokb2koAwPmLajzVP1bnnLdf6YFJIwfgP/89BgDI+O10tZjp44LQ19sdWccLAQC3bt3CjtSjmPX5DlxWX0cb12b49N9DsUxhhfCpCXq6a5ICkxZpGDxpadmyJXbs2FFt/5IlSwzQmydbyvFinc+Lfj6JET1aostTTcWkpeLmLVy+XlFrGx8Mbo+EX89gZcppcd+Z/0+C7lj7yxnxzxfUN7Ay5U+sessLpo1kuHlLQEn5TWxKL9SJ2Zh+FhG92zzM7RE9FCsLc6ybE45xH3+Nf7+j+xeqWROC8Z+0Y5j22Y/ivjP/uyL++dYtARevXNc5J6RPJ3yfnIWy8tu/p8qbVToxpqaNENirA1Z+84u479r1cqz+7u/VloVFanzx3a94783+0twkUQNn8DktR44cQW5urvj5xx9/xODBgzF16lRUVNT+H0fSr0YyIKizMyzMTXDkzDVxv09bexya1Q97/90Lc4Z6wr6JuXjMvok5urSyxZXSCnw30ReHZvXD1+O90bW1ba3XUVia4aXnXHDkjBo3bwk1xjjayOHfQYlDp69Kdn9E9fVp7DAk/ZqHfQdP6OyXyWQIeOFZnCosxvbl43F2bxx++SoGwb071tpWl/au6PyMK9ZvO1BrTFCvjnBo2gQbt2fUGuPcTIGX+nbGr1mn6n9D9EjJZDJJtiedwZOWMWPG4OTJkwCA06dPY/jw4bC0tMR3332HKVOmGLh3Tx53Z2vkxvnh9/kB+OQ1T4xddwR//H+VJfX3S3hvYw7eWHEQs7fno6NrU2wc6w1zk9v/GLnaWwIA3vV3wzcZ5xD+RSaOnS/BhrHd8JSDpc513g9yR16cH7I/GQAXWwuMXptVrS+fvdEZx+b6I2NmP5TeuIl/f5NbLYboUXjN3wudn3HFh8u2VzvmaNcE1laNEfPWAOxOP47gsfHYvu83JC56By94ta2xvZGDfZF/uggZvxXUes2Rg32x+0A+zl+8Vu3Y+rhwXElfjNPJs1FSdgNjP9r8wPdGjwiXPEvC4EnLyZMn0blzZwDAd999h549e2Lz5s1ISEjAli1b7n0yAK1Wi5KSEp1NuFmp514/vk4XlyJoURpe+ewANqUXYsHrHdHWqQkAYGdOEfblX8JJVSlSjhfjrS8y0bqZFfp4NANwuzoDAF8fKMT3medx/H8l+OTHfBQUl+E1b1ed63yx7zSCF/8Xb648hFu3BCwK7VStLx//eBzBi9Mwes1htHSwxAcvtdfvzRPVoIVTUyyY/Are/mA9tBXVJ4I3anT7X6M79udi2aZ9OHryf1i4bjd2/XoMEa++UC2+sdwMwwZ2vWeVpbljUwzwbV9rzJSFW+AbOg+vvbcKbVo4YF70kAe8OyLjYvA5LYIg4Nat27M09+zZg6CgIACAq6srLl++fN/z4+LiMGvWLJ19TX1CYes7QvrOPgEqqwRxIm7ueQ06uioQ3vMpfPBdXrXYS9e1uKAux1PNrABAXP1zZ/7LHX9cLIVL08Y6+9RllVCXVaLgUhn+uFiK9Bl90aVVU2SfvSbGXL5egcvXK3C6uAzX/qrEtxN9sSz5D1y6rpXylonuqUv7lnCyt0H6pr8rv6amJnjhuafxr2E9Yd89GpWVVcg/XaRz3onTKnTvUn0e1sv9O8OysTk27ThU6zXDXvLBFU0ZdqQerfH4xSvXcfHKdZw8cxFXr5Vh77pJmLs6CarLfExEQ8WhHWkYvNLStWtXfPLJJ9iwYQNSU1MRGBgI4PZD55ycnO57fmxsLDQajc7W9Pmh+u72E0MGiMM/d2tqaQbnpo3FZOX81XKoNDfQ5v+TmDtaN7PC/9TltV/j/3/L5qa1/+N45+d+rxgifdh36AS8Xp0N7+FzxS3r2Fkk7joM7+FzUVF5E1nHz6JdK91/X7m1ckRhUfVXkYQP7o6dqbm4rC6tduyON0N8sHnHIdy8eavWmDvu/MfQ3MzgfwelezDEnJYVK1agY8eOsLGxgY2NDXx9ffHzzz+Lx8PDw6u17+Pjo9OGVqvFxIkT4eDgACsrK4SEhOD8ed3Vc2q1GmFhYVAoFFAoFAgLC8O1a9d0YgoLCxEcHAwrKys4ODggMjLygeatGvyf8k8//RQjRozAtm3bMG3aNLRte3sM+Pvvv0f37t3ve75cLodcLtfZJzM100tfH3cxg9ohNf8SLly7gSaNTRHU2Rnebe3x1heZsDQ3wbv+bkg6qkJxiRYt7CwQM8gdV8sqkJyrEttYve80ovzd8PuF6zh+oQRDujbH005NMH59NgCgY0sFOrVsisOnr0JTXomW9pZ4L6AdzlwuQ/b/T/jt3b4ZHJrIcfTcNZRpq+CmbIL3g57B4dNX75n8EOlD6V9aHP9Tt4pSVl6Bq5oycf+S9XuwYd7bSDvyB1IPn4Rfdw8M6ukJ/4jPdM5r4+qAF557GoMnrqj1er27tUPrFg5I2JZe7Zj/Cx5wtLNB1rGzKP1Li/ZPKzH73cFIz/4ThUWcqN6QGaLQ0qJFC8ydO1f87+r69evx0ksvITs7G88++ywAICAgAOvWrRPPMTc312kjKioKP/30ExITE2Fvb4/o6GgEBQUhKysLJiYmAIDQ0FCcP38eSUlJAIDRo0cjLCwMP/30EwCgqqoKgYGBaNasGdLS0nDlyhWMHDkSgiBg2bJl9bongyctHTt21Fk9dMeCBQvEL4QeDQdrORaN6IRmNnJcL7+JE0XX8dYXmUg7eRlys0Zwd7bGy12bw8bCDJdKtDjwxxVEbshGmbZKbGPdL2cgN22EaS+1R1NLM+RfuI43Vx5C4ZXbQ07aylvw7+CEKH83WJqboLhEi19+v4TIDdmoqLr9t8oblVUY5uOKDwa3h7lpIxSpb+A/uSqs2PunQb4XovvZvu8oJs5OxOS3/bBoyqs4ebYYr0/+Euk5p3XiRr7kiwvFGuw58HutbYUP7o4DOX/iRMHFasfKb1Ti7SHdMT9mCORmpjh/8Rp+TMnBwrW7Jb8nMn7BwcE6n2fPno0VK1YgIyNDTFrkcjmUSmWN52s0GqxZswYbNmxA//63l9Vv3LgRrq6u2LNnD/z9/ZGfn4+kpCRkZGTA29sbALB69Wr4+vrixIkTcHd3R3JyMo4fP45z587BxcUFALBo0SKEh4dj9uzZsLGxqfM9yQRBqHmdqRFrM2mXobtA1CAV7eNvg+hu5dnxer+G2+QkSdrJ+6QPtFrdeX01jTjcraqqCt999x1GjhyJ7OxseHh4IDw8HNu2bYO5uTmaNm2KXr16Yfbs2XB0dAQApKSkoF+/frh69Spsbf9+dEWnTp0wePBgzJo1C2vXrsWkSZOqDQc1bdoUS5YswVtvvYXp06fjxx9/xG+//SYeV6vVsLOzQ0pKCvr06VPn+zf4BIGqqiosXLgQ3bp1g1KphJ2dnc5GRERk7GQyaba4uDhx7sidLS4urtbr5ubmokmTJpDL5fjXv/6FrVu3ii8pHjhwIDZt2oSUlBQsWrQImZmZ6Nu3r5gUqVQqmJub6yQsAODk5ASVSiXG3Ely/snR0VEn5u45qra2tjA3Nxdj6srgScusWbOwePFiDB06FBqNBpMmTcKQIUPQqFEjzJw509DdIyIiajBqWnwSGxtba7y7uztycnKQkZGBsWPHYuTIkTh+/DgAYNiwYQgMDISnpyeCg4Px888/4+TJk9i5c+c9+yAIgs6k4JomCD9ITF0YPGnZtGkTVq9ejZiYGJiamuL111/Hl19+ienTpyMjo/YnQRIRERkLqVYPyeVycTXQne1eQ0Pm5uZo27Ytunbtiri4OHTq1AmfffZZjbHOzs5o1aoVTp26/YRlpVKJiooKqNW6q+CKi4vFyolSqcTFi9XnX126dEkn5u6KilqtRmVlZZ1WCf+TwZMWlUqFDh06AACaNGkCjUYDAAgKCrpvtkdERGQMpBoeeliCIFSbE3PHlStXcO7cOTg7OwMAvLy8YGZmht27/57oXVRUhLy8PHF1r6+vLzQaDQ4d+vu5QwcPHoRGo9GJycvLQ1HR36vwkpOTIZfL4eXlVa/+GzxpadGihXgjbdu2RXJyMgAgMzPzvhOLiIiIqGZTp07Fr7/+ijNnziA3NxfTpk3D/v37MWLECJSWliImJgYHDhzAmTNnsH//fgQHB8PBwQEvv/wyAEChUGDUqFGIjo7G3r17kZ2djTfeeAMdOnQQVxO1b98eAQEBiIiIQEZGBjIyMhAREYGgoCC4u7sDAPz8/ODh4YGwsDBkZ2dj7969iImJQURERL1WDgENYMnzyy+/jL1798Lb2xvvvvsuXn/9daxZswaFhYV47733DN09IiKih9aokQRlknq6ePEiwsLCUFRUBIVCgY4dOyIpKQkDBgxAeXk5cnNz8dVXX+HatWtwdnZGnz598M0338Da2lpsY8mSJTA1NcXQoUNRXl6Ofv36ISEhQeeRJJs2bUJkZCT8/PwAACEhIYiP/3tFlomJCXbu3Ilx48ahR48esLCwQGhoKBYuXFjve2pwS54zMjKQnp6Otm3bIiQk5IHa4JJnoppxyTNRdY9iyfOz05IlaefYbD9J2jFWBq+03M3Hx6faY4SJiIiIDJK0bN9e/fXutXnQagsREVFDwRcmSsMgScvgwYPrFCeTyVBVVXX/QCIiogaMOYs0DJK03Lp1/zeXEhERPS5YaZGGwZc8ExEREdWFwZKWlJQUeHh4oKSkpNoxjUaDZ599Fr/88osBekZERCQtqZ6I+6QzWNLy6aef1vpgGYVCgTFjxmDJkiUG6BkREZG0GsoTcY2dwZKW3377DQEBAbUe9/PzQ1ZW1iPsERERETVkBntOy8WLF2FmZlbrcVNTU1y6dOkR9oiIiEg/OLQjDYNVWpo3b47c3Nxajx89elR8aRMREZEx4/CQNAyWtAwaNAjTp0/HjRs3qh0rLy/HjBkzEBQUZICeERERUUNksOGhDz74AD/88APatWuHCRMmwN3dHTKZDPn5+Vi+fDmqqqowbdo0Q3WPiIhIMhwekobBkhYnJyekp6dj7NixiI2NxZ33NspkMvj7++Pzzz+Hk5OTobpHREQkGeYs0jDoCxNbtWqFXbt2Qa1W448//oAgCHBzc4Otra0hu0VEREQNUIN4y7OtrS2ef/55Q3eDiIhILzg8JI0GkbQQERE9zpizSINJCxERkZ6x0iINvjCRiIiIjAIrLURERHrGQos0mLQQERHpGYeHpMHhISIiIjIKrLQQERHpGQst0mDSQkREpGccHpIGh4eIiIjIKLDSQkREpGcstEiDSQsREZGecXhIGhweIiIiIqPASgsREZGesdIiDSYtREREesacRRpMWoiIiPSMlRZpcE4LERHRY2jFihXo2LEjbGxsYGNjA19fX/z888/icUEQMHPmTLi4uMDCwgK9e/fGsWPHdNrQarWYOHEiHBwcYGVlhZCQEJw/f14nRq1WIywsDAqFAgqFAmFhYbh27ZpOTGFhIYKDg2FlZQUHBwdERkaioqKi3vfEpIWIiEjPZDJptvpo0aIF5s6di8OHD+Pw4cPo27cvXnrpJTExmT9/PhYvXoz4+HhkZmZCqVRiwIABuH79uthGVFQUtm7disTERKSlpaG0tBRBQUGoqqoSY0JDQ5GTk4OkpCQkJSUhJycHYWFh4vGqqioEBgairKwMaWlpSExMxJYtWxAdHV3/71EQBKHeZzVwbSbtMnQXiBqkon38bRDdrTw7Xu/X6Lv0gCTtpET6PtT5dnZ2WLBgAd5++224uLggKioK77//PoDbVRUnJyfMmzcPY8aMgUajQbNmzbBhwwYMGzYMAHDhwgW4urpi165d8Pf3R35+Pjw8PJCRkQFvb28AQEZGBnx9ffH777/D3d0dP//8M4KCgnDu3Dm4uLgAABITExEeHo7i4mLY2NjUuf+stBARERkJrVaLkpISnU2r1d73vKqqKiQmJqKsrAy+vr4oKCiASqWCn5+fGCOXy9GrVy+kp6cDALKyslBZWakT4+LiAk9PTzHmwIEDUCgUYsICAD4+PlAoFDoxnp6eYsICAP7+/tBqtcjKyqrX/TNpISIi0jOphofi4uLEuSN3tri4uFqvm5ubiyZNmkAul+Nf//oXtm7dCg8PD6hUKgCAk5OTTryTk5N4TKVSwdzcHLa2tveMcXR0rHZdR0dHnZi7r2Nrawtzc3Mxpq64eoiIiEjPGkm0eig2NhaTJk3S2SeXy2uNd3d3R05ODq5du4YtW7Zg5MiRSE1NFY/fvapJEIT7rnS6O6am+AeJqQtWWoiIiIyEXC4XVwPd2e6VtJibm6Nt27bo2rUr4uLi0KlTJ3z22WdQKpUAUK3SUVxcLFZFlEolKioqoFar7xlz8eLFate9dOmSTszd11Gr1aisrKxWgbkfJi1ERER6ZojVQzURBAFarRatW7eGUqnE7t27xWMVFRVITU1F9+7dAQBeXl4wMzPTiSkqKkJeXp4Y4+vrC41Gg0OHDokxBw8ehEaj0YnJy8tDUVGRGJOcnAy5XA4vL6969Z/DQ0RERHpmiIfLTZ06FQMHDoSrqyuuX7+OxMRE7N+/H0lJSZDJZIiKisKcOXPg5uYGNzc3zJkzB5aWlggNDQUAKBQKjBo1CtHR0bC3t4ednR1iYmLQoUMH9O/fHwDQvn17BAQEICIiAqtWrQIAjB49GkFBQXB3dwcA+Pn5wcPDA2FhYViwYAGuXr2KmJgYRERE1GvlEMCkhYiISO8aGeCBuBcvXkRYWBiKioqgUCjQsWNHJCUlYcCAAQCAKVOmoLy8HOPGjYNarYa3tzeSk5NhbW0ttrFkyRKYmppi6NChKC8vR79+/ZCQkAATExMxZtOmTYiMjBRXGYWEhCA+/u9l5CYmJti5cyfGjRuHHj16wMLCAqGhoVi4cGG974nPaSF6gvA5LUTVPYrntAxccVCSdn4e633/oMcYKy1ERER6xncPSYNJCxERkZ4xZ5EGVw8RERGRUWClhYiISM9kYKlFCkxaiIiI9MwQq4ceRxweIiIiIqPASgsREZGecfWQNJi0EBER6RlzFmlweIiIiIiMAistREREetaIpRZJMGkhIiLSM+Ys0mDSQkREpGeciCsNzmkhIiIio8BKCxERkZ6x0CINJi1ERER6xom40uDwEBERERkFVlqIiIj0jHUWaTBpISIi0jOuHpIGh4eIiIjIKLDSQkREpGeNWGiRRJ2Slu3bt9e5wZCQkAfuDBER0eOIw0PSqFPSMnjw4Do1JpPJUFVV9TD9ISIiIqpRnZKWW7du6bsfREREjy0WWqTBOS1ERER6xuEhaTxQ0lJWVobU1FQUFhaioqJC51hkZKQkHSMiInpccCKuNOqdtGRnZ2PQoEH466+/UFZWBjs7O1y+fBmWlpZwdHRk0kJERER6Ue/ntLz33nsIDg7G1atXYWFhgYyMDJw9exZeXl5YuHChPvpIRERk1GQymSTbk67eSUtOTg6io6NhYmICExMTaLVauLq6Yv78+Zg6dao++khERGTUZBJtT7p6Jy1mZmZitufk5ITCwkIAgEKhEP9MREREJLV6z2np0qULDh8+jHbt2qFPnz6YPn06Ll++jA0bNqBDhw766CMREZFRa8ShHUnUu9IyZ84cODs7AwA+/vhj2NvbY+zYsSguLsYXX3wheQeJiIiMnUwmzfakq3fS0rVrV/Tp0wcA0KxZM+zatQslJSU4cuQIOnXqJHkHiYiIqP7i4uLw/PPPw9raGo6Ojhg8eDBOnDihExMeHl5tsq+Pj49OjFarxcSJE+Hg4AArKyuEhITg/PnzOjFqtRphYWFQKBRQKBQICwvDtWvXdGIKCwsRHBwMKysrODg4IDIystpjU+6Hb3kmIiLSM0OsHkpNTcX48eORkZGB3bt34+bNm/Dz80NZWZlOXEBAAIqKisRt165dOsejoqKwdetWJCYmIi0tDaWlpQgKCtJ5bU9oaChycnKQlJSEpKQk5OTkICwsTDxeVVWFwMBAlJWVIS0tDYmJidiyZQuio6PrdU/1ntPSunXre35xp0+frm+TREREjzVDDO0kJSXpfF63bh0cHR2RlZWFnj17ivvlcjmUSmWNbWg0GqxZswYbNmxA//79AQAbN26Eq6sr9uzZA39/f+Tn5yMpKQkZGRnw9vYGAKxevRq+vr44ceIE3N3dkZycjOPHj+PcuXNwcXEBACxatAjh4eGYPXs2bGxs6nRP9U5aoqKidD5XVlYiOzsbSUlJmDx5cn2bIyIiojrSarXQarU6++RyOeRy+X3P1Wg0AAA7Ozud/fv374ejoyOaNm2KXr16Yfbs2XB0dAQAZGVlobKyEn5+fmK8i4sLPD09kZ6eDn9/fxw4cAAKhUJMWADAx8cHCoUC6enpcHd3x4EDB+Dp6SkmLADg7+8PrVaLrKwscdrJ/dQ7aXn33Xdr3L98+XIcPny4vs0RERE99qRaPRQXF4dZs2bp7JsxYwZmzpx5z/MEQcCkSZPwwgsvwNPTU9w/cOBAvPbaa2jVqhUKCgrw4Ycfom/fvsjKyoJcLodKpYK5uTlsbW112nNycoJKpQIAqFQqMcn5J0dHR50YJycnneO2trYwNzcXY+pCshcmDhw4ELGxsVi3bp1UTRIRET0WpBoeio2NxaRJk3T21aXKMmHCBBw9ehRpaWk6+4cNGyb+2dPTE127dkWrVq2wc+dODBkypNb2BEHQmSpS07SRB4m5H8km4n7//ffVSk5EREQk3URcuVwOGxsbne1+ScvEiROxfft27Nu3Dy1atLhnrLOzM1q1aoVTp04BAJRKJSoqKqBWq3XiiouLxcqJUqnExYsXq7V16dIlnZi7KypqtRqVlZXVKjD38kAPl/tnViQIAlQqFS5duoTPP/+8vs0RERGRHgiCgIkTJ2Lr1q3Yv38/Wrdufd9zrly5gnPnzonPY/Py8oKZmRl2796NoUOHAgCKioqQl5eH+fPnAwB8fX2h0Whw6NAhdOvWDQBw8OBBaDQadO/eXYyZPXs2ioqKxLaTk5Mhl8vh5eVV53uSCYIg1P0rAGbOnKmTtDRq1AjNmjVD79698cwzz9SnKb25cdPQPSBqmH6/cN3QXSBqcDq3tNb7NSZuzZeknWUvt69z7Lhx47B582b8+OOPcHd3F/crFApYWFigtLQUM2fOxCuvvAJnZ2ecOXMGU6dORWFhIfLz82Ftfft7GTt2LHbs2IGEhATY2dkhJiYGV65cQVZWFkxMTADcniJy4cIFrFq1CgAwevRotGrVCj/99BOA20ueO3fuDCcnJyxYsABXr15FeHg4Bg8ejGXLltX5nuqdtBgDJi1ENWPSQlTdo0haIrf9Lkk7SwfXvThQ21yRdevWITw8HOXl5Rg8eDCys7Nx7do1ODs7o0+fPvj444/h6uoqxt+4cQOTJ0/G5s2bUV5ejn79+uHzzz/Xibl69SoiIyOxfft2AEBISAji4+PRtGlTMaawsBDjxo1DSkoKLCwsEBoaioULF9ZpTo54T/VNWkxMTFBUVFRtpvCVK1fg6Oio87AZQ2HSQlQzJi1E1T2uScvjqN5zWmrLcbRaLczNzR+6Q0RERI+bRnxvkCTqnLQsXboUwO1y05dffokmTZqIx6qqqvDLL780mDktREREDQmTFmnUOWlZsmQJgNuVlpUrV4qTbwDA3NwcTz31FFauXCl9D4mIiIhQj6SloKAAANCnTx/88MMP1Z6OR0RERDWr78sOqWb1ntOyb98+ffSDiIjoscXhIWnU+4m4r776KubOnVtt/4IFC/Daa69J0ikiIiKiu9U7aUlNTUVgYGC1/QEBAfjll18k6RQREdHjRCaTZnvS1Xt4qLS0tMalzWZmZigpKZGkU0RERI8Tqd7y/KSrd6XF09MT33zzTbX9iYmJ8PDwkKRTREREj5NGEm1PunpXWj788EO88sor+PPPP9G3b18AwN69e7F582Z8//33kneQiIiICHiApCUkJATbtm3DnDlz8P3338PCwgKdOnVCSkoKbGxs9NFHIiIio8bRIWnUO2kBgMDAQHEy7rVr17Bp0yZERUXht99+axDvHiIiImpIOKdFGg88RJaSkoI33ngDLi4uiI+Px6BBg3D48GEp+0ZEREQkqlel5fz580hISMDatWtRVlaGoUOHorKyElu2bOEkXCIiolqw0CKNOldaBg0aBA8PDxw/fhzLli3DhQsXsGzZMn32jYiI6LHQSCbN9qSrc6UlOTkZkZGRGDt2LNzc3PTZJyIiIqJq6lxp+fXXX3H9+nV07doV3t7eiI+Px6VLl/TZNyIiosdCI5lMku1JV+ekxdfXF6tXr0ZRURHGjBmDxMRENG/eHLdu3cLu3btx/fp1ffaTiIjIaPEx/tKo9+ohS0tLvP3220hLS0Nubi6io6Mxd+5cODo6IiQkRB99JCIiInq4pwK7u7tj/vz5OH/+PL7++mup+kRERPRY4URcaTzQw+XuZmJigsGDB2Pw4MFSNEdERPRYkYEZhxQkSVqIiIiodqySSIMvjSQiIiKjwEoLERGRnrHSIg0mLURERHom43plSXB4iIiIiIwCKy1ERER6xuEhaTBpISIi0jOODkmDw0NERERkFFhpISIi0jO+7FAarLQQERHpmSEe4x8XF4fnn38e1tbWcHR0xODBg3HixAmdGEEQMHPmTLi4uMDCwgK9e/fGsWPHdGK0Wi0mTpwIBwcHWFlZISQkBOfPn9eJUavVCAsLg0KhgEKhQFhYGK5du6YTU1hYiODgYFhZWcHBwQGRkZGoqKio1z0xaSEiInoMpaamYvz48cjIyMDu3btx8+ZN+Pn5oaysTIyZP38+Fi9ejPj4eGRmZkKpVGLAgAG4fv26GBMVFYWtW7ciMTERaWlpKC0tRVBQEKqqqsSY0NBQ5OTkICkpCUlJScjJyUFYWJh4vKqqCoGBgSgrK0NaWhoSExOxZcsWREdH1+ueZIIgCA/xnTRIN24augdEDdPvF67fP4joCdO5pbXer7HsvwWStDOxR+sHPvfSpUtwdHREamoqevbsCUEQ4OLigqioKLz//vsAbldVnJycMG/ePIwZMwYajQbNmjXDhg0bMGzYMADAhQsX4Orqil27dsHf3x/5+fnw8PBARkYGvL29AQAZGRnw9fXF77//Dnd3d/z8888ICgrCuXPn4OLiAgBITExEeHg4iouLYWNjU6d7YKWFiIhIzxpBJsn2MDQaDQDAzs4OAFBQUACVSgU/Pz8xRi6Xo1evXkhPTwcAZGVlobKyUifGxcUFnp6eYsyBAwegUCjEhAUAfHx8oFAodGI8PT3FhAUA/P39odVqkZWVVed74ERcIiIiPZNqHq5Wq4VWq9XZJ5fLIZfL73meIAiYNGkSXnjhBXh6egIAVCoVAMDJyUkn1snJCWfPnhVjzM3NYWtrWy3mzvkqlQqOjo7Vruno6KgTc/d1bG1tYW5uLsbUBSstRERERiIuLk6c7Hpni4uLu+95EyZMwNGjR/H1119XO3b3KwYEQbjvawfujqkp/kFi7odJCxERkZ5JtXooNjYWGo1GZ4uNjb3ntSdOnIjt27dj3759aNGihbhfqVQCQLVKR3FxsVgVUSqVqKiogFqtvmfMxYsXq1330qVLOjF3X0etVqOysrJaBeZemLQQERHpWSOZTJJNLpfDxsZGZ6ttaEgQBEyYMAE//PADUlJS0Lq17iTe1q1bQ6lUYvfu3eK+iooKpKamonv37gAALy8vmJmZ6cQUFRUhLy9PjPH19YVGo8GhQ4fEmIMHD0Kj0ejE5OXloaioSIxJTk6GXC6Hl5dXnb9HzmkhIiJ6DI0fPx6bN2/Gjz/+CGtra7HSoVAoYGFhAZlMhqioKMyZMwdubm5wc3PDnDlzYGlpidDQUDF21KhRiI6Ohr29Pezs7BATE4MOHTqgf//+AID27dsjICAAERERWLVqFQBg9OjRCAoKgru7OwDAz88PHh4eCAsLw4IFC3D16lXExMQgIiKiziuHACYtREREemeIB+KuWLECANC7d2+d/evWrUN4eDgAYMqUKSgvL8e4ceOgVqvh7e2N5ORkWFv/vQx8yZIlMDU1xdChQ1FeXo5+/fohISEBJiYmYsymTZsQGRkprjIKCQlBfHy8eNzExAQ7d+7EuHHj0KNHD1hYWCA0NBQLFy6s1z3xOS1ETxA+p4WoukfxnJY1hwolaWdUt5aStGOsOKeFiIiIjAKHh4iIiPSM70uUBpMWIiIiPeOwhjT4PRIREZFRYKWFiIhIz+rz1FeqHZMWIiIiPWPKIg0mLURERHrWiJUWSXBOCxERERkFVlqIiIj0jHUWaTBpISIi0jOODkmDw0NERERkFFhpISIi0jMueZYGkxYiIiI947CGNPg9EhERkVFgpYWIiEjPODwkDSYtREREesaURRocHiIiIiKjwEoLERGRnnF4SBpMWoiIiPSMwxrSYNJCRESkZ6y0SIPJHxERERkFVlqIiIj0jHUWaTBpISIi0jOODkmDw0NERERkFFhpISIi0rNGHCCSRIOttFy8eBEfffSRobtBRET00GQyabYnXYNNWlQqFWbNmmXobhAREVEDYbDhoaNHj97z+IkTJx5RT4iIiPRLxuEhSRgsaencuTNkMhkEQah27M5+PoyHiIgeB/zPmTQMlrTY29tj3rx56NevX43Hjx07huDg4EfcKyIiImqoDJa0eHl54cKFC2jVqlWNx69du1ZjFYaIiMjYcPWQNAw2EXfMmDF46qmnaj3esmVLrFu37tF1iIiISE8MtXrol19+QXBwMFxcXCCTybBt2zad4+Hh4ZDJZDqbj4+PToxWq8XEiRPh4OAAKysrhISE4Pz58zoxarUaYWFhUCgUUCgUCAsLw7Vr13RiCgsLERwcDCsrKzg4OCAyMhIVFRX1uh+DJS0vv/wy3njjjVqP29raYuTIkY+wR0RERPphqKSlrKwMnTp1Qnx8fK0xAQEBKCoqErddu3bpHI+KisLWrVuRmJiItLQ0lJaWIigoCFVVVWJMaGgocnJykJSUhKSkJOTk5CAsLEw8XlVVhcDAQJSVlSEtLQ2JiYnYsmULoqOj63U/fLgcERHRY2rgwIEYOHDgPWPkcjmUSmWNxzQaDdasWYMNGzagf//+AICNGzfC1dUVe/bsgb+/P/Lz85GUlISMjAx4e3sDAFavXg1fX1+cOHEC7u7uSE5OxvHjx3Hu3Dm4uLgAABYtWoTw8HDMnj0bNjY2dbqfBvucFiIioseFTKL/abValJSU6Gxarfah+rZ//344OjqiXbt2iIiIQHFxsXgsKysLlZWV8PPzE/e5uLjA09MT6enpAIADBw5AoVCICQsA+Pj4QKFQ6MR4enqKCQsA+Pv7Q6vVIisrq859ZdJCRESkZ41k0mxxcXHivJE7W1xc3AP3a+DAgdi0aRNSUlKwaNEiZGZmom/fvmIipFKpYG5uDltbW53znJycoFKpxBhHR8dqbTs6OurEODk56Ry3tbWFubm5GFMXHB4iIiIyErGxsZg0aZLOPrlc/sDtDRs2TPyzp6cnunbtilatWmHnzp0YMmRIrefd/Sy1mp6r9iAx98NKCxERkZ5JNTwkl8thY2Ojsz1M0nI3Z2dntGrVCqdOnQIAKJVKVFRUQK1W68QVFxeLlROlUomLFy9Wa+vSpUs6MXdXVNRqNSorK6tVYO7F4ElLUlIS0tLSxM/Lly9H586dERoaWu1LIiIiMkbG8sLEK1eu4Ny5c3B2dgZw+5lqZmZm2L17txhTVFSEvLw8dO/eHQDg6+sLjUaDQ4cOiTEHDx6ERqPRicnLy0NRUZEYk5ycDLlcDi8vrzr3z+BJy+TJk1FSUgIAyM3NRXR0NAYNGoTTp09XK4ERERFR3ZWWliInJwc5OTkAgIKCAuTk5KCwsBClpaWIiYnBgQMHcObMGezfvx/BwcFwcHDAyy+/DABQKBQYNWoUoqOjsXfvXmRnZ+ONN95Ahw4dxNVE7du3R0BAACIiIpCRkYGMjAxEREQgKCgI7u7uAAA/Pz94eHggLCwM2dnZ2Lt3L2JiYhAREVHnlUNAA5jTUlBQAA8PDwDAli1bEBQUhDlz5uDIkSMYNGiQgXtHRET08Az1wsTDhw+jT58+4uc7xYCRI0dixYoVyM3NxVdffYVr167B2dkZffr0wTfffANra2vxnCVLlsDU1BRDhw5FeXk5+vXrh4SEBJiYmIgxmzZtQmRkpLjKKCQkROfZMCYmJti5cyfGjRuHHj16wMLCAqGhoVi4cGG97kcmGPhZ+XZ2dkhLS4OHhwdeeOEFvPnmmxg9ejTOnDkDDw8P/PXXX/Vu88ZNPXSU6DHw+4Xrhu4CUYPTuaX1/YMe0i8nr0rSTs92dpK0Y6wMXml54YUXMGnSJPTo0QOHDh3CN998AwA4efIkWrRoYeDeERERUUNh8KQlPj4e48aNw/fff48VK1agefPmAICff/4ZAQEBBu4drVm9Cnt3J6Og4DTkjRujc+cuiJoUg6datwEAVFZWIn7pp0j79RecP38O1k2awNu3O959LxqOjrdnhP/vf+cxyK/mt3kvWPwp/PxvP60x//gxfLp4IY7l5aJRIxP0H+CHmCn/hqWV1aO5WaJaHD96BD99twEFJ/OhvnoZMTMX4vkevcXjB39NwZ6dP6DgVD6ul2gwb8UmPNXWvca2BEHA3GnvIiczvVo7P2xag+xD/8WZP0/A1NQM67btr3Z+wvKF+P1YDs6d+RPNXVtj/qrNEt8t6YOhhoceNwafiNuyZUvs2LEDv/32G0aNGiXuX7JkCZYuXWrAnhEAHM48hGGvj8CGr7/FqtXrcLOqCv+KGCUO2924cQO/5x/H6H+NxTff/YDFn8Xj7JkzeHfCWLENpdIZe/en6Wxjx0+EhYUlXnihJwCguPgiRo96C64tW2Lj19/i81Wr8ecfp/DhtFiD3DfRP2lvlKNVGze8NWFKrcfdn+2E10dNvG9bu36oPcm4efMmfHr2w4CgV2uNESCgj38IfHsNuH/HqcEwltVDDZ3BKy1HjhyBmZkZOnToAAD48ccfsW7dOnh4eGDmzJkwNzc3cA+fbCu+WKPz+aNP4tDnRV/kHz8Gr67Pw9raGqu+1H0b97+nfoARw19D0YULcHZxgYmJCRyaNdOJSdm7B/4DB4pVlF/274epmSmmfjADjRrdzqVjP5iBYa8ORuHZs2jZqpUe75Lo3rp064Eu3XrUerzngEAAQLHqwj3bOfPnSezcshlz4tdjzLDqleShI8cAAPb/56da23hr/GQAQIlGjcLTf9y379QwMN+QhsErLWPGjMHJkycBAKdPn8bw4cNhaWmJ7777DlOm1Py3GjKc0uu3J3LaKBS1x5SWQiaTwbqWZWzHj+XhxO/5eHnI33+brKisgJmZmZiwAEDjxrcfmJR9pO7vpSBqqLQ3bmDpnGl4a8JkNLVzMHR3iIySwZOWkydPonPnzgCA7777Dj179sTmzZuRkJCALVu23Pd8fbw8imomCAIWzo9Dl+e84ObWrsYYrVaLz5YsxMDAIDRp0qTGmK1bvkebNk+jc5fnxH3dvH1w5fJlJKz9EpUVFSjRaLD00yUAgMuXL0l/M0SP2PqVi9DOoyOe797b0F0hA2gkk0myPekMnrQIgoBbt24BAPbs2SM+m8XV1RWXL1++7/k1vTxqwbwHf3kU1S7uk49w6uRJzFuwuMbjlZWVeD/mPdy6JWDahzNrjLlx4wZ+3rUDg1/RHbNv29YNH8+ei68S1sG7a2f07dUDLVxbwN7eQaf6QmSMDqen4lj2YYSPizZ0V8hAZBJtTzqDz2np2rUrPvnkE/Tv3x+pqalYsWIFgNsPnavL+whqenmUYCLdexjotrjZH2P//hSsXb8RTkplteOVlZWYHB2F/50/j9Xr1tdaZdmdnITy8hsIDhlc7digoGAMCgrGlcuXYWFhAchk2LA+Ac259J2MXF7OYVwsOo+3BvfR2b/ooylo79kZMxZ9YaCeERkXgyctn376KUaMGIFt27Zh2rRpaNu2LQDg+++/F99ZcC9yubzay6L4cDnpCIKAuNkfI2XvbqxJ2IAWLVyrxdxJWArPnsWX675C06a2NbR027YftqB3n76ws6v9AUn2DrfH+7f+8D3M5XL4+NY+AZLIGAwePhJ9B76ks2/y6OEY+a9J8PJ50UC9okeKZRJJGDxp6dixI3Jzc6vtX7Bggc4jgskw5nw8Cz/v2oFPl30OK0srXL50e35JE2trNG7cGDdv3kTMe5HIzz+OZctX4VZVlRijUChg9o/VX4VnzyLrcCaWr6j5b5Vfb9qIzl26wMLSEhnp6ViyaD4i34uu13spiPThRvlfUP3vnPi5WPU/nPnjBJrYKODgqERpiQaXi1VQX7n9z/6F82cBAE3t7NHUzkHc7ubgqISjc3Px8+VildjWrVu3cOaPEwAAZXNXNLawBACo/ncON8r/wrWrV1BRcUOMadGqDUzNzPTzBdBD43NapGHwx/jrAyst0un0bM0PyProkzi89PKQez447st1X+H5bt7i56WfLsaOn35E0u59Nc5TmRY7Bb+mpuKvv8rQunUbvPnW2zUOI9GD42P8H8yx3w7jo5h/Vdvfa0AQxk2Zif3/+QkrFs6qdvzVsAi89uaYGtscNqBrtYfLfT5/JlJ376gWO33hSjzbqSsAYFb0aBw/eqRazLIN2+GodKnrLdE/PIrH+B/8UyNJO95P175y80lg8KSlqqoKS5YswbfffovCwkJUVFToHL96tf7va2DSQlQzJi1E1T2KpOXQaWmSlm5tnuykxeDLMmbNmoXFixdj6NCh0Gg0mDRpEoYMGYJGjRph5syZhu4eERHRQ+PqIWkYPGnZtGkTVq9ejZiYGJiamuL111/Hl19+ienTpyMjI8PQ3SMiIqIGwuBJi0qlEh/h36RJE2g0t0toQUFB2LlzpyG7RkREJA2WWiRh8KSlRYsWKCoqAgC0bdsWycnJAIDMzMxqS5mJiIiMkUyi/z3pDJ60vPzyy9i7dy8A4N1338WHH34INzc3vPnmm3j77bcN3DsiIqKHx7c8S8Pgq4fulpGRgfT0dLRt2xYhISEP1AZXDxHVjKuHiKp7FKuHss6USNKO11NP9nOrDP5wubv5+PjAx8fH0N0gIiKSDIsk0jBI0rJ9+/Y6xz5otYWIiKjBYNYiCYMkLYMHD65TnEwmQ1VVlX47Q0REREbBIEnLrVu3DHFZIiIig+DKH2k0uDktREREjxuu/JGGwZY8p6SkwMPDAyUl1WdUazQaPPvss/jll18M0DMiIiJqiAyWtHz66aeIiIiAjU315VsKhQJjxozBkiVLDNAzIiIiafGBuNIwWNLy22+/ISAgoNbjfn5+yMrKeoQ9IiIi0hNmLZIwWNJy8eJFmJmZ1Xrc1NQUly5deoQ9IiIioobMYElL8+bNkZubW+vxo0ePwtnZ+RH2iIiISD/47iFpGCxpGTRoEKZPn44bN25UO1ZeXo4ZM2YgKCjIAD0jIiKSFt89JA2DvXvo4sWLeO6552BiYoIJEybA3d0dMpkM+fn5WL58OaqqqnDkyBE4OTnVu22+e4ioZnz3EFF1j+LdQ3nnSyVpx7NFE0naMVYGq7Q4OTkhPT0dnp6eiI2Nxcsvv4zBgwdj6tSp8PT0xH//+98HSliIiIjotl9++QXBwcFwcXGBTCbDtm3bdI4LgoCZM2fCxcUFFhYW6N27N44dO6YTo9VqMXHiRDg4OMDKygohISE4f/68ToxarUZYWBgUCgUUCgXCwsJw7do1nZjCwkIEBwfDysoKDg4OiIyMREVFRb3ux2BJCwC0atUKu3btwuXLl3Hw4EFkZGTg8uXL2LVrF5566ilDdo2IiEg6Blo9VFZWhk6dOiE+Pr7G4/Pnz8fixYsRHx+PzMxMKJVKDBgwANev/12VjYqKwtatW5GYmIi0tDSUlpYiKChI5zU7oaGhyMnJQVJSEpKSkpCTk4OwsDDxeFVVFQIDA1FWVoa0tDQkJiZiy5YtiI6Ortf9GGx4SJ84PERUMw4PEVX3KIaHjv2vTJJ2nm1u9cDnymQybN26VXz/nyAIcHFxQVRUFN5//30At6sqTk5OmDdvHsaMGQONRoNmzZphw4YNGDZsGADgwoULcHV1xa5du+Dv74/8/Hx4eHggIyMD3t7eAICMjAz4+vri999/h7u7O37++WcEBQXh3LlzcHFxAQAkJiYiPDwcxcXFNT6zrSYGrbQQERGRYRQUFEClUsHPz0/cJ5fL0atXL6SnpwMAsrKyUFlZqRPj4uICT09PMebAgQNQKBRiwgIAPj4+UCgUOjGenp5iwgIA/v7+0Gq19XomG989REREpGdSrfzRarXQarU6++RyOeRyeb3bUqlUAFBt/qiTkxPOnj0rxpibm8PW1rZazJ3zVSoVHB0dq7Xv6OioE3P3dWxtbWFubi7G1AUrLURERHom1ZSWuLg4cbLrnS0uLu7h+nZXRiUIQrV9d7s7pqb4B4m5HyYtRERERiI2NhYajUZni42NfaC2lEolAFSrdBQXF4tVEaVSiYqKCqjV6nvGXLx4sVr7ly5d0om5+zpqtRqVlZX1WinMpIWIiEjfJCq1yOVy2NjY6GwPMjQEAK1bt4ZSqcTu3bvFfRUVFUhNTUX37t0BAF5eXjAzM9OJKSoqQl5enhjj6+sLjUaDQ4cOiTEHDx6ERqPRicnLy0NRUZEYk5ycDLlcDi8vrzr3mXNaiIiI9MxQj+AvLS3FH3/8IX4uKChATk4O7Ozs0LJlS0RFRWHOnDlwc3ODm5sb5syZA0tLS4SGhgIAFAoFRo0ahejoaNjb28POzg4xMTHo0KED+vfvDwBo3749AgICEBERgVWrVgEARo8ejaCgILi7uwO4/RJkDw8PhIWFYcGCBbh69SpiYmIQERFR55VDAJMWIiKix9bhw4fRp08f8fOkSZMAACNHjkRCQgKmTJmC8vJyjBs3Dmq1Gt7e3khOToa19d/LwJcsWQJTU1MMHToU5eXl6NevHxISEmBiYiLGbNq0CZGRkeIqo5CQEJ1nw5iYmGDnzp0YN24cevToAQsLC4SGhmLhwoX1uh8+p4XoCcLntBBV9yie03JC9Zck7bgrLSVpx1ix0kJERKRnfNehNJi0EBER6RuzFklw9RAREREZBVZaiIiI9MxQq4ceN0xaiIiI9Eyqx/g/6Tg8REREREaBlRYiIiI9Y6FFGkxaiIiI9I1ZiyQ4PERERERGgZUWIiIiPePqIWkwaSEiItIzrh6SBoeHiIiIyCiw0kJERKRnLLRIg0kLERGRvjFrkQSTFiIiIj3jRFxpcE4LERERGQVWWoiIiPSMq4ekwaSFiIhIz5izSIPDQ0RERGQUWGkhIiLSMw4PSYNJCxERkd4xa5ECh4eIiIjIKLDSQkREpGccHpIGkxYiIiI9Y84iDQ4PERERkVFgpYWIiEjPODwkDSYtREREesZ3D0mDSQsREZG+MWeRBOe0EBERkVFgpYWIiEjPWGiRBpMWIiIiPeNEXGlweIiIiOgxNHPmTMhkMp1NqVSKxwVBwMyZM+Hi4gILCwv07t0bx44d02lDq9Vi4sSJcHBwgJWVFUJCQnD+/HmdGLVajbCwMCgUCigUCoSFheHatWt6uScmLURERHomk+h/9fXss8+iqKhI3HJzc8Vj8+fPx+LFixEfH4/MzEwolUoMGDAA169fF2OioqKwdetWJCYmIi0tDaWlpQgKCkJVVZUYExoaipycHCQlJSEpKQk5OTkICwt7uC+sFhweIiIi0jcDDQ+ZmprqVFfuEAQBn376KaZNm4YhQ4YAANavXw8nJyds3rwZY8aMgUajwZo1a7Bhwwb0798fALBx40a4urpiz5498Pf3R35+PpKSkpCRkQFvb28AwOrVq+Hr64sTJ07A3d1d0vthpYWIiMhIaLValJSU6GxarbbW+FOnTsHFxQWtW7fG8OHDcfr0aQBAQUEBVCoV/Pz8xFi5XI5evXohPT0dAJCVlYXKykqdGBcXF3h6eooxBw4cgEKhEBMWAPDx8YFCoRBjpMSkhYiISM9kEm1xcXHi3JE7W1xcXI3X9Pb2xldffYX//Oc/WL16NVQqFbp3744rV65ApVIBAJycnHTOcXJyEo+pVCqYm5vD1tb2njGOjo7Vru3o6CjGSInDQ0RERHom1eqh2NhYTJo0SWefXC6vMXbgwIHinzt06ABfX188/fTTWL9+PXx8fP6/X7odEwSh2r673R1TU3xd2nkQrLQQEREZCblcDhsbG52ttqTlblZWVujQoQNOnTolznO5uxpSXFwsVl+USiUqKiqgVqvvGXPx4sVq17p06VK1Ko4UmLQQERHpmaFWD/2TVqtFfn4+nJ2d0bp1ayiVSuzevVs8XlFRgdTUVHTv3h0A4OXlBTMzM52YoqIi5OXliTG+vr7QaDQ4dOiQGHPw4EFoNBoxRkocHiIiItIzQzxcLiYmBsHBwWjZsiWKi4vxySefoKSkBCNHjoRMJkNUVBTmzJkDNzc3uLm5Yc6cObC0tERoaCgAQKFQYNSoUYiOjoa9vT3s7OwQExODDh06iKuJ2rdvj4CAAERERGDVqlUAgNGjRyMoKEjylUMAkxYiIqLH0vnz5/H666/j8uXLaNasGXx8fJCRkYFWrVoBAKZMmYLy8nKMGzcOarUa3t7eSE5OhrW1tdjGkiVLYGpqiqFDh6K8vBz9+vVDQkICTExMxJhNmzYhMjJSXGUUEhKC+Ph4vdyTTBAEQS8tG9CNm4buAVHD9PuF6/cPInrCdG5pff+gh6T+q+r+QXVga2ly/6DHGCstREREesZ3D0mDSQsREZGePewkWrqNq4eIiIjIKLDSQkREpGccHpIGkxYiIiI9Y84iDQ4PERERkVFgpYWIiEjfWGqRBJMWIiIiPePqIWlweIiIiIiMAistREREesbVQ9Jg0kJERKRnzFmkwaSFiIhI35i1SIJzWoiIiMgosNJCRESkZ1w9JA0mLURERHrGibjS4PAQERERGQWZIAiCoTtBjyetVou4uDjExsZCLpcbujtEDQZ/G0QPhkkL6U1JSQkUCgU0Gg1sbGwM3R2iBoO/DaIHw+EhIiIiMgpMWoiIiMgoMGkhIiIio8CkhfRGLpdjxowZnGhIdBf+NogeDCfiEhERkVFgpYWIiIiMApMWIiIiMgpMWoiIiMgoMGmhOpPJZNi2bZuhu0HUoPB3QfToMGkhAIBKpcLEiRPRpk0byOVyuLq6Ijg4GHv37jV01wAAgiBg5syZcHFxgYWFBXr37o1jx44Zulv0mGvov4sffvgB/v7+cHBwgEwmQ05OjqG7RKRXTFoIZ86cgZeXF1JSUjB//nzk5uYiKSkJffr0wfjx4w3dPQDA/PnzsXjxYsTHxyMzMxNKpRIDBgzA9evXDd01ekwZw++irKwMPXr0wNy5cw3dFaJHQ6An3sCBA4XmzZsLpaWl1Y6p1WrxzwCErVu3ip+nTJkiuLm5CRYWFkLr1q2FDz74QKioqBCP5+TkCL179xaaNGkiWFtbC88995yQmZkpCIIgnDlzRggKChKaNm0qWFpaCh4eHsLOnTtr7N+tW7cEpVIpzJ07V9x348YNQaFQCCtXrnzIuyeqWUP/XfxTQUGBAEDIzs5+4PslMgamBs6ZyMCuXr2KpKQkzJ49G1ZWVtWON23atNZzra2tkZCQABcXF+Tm5iIiIgLW1taYMmUKAGDEiBHo0qULVqxYARMTE+Tk5MDMzAwAMH78eFRUVOCXX36BlZUVjh8/jiZNmtR4nYKCAqhUKvj5+Yn75HI5evXqhfT0dIwZM+YhvgGi6ozhd0H0JGLS8oT7448/IAgCnnnmmXqf+8EHH4h/fuqppxAdHY1vvvlG/JdzYWEhJk+eLLbt5uYmxhcWFuKVV15Bhw4dAABt2rSp9ToqlQoA4OTkpLPfyckJZ8+erXe/ie7HGH4XRE8izml5wgn//0BkmUxW73O///57vPDCC1AqlWjSpAk+/PBDFBYWiscnTZqEd955B/3798fcuXPx559/isciIyPxySefoEePHpgxYwaOHj163+vd3UdBEB6o30T3Y0y/C6InCZOWJ5ybmxtkMhny8/PrdV5GRgaGDx+OgQMHYseOHcjOzsa0adNQUVEhxsycORPHjh1DYGAgUlJS4OHhga1btwIA3nnnHZw+fRphYWHIzc1F165dsWzZshqvpVQqAfxdcbmjuLi4WvWFSArG8LsgeiIZdEYNNQgBAQH1nnC4cOFCoU2bNjqxo0aNEhQKRa3XGT58uBAcHFzjsX//+99Chw4dajx2ZyLuvHnzxH1arZYTcUmvGvrv4p84EZeeFKy0ED7//HNUVVWhW7du2LJlC06dOoX8/HwsXboUvr6+NZ7Ttm1bFBYWIjExEX/++SeWLl0q/m0RAMrLyzFhwgTs378fZ8+exX//+19kZmaiffv2AICoqCj85z//QUFBAY4cOYKUlBTx2N1kMhmioqIwZ84cbN26FXl5eQgPD4elpSVCQ0Ol/0KI0PB/F8DtCcM5OTk4fvw4AODEiRPIycmpVpUkemwYOmuihuHChQvC+PHjhVatWgnm5uZC8+bNhZCQEGHfvn1iDO5a2jl58mTB3t5eaNKkiTBs2DBhyZIl4t8otVqtMHz4cMHV1VUwNzcXXFxchAkTJgjl5eWCIAjChAkThKefflqQy+VCs2bNhLCwMOHy5cu19u/WrVvCjBkzBKVSKcjlcqFnz55Cbm6uPr4KIlFD/12sW7dOAFBtmzFjhh6+DSLDkwnC/884IyIiImrAODxERERERoFJCxERERkFJi1ERERkFJi0EBERkVFg0kJERERGgUkLERERGQUmLURERGQUmLQQPYZmzpyJzp07i5/Dw8MxePDgR96PM2fOQCaTIScn55Ffm4geP0xaiB6h8PBwyGQyyGQymJmZoU2bNoiJiUFZWZler/vZZ58hISGhTrFMNIiooTI1dAeInjQBAQFYt24dKisr8euvv+Kdd95BWVkZVqxYoRNXWVkJMzMzSa6pUCgkaYeIyJBYaSF6xORyOZRKJVxdXREaGooRI0Zg27Zt4pDO2rVr0aZNG8jlcgiCAI1Gg9GjR8PR0RE2Njbo27cvfvvtN502586dCycnJ1hbW2PUqFG4ceOGzvG7h4du3bqFefPmoW3btpDL5WjZsiVmz54NAGjdujUAoEuXLpDJZOjdu7d43rp169C+fXs0btwYzzzzDD7//HOd6xw6dAhdunRB48aN0bVrV2RnZ0v4zRHRk46VFiIDs7CwQGVlJQDgjz/+wLfffostW7bAxMQEABAYGAg7Ozvs2rULCoUCq1atQr9+/XDy5EnY2dnh22+/xYwZM7B8+XK8+OKL2LBhA5YuXYo2bdrUes3Y2FisXr0aS5YswQsvvICioiL8/vvvAG4nHt26dcOePXvw7LPPwtzcHACwevVqzJgxA/Hx8ejSpQuys7MREREBKysrjBw5EmVlZQgKCkLfvn2xceNGFBQU4N1339Xzt0dETxQDv7CR6IkycuRI4aWXXhI/Hzx4ULC3txeGDh0qzJgxQzAzMxOKi4vF43v37hVsbGyEGzdu6LTz9NNPC6tWrRIEQRB8fX2Ff/3rXzrHvb29hU6dOtV43ZKSEkEulwurV6+usY8FBQUCACE7O1tnv6urq7B582adfR9//LHg6+srCIIgrFq1SrCzsxPKysrE4ytWrKixLSKiB8HhIaJHbMeOHWjSpAkaN24MX19f9OzZE8uWLQMAtGrVCs2aNRNjs7KyUFpaCnt7ezRp0kTcCgoK8OeffwIA8vPz4evrq3ONuz//U35+PrRaLfr161fnPl+6dAnnzp3DqFGjdPrxySef6PSjU6dOsLS0rFM/iIjqi8NDRI9Ynz59sGLFCpiZmcHFxUVnsq2VlZVO7K1bt+Ds7Iz9+/dXa6dp06YPdH0LC4t6n3Pr1i0At4eIvL29dY7dGcYSBOGB+kNEVFdMWogeMSsrK7Rt27ZOsc899xxUKhVMTU3x1FNP1RjTvn17ZGRk4M033xT3ZWRk1Nqmm5sbLCwssHfvXrzzzjvVjt+Zw1JVVSXuc3JyQvPmzXH69GmMGDGixnY9PDywYcMGlJeXi4nRvfpBRFRfHB4iasD69+8PX19fDB48GP/5z39w5swZpKen44MPPsDhw4cBAO+++y7Wrl2LtWvX4uTJk5gxYwaOHTtWa5uNGzfG+++/jylTpuCrr77Cn3/+iYyMDKxZswYA4OjoCAsLCyQlJeHixYvQaDQAbj+wLi4uDp999hlOnjyJ3NxcrFu3DosXLwYAhIaGolGjRhg1ahSOHz+OXbt2YeHChXr+hojoScKkhagBk8lk2LVrF3r27Im3334b7dq1w/Dhw3HmzBk4OTkBAIYNG4bp06fj/fffh5eXF86ePYuxY8fes90PP/wQ0dHRmD59Otq3b49hw4ahuLgYAGBqaoqlS5di1apVcHFxwUsvvQQAeOedd/Dll18iISEBHTp0QK9evZCQkCAukW7SpAl++uknHD9+HF26dMG0adMwb948PX47RPSkkQkciCYiIiIjwEoLERERGQUmLURERGQUmLQQERGRUWDSQkREREaBSQsREREZBSYtREREZBSYtBAREZFRYNJCRERERoFJCxERERkFJi1ERERkFJi0EBERkVFg0kJERERG4f8AgtqjUunkTI8AAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# confusion matrix \n",
|
||
"\n",
|
||
"draw_confusion_matrix(y_test, y_pred)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"id": "1e1b3e42-1075-4a4a-bf44-3dadde3dbed1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAK8CAYAAACeK2TMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3QUhdfG8W96LwQIJSQ0qVJCEQWUKihFQQERFdGf2LC8YsfeC6LYsXdFRAEVEMGCSFEpAQSkl4QSIIT0np33j4HgsAETSDK72edzDsfsZDa5QZ5suMzc62UYhoGIiIiIiIiIiHgMb7sLEBERERERERGRqqWGkIiIiIiIiIiIh1FDSERERERERETEw6ghJCIiIiIiIiLiYdQQEhERERERERHxMGoIiYiIiIiIiIh4GDWEREREREREREQ8jBpCIiIiIiIiIiIeRg0hEREREREREREPo4aQiIiIiJt7/PHHqVmzJrt27bK7FBEREXETagiJiIhUorVr13LttdfSuHFjAgMDCQ0NpWPHjkycOJHU1FRbavroo4/w8vJixYoVlfp5du7ciZeXV8kvb29vatSoQd++fZk/f/4Jnzdv3jwGDRpE7dq1CQgIIDY2ljFjxrBhw4YTPuf333/nsssuIyYmBn9/fyIiIujWrRtTpkwhOzu7Mr48Wxz9f7dz507L8UcffZRLLrmEESNGUFBQUOpzH3vsMby8vCqsloULF+Ll5cXChQsr7GOWplGjRlxzzTXles7SpUt57LHHSEtLc3pfr1696NWrV4XUJiIi4s7UEBIREakk7777Lp06dWL58uXcc889zJs3j5kzZzJixAjeeustrrvuOrtLrBK33XYby5Yt4/fff2fSpEls2bKFgQMHsmjRIqdz7733XgYMGIDD4eDNN99kwYIFPProoyxfvpyOHTsyY8YMp+c8+uij9OjRgz179vDkk0+yYMECvvzyS/r27ctjjz3GQw89VBVfpu3eeustateuzfjx4+0upULNnDmThx9+uFzPWbp0KY8//nipDaE333yTN998s4KqExERcV++dhcgIiJSHS1btoybb76Zfv36MWvWLAICAkre169fP+666y7mzZtXpTUVFhZW6BUiZRUXF8c555wDQPfu3WnWrBk9e/bk/fffp0ePHiXnTZ06lRdeeIGbb77Z8hf2Hj16MGrUKHr27Mno0aOJj4+nSZMmAEyfPp0nnniC6667jnfffdfy9Q0YMIB7772XZcuWVdFXai9fX1/mzJljdxkVrkOHDhX68Vq3bl2hH09ERMRd6QohERGRSvDMM8/g5eXFO++8Y2kGHeXv78/FF19c8tjhcDBx4kRatmxJQEAA0dHRXH311ezevdvyvBPdPnP8bTBHb+f59NNPueuuu4iJiSEgIICtW7eWnHP48GGuvfZaoqKiCAkJ4aKLLmL79u1OH/unn36ib9++hIeHExwcTPfu3fn5559P4XfF1LlzZwD2799vOf70009To0YNJk2a5PSckJAQXnvtNXJycpg8eXLJ8SeeeIIaNWrw6quvltrsCgsLo3///qdc6/F69epFmzZtWLZsGd26dSMoKIhGjRrx4YcfAjBnzhw6duxIcHAwbdu2LbXpt3jxYvr27UtYWBjBwcF069at1EbOH3/8Qffu3QkMDKR+/fpMmDCBwsLCUuuaNm0aXbt2JSQkhNDQUPr378/KlSvL9DUd/9wLLriAhISEcvyuWH333Xd07dqV4OBgwsLC6NevX6lNuW+//ZZ27doREBBAkyZNeOWVV0q9re34P/MOh4OnnnqKFi1aEBQURGRkJO3ateOVV14BzFvj7rnnHgAaN25ccsvi0VvbSrtlbO/evVx22WWEhYURERHByJEj+eOPP/Dy8uKjjz4qOe9Et5tdc801NGrUyHKsoKCAp556qiTTtWvX5tprr+XgwYNl+40UERGpZGoIiYiIVLDi4mJ++eUXOnXqRGxsbJmec/PNN3PffffRr18/vvvuO5588knmzZtHt27dSElJOeVaJkyYQGJiIm+99Rbff/890dHRJe+77rrr8Pb25osvvuDll1/mr7/+olevXpbbbD777DP69+9PeHg4H3/8MV999RVRUVFccMEFp9wU2rFjBwDNmzcvObZv3z7Wr19P//79CQ4OLvV5Xbt2JTo6mgULFpQ8Z926dSd9TlkcbZ499thjZTo/OTmZa6+9lrFjx/Ltt9/Stm1b/ve///HEE08wYcIE7r33Xr755htCQ0MZOnQoe/fuLXnub7/9Rp8+fUhPT+f9999n6tSphIWFcdFFFzFt2rSS8zZs2EDfvn1JS0vjo48+4q233iIhIYGnnnrKqZ5nnnmGUaNG0bp1a7766is++eQTMjIyOO+881i3bt1Jv5bjn/vpp5+SmZnJeeedd9KZTSfyxRdfMGTIEMLDw5k6dSrvv/8+hw8fplevXixevLjkvHnz5nHppZdSs2ZNpk2bxsSJE5k6dSoff/zxf36OiRMn8thjjzFq1CjmzJnDtGnTuO6660r+3I4dO5bbbrsNgBkzZrBs2TKWLVtGx44dS/14ubm5nH/++cyfP59nn32W6dOnU7duXUaOHFnur/8oh8PBkCFDeO6557jiiiuYM2cOzz33HAsWLKBXr17k5uae8scWERGpMIaIiIhUqOTkZAMwLr/88jKd/88//xiAMW7cOMvxP//80wCMBx54oORYw4YNjTFjxjh9jJ49exo9e/Ysefzrr78agNGjRw+ncz/88EMDMC655BLL8SVLlhiA8dRTTxmGYRjZ2dlGVFSUcdFFF1nOKy4uNtq3b2906dLlpF/Xjh07DMB4/vnnjcLCQiMvL89YvXq10bVrV6NevXrGjh07Ss79448/DMC4//77T/oxzz77bCMoKKhcz/kvCxcuNHx8fIzHH3/8P8/t2bOnARgrVqwoOXbo0CHDx8fHCAoKMvbs2VNyfPXq1QZgvPrqqyXHzjnnHCM6OtrIzMwsOVZUVGS0adPGaNCggeFwOAzDMIyRI0caQUFBRnJysuW8li1bGkDJ711iYqLh6+tr3HLLLZY6MzIyjOjoaGP48OElxx599FHj3z/6HX3ubbfdZnluZmamUbduXeOyyy476e/F0T9jv/76q2EY5p+L+vXrG23btjWKi4stHy86Otro1q1bybGzzjrLiI2NNfLz8y3n1axZ0zj+x9Pj/8wPHjzYiI+PP2ltL7zwguX36d+Oz8qUKVMMwPj2228t511//fUGYHz44YcnfO5RY8aMMRo2bFjyeOrUqQZgfPPNN5bzli9fbgDGm2++edL6RUREqoKuEBIREbHZr7/+CuB0K1iXLl1o1arVad2eNWzYsBO+78orr7Q87tatGw0bNiypZ+nSpaSmpjJmzBiKiopKfjkcDi688EKWL19epg1e9913H35+fgQGBhIfH8+6dev4/vvvnW6xKQvDMCp8DlLPnj0pKirikUceKdP59erVo1OnTiWPo6KiiI6OJj4+nvr165ccb9WqFUDJKvjs7Gz+/PNPhg8fTmhoaMl5Pj4+jB49mt27d7Np0ybA/DPRt29f6tSpYznv+KtWfvzxR4qKivjf//5nOR4WFkbv3r357bffTvh1HH3u1Vdfbfn/GxgYSM+ePcu9PWzTpk3s3buX0aNH4+197EfM0NBQhg0bxh9//EFOTg7Z2dmsWLGCoUOH4u/vbznvoosu+s/P06VLF9asWcO4ceP48ccfycjIKFedx/v1118JCwuz3MIJcMUVV5zyx5w9ezaRkZFcdNFFlt/b+Ph46tatW+mb2URERMpCQ6VFREQqWK1atQgODi65Neq/HDp0CDAbDcerX79+SUPhVJT2MY+qW7duqceO1nN0xs/w4cNP+DFSU1MJCQk5aQ3/93//x1VXXUV+fj5//PEHDz30EEOGDGHNmjXUrFkTMAdPA//5e7Zr166S2/DK+pyKFhUV5XTM39/f6fjRZkdeXh5gzmwyDOOE/5/h2J+FQ4cOnfD/z78d/X/UrVs3p3OPNu9O5OhzzzrrrFLf/++mTln8159jh8NR8ntgGIal2XVUaceON2HCBEJCQvjss89466238PHxoUePHjz//PMl86nKW3dpn7e03/+y2r9/P2lpaZaG17+dzm2gIiIiFUUNIRERkQrm4+ND3759+eGHH9i9ezcNGjQ46flHmyL79u1zOnfv3r3UqlWr5HFgYCD5+flOHyMlJcVy3lEnu5omOTm51GNnnHEGQMnHe+2110q2hB2vLH+Bb9CgQclf1Lt3707dunW56qqrePTRR3n99dcBs4lw5plnMn/+fHJyckqdCbRs2TL279/PiBEjSp7Ttm3bkz7HldSoUQNvb2/27dvn9L6jc4aO/p7XrFnzhP9//u3o+TNnzqRx48blqufoc7/++msaNmxYrueW5t9/jo+3d+9evL29qVGjRslVXscPFYfS/0wez9fXlzvvvJM777yTtLQ0fvrpJx544AEuuOACkpKSyv3noGbNmvz1119lqiUwMJD09HSn48c3eGrVqkXNmjVPuEkwLCysXDWKiIhUBt0yJiIiUgkmTJiAYRhcf/31FBQUOL2/sLCQ77//HoA+ffoA5gDnf1u+fDn//PMPffv2LTnWqFEj1q5dazlv8+bNJbcalcfnn39uebx06VJ27dpVskWpe/fuREZGsmHDBjp37lzqrxNdAXEyV155Jb169eLdd9+1XP304IMPcvjwYe6++26n52RnZ3P77bcTHBzM+PHjS44//PDDHD58mNtvvx3DMJyel5WVxfz588tdY2UI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pkyIOFIuRMyUCREzV8/Eza6UpkmlRURERERERETcjBpCIiIiIiIiIiJuRg0hF+Xn58dbb72Fn5+f1aWIOAVlQsRMmRBxpFyImCkTImbulgm3m1RaRERERERERMTdaYSQiIiIiIiIiIibUUNIRERERERERMTNqCEkIiIiIiIiIuJm1BASEREREREREXEzagg5sXHjxhEWFoa/vz/h4eGsWrXquvuvWLGC8PBw/P39KVOmDF988UU2VSqSPTKSiTlz5nDvvfdSsGBBgoODadCgAb/++ms2ViuS9TJ6nrhizZo1eHt7U6tWrawtUCSbZTQTSUlJvPHGG5QqVQo/Pz/Kli3LN998k03VimSPjOZiypQp1KxZk4CAAIoUKcLjjz/OuXPnsqlakay1cuVK2rVrR9GiRfHw8GDevHk3fExO/j1bDSEnNX36dAYNGsQbb7zB1q1badKkCW3atCEyMvKq+x8+fJi2bdvSpEkTtm7dyuuvv87AgQOZPXt2NlcukjUymomVK1dy7733smjRIjZv3kzz5s1p164dW7duzebKRbJGRjNxRWxsLD169OCee+7JpkpFssetZKJLly78/vvvfP311+zbt4+pU6dSqVKlbKxaJGtlNBerV6+mR48ePPnkk+zevZuZM2eyceNGevfunc2Vi2SNS5cuUbNmTcaOHXtT++f037O17LyTql+/PnXq1GH8+PHp2ypXrkyHDh0YMWKEw/6vvPIKCxYsYM+ePenb+vbty/bt21m3bl221CySlTKaiaupWrUqXbt2ZciQIVlVpki2udVMdOvWjfLly+Pl5cW8efPYtm1bNlQrkvUymonFixfTrVs3Dh06RL58+bKzVJFsk9FcfPzxx4wfP56DBw+mb/vss8/48MMPOXbsWLbULJJdPDw8mDt3Lh06dLjmPjn992yNEHJCycnJbN68mZYtW5q2t2zZkrVr1171MevWrXPYv1WrVmzatImUlJQsq1UkO9xKJv7LZrMRHx+vH/olR7jVTHz77bccPHiQt956K6tLFMlWt5KJBQsWULduXT788EOKFStGhQoVePHFF7l8+XJ2lCyS5W4lFw0bNuT48eMsWrQIwzA4ffo0s2bN4r777suOkkWcTk7/Pdvb6gLEUXR0NGlpaRQuXNi0vXDhwkRFRV31MVFRUVfdPzU1lejoaIoUKZJl9YpktVvJxH+N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",
|
||
"text/plain": [
|
||
"<Figure size 1400x800 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# ROC curve\n",
|
||
"\n",
|
||
"# Calcul des taux de faux positifs (FPR) et de vrais positifs (TPR)\n",
|
||
"y_pred_prob = random_forest_grid.predict_proba(X_test)[:, 1]\n",
|
||
"\n",
|
||
"fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob, pos_label=1)\n",
|
||
"\n",
|
||
"# Calcul de l'aire sous la courbe ROC (AUC)\n",
|
||
"roc_auc = auc(fpr, tpr)\n",
|
||
"\n",
|
||
"plt.figure(figsize = (14, 8))\n",
|
||
"plt.plot(fpr, tpr, label=\"ROC curve(area = %0.3f)\" % roc_auc)\n",
|
||
"plt.plot([0, 1], [0, 1], color=\"red\",label=\"Random Baseline\", linestyle=\"--\")\n",
|
||
"plt.grid(color='gray', linestyle='--', linewidth=0.5)\n",
|
||
"plt.xlabel('Taux de faux positifs (FPR)')\n",
|
||
"plt.ylabel('Taux de vrais positifs (TPR)')\n",
|
||
"plt.title('Courbe ROC : random forest')\n",
|
||
"plt.legend(loc=\"lower right\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "854f6242-813f-400a-be43-7414a859b355",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Naive Bayes "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 219,
|
||
"id": "b083d10d-8510-4a07-974b-e0c324175d7f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-5 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-5 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-5 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-5 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-5 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GaussianNB()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-24\" type=\"checkbox\" checked><label for=\"sk-estimator-id-24\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GaussianNB<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.naive_bayes.GaussianNB.html\">?<span>Documentation for GaussianNB</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GaussianNB()</pre></div> </div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"GaussianNB()"
|
||
]
|
||
},
|
||
"execution_count": 219,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"clf = GaussianNB()\n",
|
||
"clf.fit(X_train, y_train)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 234,
|
||
"id": "a5459639-be3d-4292-89d2-061f276dc9a8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Accuracy Score: 0.8780906593406593\n",
|
||
"F1 Score: 0.3673381217259815\n",
|
||
"Recall Score: 0.24842951059167276\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# print results for the best model\n",
|
||
"\n",
|
||
"y_pred = clf.predict(X_test)\n",
|
||
"\n",
|
||
"# Calculate the F1 score\n",
|
||
"acc = accuracy_score(y_test, y_pred)\n",
|
||
"print(f\"Accuracy Score: {acc}\")\n",
|
||
"\n",
|
||
"f1 = f1_score(y_test, y_pred)\n",
|
||
"print(f\"F1 Score: {f1}\")\n",
|
||
"\n",
|
||
"recall = recall_score(y_test, y_pred)\n",
|
||
"print(f\"Recall Score: {recall}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 239,
|
||
"id": "22d3d4d0-36b4-4561-9bc7-3a408914f089",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"somme des probas de y prédites : 4889.8913137503505\n",
|
||
"nombre de y valant 1 : y_has_purchased 13690.0\n",
|
||
"dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# le bayes naif sous-estime les probas d'achat (les autres modèles surestiment pr avoir un bon recall) w\n",
|
||
"print(f\"somme des probas de y prédites : {y_pred_prob.sum()}\")\n",
|
||
"print(f\"nombre de y valant 1 : {y_test.sum()}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 236,
|
||
"id": "e962eeed-4099-407b-a619-a34a539a404a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAK7CAYAAACDLlR0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gU5frG8e+mNxIIIQFC7026IB1EUIqKFJGjHkSwHI56xA7YEBUVFI96rD97QUQBC4igiIig0qT33gKEQEJ62fn9MRAYFjCBJLObuT/XlYudd2d3nwXuneTJzPu6DMMwEBERERERERERx/CzuwARERERERERESlZagiJiIiIiIiIiDiMGkIiIiIiIiIiIg6jhpCIiIiIiIiIiMOoISQiIiIiIiIi4jBqCImIiIiIiIiIOIwaQiIiIiIiIiIiDqOGkIiIiIiIiIiIw6ghJCIiIiIiIiLiMGoIiYiI+KjVq1czbNgwatasSUhICBEREbRs2ZIXXniBpKQkW2r64IMPcLlcLFu2rFhfZ+fOnbhcrvwvPz8/ypUrR/fu3Zk7d+45Hzdnzhz69OlDhQoVCA4OpmrVqgwdOpT169ef8zG//vor119/PfHx8QQFBREVFUX79u154403SEtLK463V2Rq1KjBLbfcUuKv27VrV8u/T2BgIDVq1GD48OHs2rWrxOsRERERTwF2FyAiIiKF98477zBy5Ejq16/Pgw8+SKNGjcjJyWHZsmW8+eabLFmyhBkzZthdZrG7++67+cc//kFeXh4bN25k3Lhx9O7dm/nz59O5c2fLvg899BATJ07kqquu4vXXXycuLo7Nmzfz0ksv0bJlSz777DP69+9vecwTTzzBU089Rfv27Rk/fjy1a9cmPT2dxYsX8+STT7J582YmT55ckm+5UGbMmEFkZKQtr12rVi0+/fRTALKzs1m7di3jxo1j3rx5bNy4kbCwMFvqEhEREZMaQiIiIj5myZIl/Otf/6JHjx7MnDmT4ODg/Pt69OjB/fffz5w5c0q0ppycHFwuV4m+JkC1atW47LLLAOjQoQN169alS5cuvPvuu5aG0JQpU5g4cSL/+te/eP311/PHO3fuzJAhQ+jSpQs333wzzZs3p1atWgBMmzaNp556iuHDh/POO+9Y3l+vXr146KGHWLJkSQm90wvTokUL2147NDQ0/98GzL/rkJAQhg8fzqJFi+jZs6dttYmIiIguGRMREfE5zz77LC6Xi7ffftvSDDopKCiIa665Jn/b7Xbzwgsv0KBBA4KDg4mNjeWf//wne/futTzuXJcXde3ala5du+ZvL1iwAJfLxccff8z9999PfHw8wcHBbN26NX+fo0ePMmzYMKKjowkPD+fqq69m+/btHs/9448/0r17dyIjIwkLC6NDhw789NNPF/C3YmrdujUABw8etIw/88wzlCtXjkmTJnk8Jjw8nFdffZX09HTL2T5PPfUU5cqV45VXXjlrs6tMmTJF2tTo2rUrTZo0YenSpXTq1ImwsDBq1arFc889h9vtzt8vMzOT+++/n+bNmxMVFUV0dDTt2rXj66+/9njO0/9NDx8+TFBQEI899pjHfhs3bsTlcvHKK6/kjyUkJHDHHXdQpUoVgoKCqFmzJuPGjSM3N/eC32NUVBQAgYGB+WNbt25l2LBh1K1bl7CwMOLj47n66qtZs2ZN/j6pqamULVuWO+64w+M5d+7cib+/PxMnTix07W+88QbNmjUjIiKCMmXK0KBBA8aMGXPB709ERMSXqCEkIiLiQ/Ly8pg/fz6tWrWiatWqBXrMv/71Lx5++GF69OjBN998w/jx45kzZw7t27cnMTHxgmsZPXo0u3fv5s033+Tbb78lNjY2/77hw4fj5+fHZ599xssvv8yff/5J165dOXbsWP4+n3zyCT179iQyMpIPP/yQL774gujoaK688soLbgrt2LEDgHr16uWPHThwgHXr1tGzZ89zXqbUrl07YmNjmTdvXv5j1q5de97HFMTJ5tmTTz5ZoP0TEhK48cYbuemmm/jmm2/o1asXo0eP5pNPPsnfJysri6SkJB544AFmzpzJlClT6NixI/379+ejjz4653NXqFCBvn378uGHH1oaTADvv/8+QUFB3Hjjjfl1tGnThh9++IHHH3+c77//nuHDhzNhwgRuu+22Ar//3NxccnNzSU9P588//+Spp56iVq1atG/fPn+f/fv3U758eZ577jnmzJnD//73PwICAmjbti2bNm0CICIigltvvZVPP/2U5ORky2u8/vrrBAUFceuttxaq9s8//5yRI0fSpUsXZsyYwcyZMxk1apTXzwslIiJSZAwRERHxGQkJCQZg3HDDDQXaf8OGDQZgjBw50jL+xx9/GIAxZsyY/LHq1asbQ4cO9XiOLl26GF26dMnf/vnnnw3A6Ny5s8e+77//vgEY1113nWX8t99+MwDj6aefNgzDMNLS0ozo6Gjj6quvtuyXl5dnNGvWzGjTps1539eOHTsMwHj++eeNnJwcIzMz0/jrr7+Mdu3aGZUqVTJ27NiRv+/vv/9uAMYjjzxy3uds27atERoaWqjH/J0FCxYY/v7+xrhx4/523y5duhiA8ccff1jGGzVqZFx55ZXnfFxubq6Rk5NjDB8+3GjRooXlvjP/Tb/55hsDMObOnWt5fOXKlY0BAwbkj91xxx1GRESEsWvXLsvzTZo0yQCMdevWFei9nPlVr149Y8OGDed9bG5urpGdnW3UrVvXGDVqVP74tm3bDD8/P2Py5Mn5YxkZGUb58uWNYcOGFbr2u+66yyhbtux5axERESnNdIaQiIhIKfbzzz8DeFwK1qZNGxo2bHhRl2cNGDDgnPedPNPkpPbt21O9evX8ehYvXkxSUhJDhw7NP4skNzcXt9vNVVddxdKlSwt0psbDDz9MYGAgISEhNG/enLVr1/Ltt99So0aNQr8fwzCKfB6kLl26kJuby+OPP16g/StWrEibNm0sY02bNvVYmWvatGl06NCBiIgIAgICCAwM5N1332XDhg3nff5evXpRsWJF3n///fyxH374gf379+efYQPw3Xff0a1bNypXrmz59+nVqxcAv/zyy9++l9q1a7N06VKWLl3KkiVL+OyzzwgNDaV79+5s2bIlf7/c3FyeffZZGjVqRFBQEAEBAQQFBbFlyxbL+6lVqxZ9+/bl9ddfxzAMAD777DOOHDnCXXfdVeja27Rpw7FjxxgyZAhff/31RZ0tJyIi4ovUEBIREfEhMTExhIWF5V8a9XeOHDkCQKVKlTzuq1y5cv79F+Jsz3lSxYoVzzp28vVOzvEzcOBAAgMDLV/PP/88hmGQlJT0tzX85z//YenSpSxatIhJkyaRk5PDtddea3lf1apVA/jbv7Ndu3blX4ZX0McUtfLly3uMBQcHk5GRkb89ffp0rr/+euLj4/nkk09YsmQJS5cu5dZbbyUzM/O8zx8QEMDNN9/MjBkz8i/f++CDD6hUqRJXXnll/n4HDx7k22+/9fi3ady4MUCBmichISG0bt2a1q1bc9lllzFkyBC+//57Dhw4YGmQ3XfffTz22GP069ePb7/9lj/++IOlS5fSrFkzy/sG8997y5Yt+Zf2/e9//6Ndu3a0bNmy0LXffPPNvPfee+zatYsBAwYQGxtL27Zt859bRESktNMqYyIiIj7E39+f7t278/3337N3716qVKly3v1PNhgOHDjgse/+/fuJiYnJ3w4JCSErK8vjORITEy37nXS+s2kSEhLOOlanTh2A/Od79dVXLStRnS4uLu6cz39SlSpV8ieS7tChAxUrVuSmm27iiSee4LXXXgPMxlXjxo2ZO3cu6enpZ50TaMmSJRw8eJBBgwblP+aSSy4572Ps8sknn1CzZk2mTp1q+Tc427/d2QwbNoyJEyfy+eefM3jwYL755hvuvfde/P398/eJiYmhadOmPPPMM2d9jsqVK19Q7ZUqVSImJoZVq1ZZ3s8///lPnn32Wcu+iYmJlC1b1jJ2+eWX06RJE1577TUiIiJYsWKFZX6lwtY+bNgwhg0bRlpaGgsXLuSJJ56gb9++bN68merVq1/QexQREfEVOkNIRETEx4wePRrDMLjtttvIzs72uD8nJ4dvv/0WMH+ABjx+aF66dCkbNmyge/fu+WM1atRg9erVlv02b96cP7FvYXz66aeW7cWLF7Nr16781co6dOhA2bJlWb9+ff5ZJGd+BQUFFfp1b7zxRrp27co777xjucxq7NixHD16lAceeMDjMWlpadxzzz2EhYUxatSo/PHHHnuMo0ePcs899+RfonS61NRU5s6dW+gaL5bL5SIoKMjSDEpISDjrKmNn07BhQ9q2bcv777/PZ599RlZWFsOGDbPs07dvX9auXUvt2rXP+m9zoQ2hvXv3kpiYaJmA3OVyeayWN2vWLPbt23fW57jnnnuYNWsWo0ePJi4uLr+JdzG1h4eH06tXL8aOHUt2djbr1q27oPcnIiLiS3SGkIiIiI9p164db7zxBiNHjqRVq1b861//onHjxuTk5LBy5UrefvttmjRpwtVXX039+vW5/fbbefXVV/Hz86NXr17s3LmTxx57jKpVq1oaIDfffDM33XQTI0eOZMCAAezatYsXXniBChUqFLrGZcuWMWLECAYNGsSePXsYO3Ys8fHxjBw5EjBXjXr11VcZOnQoSUlJDBw4kNjYWA4fPsyqVas4fPgwb7zxxgX9/Tz//PO0bduW8ePH83//938ADBkyhBUrVjBp0iR27tzJrbfeSlxcHJs2bWLy5Mls27aNzz77jFq1auU/z6BBg3jssccYP348GzduZPjw4dSuXZv09HT++OMP3nrrLQYPHnzeped/+eUXunfvzuOPP17geYT+Tt++fZk+fTojR45k4MCB7Nmzh/Hjx1OpUiXL3Dznc+utt3LHHXewf/9+2rdvT/369S33P/XUU8ybN4/27dtzzz33UL9+fTIzM9m5cyezZ8/mzTff/Nuz0zIyMvj9998Bc3W8HTt28MILLwBw7733Wt7PBx98QIMGDWjatCnLly9n4sSJ53z+m266idGjR7Nw4UIeffRRj8ZhQWu/7bbbCA0NpUOHDlSqVImEhAQmTJhAVFQUl156aYH+HkVERHyarVNai4iIyAX766+/jKFDhxrVqlUzgoKCjPDwcKNFixbG448/bhw6dCh/v7y8POP555836tWrZwQGBhoxMTHGTTfdZOzZs8fyfG6323jhhReMWrVqGSEhIUbr1q2N+fPnn3OVsWnTpnnUdHKVsblz5xo333yzUbZsWSM0NNTo3bu3sWXLFo/9f/nlF6NPnz5GdHS0ERgYaMTHxxt9+vQ563Of7uQqYxMnTjzr/YMGDTICAgKMrVu3WsZnz55t9O7d2yhfvnz+6918883nXTXrl19+MQYOHGhUqlTJCAwMNCIjI4127doZEydONFJSUs5b58m/qyeeeOK8+xmGuTJX48aNPcaHDh1qVK9e3TL23HPPGTVq1DCCg4ONhg0bGu+8847xxBNPGGd+a3euleOSk5ON0NBQAzDeeeeds9Zz+PBh45577jFq1qxpBAYGGtHR0UarVq2MsWPHGqmpqX/7XjhtdTE/Pz+jcuXKRq9evYwFCxZY9j169KgxfPhwIzY21ggLCzM6duxo/Prrrx7/7053yy23GAEBAcbevXsvuPYPP/zQ6NatmxEXF2cEBQUZlStXNq6//npj9erV531vIiIipYXLMM5yDrSIiIiIiBfKzs6mRo0adOzYkS+++MLuckRERHyWLhkTEREREa93+PBhNm3axPvvv8/Bgwd55JFH7C5JRETEp6khJCIiIiJeb9asWQwbNoxKlSrx+uuvW5aaFxERkcLTJWMiIiIiIiIiIg6jZedFRERERERERBxGDSEREREREREREYdRQ0hERERERERExGEcN6m02+1m//79lClTBpfLZXc5IiIiIiIiIiJFwjAMjh8/TuXKlfHzO/85QI5rCO3f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ateuzYgRI/joo48oUKAA48ePp1+/fjz44IM89thjREZG8ssvv/Dss8/Su3dv+vTpA0C5cuUYPXo0jz32GAkJCdx9991UrFiRAwcO8OWXXxIREZFlY6lNmza0bt2aW265hVGjRlG1alW2bt2Kn58fXbp0oW3btvz999+8++679O7dm7lz5/LTTz8RGRmZrdd0xx13MHToUFJSUhg9erTltqFDhzJo0CAiIyPp2rUrycnJrFmzhpMnT/LUU08BcP3117Ns2TLL2j5Vq1blq6++onHjxiQkJPDss89edqQTwKuvvsqNN95IuXLluPXWW/H392fjxo1s2rSJN954gypVqpCWlsZ//vMfunfvzm+//cbHH3982ce9miljfn5+DB48mBEjRhATE0NMTAwjRowgPDyc22+/3TXq6e6776ZMmTK89dZbgLmo+KhRo2jQoIFrytiQIUO46aabXCOsXnrpJbp27Uq5cuU4ffo0kydPZtGiRcydO9f1/FOnTqV48eKUL1+eTZs28cQTT9CzZ0/LItdgNuEyR67lmsvuQ5bP5Jdt57t9uMSo8Pxs49ctR7N3hz/+MIz27Q3DbAsZRokShrFoUe4WKZLHFi9ebHcJIl5FmRBxp1yIWHmaiUttd+3tstp23jAM4+uvvzaCg4ONffv2uY4tWbLE6NKlixEVFWUEBwcbtWrVMt5//30jLS3N7f4LFiwwrr/+eqNw4cJGaGioUaNGDeOZZ54xDh06dNFaTpw4Ydxzzz1G0aJFjdDQUKNOnTrG7NmzXbePGzfOKFeunFGgQAHj7rvvNt58880st53PysmTJ42QkBAjPDw8y+3bv/76a6N+/fpGcHCwUbhwYaN169bG9OnTXbdv2bLFCAsLM06dOuU6tm7dOqNx48ZGSEiIERMTY0ydOtWoUKGCMXr0aNc5gDFjxgy355s7d67RokULIywszIiMjDSaNm1qfPLJJ67bR40aZZQqVcoICwszrr/+euPLL780AOPkyZMXff+uVkZGhvHaa68Z0dHRRkhIiNG6dWtj06ZNhmEYRkJCgmEYhtGmTRujf//+rvukpqYaQ4cONapUqWKEhoYa5cqVMx555BFLnffee69RoUIFIzg42ChevLjRoUMHY/78+Zbn/vDDD42yZcsaQUFBRvny5Y1XXnnFSE5OtpyzfPlyo1ChQkZiYmKW9efUtvN+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qADA4cOH2bdvn+v8SpUqMWfOHBYtWkT9+vUZPnw4Y8aMcdSW8yIiIiIiIl7p7NmLf/2zwHG2zv1nwd3LnnsFQkJCiI6OpmzZsnTu3Jm+ffu6Fr0HSE9P57777qNSpUqEhYVRvXp1PvzwQ8tjDBgwgJ49e/L+++9TqlQpihYtyqOPPmrZ+frYsWN0796dsLAwKlWqxNdff+1Wy759++jRowcRERFERkbSp08fjh496rp96NCh1K9fn88//5zy5csTERHBww8/THp6Ou+++y7R0dGUKFGCN99887KvOzAwkOjoaKKjo6lVqxbDhg3jzJkzrs0AAEaNGkXdunUpUKAA5cqV45FHHnEt3gywd+9eunfvTuHChSlQoAC1a9d2bQIAEBsbS7du3YiIiKBkyZLcddddHD9+/KI1/XvKmJ+fHxMmTODmm28mPDycmJgYvv/+e8t9PH0OuTRbG0IAjzzyCHv27CE5OZm1a9fSunVr120TJ0507byQqU2bNqxbt47k5GR2797tGk3kRI0aNbK7BBGvokyIWCkTIu6UCxGrHM1ERMTFv/79n/glSlz83K5dredWrJj1eVdp165dzJ0717L8SEZGBmXLluXbb78lNjaWV199lZdeesm1E16mhQsXsnPnThYuXMj//vc/Jk6cyMSJE123DxgwgD179vDrr7/y3XffMXbsWI4dO+a63TAMevbsSVxcHIsXL2bBggXs3LmTvn37Wp5n586d/PTTT8ydO5dJkybx+eefc8MNN3DgwAEWL17MO++8wyuvvMLvv/+e7dednJzMxIkTKVSoENWrV3cd9/f3Z8yYMWzevJn//e9//Prrrzz33HOu2x999FGSk5NZsmQJmzZt4p133iHin+/D4cOHadOmDfXr12fNmjXMnTuXo0eP0qdPn2zXBTBs2DD69OnDxo0b6datG3fccYdrh7Gceo7LcdKUMdu2nZerd2EHWkSUCZF/UyZE3CkXIlZOy8Ts2bNd24Rnbss+atQo1+1BQUEMGzbMdb1SpUosX76cb7/91tJ4KFy4MB999BEBAQHUqFGDG264gV9++YUHHniA7du389NPP/H777/TrFkzAD777DNq1qzpuv/PP//Mxo0b2b17N+XKlQPgq6++onbt2qxevZomTZoAZoPq888/p2DBgtSqVYt27dqxbds25syZg7+/P9WrV+edd95h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",
|
||
"text/plain": [
|
||
"<Figure size 1400x800 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# ROC curve\n",
|
||
"\n",
|
||
"# Calcul des taux de faux positifs (FPR) et de vrais positifs (TPR)\n",
|
||
"y_pred_prob = clf.predict_proba(X_test)[:, 1]\n",
|
||
"\n",
|
||
"fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob, pos_label=1)\n",
|
||
"\n",
|
||
"# Calcul de l'aire sous la courbe ROC (AUC)\n",
|
||
"roc_auc = auc(fpr, tpr)\n",
|
||
"\n",
|
||
"plt.figure(figsize = (14, 8))\n",
|
||
"plt.plot(fpr, tpr, label=\"ROC curve(area = %0.3f)\" % roc_auc)\n",
|
||
"plt.plot([0, 1], [0, 1], color=\"red\",label=\"Random Baseline\", linestyle=\"--\")\n",
|
||
"plt.grid(color='gray', linestyle='--', linewidth=0.5)\n",
|
||
"plt.xlabel('Taux de faux positifs (FPR)')\n",
|
||
"plt.ylabel('Taux de vrais positifs (TPR)')\n",
|
||
"plt.title('Courbe ROC : naive Bayes')\n",
|
||
"plt.legend(loc=\"lower right\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"id": "ad1a0b57-e382-4ae3-90b6-1f790099711b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/mamba/lib/python3.11/site-packages/numpy/core/fromnumeric.py:86: FutureWarning: The behavior of DataFrame.sum with axis=None is deprecated, in a future version this will reduce over both axes and return a scalar. To retain the old behavior, pass axis=0 (or do not pass axis)\n",
|
||
" return reduction(axis=axis, out=out, **passkwargs)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# utilisation d'une métrique plus adaptée aux modèles de marketing : courbe de lift\n",
|
||
"\n",
|
||
"# Tri des prédictions de probabilités et des vraies valeurs\n",
|
||
"sorted_indices = np.argsort(y_pred_prob)[::-1]\n",
|
||
"y_pred_prob_sorted = y_pred_prob[sorted_indices]\n",
|
||
"y_test_sorted = y_test.iloc[sorted_indices]\n",
|
||
"\n",
|
||
"# Calcul du gain cumulatif\n",
|
||
"cumulative_gain = np.cumsum(y_test_sorted) / np.sum(y_test_sorted)\n",
|
||
"\n",
|
||
"# Tracé de la courbe de lift\n",
|
||
"plt.plot(np.linspace(0, 1, len(cumulative_gain)), cumulative_gain, label='Courbe de lift')\n",
|
||
"plt.xlabel('Part de clients identifiés sans modèle ')\n",
|
||
"plt.ylabel('Part de clients identifiés avec modèle')\n",
|
||
"plt.title('Courbe de Lift')\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "7cbb1fec-97b9-4780-9488-5b8eff5aee0d",
|
||
"metadata": {},
|
||
"source": [
|
||
"## From model to segmentation"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"id": "d97ca3df-3778-469c-a077-495b3ee25051",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(array([9.0362e+04, 2.7200e+02, 1.6700e+02, 1.0000e+02, 8.6000e+01,\n",
|
||
" 5.7000e+01, 6.6000e+01, 6.3000e+01, 4.5000e+01, 5.1000e+01,\n",
|
||
" 5.4000e+01, 3.6000e+01, 5.3000e+01, 5.3000e+01, 5.3000e+01,\n",
|
||
" 5.1000e+01, 7.7000e+01, 1.1800e+02, 1.2700e+02, 4.2050e+03]),\n",
|
||
" array([8.76852176e-09, 5.00000083e-02, 1.00000008e-01, 1.50000007e-01,\n",
|
||
" 2.00000007e-01, 2.50000007e-01, 3.00000006e-01, 3.50000006e-01,\n",
|
||
" 4.00000005e-01, 4.50000005e-01, 5.00000004e-01, 5.50000004e-01,\n",
|
||
" 6.00000004e-01, 6.50000003e-01, 7.00000003e-01, 7.50000002e-01,\n",
|
||
" 8.00000002e-01, 8.50000001e-01, 9.00000001e-01, 9.50000000e-01,\n",
|
||
" 1.00000000e+00]),\n",
|
||
" <BarContainer object of 20 artists>)"
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.hist(y_pred_prob, bins=20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"id": "b4ae4508-d5ac-4b22-a546-6c724278f8c3",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([8.76852176e-09, 8.76852176e-09, 8.76852176e-09, ...,\n",
|
||
" 1.00000000e+00, 1.00000000e+00, 1.00000000e+00])"
|
||
]
|
||
},
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.sort(y_pred_prob)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"id": "ace9c778-0ab4-4e28-8ca0-364040d122e6",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"4527"
|
||
]
|
||
},
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(y_pred_prob>0.8).sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"id": "4a202a7e-e7fe-479c-8be3-7b2b93fe9d7b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqgAAAHFCAYAAAA+OgtFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABT90lEQVR4nO3deXwTdf7H8XfatGkptByFAqW0BVQKyGER5RK5ioioP0EQQQ5BAQ8Q0BVEBVGXBZFlUQFdRRYFrCCyHghULnFhlVNFdD2QSyg3tHL2+P7+gMSmSSGF0hx9PR+PPGi++c7kMzPJzJuZyYzFGGMEAAAA+IggbxcAAAAA5EVABQAAgE8hoAIAAMCnEFABAADgUwioAAAA8CkEVAAAAPgUAioAAAB8CgEVAAAAPoWACgAAAJ9ySQH122+/Vb9+/ZSYmKiwsDCVLl1a1113nSZOnKgjR444+t18882yWCyyWCwKCgpSmTJlVKtWLd19991asGCBcnNzXcadkJDgGCb/448//rj0KQ1gmzdvVqtWrRQVFSWLxaIpU6a47Xfy5EmNHTtWq1atcnlt7NixslgsOnTo0JUt1gfs2LFDFotFs2bNcrTZp7+w5s6dW+D8vlwJCQnq27fvFRn3pUpISNBtt91WpOO0WCx65JFHLtpv1apVslgsTp9fd8vt5ptv1s033+x4fqHPfXHx9Dvqi2bNmiWLxaINGzZ4u5QLuv/++3XLLbd4u4zL8tZbbyk2NlYnTpzweJinn35a1atXl9VqVdmyZa9ccT5o7969Gjt2rLZs2eLtUgJS3759lZCQ4LX3txZ2gH/+85966KGHdM011+iJJ55QnTp1lJWVpQ0bNmjGjBlat26dPvzwQ0f/GjVqaM6cOZKkEydO6LffftOiRYt09913q2XLlvr4448VFRXl9B7NmzfXpEmTXN67VKlShS23RLj//vt14sQJvffeeypXrlyBH6iTJ0/queeekySnDTikAQMGXNLGbe7cudq6dasee+yxoi8KTq677jqtW7dOderUuWC/adOmOT33hc+9p99RXJrNmzfrX//6l7766itvl3JZ+vTpowkTJmjixImOz+yF/Pvf/9aLL76o0aNHq2PHjrLZbMVQpe/Yu3evnnvuOSUkJKhhw4beLifgPPPMMxo6dKjX3r9QAXXdunUaPHiw2rdvr0WLFjl9Gdq3b68RI0ZoyZIlTsOEh4frxhtvdGobMGCA3n77bd1///168MEHlZqa6vR62bJlXYbxBSdPnvTJkLx161Y98MAD6tixo7dLueJOnTql8PDwIh9vtWrVVK1atSIfr6/z1c+0O5GRkR6tFy4WYL3B176jxhidPn36inyXvOFvf/ubmjRposaNG3u7FCdZWVmyWCyyWj3b1FqtVg0cOFDPP/+8nnzyyYt+N7du3SpJGjJkiCpVqnTZ9Ur+sU7IyclRdna2t8sIeDVr1vTq+xfqEP9f//pXWSwWvfHGG27/pxYaGqrbb7/do3H169dPt956q+bPn6+dO3cWpowCHTt2TCNGjFCNGjVks9lUqVIl3Xrrrfrxxx8luT9EKLk/5Nu3b1+VLl1a3333nVJSUlSmTBm1bdtWjz32mCIiIpSRkeHy/t27d1dMTIyysrIcbampqWratKkiIiJUunRpdejQQZs3b/ZoerZu3ao77rhD5cqVU1hYmBo2bKh//etfjtfth96ys7M1ffp0x6kQ7uzYsUMVK1aUJD333HOOvvkPIe/fv189evRQVFSUYmJidP/99+v48eNOfYwxmjZtmho2bKjw8HCVK1dOXbt21fbt2y86TfZDsps3b9Zdd92lyMhIRUVFqVevXjp48KBTX/vh5IULF6pRo0YKCwtz7FVIT0/XwIEDVa1aNYWGhioxMVHPPfecy0pr79696tatm8qUKaOoqCh1795d6enpBdaV39y5c9W0aVOVLl1apUuXVsOGDfXWW29JOrc37tNPP9XOnTudTkWxO3v2rF544QXVrl1bNptNFStWVL9+/VymMysrS3/5y19UuXJllSpVSi1atNDXX3990Xkp/fnZnThxol588UVVr15dYWFhaty4sZYvX+52Gjdt2qSuXbuqXLlyjhXQ6dOnNWrUKCUmJio0NFSxsbF6+OGHdezYMbfv++GHH6p+/foKCwtTjRo1NHXqVKfXT58+rREjRqhhw4aKiopS+fLl1bRpU/373/8ucFpef/11XX311bLZbKpTp47ee+89p9cL+v7ml/cQ/4U+92vWrJHFYtG8efNcxjF79mxZLBatX7/+gu9VlN9Re72eLs+CDr+5+yzbT6OYMWOGkpKSZLPZHHX++OOP6tGjh2JiYmSz2VS9enX17t1bZ86ccRpHZmamBg8erOjoaFWoUEF33XWX9u7d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Vqf+77//vpHk9B/o/OsYT7f/GzZsMJLMokWLCqzPE169zJQxxm17ixYttH79eqfHQw89dMFxffbZZ7r66qvVrl27Iq2xS5cuLm39+vXT2rVrnXaHv/3227r++utVr149SdLSpUuVnZ2t3r17Kzs72/EICwtTq1atLnqYcsWKFWrbtq3i4uKc2vv27auTJ09q3bp1lz9xbuQ/RaN+/fo6ffq0Dhw4IEn65JNPZLFY1KtXL6fpqly5sho0aODxL6V79uzp9Lxbt26yWq1auXKly/tfffXVTm2ffPKJWrdurapVqzrVYD+/b/Xq1ZKklStXqkyZMi7TdO+99160vrS0NOXk5Ojhhx/2aHry++STT1S2bFl17tzZqcaGDRuqcuXKjvlkn96C5oen7rrrLoWFhTmelylTRp07d9YXX3yhnJwcp775P9MrVqyQJJfTPe6++25FRES4HEqqW7euGjRo4NR27733KiMjQ5s2bXK0zZ8/X82bN1fp0qVltVoVEhKit956Sz/88INL/W3btlVMTIzjeXBwsLp3765ffvmlcIeECqlHjx6qVKmSXnvtNUfbK6+8oooVK6p79+4XHPZKfkcLszw91aZNG5UrV87x/OTJk1q9erW6devmOA3iQtytGyQ5naK1fft23XvvvapcubKCg4MVEhKiVq1aSZJjuZcvX141a9bUSy+9pMmTJ2vz5s0uV3QpzPpz7969qlixostpDU2aNNE333yjhx56SEuXLnU5LcvT6S/scs7//Vq7dq2OHDmiPn36OE1Lbm6ubrnlFq1fv97lFIhKlSrpwIEDl3SepX2dkv/73KRJEyUlJbl8n8uVK6c2bdpcdLyeLDc7T9YRK1asUJ06ddSkSROnfn379pUxxrFesrv99tsVEhJy0ToLW2teP/30k3799Vf179/f6fuX14kTJ/TVV1+pa9euKl26tKM9ODhY9913n/bs2eNyqDz/lU+SkpIkSZ06dXJpd3fKoyfrg+zsbP31r39VnTp1FBoaKqvVqtDQUP38889u17mefJ/z83T7X6tWLZUrV05PPvmkZsyYoW3bthU4zgvxOKBGR0erVKlS+u233y7pjdyxz4iqVas6tUdFRalx48ZOj/x98jt48GCR/8ilVKlSioyMdGnv2bOnbDab45zVbdu2af369erXr5+jz/79+yVJ119/vUJCQpweqamp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u02tW7dW5cqV1a5dO40fP17lypVTfHy8li9f7jgEVRgpKSmqVq2aHnroIaWnpzsd3pfObTzGjRun0aNHa/v27brllltUrlw57d+/X19//bUiIiIueCHmMWPGOM61fPbZZ1W+fHnNmTNHn376qSZOnOhycwNPlClTRvHx8fr3v/+ttm3bqnz58oqOji7URcObN2+uBx98UP369dOGDRt00003KSIiQvv27dOXX36pa6+9VoMHD77oeBYuXCir1ar27dvr+++/1zPPPKMGDRqoW7duFx123LhxSktLU7NmzTRkyBBdc801On36tHbs2KHFixdrxowZqlatmnr37q2///3v6t27t1588UVdddVVWrx4sUcb8ISEBD311FN6/vnnderUKcelt7Zt26ZDhw45lt21116rhQsXavr06UpOTlZQUJAaN26se+65R3PmzNGtt96qoUOHqkmTJgoJCdGePXu0cuVK3XHHHfq///s/JSUlqVevXpoyZYpCQkLUrl07bd26VZMmTXJ7eklBgoOD1b59ew0fPly5ubmaMGGCMjIyPLrYd/v27dWhQwc9+eSTysjIUPPmzfXtt99qzJgxatSokcvle6pWrarbb79dY8eOVZUqVfTuu+8qLS1NEyZMcFw/0X55sIceekhdu3bV7t279fzzz6tKlSr6+eefXWqIjo5WmzZt9MwzzygiIkLTpk3Tjz/+eNFL7XjCk8/90KFDdcMNN0g6959nT1yJ76idJ8uze/fuevbZZ3XPPffoiSee0OnTpzV16tRCnaM6efJktWjRQjfccINGjhypWrVqaf/+/froo4/0+uuvO/b0e6JZs2YqV66cBg0apDFjxigkJERz5sxxCSrffvutHnnkEd1999266qqrFBoaqhUrVujbb7917FkpzPrz5ptvljFGX331lVJSUhzv07lzZ9WrV0+NGzdWxYoVtXPnTk2ZMkXx8fG66qqrPJ7+y13OpUuX1iuvvKI+ffroyJEj6tq1qypVqqSDBw/qm2++0cGDB53+I5ybm6uvv/5a/fv393je53XNNdfowQcf1CuvvKKgoCB17NhRO3bs0DPPPKO4uDgNGzbsksbryXKz82QdMWzYMM2ePVudOnXSuHHjFB8fr08//VTTpk3T4MGDPQp5NWvWVHh4uObMmaOkpCSVLl1aVatW1aFDhzyuNb/XXntNnTt3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Y49p2rRpat68uV5//XV17NhR27ZtU/Xq1d0O061bN+3fv19vvfWWatWqpQMHDig7O9vjugAAAHBxfrMHVZK2bdt20T7vvvuuR+OaPHmy+vfvrwEDBigpKUlTpkxRXFycpk+f7rb/kiVLtHr1ai1evFjt2rVTQkKCmjRpombNmhVqGgAAAHBhfhVQk5OTNWnSJKcfR9nt379ft99+uwYPHnzR8Zw9e1YbN25USkqKU3tKSorWrl3rdpiPPvpIjRs31sSJExUbG6urr75ajz/+uE6dOlXg+5w5c0YZGRlODwAAAFyYXwXUd999VxMnTtRNN92kX3/91am9Tp06On78uLZs2XLR8Rw6dEg5OTmKiYlxao+JiVF6errbYbZv364vv/xSW7du1YcffqgpU6ZowYIFevjhhwt8n/HjxysqKsrxiIuL82xCAQAASjC/CqhdunTR1q1bFR0drQYNGmjSpEm64447NHDgQD377LNatWqVatas6fH4LBbney8ZY1za7HJzc2WxWDRnzhw1adJEt956qyZPnqxZs2YVuBd11KhROn78uOOxe/duzyf2EhRQOgAAgF/xmx9J2VWqVEkffvihevbsqb/85S+KiIjQf//7X1177bUejyM6OlrBwcEue0sPHDjgslfVrkqVKoqNjVVUVJSjLSkpScYY7dmzR1dddZXLMDabrcTePAAAAOBS+dUeVEk6evSo7r33Xi1atEgjR45UpUqV1L1790Jd9zQ0NFTJyclKS0tzak9LSyvwR0/NmzfX3r179ccffzjafvrpJwUFBalatWqXNjEAAABw4VcB9ZNPPlGdOnX066+/auPGjfrrX/+qb7/9Vq1atVKLFi309NNPe3zZp+HDh+vNN9/UzJkz9cMPP2jYsGHatWuXBg0aJOnc4fnevXs7+t97772qUKGC+vXrp23btumLL77QE088ofvvv1/h4eFXZHo9ZcS9TgEAQODwq4DatWtXPfroo1q3bp1q164tSYqIiND06dP1ySef6J133lHjxo09Glf37t01ZcoUjRs3Tg0bNtQXX3yhxYsXKz4+XpK0b98+7dq1y9G/dOnSSktL07Fjx9S4cWP17NlTnTt31tSpU4t+QgEAAEowi3F3zSYf9e2336p+/foFvp6RkaFhw4bprbfeKsaqPJeRkaGoqCgdP35ckZGRRTbeH9MzdMuUNYou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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# number of observations\n",
|
||
"N = len(y_pred_prob)\n",
|
||
"\n",
|
||
"# sort the data in ascending order \n",
|
||
"y_pred_prob_sorted = np.sort(y_pred_prob) \n",
|
||
"\n",
|
||
"# get the cdf values of y \n",
|
||
"steps = np.arange(N) / N\n",
|
||
" \n",
|
||
"# plotting \n",
|
||
"plt.xlabel('X') \n",
|
||
"plt.ylabel('P(score<=X)') \n",
|
||
" \n",
|
||
"plt.title('CDF curve of the predicted probability of purchasec(score) for sports companies') \n",
|
||
" \n",
|
||
"plt.plot(y_pred_prob_sorted, steps) \n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 60,
|
||
"id": "e87efb96-71e6-4571-9a48-576ff5ebcbdc",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 ,\n",
|
||
" 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1. ])"
|
||
]
|
||
},
|
||
"execution_count": 60,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# on regarde de plus près les quantiles (on identifie 2 clusters, où est le cut-off ?)\n",
|
||
"\n",
|
||
"np.linspace(0,1, 21)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"id": "ccd8373c-85c4-451d-b918-7bb84713c9ea",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(90634,)"
|
||
]
|
||
},
|
||
"execution_count": 59,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_pred_prob_sorted[y_pred_prob < 0.1].shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"id": "75a2c582-3020-4e2e-9a41-0da75c5dbbed",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"score du quantile 0.0 : 1.0\n",
|
||
"score du quantile 0.05 : 1.1703610048497538e-08\n",
|
||
"score du quantile 0.1 : 1.1916538583855572e-08\n",
|
||
"score du quantile 0.15000000000000002 : 1.672960453020865e-08\n",
|
||
"score du quantile 0.2 : 2.261530896018714e-08\n",
|
||
"score du quantile 0.25 : 4.429426100901144e-08\n",
|
||
"score du quantile 0.30000000000000004 : 5.527720441770875e-08\n",
|
||
"score du quantile 0.35000000000000003 : 6.583003552085313e-08\n",
|
||
"score du quantile 0.4 : 1.0150014636815537e-07\n",
|
||
"score du quantile 0.45 : 1.045553983975125e-07\n",
|
||
"score du quantile 0.5 : 1.8254643649033717e-07\n",
|
||
"score du quantile 0.55 : 1.0036337913333724e-06\n",
|
||
"score du quantile 0.6000000000000001 : 3.6006418270834777e-06\n",
|
||
"score du quantile 0.65 : 8.750051427856617e-06\n",
|
||
"score du quantile 0.7000000000000001 : 1.7761176996762073e-05\n",
|
||
"score du quantile 0.75 : 3.658511676930477e-05\n",
|
||
"score du quantile 0.8 : 7.449089979671675e-05\n",
|
||
"score du quantile 0.8500000000000001 : 0.0001599334998042523\n",
|
||
"score du quantile 0.9 : 0.0006156933309033692\n",
|
||
"score du quantile 0.9500000000000001 : 0.5161846499348189\n",
|
||
"score du quantile 1.0 : 1.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"for step in np.linspace(0,1, 21) :\n",
|
||
" score_reached = y_pred_prob_sorted[int(step*N)-1]\n",
|
||
" print(f\"score du quantile {step} : {score_reached}\")\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"id": "3e7d04c4-1add-4ef3-bca5-c2f68356b669",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"score du quantile 0.94 : 0.046364832132301186\n",
|
||
"score du quantile 0.941 : 0.060426331367796585\n",
|
||
"score du quantile 0.942 : 0.07560789365683944\n",
|
||
"score du quantile 0.943 : 0.0961854989484283\n",
|
||
"score du quantile 0.944 : 0.12036366182214445\n",
|
||
"score du quantile 0.945 : 0.15326229828189683\n",
|
||
"score du quantile 0.946 : 0.20141929276940546\n",
|
||
"score du quantile 0.947 : 0.26129057078459816\n",
|
||
"score du quantile 0.948 : 0.34459110917836233\n",
|
||
"score du quantile 0.949 : 0.42441766527261676\n",
|
||
"score du quantile 0.95 : 0.5161846499348189\n",
|
||
"score du quantile 0.951 : 0.6281715747542238\n",
|
||
"score du quantile 0.952 : 0.7161294443763133\n",
|
||
"score du quantile 0.953 : 0.8098274658632696\n",
|
||
"score du quantile 0.954 : 0.8628210594682936\n",
|
||
"score du quantile 0.955 : 0.9031546758694196\n",
|
||
"score du quantile 0.956 : 0.9406325197642711\n",
|
||
"score du quantile 0.957 : 0.9717094630837765\n",
|
||
"score du quantile 0.958 : 0.9853416074407844\n",
|
||
"score du quantile 0.959 : 0.99263528504162\n",
|
||
"score du quantile 0.96 : 0.9965103675841931\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# le saut survient entre le quantile 0.94 et 0.955\n",
|
||
"# on peut prendre le quantile 0.95 / score = 0.52 comme cut-off approximatif\n",
|
||
"for step in np.linspace(0.94,0.96, 21) :\n",
|
||
" score_reached = y_pred_prob_sorted[int(step*N)-1]\n",
|
||
" print(f\"score du quantile {step} : {score_reached}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"id": "5d8bb4ea-0030-4d23-8cff-26c9ed54ca71",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-4 {\n",
|
||
" /* Definition of color scheme common for light and dark mode */\n",
|
||
" --sklearn-color-text: black;\n",
|
||
" --sklearn-color-line: gray;\n",
|
||
" /* Definition of color scheme for unfitted estimators */\n",
|
||
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
||
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
||
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
||
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
||
" /* Definition of color scheme for fitted estimators */\n",
|
||
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
||
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
||
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
||
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
||
"\n",
|
||
" /* Specific color for light theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
||
" --sklearn-color-icon: #696969;\n",
|
||
"\n",
|
||
" @media (prefers-color-scheme: dark) {\n",
|
||
" /* Redefinition of color scheme for dark theme */\n",
|
||
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
||
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
||
" --sklearn-color-icon: #878787;\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 pre {\n",
|
||
" padding: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-hidden--visually {\n",
|
||
" border: 0;\n",
|
||
" clip: rect(1px 1px 1px 1px);\n",
|
||
" clip: rect(1px, 1px, 1px, 1px);\n",
|
||
" height: 1px;\n",
|
||
" margin: -1px;\n",
|
||
" overflow: hidden;\n",
|
||
" padding: 0;\n",
|
||
" position: absolute;\n",
|
||
" width: 1px;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-dashed-wrapped {\n",
|
||
" border: 1px dashed var(--sklearn-color-line);\n",
|
||
" margin: 0 0.4em 0.5em 0.4em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" padding-bottom: 0.4em;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-container {\n",
|
||
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
||
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
||
" so we also need the `!important` here to be able to override the\n",
|
||
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
||
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
||
" display: inline-block !important;\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-text-repr-fallback {\n",
|
||
" display: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-parallel-item,\n",
|
||
"div.sk-serial,\n",
|
||
"div.sk-item {\n",
|
||
" /* draw centered vertical line to link estimators */\n",
|
||
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
||
" background-size: 2px 100%;\n",
|
||
" background-repeat: no-repeat;\n",
|
||
" background-position: center center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Parallel-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item::after {\n",
|
||
" content: \"\";\n",
|
||
" width: 100%;\n",
|
||
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
||
" flex-grow: 1;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel {\n",
|
||
" display: flex;\n",
|
||
" align-items: stretch;\n",
|
||
" justify-content: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" position: relative;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
|
||
" align-self: flex-end;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
|
||
" align-self: flex-start;\n",
|
||
" width: 50%;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
|
||
" width: 0;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Serial-specific style estimator block */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-serial {\n",
|
||
" display: flex;\n",
|
||
" flex-direction: column;\n",
|
||
" align-items: center;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" padding-right: 1em;\n",
|
||
" padding-left: 1em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
||
"clickable and can be expanded/collapsed.\n",
|
||
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
||
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
||
"*/\n",
|
||
"\n",
|
||
"/* Pipeline and ColumnTransformer style (default) */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable {\n",
|
||
" /* Default theme specific background. It is overwritten whether we have a\n",
|
||
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable label */\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label {\n",
|
||
" cursor: pointer;\n",
|
||
" display: block;\n",
|
||
" width: 100%;\n",
|
||
" margin-bottom: 0;\n",
|
||
" padding: 0.5em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
|
||
" /* Arrow on the left of the label */\n",
|
||
" content: \"▸\";\n",
|
||
" float: left;\n",
|
||
" margin-right: 0.25em;\n",
|
||
" color: var(--sklearn-color-icon);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Toggleable content - dropdown */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content {\n",
|
||
" max-height: 0;\n",
|
||
" max-width: 0;\n",
|
||
" overflow: hidden;\n",
|
||
" text-align: left;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content pre {\n",
|
||
" margin: 0.2em;\n",
|
||
" border-radius: 0.25em;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
||
" /* Expand drop-down */\n",
|
||
" max-height: 200px;\n",
|
||
" max-width: 100%;\n",
|
||
" overflow: auto;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
||
" content: \"▾\";\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Pipeline/ColumnTransformer-specific style */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific style */\n",
|
||
"\n",
|
||
"/* Colorize estimator box */\n",
|
||
"#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
|
||
"#sk-container-id-4 div.sk-label label {\n",
|
||
" /* The background is the default theme color */\n",
|
||
" color: var(--sklearn-color-text-on-default-background);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover, darken the color of the background */\n",
|
||
"#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Label box, darken color on hover, fitted */\n",
|
||
"#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator label */\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label label {\n",
|
||
" font-family: monospace;\n",
|
||
" font-weight: bold;\n",
|
||
" display: inline-block;\n",
|
||
" line-height: 1.2em;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-label-container {\n",
|
||
" text-align: center;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Estimator-specific */\n",
|
||
"#sk-container-id-4 div.sk-estimator {\n",
|
||
" font-family: monospace;\n",
|
||
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
||
" border-radius: 0.25em;\n",
|
||
" box-sizing: border-box;\n",
|
||
" margin-bottom: 0.5em;\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* on hover */\n",
|
||
"#sk-container-id-4 div.sk-estimator:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
||
"\n",
|
||
"/* Common style for \"i\" and \"?\" */\n",
|
||
"\n",
|
||
".sk-estimator-doc-link,\n",
|
||
"a:link.sk-estimator-doc-link,\n",
|
||
"a:visited.sk-estimator-doc-link {\n",
|
||
" float: right;\n",
|
||
" font-size: smaller;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1em;\n",
|
||
" height: 1em;\n",
|
||
" width: 1em;\n",
|
||
" text-decoration: none !important;\n",
|
||
" margin-left: 1ex;\n",
|
||
" /* unfitted */\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted,\n",
|
||
"a:link.sk-estimator-doc-link.fitted,\n",
|
||
"a:visited.sk-estimator-doc-link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
||
".sk-estimator-doc-link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover,\n",
|
||
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
||
".sk-estimator-doc-link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* Span, style for the box shown on hovering the info icon */\n",
|
||
".sk-estimator-doc-link span {\n",
|
||
" display: none;\n",
|
||
" z-index: 9999;\n",
|
||
" position: relative;\n",
|
||
" font-weight: normal;\n",
|
||
" right: .2ex;\n",
|
||
" padding: .5ex;\n",
|
||
" margin: .5ex;\n",
|
||
" width: min-content;\n",
|
||
" min-width: 20ex;\n",
|
||
" max-width: 50ex;\n",
|
||
" color: var(--sklearn-color-text);\n",
|
||
" box-shadow: 2pt 2pt 4pt #999;\n",
|
||
" /* unfitted */\n",
|
||
" background: var(--sklearn-color-unfitted-level-0);\n",
|
||
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link.fitted span {\n",
|
||
" /* fitted */\n",
|
||
" background: var(--sklearn-color-fitted-level-0);\n",
|
||
" border: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"\n",
|
||
".sk-estimator-doc-link:hover span {\n",
|
||
" display: block;\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link {\n",
|
||
" float: right;\n",
|
||
" font-size: 1rem;\n",
|
||
" line-height: 1em;\n",
|
||
" font-family: monospace;\n",
|
||
" background-color: var(--sklearn-color-background);\n",
|
||
" border-radius: 1rem;\n",
|
||
" height: 1rem;\n",
|
||
" width: 1rem;\n",
|
||
" text-decoration: none;\n",
|
||
" /* unfitted */\n",
|
||
" color: var(--sklearn-color-unfitted-level-1);\n",
|
||
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link.fitted {\n",
|
||
" /* fitted */\n",
|
||
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
||
" color: var(--sklearn-color-fitted-level-1);\n",
|
||
"}\n",
|
||
"\n",
|
||
"/* On hover */\n",
|
||
"#sk-container-id-4 a.estimator_doc_link:hover {\n",
|
||
" /* unfitted */\n",
|
||
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
||
" color: var(--sklearn-color-background);\n",
|
||
" text-decoration: none;\n",
|
||
"}\n",
|
||
"\n",
|
||
"#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
|
||
" /* fitted */\n",
|
||
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
||
"}\n",
|
||
"</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=2, random_state=0)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" checked><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> KMeans<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.cluster.KMeans.html\">?<span>Documentation for KMeans</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KMeans(n_clusters=2, random_state=0)</pre></div> </div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"KMeans(n_clusters=2, random_state=0)"
|
||
]
|
||
},
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# simple K-means pour déterminer le seuil qui sépare les 2 clusters apparents\n",
|
||
"\n",
|
||
"from sklearn.cluster import KMeans\n",
|
||
"\n",
|
||
"kmeans = KMeans(n_clusters=2, random_state=0)\n",
|
||
"\n",
|
||
"kmeans.fit(y_pred_prob.reshape(-1,1))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 91,
|
||
"id": "afbf8247-4cb1-455b-96df-7e9a87407413",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([0, 0, 0, ..., 0, 0, 0], dtype=int32)"
|
||
]
|
||
},
|
||
"execution_count": 91,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_clusters = kmeans.predict(y_pred_prob.reshape(-1,1))\n",
|
||
"y_clusters"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"id": "e4747b82-1967-4043-bcd1-7659dbd87a2a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"4846"
|
||
]
|
||
},
|
||
"execution_count": 93,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_clusters[y_clusters==1].size"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"id": "2853083a-99a4-4ae9-9e8d-ddf175cca7ee",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.9495712620712621"
|
||
]
|
||
},
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# 5% des individus sont dans le cluster 1\n",
|
||
"1 - y_clusters.mean()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d18c8a4c-7d19-4d24-a304-cb26a533303e",
|
||
"metadata": {},
|
||
"source": [
|
||
"Intérêt du K-means : permet d'identifier un seuil de passage d'un cluster à l'autre quand le cluster est restreint, comme ici où on isole les clients avec la proba d'achat dans le quantile 0.95, et on les sépare des 95% restant"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"id": "77f59f30-1dc6-43b8-98b7-d179a966786a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"part d'individus dans le cluster 0 : 0.9495712620712621\n",
|
||
"seuil de passage du cluster 0 au cluster 1 : 0.4855790414879801\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# seuil de split \n",
|
||
"\n",
|
||
"size_cluster_0 = 1 - y_clusters.mean()\n",
|
||
"seuil_cluster = y_pred_prob_sorted[int(1 - y_clusters.mean()*N)]\n",
|
||
"\n",
|
||
"print(f\"part d'individus dans le cluster 0 : {size_cluster_0}\")\n",
|
||
"print(f\"seuil de passage du cluster 0 au cluster 1 : {seuil_cluster}\")"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.11.6"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|