{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🎯 Uplift model selection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [MegaFon Uplift Competition](https://ods.ai/competitions/megafon-df21-comp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## problem: predict the uplift by user's feature vector" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:25.634993Z", "start_time": "2021-08-09T22:36:25.630910Z" } }, "outputs": [], "source": [ "pip install scikit-uplift lightgbm -U" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:28.529257Z", "start_time": "2021-08-09T22:36:26.514166Z" } }, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.model_selection import (\n", " StratifiedShuffleSplit, GridSearchCV, \n", " train_test_split, cross_validate, cross_val_score\n", ")\n", "from lightgbm import LGBMClassifier\n", "from sklift.models import SoloModel\n", "from sklift.viz import plot_qini_curve\n", "from sklift.datasets import fetch_megafon\n", "from sklift.metrics import make_uplift_scorer" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:37.602085Z", "start_time": "2021-08-09T22:36:28.531896Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
X_1X_2X_3X_4X_5X_6X_7X_8X_9X_10...X_41X_42X_43X_44X_45X_46X_47X_48X_49X_50
id
039.396577-0.18654819.52450521.25020855.291264182.966712-5.385606144.573379-12.534344-58.279429...90.877638134.363458-213.584582-2.092461-93.973258-0.155597-312.13073344.798182-125.68241316.231365
138.9876940.819522-42.064512-48.270949-33.171257179.459341-87.151810-162.69325720.651652181.635081...-183.84074672.864779559.7835841.14239180.037124-1.216185-111.473936-127.737977-117.50117110.732234
2-16.6930931.844558-8.615192-18.818740-22.271188-116.290369-63.816746-38.34076324.968496-136.340629...-203.6377662.48024296.9985041.100962-33.2751590.920926-679.492242-91.009397-18.17335814.367636
3-72.040154-0.22692139.80260716.441262-1.11250968.12800823.0731474.688858-49.383641-91.866107...172.90687583.951551-323.642557-0.36918293.221948-1.962380-442.466684-22.298302-75.91660311.634299
418.2969730.99643724.465307-34.15197124.623458-155.455558-12.15978726.705778105.864805258.607252...125.577535-208.531112118.902324-0.808578-117.4979061.770635627.395611122.019189194.091195-11.883858
\n", "

5 rows × 50 columns

\n", "
" ], "text/plain": [ " X_1 X_2 X_3 X_4 X_5 X_6 \\\n", "id \n", "0 39.396577 -0.186548 19.524505 21.250208 55.291264 182.966712 \n", "1 38.987694 0.819522 -42.064512 -48.270949 -33.171257 179.459341 \n", "2 -16.693093 1.844558 -8.615192 -18.818740 -22.271188 -116.290369 \n", "3 -72.040154 -0.226921 39.802607 16.441262 -1.112509 68.128008 \n", "4 18.296973 0.996437 24.465307 -34.151971 24.623458 -155.455558 \n", "\n", " X_7 X_8 X_9 X_10 ... X_41 \\\n", "id ... \n", "0 -5.385606 144.573379 -12.534344 -58.279429 ... 90.877638 \n", "1 -87.151810 -162.693257 20.651652 181.635081 ... -183.840746 \n", "2 -63.816746 -38.340763 24.968496 -136.340629 ... -203.637766 \n", "3 23.073147 4.688858 -49.383641 -91.866107 ... 172.906875 \n", "4 -12.159787 26.705778 105.864805 258.607252 ... 125.577535 \n", "\n", " X_42 X_43 X_44 X_45 X_46 X_47 \\\n", "id \n", "0 134.363458 -213.584582 -2.092461 -93.973258 -0.155597 -312.130733 \n", "1 72.864779 559.783584 1.142391 80.037124 -1.216185 -111.473936 \n", "2 2.480242 96.998504 1.100962 -33.275159 0.920926 -679.492242 \n", "3 83.951551 -323.642557 -0.369182 93.221948 -1.962380 -442.466684 \n", "4 -208.531112 118.902324 -0.808578 -117.497906 1.770635 627.395611 \n", "\n", " X_48 X_49 X_50 \n", "id \n", "0 44.798182 -125.682413 16.231365 \n", "1 -127.737977 -117.501171 10.732234 \n", "2 -91.009397 -18.173358 14.367636 \n", "3 -22.298302 -75.916603 11.634299 \n", "4 122.019189 194.091195 -11.883858 \n", "\n", "[5 rows x 50 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset = fetch_megafon()\n", "data, treatment, target = dataset.data, dataset.treatment, dataset.target\n", "data = data.set_index('id')\n", "\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:37.612740Z", "start_time": "2021-08-09T22:36:37.605841Z" } }, "outputs": [ { "data": { "text/plain": [ "0 control\n", "1 control\n", "2 treatment\n", "3 treatment\n", "4 treatment\n", "Name: treatment_group, dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treatment.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:37.625552Z", "start_time": "2021-08-09T22:36:37.616897Z" } }, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 0\n", "2 0\n", "3 0\n", "4 0\n", "Name: conversion, dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 📝Solution of problem" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:36:37.707170Z", "start_time": "2021-08-09T22:36:37.628978Z" } }, "outputs": [], "source": [ "# make treatment binary\n", "treatment = treatment.map({'control': 0, 'treatment': 1})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Conditional Independence Assumption:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "intuition: check if treatment was random" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:37:01.986874Z", "start_time": "2021-08-09T22:36:37.711818Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "F1 micro 0.50\n" ] } ], "source": [ "f1_micro = cross_val_score(\n", " X=data,\n", " y=treatment,\n", " estimator= LGBMClassifier(random_state=42, n_jobs=-1),\n", " scoring='f1_micro', \n", " cv=3)\n", "\n", "print(f'F1 micro {f1_micro.mean():.2f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the user's features, the classifier makes type I and type II errors as often (50%) as it guesses the correct answer. This means that communication was carried out by random." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Fit single model with treatment feature (S-Learner approach) ([link to tutorial](https://habr.com/ru/company/ru_mts/blog/485980/))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "intuition: the model fits simultaneously on two groups with binary treatment flag as an additional user's feature. We score each object from the test sample twice: with the treatment flag equal to 1 and equal to 0. Subtracting the probabilities for each observation, we obtain an estimated uplift." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:37:06.722450Z", "start_time": "2021-08-09T22:37:01.995217Z" } }, "outputs": [], "source": [ "# setting up data\n", "# use test set for model evaluation after grid-search-cross-validation-tuning \n", "# use cv set for GridSearchCV\n", "\n", "stratify_cols = pd.concat([treatment, target], axis=1)\n", "\n", "X_cv, X_test, y_cv, y_test, trmnt_cv, trmnt_test = train_test_split(\n", " data,\n", " target,\n", " treatment,\n", " stratify=stratify_cols,\n", " test_size=0.2,\n", " random_state=42\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:37:06.732922Z", "start_time": "2021-08-09T22:37:06.726210Z" } }, "outputs": [], "source": [ "# setting up model ...\n", "estimator = LGBMClassifier(\n", " random_state=42,\n", " n_jobs=-1,\n", ")\n", "\n", "# ... metamodel ...\n", "slearner = SoloModel(estimator=estimator)\n", "\n", "# ... and uplift metric scorer to pass to cross validation\n", "uplift_scorer = make_uplift_scorer(\"qini_auc_score\", trmnt_cv)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:37:45.899995Z", "start_time": "2021-08-09T22:37:06.737907Z" } }, "outputs": [ { "data": { "text/plain": [ "{'fit_time': array([33.87235594, 33.96732211, 33.46848416]),\n", " 'score_time': array([1.76540208, 1.70858002, 1.79931688]),\n", " 'estimator': [SoloModel(estimator=LGBMClassifier(random_state=42)),\n", " SoloModel(estimator=LGBMClassifier(random_state=42)),\n", " SoloModel(estimator=LGBMClassifier(random_state=42))],\n", " 'test_score': array([0.22895519, 0.22294613, 0.22625875])}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cv_gen = StratifiedShuffleSplit(\n", " n_splits=3,\n", " random_state=42\n", ")\n", "\n", "cross_validate(slearner, \n", " X=X_cv,\n", " y=y_cv,\n", " scoring=uplift_scorer,\n", " return_estimator=True,\n", " cv=cv_gen,\n", " n_jobs=-1,\n", " fit_params={'treatment': trmnt_cv}\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:38:44.842022Z", "start_time": "2021-08-09T22:37:45.907215Z" } }, "outputs": [], "source": [ "grid = {\n", " 'estimator__learning_rate': [0.2],\n", " 'estimator__max_depth': [6]\n", "}\n", "\n", "grid_search = GridSearchCV(slearner,\n", " param_grid=grid,\n", " scoring=uplift_scorer,\n", " n_jobs=-1,\n", " cv=cv_gen,\n", " return_train_score=True\n", " )\n", "\n", "grid_search = grid_search.fit(\n", " X=X_cv,\n", " y=y_cv,\n", " treatment=trmnt_cv\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:38:44.860816Z", "start_time": "2021-08-09T22:38:44.847274Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "best qini score on grid search: 0.2269\n", "best params: {'estimator__learning_rate': 0.2, 'estimator__max_depth': 6}\n" ] } ], "source": [ "print(f\"best qini score on grid search: {grid_search.best_score_:.4f}\")\n", "print(f\"best params: {grid_search.best_params_}\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:38:55.258438Z", "start_time": "2021-08-09T22:38:44.865374Z" } }, "outputs": [], "source": [ "slearner.set_params(**grid_search.best_params_)\n", "\n", "slearner.fit(\n", " X=X_cv, \n", " y=y_cv, \n", " treatment=trmnt_cv,\n", ")\n", "\n", "uplift = slearner.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-08-09T22:38:55.910003Z", "start_time": "2021-08-09T22:38:55.261034Z" } }, "outputs": [ { "data": { "image/png": "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1XV1dRIbGxt0PZTV3PQgpbWlFNUUNQ1nG2N6NneS20ZuOtBnn30W7fP5GDRokPf0008vf/zxxweUlZW5ADZt2hSxffv28MLCwoj4+Hjfj370o33XXHPNrs8//zwWIC4urjHQ90icdNJJFUuWLEnxer3s2LEj/OOPP+534oknVs2YMaOpffPmzREfffRRPMDEiRNr9+3bF/7GG2/Egf+H98qVK6MPd49Ro0bV5uXlRYF/5KeqqiqsqKhozfbt29du37597ZVXXrnrscceSwGYOnVqxd///vcUgMrKSnn++eeTZ8+eXQFw/fXX77rpppvSt2zZEg5QW1srf/rTnwYceL8FCxbs27Bhw/oDHwcmNgAzZsyoKiwsjN6wYUNkbW2tPPfccynnnHNO6YH9Pvjgg5irrrpq2IsvvpiflpbWNAq1cePGiMrKSgEoLi4O++STT/qNGzeuFvyjWsXFxRGjRo2qC+7fho3c9CiB3/DcyZbcGNMbuJPdvFb4GhX1FcRHxoc6nB4pUHMDoKosWrSoMDw8nLPPPrt83bp10cccc8xogNjYWN8TTzyxacOGDVE33XRTusvlIjw8XO+7777NABdffPGe0047LWfQoEH1K1asyGtrHBdddFHphx9+2G/MmDHjRERvv/32bZmZmd6LLrqo9M0330zIzs4eP3To0LrJkydXgn8k6Omnn974k5/8JLOioiKssbFRFixYsDs3N7f2UPeYO3du2aJFi1KvueaaPY899ljKGWecsd9S8fPPP7/kggsuGHHPPffsXLRo0dbvf//7w/7+978PUlXOP//8vYHl49/+9rfLdu3aFT5r1qxRqoqIcOGFF7aroDgiIoI//vGPW0477bScxsZGvvOd7+wJfJef/exnQ4855piqCy+8sOznP/95RnV1ddj8+fNHAgwdOrT+rbfeyl+zZk3MDTfckC4iqCpXXnnlrmOPPbYG4P3334+dPHlyVURE8KsKxb8Ku+/Izc3VlStXhjqMI/LEl09w58d38ub8NxkYO7D1C4wx3dryrcu56q2rWHz6YiYPnBzqcA5LRFap6n47Dq5evbpw0qRJ7fqhaNpmypQpo5YuXZo/YMCAoPd86ekuvfTSjLPOOqt03rx5B02jrV69esCkSZOyDmy3aakexFPiITEqkdQYO0LCmN4gMAprU1MmWHffffe2jRs3Rrbes/cYP358TUuJzeHYtFQP4in1Lxk94ER1Y0wPNTRuKHERceSVtHkWxPRRM2fObPPuyz3dkezBYyM3PYRPfeSX5FsxsTG9iIhYUbExncCSmx5iR+UOqr3VVkxsTC/jTnbjKfXQ1+ofjelMltz0EIFha0tujOld3MluKuor2F3drjMLjTHNWHLTQwSGrbOTskMciTGmIzU/hsEY0zEsuekhPKUe0vqlERcRF+pQjDEdqGnFVC/ZqbgrhYWFTRk9evRYt9s9bubMmdl79uwJ64jPXbhwYf/vfe97doBfD2bJTQ/RWw7XM8bsLzEqkYGxA23k5ggEzpXyeDzrkpKSvHfffbftk2EAS256hPrGejaXb7Z6G2N6KXeyrZhqr2nTplUFzjZ6++23Y4866qjRY8aMGTt58uTRq1evjgL/iMycOXNGnnjiie5hw4aN/+EPf5geuP7ee+/tn5WVNX7ChAljPvzww6bTrL/66qvIadOm5eTk5Iw97rjjcjweTyTAOeeck3XhhRdmTpo0aXR6evqEf//73/Hz58/PGjFixLhzzjknq4u/vjmA7XPTAxSUFdCojZbcGNNL5STlsGLnChp8DUS4gt9ivlt54ccZFK2P7dDPHDi2mrP+t9UDOb1eL2+//Xb8ZZddtgdg0qRJtZ988smGiIgIXnjhhfjrr78+fenSpRsB1q9fH7t69er1MTExvuzs7PHXXXfd7oiICO68886hq1at+jIlJaXx+OOPHzV+/PhqgAULFmReeOGFe6+66qq9f/nLX/ovWLAg44033tgIUFZWFv7ZZ59tePLJJ5POP//87LfeemvDlClTaiZOnDjmww8/jDn++OODOsHadDxLbnqAwEqpnCSbljKmN3Inu/H6vGwu20x2si0aCFbgXKndu3dHjBw5svass84qB9i3b1/Yt7/97eGFhYXRIqLNT+2ePn16ef/+/RsBsrOzazdu3BhVVFQUPm3atIqhQ4d6Ac4+++x9eXl50QCfffZZ3GuvvbYR/AdJ3n777U2jPd/85jdLXS4XRx99dHX//v0bAmch5eTk1GzcuDHKkpvQaTW5EZFY4FogU1V/ICJuYJSq/rvTozOAv94m0hVJZoLVtxnTGzUvKu6xyU0QIywdLVBzU1FR4Tr55JPdd95558Bf/vKXRTfccEPajBkzKpYtW7bxq6++ipw5c+aowDWRkZFNGwqFhYXtl/i0VXR0tDqfs9/nulwuvF6vbSUfQsHU3PwDqAOOc15vB37TaRGZg3hKPIxIGkG4ywbajOmNRiSOIEzCrO7mCMXHx/sWLly45b777hvU0NBAeXl5WHp6ej3A/fffP6C160866aSqFStWxO/atSusrq5Onn/++eTAe5MnT6566KGHkp3PSsnNza3svG9iOkowyc1IVf0D0ACgqtVAqxmpiDwiIkUi8kWztrtFZIOIrBGR50Ukqdl7N4lIvoh8JSKnNms/zWnLF5Ebm7UPF5EVTvv/iUivPUjMVkoZ07tFhkUyLGGYJTftcMIJJ9SMHj265oEHHki54YYbdt12223pY8aMGev1elu9dtiwYQ033HDDjmnTpo3Jzc0dnZOTUxt47+9///uWxx9/fEBOTs7Yp556qv99993X5SNUpu2ktS2/ReRDYBbwgaoeLSIjgadU9dhWrjsJqAQWq+p4p20O8JaqekXkLgBVvUFExgJPAccCQ4E3gMBP8zzgG8A24BPgAlVdLyLPAM+p6tMi8ndgtaouau0L5+bm6sqVK1vr1m2U1ZUx/enpXDvlWi4Zf0mowzHGdJLr3rmOL/Z8wevnvB7qUFokIqtUNbd52+rVqwsnTZrU5kMNjekoq1evHjBp0qSsA9uDGbm5FXgdyBCRJ4A3getbu0hV3wX2HdD2H1UNpNEfAYHCrHnA06pap6qbgHz8ic6xQL6qFqhqPfA0ME/8x2LPBJY41z8GnBXEd+lx7NgFY/oGd5Kb7ZXbqWroc4c+G9PhWk1uVHUZcDZwCf7RlVxVXd4B9/4+8JrzPA1oPtS3zWk7VHt/oLRZohRob5GIXC4iK0VkZXFxcQeE3nUsuTGmb2gqKrapKWPaLdhN/NKAMCASOElEzm7PTUXkF4AXeKI9nxMsVX1AVXNVNTc1tWdtYOkp8ZAYlUhqTM+K2xjTNnYMgzEdJ5il4I8AE4F1gM9pVuC5I7mhiFwCfAuYpV8X/GwHMpp1S3faOET7XiBJRMKd0Zvm/XsVT6kHd5Ib/0ycMaa3SuuXRmx4rI3cGNMBgllbPE1Vx3bEzUTkNPz1OjOcVVcBLwFPisif8BcUu4GP8a/KcovIcPzJy/nAd1RVReRt4Fz8dTgXAy92RIzdiU995Jfkc1Z2rywnMsY04xIX2cnZltwY0wGCmZb6r7OaqU1E5Cngv8AoEdkmIpcBfwPigWUi8rmzyglVXQc8A6zHX7z8Y1VtdEZlrgSWAl8Czzh9AW4ArhGRfPw1OA+3NcbubkflDqq91VZvY0wf4U5y4yn10NoqVmPM4QWT3CzGn+B85exPs1ZE1rR2kapeoKpDVDVCVdNV9WFVzVbVDFU9ynn8sFn/36rqSFUdpaqvNWt/VVVznPd+26y9QFWPdT5zvqrWtfXLd3eB3+AsuTGmb3AnuymrK6O4pmctfAiVsLCwKaNHjx7rdrvHnX766SMqKiradBj0FVdckZ6dnT3uiiuuSG+99/5uvPHGwW29xnSdYP5DeBi4CDgNOBN/vcyZnRmU8QuslMpO6qHbsRtj2iSwWadNTQUncPyCx+NZFxERoX/84x+DWnnR0NAAwJNPPjlgw4YN6+6///5tbb33woULh7T1GtN1gkluilX1JVXdpKqbA49Oj8zgKfWQ1i+NuIi4UIdijOkC7iRbDn6kpk+fXpmfnx9VXl7umj9/ftaECRPGjBkzZuw///nPJICFCxf2nzlzZva0adNyjj/++FEzZ87Mrq6uDhs/fvzYBx98MHnHjh3hp5566sjx48ePGT9+/Jj//Oc/cQBlZWWuc889NysnJ2dsTk7O2EcffTTpRz/6UVrg0M65c+cOD+03Ny0JpqD4MxF5EngZ/xlTAKjqEa2WMsHzlHhsSsqYPiQpOonUmNQeuRz8lg9uycgvyY/tyM/MTs6u/vUJv271uIOGhgaWLl2aMGfOnPKbb755yCmnnFL+7LPPFu7ZsycsNzd3zNy5c8sB1q1bF7tmzZp1gwYNagSIjY2dvGHDhvUAZ5555vBrrrlm96mnnlrp8XgiTz31VHdBQcG6G2+8cUhCQkJjXl7eeoDi4uKwSy65pPTRRx8dGLjWdD/BJDcx+JOaOc3ajngpuAlOfWM9m8s3M3vY7FCHYozpQu5kd9OUtDm8wOgJwNSpUyt++tOf7snNzR29dOnSpIULFw52+kh+fn4kwIknnlgeSGwO9MEHHyR4PJ6YwOvKysqwsrIy17vvvpvw9NNPFwTaU1NTW7zedC+tJjeqemlXBGL2V1BWQKM22siNMX2MO8nNUxuewuvzEu4K5vfP7iGYEZaOFqi5ad6mqixZsiR/0qRJ+y0yef/99+NiY2N9HIKq8umnn34ZGxtrS9V6gVZrbkQk3TnBu8h5/EtE2lxZbtomMOeek2SngRvTl7iT3dT76tlSviXUofRIp5xySvkf//jHQT6fP4/54IMPYlq5BIDp06eX//73vx8YeP3hhx/GAMyYMaP8z3/+c1N7cXFxGEB4eLjW1dXZ7qrdVDAFxf/Av8neUOfxstNmOlFeSR6RrkgyEzJDHYoxpgsFRmvzSm1q6kjceeedO7xer4wePXpsdnb2uF/+8peHPHewuQceeGDrp59+GpeTkzN25MiR4/72t7+lAvz+97/fWVpaGuZ2u8eNGjVq7KuvvhoPcOGFFxaPGTPGCoq7KWltsygR+VxVj2qtrafIzc3VlStXhjqMVv1w2Q/ZW7uXZ898NtShGGO6UK23lqlPTuV/JvwPV02+KtThNBGRVaqa27xt9erVhZMmTdoTqpiMWb169YBJkyZlHdgezMjNXhH5roiEOY/v4j/byXQiT4mnaVmoMabviA6PJjM+05aDG9MOwSQ33wfOA3YBO/Gf52RFxp2orK6Mopqipg29jDF9izvZbcmNMe0QzGqpzcDcLojFOALLQG2llDF9kzvZzbLNy6huqCY2okO3juloPp/PJy6Xy1YYmS7n8/kEaHEFXDCrpR4TkaRmr5NF5JEOjM8cwM6UMqZvC6ySzC/ND3EkrfqiuLg40fkhY0yX8fl8UlxcnAh80dL7wWyiMFFVSwMvVLVERCZ3VIDmYHkleSRGJZIaE9QxKcaYXqb5GVMTUyeGOJpD83q9/7Nr166Hdu3aNZ7gyhyM6Sg+4Auv1/s/Lb0ZTHLjEpFkVS0BEJGUIK8zR8hT6i8mFrFfhozpi9Li04gJj+n2xzBMmTKlCCtbMN1QMEnKH4H/ikhgTfJ84HedF1Lf5lMf+SX5zMueF+pQjDEh4hIX2UnZVlRszBFqdRhRVRcDZwO7ncfZTpvpBDsqd1DtrbaVUsb0cYEVU63tRWaMOVgwBcWPq+p6Vf2b81gvIo93RXB9kRUTG2PAf8ZUSV0Je2ttWzFj2iqYArBxzV+ISBgwpXPCMYE59uyk7BBHYowJpaZjGOyEcGPa7JDJjYjcJCIVwEQRKReRCud1EfBil0XYx+SV5JHWL424iLhQh2KMCaFAcmN1N8a03SGTG1X9varGA3eraoKqxjuP/qp6UxfG2Kd4Sjw2JWWMISU6hf7R/S25MeYIBDMt9ZqInHTgo7WLROQRESkSkS+ataWIyDIR8Th/JjvtIiILRSRfRNaIyNHNrrnY6e8RkYubtU8RkbXONQulF6ybrm+sZ3P5ZjtTyhgD+EdvbFrKmLYLJrn5ebPHLcDLwG1BXPcocNoBbTcCb6qqG3jTeQ1wOuB2HpcDi6BpT51bganAscCtgYTI6fODZtcdeK8ep6CsgEZtJCfFVkoZY/zJTUFZAY2+xlCHYkyPEsxS8DObPb4BjAdKgrjuXWDfAc3zgMec548BZzVrX6x+HwFJIjIEOBVYpqr7nE0ElwGnOe8lqOpH6l8nubjZZ/VYgeHnwNbrxpi+zZ3kpq6xji0VW0IdijE9ypFsl7mywDkAACAASURBVL0NGHOE9xukqjud57uAQc7zNGDrAfdIa6V9WwvtLRKRy0VkpYisLC4uPsLQO19eSR6RrkgyEzJDHYoxphtofgyDMSZ4re5QLCJ/BQK7SLmAo4BP23tjVVUR6ZLdqVT1AeABgNzc3G67I5anxMOIpBGEu+x0C2MMjEgagSB4Sj3MYU6owzGmxwjmp+jKZs+9wFOq+sER3m+3iAxR1Z3O1FKR074dyGjWL91p2w6cfED7cqc9vYX+PZqnxMPUIVNDHYYxppuICY8hMyHTRm6MaaNgam4eA54CVgGrgY/bcb+XgMCKp4v5er+cl4DvOaumpgFlzvTVUmCOiCQ7hcRzgKXOe+UiMs1ZJfU9evjeO2V1ZRTVFNkycGPMftxJbktujGmjYI5fOBnwAP8L3AfkBbkU/Cngv8AoEdkmIpcBdwLfEBEPMNt5DfAqUADkAw8CPwJQ1X3Ar4FPnMcdThtOn4ecazYCrwXxfbutwHJPO1PKGNOcO9nN1oqtVDdUhzoUY3qMYE8Fn6OqXwGISA7+kZzDHsGgqhcc4q1ZLfRV4MeH+JxHgEdaaF+Jf+VWr2BnShljWpKTnIOiFJQVMH5Ar/krz5hOFcxqqYhAYgOgqnlAROeF1DflleSRGJVIakxqqEMxxnQjdgyDMW0XVEGxiDwE/NN5fSH7FxmbDuAp9eBOctMLNlo2xnSg9H7pRIdF207FxrRBMCM3C4D1wE+cx3qnzXQQn/rIL8m3KSljzEHCXGGMTBqJp9RGbowJVqsjN6paB/zJeZhOsKNyB9XeaktujDEtcie7eXfbu6EOw5ge40h2KDYdrOnYBVspZYxpgTvJzb7afeyt2RvqUIzpESy56QYCw83ZSdkhjsQY0x01FRXb1JQxQbHkphvIK8kjrV8acRFxoQ7FGNMN2YopY9rmkDU3IvIyX58pdRBVndspEfVBnhKP1dsYYw5pQMwAUqJTbMWUMUE6XEHxPV0WRR9W31jP5vLNzMo8aG9DY4xpYscwGBO8QyY3qvpOVwbSVxWUFdCojVZMbIw5LHeymyV5S2j0NRLmCgt1OMZ0a8GcLeUWkSUisl5ECgKPrgiuL7CVUsaYYLiT3dQ21rKtcluoQzGm2wumoPgfwCLAC5wCLObr3YpNO3lKPES6IslMyAx1KMaYbsydZEXFxgQrmOQmRlXfBERVN6vqbcA3OzesviOvJI8RSSMIdwVzEoYxpq8amTQSQSy5MSYIwfxErRMRF+ARkSuB7UC/zg2r7/CUeJg6ZGqowzDGdHOxEbGkx6fbXjfGBCGYkZufArH4z5WaAnwX+F5nBtVXlNWVUVRTZMvAjTFBsRVTxgQnmOQmS1UrVXWbql6qqucAViDSAQJ7VlhyY4wJhjvZzZaKLdR6a0MdijHdWjDJzU1Btpk2spVSxpi2yEnOwac+NpZtDHUoxnRrh9uh+HTgDCBNRBY2eysB/8op006eUg+JUYmkxqSGOhRjTA/Q/BiGcf3HhTgaY7qvwxUU7wBWAnOBVc3aK4CrOzOoviKvJA93khsRCXUoxpgeIDM+k6iwKKu7MaYVh9uheDWwWkSeVNWGLoypT/Cpj/ySfOZlzwt1KMaYHiLMFcaIxBGW3BjTimBqbo4VkWUikufsTrypvTsUi8jVIrJORL4QkadEJFpEhovIChHJF5H/E5FIp2+U8zrfeT+r2efc5LR/JSKntiemrrajcgfV3morJjbGtIk72W3LwY1pRTDJzcPAn4DpwDFArvPnERGRNPzLynNVdTwQBpwP3AX8WVWzgRLgMueSy4ASp/3PTj9EZKxz3TjgNOA+EekxB64EfvMK7DpqjDHByEnOYU/NHkpqS0IdijHdVjDJTZmqvqaqRaq6N/Bo533DgRgRCce/h85OYCawxHn/MeAs5/k85zXO+7PEX6QyD3haVetUdROQDxzbzri6TOA3Lxu5Mca0hR3DYEzrgklu3haRu0XkOBE5OvA40huq6nbgHmAL/qSmDH/BcqmqBlZhbQPSnOdpwFbnWq/Tv3/z9hau2Y+IXC4iK0VkZXFx8ZGG3qE8JR7S+qURFxEX6lCMMT1I4BeiwD5ZxpiDBXP8QuBsgNxmbYp/pKXNRCQZ/6jLcKAUeBb/tFKnUdUHgAcAcnNztTPvFay8kjwbtTHGtNmAmAEkRSVZ3Y0xh9FqcqOqp3TwPWcDm1S1GEBEngNOAJJEJNwZnUnHf4YVzp8ZwDZnGisR2NusPaD5Nd1afWM9m8s3MytzVqhDMcb0MCLiLyq2aSljDqnVaSkRGSQiD4vIa87rsSJyWWvXHcYWYJqIxDq1M7OA9cDbwLlOn4uBF53nLzmvcd5/S1XVaT/fWU01HHADH7cjri5TUFZAozbazsTGmCPiTnKTX5qPT32hDsWYbimYmptHgaXAUOd1HvCzI72hqq7AXxj8KbDWieEB4AbgGhHJx19T87BzycNAf6f9GuBG53PWAc/gT4xeB36sqo1HGldXsmMXjDHt4U52U+OtYXtFjxisNqbLBVNzM0BVnxGRm8Bf1Csi7UoiVPVW4NYDmgtoYbWTqtYC8w/xOb8FftueWELBU+Ih0hVJZoKdP2qMabumouLSPDISMlrpbUzfE8zITZWI9MdfRIyITMO/YskcobzSPEYkjSDcFUxuaYwx+8tOygZsObgxhxLMT9dr8Ne3jBSRD4BUvq6NMUfAs8/D1CFTW+9ojDEtiIuII61fmiU3xhxCMKulPhWRGcAoQICv7KypI1dWV0ZRTZEtAzfGtIsdw2DMobWa3DhHGpwBZDn954gIqvqnTo6tVwpsvGXJjTGmPXKSc3hv23vUNdYRFRYV6nCM6VaCqbl5GbgE/wqm+GYPcwRspZQxpiO4k900aiMFpe06x9iYXimYmpt0VZ3Y6ZH0EZ5SD4lRiaTGpIY6FGNMD5aT5P8FyVPqYUz/MSGOxpjuJZiRm9dEZE6nR9JHeEo8uJPc+PcvNMaYI5OZkEmkK9KKio1pQTDJzUfA8yJSIyLlIlIhIuWdHVhv5FOfP7mxehtjTDuFu8IZkTTCkhtjWhBMcvMn4DggVlUTVDVeVRM6Oa5eaUflDqq91ZbcGGM6hDvJzpgypiXBJDdbgS+c85xMOwT+EnInWXJjjGk/d7KbopoiSmtLQx2KMd1KMAXFBcBy5+DMukCjLQVvu8CeFDZyY4zpCIG/SzylHo4ZfEyIozGm+whm5GYT8CYQiS0FbxdPiYe0fmnERcSFOhRjTC8QGAUO7J9ljPELZofi2wFEJFZVqzs/pN7LiomNMR1pYOxAEiITrO7GmAO0OnIjIseJyHpgg/N6kojc1+mR9TL1jfUUlhdavY0xpsOIiB3DYEwLgpmW+gtwKrAXQFVXAyd1ZlC9UUFZAY3aaDsTG2M6lDvJTX5JPj71hToUY7qNYJIbVHXrAU2NnRBLr9a0UsqmpYwxHcid7KbaW82Oyh2hDsWYbiOopeAicjygIhIhItcBX3ZyXL2Op8RDhCuCYQnDQh2KMaYXCYwGW92NMV8LJrn5IfBjIA3YDhzlvDZtkFeax8ikkYS7gll9b4wxwclOygawuhtjmjnsT1oRCQPuVdULuyieXstT4mHq4KmhDsMY08v0i+zH0LihNnJjTDOHHblR1UZgmIhEduRNRSRJRJaIyAYR+dJZkZUiIstExOP8mez0FRFZKCL5IrJGRI5u9jkXO/09InJxR8bYkcrqyiiqLrJ6G2NMp8hJzrHkxphmgpmWKgA+EJFbROSawKOd970XeF1VRwOT8Nfw3Ai8qapu/JsG3uj0PR1wO4/LgUUAIpIC3ApMBY4Fbg0kRN1NYIMtS26MMZ3BneymsLyQ+sb6UIdiTLcQTHKzEfi307fdOxSLSCL+peQPA6hqvaqWAvOAx5xujwFnOc/nAYvV7yMgSUSG4F+evkxV96lqCbAMOO1I4+pMdqaUMaYzuZPdNGojm8o2hToUY7qFoHco7kDDgWLgHyIyCVgF/BQYpKo7nT67gEHO8zT8h3cGbHPaDtXe7XhKPSRGJTIwdmCoQzHG9ELNj2EYlTIqxNEYE3rB7FC8TESSmr1OFpGl7bhnOHA0sEhVJwNVfD0FBYBzAnmHnUIuIpeLyEoRWVlcXNxRHxs0T4kHd5IbEenyextjer9hicMId4XbiiljHMFMS6U600YAOFNA7RmC2AZsU9UVzusl+JOd3c50E86fRc7724GMZtenO22Haj+Iqj6gqrmqmpuamtqO0NvOpz7yS/Ot3sYY02kiXBGMSBxhRcXGOIJJbhpFJDPwQkSG0Y5RFVXdhX9jwMDY6SxgPfASEFjxdDHwovP8JeB7zqqpaUCZM321FJjjjCQlA3Octm5lR+UOqhqqLLkxxnQqd7LbkhtjHMHsKPcL4H0ReQcQ4ET8q5ba4yrgCWeJeQFwKf5E6xkRuQzYDJzn9H0VOAPIB6qdvqjqPhH5NfCJ0+8OVd3Xzrg6nBUTG2O6gjvJzSsFr1BWV0ZiVGKowzEmpIIpKH7d2VtmmtP0M1Xd056bqurnQG4Lb81qoa9yiB2RVfUR4JH2xNLZAnPgNnJjjOlMgb9jPCUecge39NerMX1HUAdnAlHAPqAcGCsidip4kDwlHtL6pREXERfqUIwxvVjTGVNWVGxM6yM3InIX8G1gHeBzmhV4txPj6jU8JR4btTHGdLpBsYOIj4i3uhtjCK7m5ixglKrWdXYwvU19Yz2F5YXMzJwZ6lCMMb2ciFhRsTGOYI9fiOjsQHqjgrICGrWxabjYGGM6kzvZTX5pPv5SRWP6rmBGbqqBz0XkTaBp9EZVf9JpUfUSTSulbFrKGNMF3EluKhsq2Vm1k6H9hoY6HGNCJpjk5iXnYdrIU+IhwhVBZkJm652NMaadmq+YsuTG9GXBLAV/rLU+pmV5pXmMTBpJhMtm9UzPo6rUNviIiQw76D1vo48wlzQdKVLv9fHGl7spKq9l5uhBrNi0l+r6RiLCXNQ0NLJlbxUFe6q4aNowZo8ZRKMqtQ3+96MjDv58c2Syk7MB/4qpGRkzQhyNMaFzyORGRJ5R1fNEZC0t7EisqhM7NbJewFPiYergqaEOw5iDVNZ5+f2rX7KzrJZwl7B6Wym7y+sY0C+KPZXtWztw28vrD/nee562bZE1KSOJk9wD+Otb+fxkZjYnjx7I6MHxxEYGM+jc9yREJjAkbgh5JXmhDsWYkDrc3xA/df78VlcE0tuU1ZVRVF1k9TYmJMqqG3h5zQ7W7SjjqY+3Bn1d88QmZ1A/8nZXtthvQL8oymrqaWj8+veeE0b2p19UOOFhLipqvaTERTB2SALV9Y0kxkbw/Kfb+XJXedM1LgGfwqnjBrN03a4W77N6aymrt/qPtlv4Vj4L38o/qM/kzCQ+2+Lv88gluUzPTiUyPNgtvHofWzFlzGGSG+f8JlR1c9eF03sEfnOy5MZ0pjpvI8UVdbz4+Q627K3mzQ1FbRp5+fN5R9G/XyRJMRH4nDwlzNU5p9fnDks55HtXnpJ9UJuqsruijk3FlSTERODZXUlJdT3v5e+hpKoerxNwILEB+P6jK5ueJ8dG8PyPTmBY/9im6bO+wJ3k5sPtH9LQ2EBEmE2Jm77JxnY7iZ0pZTqat9HH5n3V3PHyet7JKz5kv+gIF9NG9Gdkaj8ykmMZmRpHUmxkq58f1s1+/osIgxOiGZwQDcC4of7zki49Yfh+/VSVXeW1rN9Rzl/e/HrEoqS6gZPvWd70esyQBM45Oo35UzJIjO29P/TdyW686mVT+SbbhsL0WZbcdBJPqYeEyAQGxg4MdSimh6htaOSVNTu59tnVbb720uOzGDU4nrFDEvrUKAX4k6AhiTEMSYxh1phBgD/heWXtTu5/t6Cp35c7y/nNK+X85pUvARiRGsfd507EPSieuMjwThux6mrNV0xZcmP6qsMVFL+pqrNE5C5VvaErg+oNAn+x9LUfNCZ4O0prWLu9jGv+73Oq6htb7T97zECiI8IYFB/NvKOG2n9bhyEifGviUL418evl0FV1Xj7dUsIfln4FQEFxFecs+u9+1w3rH8svzhjDdPeAHlu0PDxhOOESbnU3pk873P+9Q0TkeGCuiDwN7Pc3qap+2qmR9WA+9ZFfms/ckXNDHYrpRoor6nju0238/rUNLb4/oF8U04an4B7Uj+NHDrAl0h0sLiqcE92pnOhOBWBl4T5u//d6IsKkqch5895qLn981X7XnegewHuePaz+1ZweMZ0VERZBVmKWHaBp+rTDJTe/Am4B0oE/HfCeAnZg0iHsqNxBVUOVFRP3YYV7qliyaht/e/vg1T0BM0cNZOTAOE4ZNZD46O7/Q7O3yc1K4eUrpze9bvQpW/dVs3pbKU+s2EJNg380LbB8fdId/2nqGxnu4p75kzht3OBuuTLLnezms6LPQh2GMSFzuNVSS4AlInKLqv66C2Pq8ayYuG9o9CnV9V6e/2w7+UWV7CitYV9VPZ82W73TXEpsJN+ZmskJ2QPoF9Uzpzx6szCXkDUgjqwBccw7Kg3w/zveUVbDM59sZXmzIu56r4+fPOVPHtKSYvjZbDejBycwbmgCrm5Qu5OTnMNrm16jvL6chMiEUIdjTJcLZofiX4vIXOAkp2m5qv67c8Pq2QLDwTZy03t4dlfwixe+4ONN+1rtmzssmeS4SLJT+3HciP4kx7W+Usl0T2EuISM5lmvnjOLaOaOa2tdsK+X5z7ZT5/WxdnsZP1+yZr/rzpgwmJvPGEN6cmxXhwx8/YtVfkk+Rw86OiQxGBNKrSY3IvJ74FjgCafppyJyvKre3KmR9WCeEg9p/dKIi4gLdSjmCPh8yrOrtvLrf39JZZ33sH0npiUybmgCVfWNzMhJZWRqv16z6sYc2sT0JCamJwH+UZxVm/exdnsZL6/ZCcCra3fx6lr/xoS5w5LJSIklKTaCn586qksKlZuvmLLkxvRFwfxf9k3gKFX1AYjIY8BngCU3h+Ap8dioTQ+ydV8197+7kde/2H3IDfBS46O47IThZKTEkpYUg0uw1UoG8NffHDdyAMeNHMDlJ41kd3ktH27cw5JV26is8/LlrnJWbi4B4B8fFDI0MZp5k9OIDg8jNyuZE7IHdHhMQ+KG0C+inxUVmz4r2F8hkoDAeHxiJ8XSK9Q31lNYXsjMTKu37o5UlRc+387rX+xib2V90w+d5sYNTWBHaQ3fnTaMWaMH2UiMaZNBCdH8v8np/L/J6U1tdd5G3li/m6Xrd7NpTxWLlm886LqPb57FQGfDwvYSEbKTsm05uOmzgklufg98JiJv418OfhJwY3tvLCJhwEpgu6p+S0SGA08D/YFVwEWqWi8iUcBiYAqwF/i2qhY6n3ETcBnQCPxEVZe2N672KigroFEbbfOsbsLnUz7bWsrtL69jzbayFvuMSI1j9uhBnDwq1VYtmU4RFR7GNycO5ZsThzadtv7fgr08/lEheyrrATj2d2829R87JIEnfzA1qJ2lD8Wd7Ob1Ta+jqjbKaPqcYAqKnxKR5cAxTtMNqtryKXdt81PgSyBQyn8X8GdVfVpE/o4/aVnk/Fmiqtkicr7T79siMhY4HxgHDAXeEJEcVW19N7RO1LRSyqalQkJV2bSnigffKzjkgZFpSTGcdVQakzOTGBgfZX/xmy4lIsREhjFz9EBmjvbvYJ5fVMl/C/byvqeYHWW1rN9ZzlF3LAPgsunDufi4LDL7t6042Z3s5tm8Z9ldvZvBcYM7/HsY050FNS3lHKL5UkfdVETS8dfy/Ba4Rvw/XWYC33G6PAbchj+5mec8B1gC/M3pPw94WlXrgE0iko+/8Hn/LUe7mKfEQ4QrgsyEzFCG0SfUNjSyvbSGD/L38OaXRYc8b+nbx2QwOSOpTx5NYHqG7IH9yB7Yj4umDaOh0ccj729i9bZStpbU8PD7m3j4/U3ER4dz5qSh/L/JaRyTdehDSAMCK6bySvIsuTF9Tqg22/gLcD0Q77zuD5SqamBpyjYgzXmeBmwFUFWviJQ5/dOAj5p9ZvNr9iMilwOXA2Rmdm7SkVeax4jEEUS4bHqjMxQUV3Le/R8d9uTruZOGMik9icmZSUSEdb8N1ow5nIgwF1fMGAn4RyLvf7eAV9bupKLWy5MrtvDkii0AXDUze7/l6QdqvmLqpPSTDtnPmN6oy5MbEfkWUKSqq0Tk5K64p6o+ADwAkJubq515L0+Jh6mDp3bmLfoMVWXdjnJufWkdq7eW4vUd/K9uZGocgxKimTV6ILlZKbhsZMb0IiLCD2eM5IczRqKqLPtyN399y7/r9V/fyuevb+Xz2k9PZMyQgzfqS4xKZFDsIFsxZfqkwyY3TtHvOlUd3YH3PAH/eVVnANH4a27uBZJEJNwZvUkHtjv9twMZwDYRCce/Wmtvs/aA5teERFldGUXVRVZvc4Tyiyp5/rNt/O/bB68kCRjQL5KZowfxnWMzbRWT6VNEhDljBzNn7GC2lVSz4An/8X6n3/seD30vl9ljBx10jTvZbSumTJ902ORGVRtF5CsRyVTVLR1xQ1W9CbgJwBm5uU5VLxSRZ4Fz8a+Yuhh40bnkJef1f53331JVFZGXgCdF5E/4C4rdwMcdEeORyivJA6yYuC2q672cce97FO6tbvH9U8cNZkZOKhPSbAcCYwLSk2N5+crpbNhVzp+W5fE/i1cC8N71p5CR8nXhsTvZzUc7P6LB12BT5aZPCWZaKhlYJyIfA1WBRlXt6COvbwCeFpHf4N8k8GGn/WHgcadgeB/+FVKo6joReQZYD3iBH3eblVJ2plSLVJXyWi//+3Y+D7xbcND7MRFhXDUzm+NG9CfcamWMadXowQksPH8y8+/3r6M48Q9vc+/5RzWdjeVOcuP1edlctpns5OxQhmpMlwomubmls26uqsuB5c7zAvyrnQ7sUwvMP8T1v8W/4qpb8JR6SIhMYGDswFCH0m2oKi+t3sFPn/68xfeTYyM4LzeDOWO75+nKxnR30RFhvHzldM782/sA/PTpz1myahuPXza1ab8tT6nHkhvTpwSzz807IjIMcKvqGyISC4R1fmg9T+DYhb683LjO28gzK7dxywtftPj+ebn+MqlTxw1iYHzH7MZqjIGXr5zOw+9v4oXPt/OeZw//3biXKVnDCZMwPCUeTh9+eqhDNKbLBHNw5g/wL6NOAUbiX279d2BW54bWs6gq+aX5zB3Z0bN13VtgZOafH23mk8KDjzIAGJoYzZ3nTCS5HbutGmNad9n04RyblczNL3zBBQ9+RP5vTycrIaupHtCYviKYaakf458uWgGgqh4RsXmXA+yo2kFVQ1WfKSbetKeKxz4s5IkVm2lo3H+J9nenZjLvqDSiI2yAz5iuNiE9iVPHDmLp+t1c8OBHuMe4WVO8JtRhGdOlgklu6pwzngBwlmN36l4xPVHePmelVC8uJi6pqueRDzbxyPubqKr3126nxkcxe/RA5k5Ko190qPaENMY0d+VMN+969vBJYQkTx2ewo+p1Kusr6RfZL9ShGdMlgvlp9I6I3AzEiMg3gB8BL3duWD1PYKOs3jZyU9vQyD1Lv+Kh9zcd9N6Np43m+JH9+3SNkTHd1cLzJ/ODx1fy6PI6YjMgvzSfowYeFeqwjOkSwSQ3N+I/vHItcAXwKvBQZwbVE3lKPKT1SyMuIi7UobRb3u4KHni3gCWrth303g2njeYES2iM6fYGJ0aT1T+WzeX+c6XySvIsuTF9RjCrpXwi8hj+mhsFvlJVm5Y6gKfE06OnpNbvKOes//2A+kbfQe8dN6I/Pz4lm8QY2wTMmJ7k9/9vIhc8VIk2RtpOxaZPCWa11Dfxr47aCAgwXESuUNXXOju4nqK+sZ7C8kJmZs4MdShtkre7gjl/fveg9qGJ0cydNJTp7lRLaIzpwfx1cC58dYN5b/NamBbqiIzpGsFMS/0ROEVV8wFEZCTwCmDJjWNT2SYatbFpw6zuTFW59NFPWP5V8X7tQxOj+e60YUzPHmBTTsb0AmG1pUSWF/LmN4q4/osatlRtw9fYiCvMVjGa3i+Y5KYikNg4CoCKToqnR+oJZ0rtq6rn6F8vO6j91m+NZcqwZEtojOlpVAmv2UNkeSGR5YVElW/e73lYfVlT17Pj43nEl0jBrkKy00aGMGhjusYhkxsROdt5ulJEXgWewV9zMx/4pAti6zE8JR4iXBFkJmSGOpSDfLqlhLte28CKTfua2nIG9ePX88YTG2lLt43p1tRHeHURUU7S4k9cCoks30xUeSGuhqqvu4oLEjOR/iNg+LGQMqLpcX5CBue4omzvKdNnHO6n25nNnu8GZjjPi4GYTouoB8orzWNE4ohuc+ruysJ9PPphIf9es3O/9sumD2fepKE2SmNMd+JrJKJq536JS9Pzis24vLVNXdUVAUnD/AlM9on7JTCSmAHhLe8CHoadmWP6lkMmN6p6aVcG0pN5SjwcO/igMz+73Gtrd7LgiU/3a4uLDOOe+ZNIT44NUVTGGHwNRFZsJ7KiWeJSVkhUxWYiy7cgvvqmrhoeDclZyMBsGP0NJ3kZ7k9gEtIhzEZcjWlNMKulhgNXAVnN+6tq3zpE6RDK6sooqi4KWTHx3so6bnpuLf9Zv3u/9guOyeCCYzNtlMaYLiKNdURWbD2oBiaqvJCIim2INjb11Yg4SBmODBkL4761/whM/BBwuUL4TYzp+YL5FeAF4GH8uxIfvAlKHxfYO6Iri4nrvT7+tCyPf326jeKKuv3eu/vciYwenNBlsRjTl4i3hsjyLQfVwESVbya8cjvS7GQajYqHlJFIxhRImb9/AtNvINgvHsZ0mmCSm1pVXdjpkfRQTSulumADv/c9e7j1pS/YWPx1EWHOoH5cOHUYkzOSbJTGmA7gqq88YPrIeV5RSETVrv36akyKP1kZfvx+yQspI5DYFEtgjAmRYJKbe0XkVuA/QNMwgap+euhL+g5PqYeEyAQGTKvxpQAAFjpJREFUxnbOQek+n/KXN/L4cONeVm4uaWr/5oQh/ODEEYS57C9PY9rKVVfqTBs1S2ICIzA1++8BpXGDoP8IxD2rqfaF5OH+aaWY5BB9A2PM4QST3EwALgJm8vW0lDqv+zxPiQd3srvDR00aGn24f7H/PomjB8dz3ZxRDEqI7tB7GdPrqBJWu++A6aOvE5mwutL9u8cP9ScwaafvPwKTnIVExYfoSxhjjlQwyc18YISq1rfas49RVfJL8zlzxJmtdw5SSVU9k1vYbO++7xxNRoqteDKmiSrhNUVfJy5lhU3TR5Hlmwmr/3qvURUXJKT7l1APO/vgBCbCdrcwpjcJJrn5AkgCijo5lh5nR9UOqhqqyElp/0qpqjov425delD7s1ccZxtvmb5LfURU7WpxA7vI8kJc3pqvu7rCISkTSRkBI/avgZGkTAiPCuEXMcZ0pWCSmyRgg4h8wv41N0e0FFxEMoDFwCD801sPqOq9IpIC/B/+JeeFwHmqWiL++Z57gTOAauCSQL2PiFwM/NL56N+o6mNHEtORalop1Y5i4oraBibc9p/92q6encPM0Z1Tw2NMt+PzElG5/eAamIpCIsu34Gr8ekWghkVC8nBkwAjImfl1DUzKcP8mdmHdYyNNY0xoBZPc3NrB9/T+//buPErOqszj+PepruosnbVDCE020iQhRFGWGMKgmIGAwAgIigeHcwTBYXREFp0zgsyMOqgHF9xGD4uAa2RRBBkXFkEZcI4QUZZAJB1JZyMhhHS6O2unu5/5497qvNVbujrVXV3Vv885dfLWfe9b7711O+kn73vf5wKfdPc/m9lY4BkzewS4GHjU3W8ws2uAa4BPAWcAc+LreOAm4PgYDH0GWEAIkp4xswfcvaHLGQfIga4p9eDyTXzkx890vL96yRwWH3EwKT1hIWXG2lrIbF/fkbyu41ZScz2Vzeuw9taOup4eFYKVKUfAkblzYGzcoZDSlUwR6d1+gxt3f7yQJ3T3jcDGuN1sZiuAqcA5wOJY7QfA7wnBzTnAD93dgT+a2QQzq4l1H3H3rQAxQDoduLOQ7e1NXUMdU8dMpSpTlddxu/e2Me8/Hux4f8mJh3HuMdMK3TyRQWWtu6lsXtvtIo6Z7esx35cmyyvHhGBl6luh+txOSewO0SPUInJA+pKhuBk6MlNVAhlgh7sfcKY4MzsMOAZ4CpgSAx+ATYTbVhACn3WJw9bHsp7KuzvPZcBlADNmFG5xy7qGurxvST2/fhtX3/1sx3vNqZFSYnt3dgpc4hyY5nrS2zfmJrEbOT4ksZu5EKovyA1gqg5SACMiA6YvV246noOM81/OARYd6InNbAxwL3CVuzclH6V2dzcz7/HgPLn7rcCtAAsWLCjI57a0tVDfVM/JM/r+RPyjK17j8p/8BYDPnDWfBTOrC9EUkYJKtTSFwKWxPnElJuaA2Zm7zIdXTYaJtdjh70zkf4lzYEbr51tEiiOvFdjiraH7Y1K/a/p7UjPLEAKbpe7+81j8mpnVuPvGeNsp+3TWBmB64vBpsWwD+25jZct/39825Wt142ravK3Pa0qdf/P/saw+TAe6/YMLOFi5aqRY3KnYsy0neV3yVlJ699bc6mNrQrByxKnkPkI9CxuppT5EZOjpy22p8xJvU4QJvLv7e8J49ed2YIW7fy2x6wHgIuCG+OcvEuWXm9ldhAnFjTEAegj4opllU4SeBlzb33blK5/JxD/645qOwOamC49VYCMDz530ri1dApfsdkVL476qGIybGpLYTT+7aw6YyvzmlImIFFtfrtwkM9S1Eh7TPucAznkiIePxC2aWnXzyaUJQc4+ZXQqsAd4f9/2a8Bj4KsKj4B8CcPetZnY9sCzW+6/s5OLBUNdQRyaVYca43ufw3Pjwy/z3Y6tIGSy9dBFjRuZ1sUykZ95OeufmLos4ZvPApPbuW4PMLQXjZ4QkdrMWdsoBMxMyCrhFpHz0Zc7Nhwp5Qnd/EuhpJuEp3dR34GM9fNYdwB2Fa13frdy2ktrxtWRSPefVeGZNQ0dg8/2LFyqwkfy1t5HZ8Wri6ksyD8waUq37LqJ6KhOutFTXwux35AYw46dDurKIHRERGTw9/rY1s//s5Th39+sHoD0lo66hjoWHLOxx/962dq64M0we/vr7j2ZilX6xSA/a91LZvKH7OTDN67D2fSufeHpkCGAOng3zTu0UwExTDhgREXq/crOjm7Iq4FJgEjBsg5vGPY1s3rm51/k2l3x/GRu27eLKU+ZQO3nMILZOhiJr20Nl87puF3HMNK/HvK2jrmeqwgTeQ98E1Wd1ygFTA6lUEXsiIjL09RjcuPuN2e2YSfhKwnyXu4AbezpuOMguu9DTk1K3PfEKT9Rt4S3TxrPkyCnd1pHyY627qGxa22UOzIimNaS3b8jNATNiXAhWph8H1efnBjBjDlYOGBGRA9DrJJC4xMEngAsJWYOPHczlDYaqum09ryn1evMePv+rFQB86l3zBrVdMvBSLdupbE7Me2lc07ESdWbHppy6PnpSyAFTe2Ii/0sMYEZXK4ARERkgvc25+QpwHiH53VHuvn3QWjXErWxYybjKcRw8uuvilm/7wm8BuOLk2YwbpUX8SlFqz7ac20bJW0npXVty6nrVlPAI9ZxTEos4xhwwoyYUqQciIsNbb1duPklYBfzfgesSGYSNMKF42GbvqmuoY87EOVin/3kvfWoNALMnj+HU+YcUo2nSF+5U7N7abQK7EU31VOzZllt97KEhgJl6ZtckdiM0n0pEZKjpbc6NZi12w91ZtW0VZ9WelVPe0trOdfctB+AL5765GE2TJHfSuzbvC1yyK1E3hzwwFS3N+6paCsZNCzlgZp7XNYldZlQROyIiIvlS4pU8vbrjVXbs3cHc6tzJxGd+6wkArjvzSEZX6msdFN5OZsembhPYVTbVk2rdta9qKg0TZoYcMLUn5txCsgkzID2iiB0REZFC0m/hPGWflEpOJr7/LxtYtTlMSVpUO6ko7Spb7a1ktm/odg5MZfM6Um17Oqp6RWW4VXRQLcw9OTeAGT8dKvTjLiIyHOhf+zx1BDcxx427c9XdYRWJOz98wIulD0vW1kJm+/r49FEygV19TGLX2lHX06NCDphD5sH83DkwNu5QJbETEREFN/la2bCSqWOmUpUJiwne/uRqAC59+ywtr9ALa91NZfPabhdxzGxfj3l7R12vHBOClalvhepzOyWxO0SPUIuISK/02zhPdQ11HbekGna08PlfraCyIsW7j6opcsuKz/bu7BS4xDkwzfWkt2/MTWI3ckIIVmYuhOoLcgOYqoMUwIiISL8puMlDS1sL9U31nDzjZACOuf4RAK5/z5tJVwyPh8tSLU0hcGmsz1nEcUTzGtI7N+fU9arJIVg5/J2J4GVWmBczurpIPRARkXKn4CYPqxtX0+ZtzJ04l2fXhVwoh00azfyaMkr5407Fnm3dL+LYVE9699bc6mNr4jpIp3XNATOyjL4XEREpGQpu8rCyYSUAsyfMZsmX/gDAF95zVDGb1D/upHdt6RK4ZLcrWhr3VcVg3NSQxG762V1zwFRWFbEjIiIiXSm4yUNdQx2ZVIaNW8YCMHfKmKG7xIK3k965ucsijtk8MKm9+xZ9d6uA8dNDErtZC3Pnv0yYCZmRReyIiIhIfhTc5GHltpXUjq/l24+9AgyBqzbtbWR2vJoTuCS3c3LApDLhSkt1Lcw+KWcOjE2YARVDNEgTERHJk4KbPNQ11DFt5FE8vnor//SOWkZmBiGnSvteKps3dD8Hpnkt1r63o6qnR4YA5uA5MC93DoyNn6YcMCIiMiwouOmjxj2NbN65mfZt40mnjNPmTynYZ1vbHiqb13W7iGOmeT3mbR11PVMVJ/C+CarP6pQDpgZSw+OpLRERkZ4ouOmjbGbitZvGc8abDsn7qo217qKyaW2XOTAjmtaQ3r4hNwfMiHEhWJl+HFSfnxvAjDlYOWBERER6UfLBjZmdDnwTqABuc/cbBuI8ddtCcGN7a7jw+Jnd1km1NHeZ99JxBWbnazl1ffQkmFiL1Z6Y+wRSdS02aqICGBERkX4q6eDGzCqA7wCnAuuBZWb2gLu/VOhzPbnmBbxtFKfOmMzk5hep3NB1Dkx615acY7xqSniEeu6SnEUcmTgLGzWh0E0UERERSjy4ARYCq9z9FQAzuws4Byh4cPPq2gc5um0nN216bwijIh97aAhgpuYu4sjEWdiIMYVuhoiIiOxHqQc3U4F1iffrgeM7VzKzy4DLAGbMmJH3SdranVl2EDWZDJz2sdwkdplR/Wy6iIiIDIRSD276xN1vBW4FWLBgge+nehcVKeNrH3644O0SERGRwiv154Y3ANMT76fFMhERERmmSj24WQbMMbNZZlYJXAA8UOQ2iYiISBGV9G0pd281s8uBhwiPgt/h7i8WuVkiIiJSRCUd3AC4+6+BXxe7HSIiIjI0lPptKREREZEcCm5ERESkrCi4ERERkbKi4EZERETKirnnndOupJnZ68Cafh5+ELBlv7VKQ7n0pVz6AerLUFUufTnQfsx098mFaozIQBp2wc2BMLM/ufuCYrejEMqlL+XSD1Bfhqpy6Uu59EOkL3RbSkRERMqKghsREREpKwpu8nNrsRtQQOXSl3LpB6gvQ1W59KVc+iGyX5pzIyIiImVFV25ERESkrCi46QMzO93MXjazVWZ2TbHbk2Vm083sd2b2kpm9aGZXxvJqM3vEzOrinxNjuZnZt2I/njezYxOfdVGsX2dmFyXKjzOzF+Ix3zIzG8D+VJjZX8zsl/H9LDN7Kp777rjyO2Y2Ir5fFfcflviMa2P5y2b2rkT5oI2hmU0ws5+Z2V/NbIWZnVDCY3J1/NlabmZ3mtnIUhkXM7vDzDab2fJE2YCPQ0/nGIC+fCX+jD1vZveZ2YTEvry+7/6MqciQ5u569fIirDb+N6AWqASeA+YXu12xbTXAsXF7LLASmA98Gbgmll8DfClunwn8BjBgEfBULK8GXol/TozbE+O+p2Ndi8eeMYD9+QTwE+CX8f09wAVx+2bgo3H7X4Cb4/YFwN1xe34cnxHArDhuFYM9hsAPgA/H7UpgQimOCTAVWA2MSozHxaUyLsBJwLHA8kTZgI9DT+cYgL6cBqTj9pcSfcn7+853TPXSa6i/it6Aof4CTgAeSry/Fri22O3qoa2/AE4FXgZqYlkN8HLcvgX4QKL+y3H/B4BbEuW3xLIa4K+J8px6BW77NOBR4GTgl/EXxpbEP94d4wA8BJwQt9OxnnUem2y9wRxDYDwhILBO5aU4JlOBdYRf7Ok4Lu8qpXEBDiM3IBjwcejpHIXuS6d95wJLu/se9/d99+fv2kD8vOmlVyFfui21f9l/4LPWx7IhJV4uPgZ4Cpji7hvjrk3AlLjdU196K1/fTflA+Abwb0B7fD8J2Oburd2cu6O9cX9jrJ9v/wbCLOB14HsWbrHdZmZVlOCYuPsG4KvAWmAj4Xt+htIcl6zBGIeezjGQLiFcPYL8+9Kfv2siQ5qCmzJgZmOAe4Gr3L0puc/dHRjSj8SZ2buBze7+TLHbUgBpwu2Dm9z9GGAH4dZEh1IYE4A4V+QcQsB2KFAFnF7URhXQYIzDYJzDzK4DWoGlA3kekVKi4Gb/NgDTE++nxbIhwcwyhMBmqbv/PBa/ZmY1cX8NsDmW99SX3sqndVNeaCcCZ5tZPXAX4dbUN4EJZpbu5twd7Y37xwNv7KcfgzWG64H17v5UfP8zQrBTamMCsARY7e6vu/te4OeEsSrFcckajHHo6RwFZ2YXA+8GLoyBFPtpc3flb5D/mIoMaQpu9m8ZMCc+TVBJmFT3QJHbBIQnPIDbgRXu/rXErgeA7FMdFxHm4mTLPxifDFkENMbL5w8Bp5nZxPi/9dMI99w3Ak1mtiie64OJzyoYd7/W3ae5+2GE7/cxd78Q+B3wvh76ke3f+2J9j+UXxCc8ZgFzCJM+B20M3X0TsM7MjohFpwAvUWJjEq0FFpnZ6HiubF9KblwSBmMcejpHQZnZ6YRbuWe7+85Ofezz9x3HKN8xFRnaij3ppxRehCcpVhKeNLiu2O1JtOvthEvezwPPxteZhHvijwJ1wG+B6ljfgO/EfrwALEh81iXAqvj6UKJ8AbA8HvNtBngyIbCYfU9L1RL+UV4F/BQYEctHxver4v7axPHXxba+TOIposEcQ+Bo4E9xXO4nPGVTkmMCfA74azzfjwhP4JTEuAB3EuYK7SVcUbt0MMahp3MMQF9WEebDZP/u39zf77s/Y6qXXkP5pQzFIiIiUlZ0W0pERETKioIbERERKSsKbkRERKSsKLgRERGRsqLgRkRERMqKghspe2bmZnZj4v2/mtlnC/TZ3zez9+2/Zp8/79OF+qz9nGexmf1dP46rN7ODBqJNIiKFouBGhoM9wHlD7ZdyIiNsUt7BjZlV9OP0i4G8gxsRkVKg4EaGg1bgVuDqzjs6X3kxs+3xz8Vm9riZ/cLMXjGzG8zsQjN72sxeMLPDEx+zxMz+ZGYr4zpZmFmFmX3FzJaZ2fNm9s+Jz33CzB4gZPtNtuUGYJSZPWtmS2PZ/Wb2jJm9aGaXJdtpZjea2XPACWZ2aTz/02b2XTP7dqw32czuje1YZmYnWlhk9SPA1fFc7+iuXjx+kpk9HM9/GyHZnYjIkNbd/xxFytF3gOfN7Mt5HPNW4EhgK/AKcJu7LzSzK4GPA1fFeocBC4HDgd+Z2WxCOv5Gd3+bmY0A/mBmD8f6xwJvdvfVyZO5+zVmdrm7H50ovsTdt5rZKGCZmd3r7m8QFrF8yt0/aWaHAj+On9sMPAY8F4//JvB1d3/SzGYQlg440sxuBra7+1cBzOwnnevFvn8GeNLd/8vM/oGQGVdEZEhTcCPDgrs3mdkPgSuAXX08bJmHNYQws78B2eDkBeDvE/Xucfd2oM7MXgHmEdYgekviqtB4who/LcDTnQObXlxhZufG7enxM94A2ggLpkIIrB53962xrT8F5sZ9S4D5YfkjAMZZWEW+s57qnQScB+DuvzKzhj62W0SkaBTcyHDyDeDPwPcSZa3E27NmlgIqE/v2JLbbE+/byf2703kNEyfcvvm4uz+U3GFmi4EdfWlsrLsEOMHdd5rZ7wlr/QDsdve2PnxMCljk7rs7fXZ/64mIDHmacyPDRryycQ+5t1bqgePi9tlAph8ffb6ZpeI8nFrCYoUPAR81swyAmc01s6o+fNbe7DGEqz0NMbCZByzq4ZhlwDvjytVp4L2JfQ8TbqER25G95dUMjO1Dvf8F/jGWnUFYBFREZEhTcCPDzY1A8qmp7xICg+eAE+jjVZVO1hJWTP4N8JF49eM2woThP5vZcuAW+nal9FbC3KClwINA2sxWADcAf+zuAHffAHwxtuEPhICtMe6+AlgQJzW/RJhIDPA/wLnZCcW91PsccJKZvUi4PbW2L1+IiEgxaVVwkTJgZmPcfXu8cnMfcIe731fsdomIFIOu3IiUh8+a2bPAcmA1cH+R2yMiUjS6ciMiIiJlRVduREREpKwouBEREZGyouBGREREyoqCGxERESkrCm5ERESkrCi4ERERkbLy/4R6g+ET3041AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bets_disp = plot_qini_curve(y_test, uplift, trmnt_test, perfect=True, name='Best model');\n", "bets_disp.figure_.suptitle(\"Qini curve\");" ] } ], "metadata": { "kernelspec": { "display_name": "python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 4 }