{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Example-Dependent Cost-Sensitive Fraud Detection using CostCla

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "
\n", "\n", "

Alejandro Correa Bahnsen, PhD

\n", "

\n", "

Data Scientist

\n", "

\n", "

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

PyCaribbean, Santo Domingo, Dominican Republic, Feb 2016

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

About Me

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "%%html\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### A brief bio:\n", "\n", "* PhD in **Machine Learning** at Luxembourg University\n", "* Data Scientist at Easy Solutions\n", "* Worked for +8 years as a data scientist at GE Money, Scotiabank and SIX Financial Services\n", "* Bachelor in Industrial Engineering and Master in Financial Engineering\n", "* Organizer of Big Data & Data Science Bogota Meetup\n", "* Sport addict, love to swim, play tennis, squash, and volleyball, among others.\n", "\n", "

\n", "\n", "\n", " \n", " \n", "\n", "
\n", "\n", " \n", " \n", " \n", " \n", "\n", "al.bahnsen@gmail.com \n", "
\n", " \n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "http://github.com/albahnsen \n", "\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "http://linkedin.com/in/albahnsen \n", "\n", "
\n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", "@albahnsen \n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Agenda\n", "\n", "* Quick Intro to Fraud Detection\n", "* Financial Evaluation of a Fraud Detection Model\n", "* Example-Dependent Classification\n", "* CostCla Library\n", "* Conclusion and Future Work" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Fraud Detection" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Estimate the **probability** of a transaction being **fraud** based on analyzing customer patterns and recent fraudulent behavior" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "

\n", "
\n", "\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Fraud Detection" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Issues when constructing a fraud detection system:\n", "\n", "* Skewness of the data\n", "* **Cost-sensitivity**\n", "* Short time response of the system\n", "* Dimensionality of the search space\n", "* Feature preprocessing\n", "* Model selection" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Different machine learning methods are used in practice, and in the\n", "literature: logistic regression, neural networks, discriminant\n", "analysis, genetic programing, decision trees, random forests among others" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Fraud Detection" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Formally, a fraud detection is a statistical model that allows the estimation of the probability of transaction $i$ being a fraud ($y_i=1$)\n", "\n", " $$\\hat p_i=P(y_i=1|\\mathbf{x}_i)$$ " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Data!

\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Load dataset from CostCla package" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from costcla import datasets" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from costcla.datasets.base import Bunch\n", "def load_fraud(cost_mat_parameters=dict(Ca=10)):\n", "# data_ = pd.read_pickle(\"trx_fraud_data.pk\")\n", " data_ = pd.read_pickle(\"/home/al/DriveAl/EasySol/Projects/DetectTA/Tests/trx_fraud_data_v3_agg.pk\")\n", " target = data_['fraud'].values\n", " data = data_.drop('fraud', 1)\n", " n_samples = data.shape[0]\n", " cost_mat = np.zeros((n_samples, 4))\n", " cost_mat[:, 0] = cost_mat_parameters['Ca']\n", " cost_mat[:, 1] = data['amount']\n", " cost_mat[:, 2] = cost_mat_parameters['Ca']\n", " cost_mat[:, 3] = 0.0\n", " return Bunch(data=data.values, target=target, cost_mat=cost_mat,\n", " target_names=['Legitimate Trx', 'Fraudulent Trx'], DESCR='',\n", " feature_names=data.columns.values, name='FraudDetection')\n", "datasets.load_fraud = load_fraud" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "data = datasets.load_fraud()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Data file" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['data', 'target', 'name', 'cost_mat', 'DESCR', 'feature_names', 'target_names'])\n", "Number of examples 207147\n" ] } ], "source": [ "print(data.keys())\n", "print('Number of examples ', data.target.shape[0])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Class Label" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Frequency Percentage\n", "Negative (Legitimate Trx) 206261 99.572284\n", "Positive (Fraud Trx) 886 0.427716\n", "Total Trx 207147 1.000000\n" ] } ], "source": [ "target = pd.DataFrame(pd.Series(data.target).value_counts(), columns=('Frequency',))\n", "target['Percentage'] = (target['Frequency'] / target['Frequency'].sum()) * 100\n", "target.index = ['Negative (Legitimate Trx)', 'Positive (Fraud Trx)']\n", "target.loc['Total Trx'] = [data.target.shape[0], 1.]\n", "print(target)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Features" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "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", "
Features
0date
1account
2amount
3type
\n", "
" ], "text/plain": [ " Features\n", "0 date\n", "1 account\n", "2 amount\n", "3 type" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(data.feature_names[:4], columns=('Features',))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Features" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
dateaccountamounttype
02013-01-19 17:31:461207502.52200
12013-01-19 17:31:251207502.52200
22013-01-19 17:27:4812071485.71200
32013-01-19 17:25:521911941.74200
42013-01-19 17:12:38146920.6200
52013-01-19 17:12:211469440.42200
62013-01-19 17:11:5814692073.57200
72013-01-19 17:11:001207502.52200
82013-01-19 17:10:3236004991.27200
92013-01-19 17:10:00580620.85200
\n", "
" ], "text/plain": [ " date account amount type\n", "0 2013-01-19 17:31:46 1207 502.52 200\n", "1 2013-01-19 17:31:25 1207 502.52 200\n", "2 2013-01-19 17:27:48 1207 1485.71 200\n", "3 2013-01-19 17:25:52 191 1941.74 200\n", "4 2013-01-19 17:12:38 1469 20.6 200\n", "5 2013-01-19 17:12:21 1469 440.42 200\n", "6 2013-01-19 17:11:58 1469 2073.57 200\n", "7 2013-01-19 17:11:00 1207 502.52 200\n", "8 2013-01-19 17:10:32 3600 4991.27 200\n", "9 2013-01-19 17:10:00 5806 20.85 200" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(data.data[:, :4], columns=data.feature_names[:4])\n", "df.head(10)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Aggregated Features" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
Trx_sum_6HTrx_count_6HTrx_sum_1DTrx_count_1DTrx_sum_2DTrx_count_2DTrx_sum_7DTrx_count_7DTrx_sum_15DTrx_count_15DTrx_sum_30DTrx_count_30D
02757.7442757.7442757.7442757.7442757.7442757.744
12255.2232255.2232255.2232255.2232255.2232255.223
2769.512769.512769.512769.512769.512769.512
3000000000000
42513.9922513.9927674.54315523.61039894.8275805848
52073.5712073.5717234.12215083.2939454.42657617.647
600005160.55113009.6837380.82555544.146
7266.991266.991266.991266.991266.991266.991
8588.222588.222588.2221086.8344722.141111529.415
9000020.85120.85120.85120.851
\n", "
" ], "text/plain": [ " Trx_sum_6H Trx_count_6H Trx_sum_1D Trx_count_1D Trx_sum_2D Trx_count_2D \\\n", "0 2757.74 4 2757.74 4 2757.74 4 \n", "1 2255.22 3 2255.22 3 2255.22 3 \n", "2 769.51 2 769.51 2 769.51 2 \n", "3 0 0 0 0 0 0 \n", "4 2513.99 2 2513.99 2 7674.54 3 \n", "5 2073.57 1 2073.57 1 7234.12 2 \n", "6 0 0 0 0 5160.55 1 \n", "7 266.99 1 266.99 1 266.99 1 \n", "8 588.22 2 588.22 2 588.22 2 \n", "9 0 0 0 0 20.85 1 \n", "\n", " Trx_sum_7D Trx_count_7D Trx_sum_15D Trx_count_15D Trx_sum_30D Trx_count_30D \n", "0 2757.74 4 2757.74 4 2757.74 4 \n", "1 2255.22 3 2255.22 3 2255.22 3 \n", "2 769.51 2 769.51 2 769.51 2 \n", "3 0 0 0 0 0 0 \n", "4 15523.6 10 39894.8 27 58058 48 \n", "5 15083.2 9 39454.4 26 57617.6 47 \n", "6 13009.6 8 37380.8 25 55544.1 46 \n", "7 266.99 1 266.99 1 266.99 1 \n", "8 1086.83 4 4722.14 11 11529.4 15 \n", "9 20.85 1 20.85 1 20.85 1 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(data.data[:, 4:], columns=data.feature_names[4:])\n", "df.head(10)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Fraud Detection as a classification problem" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "### Split in training and testing" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from sklearn.cross_validation import train_test_split\n", "X = data.data[:, [2, 3] + list(range(4, data.data.shape[1]))].astype(np.float)\n", "X_train, X_test, y_train, y_test, cost_mat_train, cost_mat_test = \\\n", "train_test_split(X, data.target, data.cost_mat, test_size=0.33, random_state=10)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Fraud Detection as a classification problem" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "### Fit models" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "\n", "classifiers = {\"RF\": {\"f\": RandomForestClassifier()},\n", " \"DT\": {\"f\": DecisionTreeClassifier()}}\n", "\n", "ci_models = ['DT', 'RF']\n", "# Fit the classifiers using the training dataset\n", "for model in classifiers.keys():\n", " classifiers[model][\"f\"].fit(X_train, y_train)\n", " classifiers[model][\"c\"] = classifiers[model][\"f\"].predict(X_test)\n", " classifiers[model][\"p\"] = classifiers[model][\"f\"].predict_proba(X_test)\n", " classifiers[model][\"p_train\"] = classifiers[model][\"f\"].predict_proba(X_train)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models performance" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "### Evaluate metrics and plot results" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from IPython.core.pylabtools import figsize\n", "import seaborn as sns\n", "colors = sns.color_palette()\n", "figsize(12, 8)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score\n", "\n", "measures = {\"F1Score\": f1_score, \"Precision\": precision_score, \n", " \"Recall\": recall_score, \"Accuracy\": accuracy_score}\n", "\n", "results = pd.DataFrame(columns=measures.keys())\n", "\n", "for model in ci_models:\n", " results.loc[model] = [measures[measure](y_test, classifiers[model][\"c\"]) for measure in measures.keys()]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models performance" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "def fig_acc():\n", " plt.bar(np.arange(results.shape[0])-0.3, results['Accuracy'], 0.6, label='Accuracy', color=colors[0])\n", " plt.xticks(range(results.shape[0]), results.index) \n", " plt.tick_params(labelsize=22); plt.title('Accuracy', size=30)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAIDCAYAAADCP0IjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtYVXWi//HPYm9EDC+QeEFlQ3Zh6DLZ1dtUqDWoR9HK\nS5Ymcmpy8olK0ym7nS5Hu6knNZpCH/IaWmpWZmXOMVLHtBKdET0iBZVoKgiCF9iwfn/4Yxdx219U\nNsX79TzneWqv7/ru73JOe97zbe21Ldu2bQEAAADwmp+vFwAAAAD81hDRAAAAgCEiGgAAADBERAMA\nAACGiGgAAADAEBENAAAAGCKiAQAAAENENAAAAGCIiAaAXxk3bpyioqIUFRWlP//5z75eDgCgESKi\nAeAXvv32W23evFlOp1PNmzdXTk6ONm7c6OtlAQAaGSIaAH5h8eLFsm1b1157rf70pz/Jtm0tWbLE\n18sCADQyRDQA/H/Hjx/XqlWrZFmWBgwYoP79+0uSNmzYoAMHDvh4dQCAxsTp6wUAQGOxatUqFRUV\nKSAgQLGxsWrWrJmCgoJUXFyst99+Ww8++GCdc3z77bdavny50tLSlJubq9LSUnXo0EE9e/bU6NGj\ndcEFF5zVc6OioiRJQ4cO1bRp02qcu6ZxK1eu1KOPPirLsrR582bl5OTolVdeUXp6uiRp+/btleY5\nduyYli5dqrS0NO3bt0+FhYVyOp0KDQ3VlVdeqZEjR+rqq6+u9c+ooKBAy5cv17p165STk6PCwkKF\nhISoW7duGjFihHr27OkZO2/ePL300kuSpBkzZmjAgAG1zj169Ght3bpVLVq00BdffKEWLVrUOh4A\n6oudaAD4/5YuXSrLstSvXz+1bNlSAQEB+o//+A/Ztq133nlHbre71vOXLFmiQYMGaf78+crMzNSp\nU6dUVlamnJwcLV26VHFxcVq+fPlZP9eyLK+ur65xOTk5GjdunL788ktZllXlenft2qXY2FjNmDFD\n27ZtU35+vpxOp0pKSvTDDz/o/fff11133aU5c+bU+B5ff/21+vfvr5dfflnp6ekqKCiQn5+fDh06\npI8//ljjxo3Tk08+Kdu2JZ2OfqfTKcuy9O6779a6/p9++klfffWVLMtS//79CWgA5xQRDQCStmzZ\nor1790qSbr/9ds/rw4cPlyQdOXJEH3/8cY3nf/rpp3rmmWdUVlamXr166b333tPOnTuVnp6uRYsW\n6ZJLLlFpaameeuopffnll2ft3LPpjTfeUHh4uD744AN98803lXahy8rKlJiYqCNHjsjpdOpvf/ub\nNm/erO3bt2vHjh16++23deWVV8q2bc2dO1dbtmypMv/+/fv1l7/8Rfn5+erSpYvefPNN7dy5Uzt2\n7NDatWt1yy23SJKWL1+uuXPnSpJCQkLUr18/2batzZs3Kzc3t8b1r1mzRuXl5ZKk22677Wz+0QBA\nFUQ0AEhatGiRJKlTp07q0aOH5/Xo6GhFR0dLUo1fMCwvL9e0adNkWZYiIiKUlJSkiy++WJLkcDh0\n9dVX64033lBgYKBs29asWbPOyrlnk23b2rhxo5KSktS1a1dJktP58x1/mzdv1g8//CDLsnT33Xfr\n7rvvVps2bTzj/vjHP+q1116Tv7+/JFW7a/7KK6/o2LFjcjqdSk5OVu/eveXnd/q/hlwul2bOnKlL\nL71Utm1r3rx5KioqkiSNGDHCs8badqPXrFkjSYqMjNRVV111pn8kAFArIhpAk3fw4EGtX79elmVV\n2oWuMGzYMNm2ra+//lr/93//V+X45s2btX//fknSnXfeqWbNmlUZ0759e40ePVr9+vXThRdeqLKy\nsjM+92yyLEt9+/ZV+/btqz3eq1cvpaWlaeXKlUpISKh2TEhIiC688ELZtu3Z1a9w/PhxffLJJ7Is\nSzExMXK5XFXOdzgcSkhI0E033aTY2Fj99NNPkqQePXqoS5cusm1bK1eurPa9f/jhB+3YsUOWZbEL\nDaBB8MVCAE3ekiVLVFZWJqfTqaFDh1Y5PmjQIL344os6efKklixZoqeffrrS8V/eYlHbl+oefvjh\nKq+dyblnW7du3Wo8ZlmW2rZtq7Zt29Y6R1BQkCSpuLi40uvbt29XaWmpLMuqdZd4wIAB1X55cNiw\nYZoxY4b279+vzZs3V/q3BdLPu9AOh0NDhgypdY0AcDYQ0QCatNLSUr3zzjuyLEu9e/eudic2KChI\nsbGxWrlypVavXq1HHnlE5513nuf4d9995/nrsLAwo/c/k3PPtvPPP7/OMfv27dOqVau0Y8cOHTly\nRHl5eSotLfUcP378uCR5vhhY4dtvv/X8dadOnYzXduutt+rVV19VWVmZ3nnnnSoR/eGHH8qyLN10\n001eXQcAnCkiGkCTtmbNGh05ckSWZal79+7Kysqqdtx1112nlStX6sSJE1q1apXuvPNOz7GKe3cl\nGT8R4kzOPdsq7nGuyauvvqqkpCTZtu31E0EqnOl1tm3bVjExMfr000+1bt06FRYWqlWrVpJOh/2e\nPXu4lQNAgyKiATRpFV8WtG1b06dP1/Tp02sdb9u2li5dWimif+nUqVOeL9eZOpNzzwaHw1HjsXfe\neUevvfaaLMtSmzZtdP/996t3794KDQ313MIh/fyc5l/7ZXSfOnWqXusbPny4Pv30U5WUlOj999/3\n/Gfw4YcfSjod2jfeeGO95gYAU3yxEECT9e9//1vp6emyLMvr/5NO73z+8l7m1q1be/46Pz/faA1n\ncq63fnm7RX0lJydLOh3aCxcu1OjRoxUZGVkpoGt7r4pdY0nKy8ur1xp69+7tueXl/fff97xecSvH\n0KFDPU/7AIBzjZ1oAE1WxWPtLMvSp59+Wue9unl5ebrhhhtUVlamJUuW6LrrrpMkRUREeMbk5uaq\nS5cuXq/hTM6tWLukWp/YcfDgQaM5f+348eP67rvvPF8KvOiii6odV15erqysrGpv9fjlddb3J9Qr\nnp7y6quvKj09Xbm5uTpw4ICys7NlWZZuvfXWes0LAPXB/2QH0CQdPXpUa9askWVZ6tGjh1dfdgsJ\nCVGfPn1k27bWrVunQ4cOSZKuvfZaz5iNGzfWeP5///d/q3v37urRo4dnN9b03J49e1baya34guOR\nI0dqPPeLL76o48pq98v7mWu7b/qDDz5QYWFhtccuv/xyBQQE1Lmejz/+WNdff726d++udevWVTl+\n++23e247+eCDD7Rq1SpJ0jXXXFMp1AHgXDOO6B07dig2NlZRUVG1/rRrTXbt2qUHHnhAvXr10mWX\nXaY+ffroqaeeOuOdEgAwsWzZMs+9uRW/SuiNYcOGSTq985uamipJuv7669WpUyfZtq3U1NRqgzYv\nL08ffPCBCgoK1KVLF4WEhNTr3M6dO3vOlaTw8HDZtq0dO3ZUe6/xsWPHlJycbPxFwF8KDg723Ktd\n3XOyJSkrK0vTpk1TcHCwbNuuFN7S6diPjY2VbdtKT0/Xpk2bqsxRcb95QUGBTpw4Uel/YFRo166d\n577n1atXa+3atXyhEIBPeB3Rbrdbs2bN0h133OH51SpTaWlpGjlypNLS0nTzzTfrgQceULdu3bR8\n+XINHz681p9zBYCzxbZtvf3225JO7y737dvX63Mr7su1bVvLly9XeXm5/Pz89Pjjj8uyLB09elR3\n3323tm3bJtu25Xa7tW3bNv3nf/6n8vLyZFmWJk6c6JnvTM6VpJtuuknS6d3iKVOmeDYkbNvWli1b\nNHr0aLVs2VLh4eH1/vPy9/dXr169ZNu2srOz9dxzz3l2nPPy8vTWW2/pjjvu0LXXXuu5paKwsLDK\nzvrDDz+sVq1aybZtJSYmatWqVSopKZF0+lF/Dz/8sP75z3/Ksizdc889le4X/6Xhw4fLtm1lZmaq\noKDAE+gA0JAs+9cP86zByJEjtWPHDt11110KCAjQm2++qQkTJmjChAlevVFJSYn69u2ro0ePKjU1\n1fMzutLpn4d94oknFBMTo6SkpPpdCQB4ad26dZowYYIsy1JCQoImTZpkdP6cOXM0Z84cWZal//mf\n/9Ett9wi6fTu9nPPPafS0lLZti2n0ynbtlVWVibLsuTv76+nnnqq2l3T+p5bVFSk2267TTk5OZ5n\nMwcGBqq0tFRut1udO3fWvHnzNGHCBO3du1dDhw7VtGnTPOevXLlSjz76qCzL0oIFC6rd/ZVO7zSP\nHDlSx44d87xPQECATp065Xk84OzZs7Vz507Fx8fLsizZtq2AgAAtXLhQV1xxhaTT/zbzr3/9q44c\nOeJ5VJ7T6fR8IdGyLA0bNkzPPPNMjX/+5eXl6tu3r+fe6rrGA8C54PVO9LFjx/Tmm2/qscce89zX\nZmL9+vU6dOiQbrnllkoBLZ2+xy0sLEwbNmyo9xdOAMBbS5cu9Txto7qf+a7LL+/LrXhEnnR6h7Ti\nGdIXXHCBAgIC5HQ65XK5NHLkSL333ns13nZQ33ODgoK0bNkyjR07VpGRkQoICJDb7VanTp103333\nafny5Z6f2P7lE0Z+qabXf+mCCy7Qu+++q7i4OLVv315Op1P+/v66+uqrNW3aNCUnJysoKEg9evTQ\ngw8+qPbt2ysgIECRkZEKDg72zHPFFVfoo48+0oQJE3TZZZd5dpvbtWunP//5z5o/f36dQezn56ch\nQ4Z4Yr4+/xkCwJnyeie6qKjI8yijil0Yk53op59+WqmpqXr22Wer/cB79NFHtWrVKk2fPl1xcXEG\nlwAAaGoefvhhrVmzRlFRUZ4vFwJAQ/J6J/rXzwI1lZmZKUmeHZFfc7lcnnvcAACoSXZ2tj755BNZ\nlqUxY8b4ejkAmqgGe8RdQUGBJKlly5bVHq/4V3oV4wAA+LWysjI9+eSTnltWBg8e7OslAWiiGiyi\n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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_acc()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models performance" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "def fig_f1():\n", " plt.bar(np.arange(results.shape[0])-0.3, results['Precision'], 0.2, label='Precision', color=colors[0])\n", " plt.bar(np.arange(results.shape[0])-0.3+0.2, results['Recall'], 0.2, label='Recall', color=colors[1])\n", " plt.bar(np.arange(results.shape[0])-0.3+0.4, results['F1Score'], 0.2, label='F1Score', color=colors[2])\n", "\n", " plt.xticks(range(results.shape[0]), results.index) \n", " plt.tick_params(labelsize=22)\n", " plt.ylim([0, 1])\n", " plt.legend(loc='center left', bbox_to_anchor=(1, 0.5),fontsize=22)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAHzCAYAAACXNLhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtUVXXi///X4YBcBBEFTVQuoWaaU9bkp9TJ1Kbxmoxj\napqOyGQ2+svM8lofa5qW9rHSGeFTKhppjJqJdtEYG53UoMxLXkpwBBMbvASKIIggcL5/9PN85sTt\ngMhR38/HWrNW7v0+e783Y2f1ZN8sNpvNJgAAAACAkdxcPQEAAAAAgOsQhQAAAABgMKIQAAAAAAxG\nFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgtY7CgwcPql+/furYsaNiYmJqvcPDhw/r6aef\nVo8ePXTHHXeoT58+mjt3rs6cOVPrbQEAAAAAro67swNLS0sVExOjZcuWyWKxyGKx1HpnO3fu1KRJ\nk2S1WjVkyBAFBwfryJEjWrdunT7//HOtWbNGrVq1qvV2AQAAAAB143QUPv744zp48KAef/xxeXp6\natmyZbXaUUlJiWbPni2bzaaEhAR16tTJvu6+++7Tiy++qD/96U966623arVdAAAAAEDdOX356IUL\nF7Rs2TLNnj1bnp6etd7Rtm3blJ2drYcfftghCCVp2LBhCg4O1vbt23X69OlabxsAAAAAUDdOR+Ha\ntWvVo0ePOu/oq6++ksVi0f33319hncVi0X/913/JZrNp165ddd4HAAAAAKB2nI5CX1/fq9pRenq6\nJCk0NLTS9aGhobLZbPZxAAAAAIBrr8FeSZGXlydJ8vPzq3S9v7+/wzgAAAAAwLXXYFF46dIlSZKH\nh0el6xs1auQwDgAAAABw7TVYFHp5eUmSLl++XOn64uJih3EAAAAAgGuvwaIwICBAknT+/PlK1+fm\n5jqMq05paVn9TQwAAAAADOb0ewqvVocOHbR7924dO3ZM9913X4X1x44dk8Vi0e23317jtnJzL16L\nKcJgQUF+ys6+4OppAACuEt/nqE9BQZU/CwO42TTYmcIePXrIZrNp586dFdZdvnxZX375pdzd3SsN\nRgAAAADAtVHnKLRYLFWuO3XqlI4dO6aioiL7sgceeEChoaHasWOH9uzZ4zB++fLlOnfunB555BE1\nbdq0rlMCAAAAANSSxWaz2WoalJ6erh07dtj/nJycrOTkZPXo0cPhhfYjRoxQ48aNNWbMGO3evVtx\ncXHq2bOnff2+ffsUHR2t8vJyDRkyRMHBwTpw4ID++c9/KiIiQgkJCU5FIZeFoL5xuREA3Bz4Pkd9\n4vJRmMKpewoPHTqkBQsWOCyzWCxKSUlRSkqKfVm/fv3UuHFjSZKbW8WTkHfffbfef/99xcbGauvW\nrcrPz9ctt9yiqKgoPfXUU2rSpMnVHAsAAAAAoJacOlN4veE3gKhv/GYZAG4OfJ+jPnGmEKZosAfN\nAAAAAACuP0QhAAAAABiMKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAA\nAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADAY\nUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAAAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAA\nAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiMKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDB\niEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAAAAxGFAIA\nAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAAAACDEYUAAAAAYDCiEAAAAAAM\nRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiMKAQAAAAAgxGFAAAAAGAwohAA\nAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMRhQAAAABg\nMKIQAAAAAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAAAACDEYUA\nAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYO61GZyUlKSEhASlpqaq\npKREoaGhGjhwoKKiouTp6enUNjZs2KDExEQdOXJEFy9eVJMmTdSlSxeNGDFCffr0qdNBAAAAAADq\nxmKz2WzODFy8eLFiY2MVHBys/v37y9fXV8nJydqzZ4+6deum+Ph4ublVf+JxxowZ+vDDDxUYGKh+\n/fqpRYsWOn36tD766CMVFBRo8uTJmjx5co1zyc6+4NzRAU4KCvLj7xUA3AT4Pkd9Cgryc/UUgAbh\nVBSmpaVp6NChatOmjRITE+Xr62tfN23aNG3evFkzZszQuHHjqtzGgQMHNGLECAUFBWnTpk1q0qSJ\nfd3x48c1ePBg2Ww27dy5UwEBAdXOhy971Df+IwIAbg58n6M+EYUwhVP3FK5du1Y2m03R0dEOQShJ\nU6ZMkc1m0+rVq6vdxvfffy9J+uUvf+kQhJIUFham8PBwlZWV6d///ndt5g8AAAAAuApOReGuXbsk\nSd27d6+wLiQkRMHBwTpx4oROnz5d5TY6dOgg6f/i8D+VlJToxx9/lKenp8LDw52aOAAAAADg6tUY\nhaWlpcrMzJTValWbNm0qHRMWFiZJOnr0aJXb6dSpk0aPHq0jR45o6tSp2r9/v3744Qft2bNHU6ZM\nUV5enp599tkKZyIBAAAAANdOjU8fLSgoUFlZmZo0aSKLxVLpGH9/f0lSfn5+tdt68cUX1alTJ736\n6qv69NNP7csDAwMVGxvL00cBAAAAoIHVGIWXLl2SJHl4eFQ5plGjRpKkoqKiarf13nvvaf78+QoP\nD9djjz2m5s2b69SpU1q7dq2eeeYZvfLKKxoyZEht5g8AAAAAuAo1RqGXl5ck6fLly1WOKS4uliR5\ne3tXOWbv3r169dVX1bFjR61du9YekpI0fPhwDRgwQC+88ILuuusuhYaGOn0AAAAAAIC6q/GeQj8/\nP7m7u6uwsFClpaWVjsnNzZWkal8l8f7770uSRo4c6RCEkuTj46MhQ4aotLRUf//7352ePAAAAADg\n6tR4ptBqtSo8PFzp6enKzMxUREREhTEZGRmSpI4dO1a5nezsbElS8+bNK10fEBAgm82mkydP1jjp\ngAAfubtbaxwH1AbvIgKAmwPf5wBQOzVGoST17NlT6enp2rlzZ4UoPHz4sHJyctS5c2c1a9asym0E\nBgZKkjIzMytd/8MPPziMq05u7kVnpg04jZcdA8DNge9z1Cd+wQBTOPWewpEjR8pqtSo+Pl7nzp2z\nLy8vL9ebb74pi8WisWPH2pefOnVKx44dc3jwTJ8+fWSz2ZSQkOCwDUk6c+aMNm7cKIvFooceeuhq\njwkAAAAA4CSLzWazOTMwPj5er732moKCgjR48GB5e3tr27ZtSk1NVb9+/bRw4UL72DFjxmj37t2K\ni4tTz5497cunTZumzZs3q2nTpho8eLACAwN15swZbdq0SXl5eZo4caKmTJlS41z4DSDqG79ZBoCb\nA9/nqE+cKYQpnLp8VJLGjRun0NBQrVixQmvXrlVpaanCw8M1Z84cjRo1qsJ4N7eKJyHfeOMN9erV\nS4mJifrwww9VWFioJk2a6M4779SoUaPUq1evqzsaAAAAAECtOH2m8HrCbwBR3/jNMgDcHPg+R33i\nTCFM4dQ9hQAAAACAmxNRCAAAAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAA\nAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAAAACDEYUAAAAAYDCi\nEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiMKAQAAAAAgxGFAAAA\nAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMR\nhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAA\nAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiM\nKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAA\nAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBg\nRCEAAAAAGIwoBAAAAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEA\nAADAYEQhAAAAABiMKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAG\nc6/N4KSkJCUkJCg1NVUlJSUKDQ3VwIEDFRUVJU9PT6e2UVZWpnfffVcbN25UZmamvLy8dNtttykq\nKkq9e/eu00EAAAAAAOrGYrPZbM4MXLx4sWJjYxUcHKz+/fvL19dXycnJ2rNnj7p166b4+Hi5uVV/\n4rG0tFRPPvmkUlJS1L17d917773KycnRxx9/rLy8PL3yyit69NFHa5xLdvYF544OcFJQkB9/rwDg\nJsD3OepTUJCfq6cANAinojAtLU1Dhw5VmzZtlJiYKF9fX/u6adOmafPmzZoxY4bGjRtX7Xbefvtt\nLVq0SDNmzFBUVJR9+fHjx/Xoo4+qY8eOWrVqVY2T5sse9Y3/iACAmwPf56hPRCFM4dQ9hWvXrpXN\nZlN0dLRDEErSlClTZLPZtHr16mq3ceWy0fbt2zsEoSSFhYVp9+7dTgUhAAAAAKD+OBWFu3btkiR1\n7969wrqQkBAFBwfrxIkTOn36dJXb2Lt3r3Jzc9WvXz/7svPnz+v8+fO1nTMAAAAAoJ7UGIWlpaXK\nzMyU1WpVmzZtKh0TFhYmSTp69GiV2zl8+LAsFovatWunVatWqXfv3rrvvvt03333qW/fvlq3bl3d\njgAAAAAAUGc1Pn20oKBAZWVlatKkiSwWS6Vj/P39JUn5+flVbufKWcS//e1vSk9P1+jRoxUWFqZj\nx45p+fLlevHFF3X27FlNnDixLscBAAAAAKiDGqPw0qVLkiQPD48qxzRq1EiSVFRUVOWYwsJC2Ww2\npaWlaePGjWrVqpV9Xa9evTR8+HDFxsZq6NChatGihdMHAAAAAACouxovH/Xy8pIkXb58ucoxxcXF\nkiRvb+8qx1itVlksFg0dOtQhCCWpS5cu6tGjh0pLS7Vz506nJg4AAAAAuHo1nin08/OTu7u7CgsL\nVVpaKnf3ih/Jzc2VJAUEBFS5nSuXmDZv3rzS9e3bt1dycrJOnTpV46QDAnzk7m6tcRxQGzx2GgBu\nDnyfA0Dt1BiFVqtV4eHhSk9PV2ZmpiIiIiqMycjIkCR17Nixyu20a9dONputyui7cpnqlUtRq5Ob\ne7HGMUBt8F4rALg58H2O+sQvGGCKGqNQknr27Kn09HTt3LmzQhQePnxYOTk56ty5s5o1a1blNu6/\n/365ubnpiy++kM1mq/DQmsOHD0uSbrvtttoeAwAAAHBdKysrs59IuVFERETIajXz6ryYmBjFxMRo\n/vz5ioyMrPXnZ82apQ0bNmjVqlW69957r8EM65dTUThy5EitWrVK8fHxeuSRR+zxV15erjfffFMW\ni0Vjx461jz916pSKiorUqlUr+32GgYGB6t+/vzZv3qxly5ZpwoQJ9vFJSUk6cOCAWrZsqR49etTn\n8QEAAAAul5GRoTGz/iYf/xvjgYoX837Uqnmj1KFDh3rZ3tdff+3QC/+pUaNGatGihbp166bx48er\nXbt29bLPq9GzZ081btxYXbp0qdPnBw4cqA4dOigkJKSeZ3ZtOBWFoaGheu655/Taa68pMjJSgwcP\nlre3t7Zt26bU1FT169dPQ4YMsY+fPn26du/erbi4OPXs2dO+fPbs2fr222+1cOFCHTp0SHfccYcy\nMjL0ySefyNPTU/Pnz6/0nkUAAADgRufj30K+Aa1dPQ2XCg4O1pgxYxyWnT17VgcPHlRiYqI+/vhj\n/eUvf1GfPn1cNMOf3HXXXbrrrrvq/PmePXs6dND1zukCGzdunEJDQ7VixQqtXbtWpaWlCg8P15w5\nczRq1KgK493cKj7YtHnz5lq/fr1iY2P1j3/8Q9u3b5evr68efvhhTZw4sdp7EgEAAADc2Fq0aKGo\nqKhK161bt04vvviiXnjhBf3zn/+Up6dnA8/OXLU6Lde7d2/17t27xnGrVq2qcp2vr69mzJihGTNm\n1GbXAAAAAG5ijz76qFatWqWjR49qz5496tGjh/r06aNTp04pJSVFL774olJSUjRx4kT7rWjFxcWK\ni4vT3//+d2VmZspqtSosLExDhgzR448/XuGeyLKyMq1cuVIffvihMjMzZbFYdOedd2ry5Mm65557\n7OMWL16s2NjYCvcUJiYmav369frXv/6loqIiNW/eXJ07d1ZUVJTDvYMzZ87Uxo0bK9xTmJ2drSVL\nlmjHjh06ffq0PDw8FB4ersGDB2v06NEOV01e2UZcXJy8vb0VExOj7777TsXFxWrfvr2eeuop9e3b\nt15+9jW+pxAAAAAAGsKtt94qSTpz5ozD8oULFyovL08TJ07UnXfeKemnIBw9erQWL14sHx8fjR8/\nXiNHjlRxcbHmzZunSZMmOWzDZrPpySef1GuvvaamTZvqySef1PDhw5WWlqbRo0dr8+bN9rEWi6XC\ngzGXLFmi2bNn68yZM3r00Uf19NNPq1evXtq7d6+ioqK0ffv2aj+flZWloUOHKiEhQW3btlV0dLSG\nDx9un+/kyZMdxl/Zxp49e/SHP/xBbdu2VVRUlHr16qVvv/1WTz/9tL777rs6/qQdcQMfAAAAgOtC\nTk6OJKlp06YOy9PT05WQkOAQWrGxsfr22281YsQIvfzyy/blzz77rKKjo7V9+3Zt2LBBv/3tbyVJ\nCQkJ+uKLL/Tb3/5W8+bNs48fPXq0Bg0apLlz5+qhhx6q8hV5q1atkqenpzZs2CA/v/97XUlUVJQi\nIyO1bt069erVq8pje+WVV5STk6NJkyY5BOCzzz6rxx57TNu3b9fHH3+swYMH29fZbDYtX75c77zz\n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\neaXrmzVrJknKzc2tsM7f37/SbX3zzTdVhrLFYlFOTk6N87paRCEAAACABnHl/YENJSAgQH379lXf\nvn01ffp0bdq0SdOnT9fKlSv1+OOPq02bNvb3H16+fLnG7V0ZW1XUlpeXS5Lc3CrepffzZVe21aVL\nFz355JNV7vPnTz69FohCAAAAAEYYOHCg1q9fry+//FJpaWlq06aNAgMDJf3fmbvqXDlDePbs2UrX\nX9nGlTOG1bmyX4vFUu0ltQ2BB80AAAAAuKEdP35ckZGRevjhh6u9NFWSSktLJUleXl6SpDvuuEM2\nm027du2qMPbgwYOaNGmS3n33XUk/ndWz2Wzat29fpdvev3+/LBaLunTpUuOcO3XqJHd3d6Wlpen8\n+fMV1hcXFzv1fsb6QBQCAAAAuKG1bdtWJSUl+uGHHzRnzhx7+P1cUlKS9uzZo8DAQPtrHvr16ycv\nLy9t27ZN33//vcP4pUuXatu2bWratKmkn840ent769NPP63wNNPdu3dr165datmypXr27FnjnH19\nffWb3/xGxcXFiomJqbB+wYIF6tWrlxITE536GVyNWl0+mpSUpISEBKWmpqqkpEShoaEaOHCgoqKi\n5OnpWacJPP3009qyZYu6deumlStX1mkbAAAAAG4uy5cvt993l5eXJ+mn1zisWLHCPqZr167q2rWr\n/R2AEyZM0IYNG5ScnKxf/epXat26tSwWi86dO6evvvpK//rXv9S0aVMtXLhQjRo1kvTTUz5nz56t\nuXPnauTIkYqMjJSfn5+++OILHThwQL169dKQIUMk/XSP4ty5czV79myNHDlS/fr1U8uWLZWZmakt\nW7bI09NT8+bNk7u7c5k1a9YsHTx40N5Y3bt3V0lJiVJSUnTo0CHdfffdGjhwYH3+WCvldBQuXrxY\nsbGxCg4O1ogRI+Tr66vk5GQtWrRIKSkpio+Pr/SGyups3LhRW7Zssf+fDQAAANysTl286OopOO1a\nzLW2/82/YMECh89YLBbl5+drwYIF9mWTJk1S165dJUkRERH65JNPtH79ev3zn//Ujh07dP78eZWX\nl6tJkyaKiIjQtGnTNHz48ApPAh0+fLjatm2ruLg4bdy4URcvXlTbtm01depUjR8/3mFsZGSkWrdu\nreXLl2vLli0qKChQs2bN9Otf/1oTJkyo9OmpVR17YGCgPvjgAy1btkxbt27V0qVLZbFYFBISoilT\nplzVybfasNhquuhWUlpamoYOHao2bdooMTFRvr6+9nXTpk3T5s2bNWPGDI0bN87pHZ86dUqPPPKI\nQkND9e2339bqTGF29gWn9wM4IyjIj79XAHAT4Psc9SkoyK/etlVWVqaMjIx6215DiIiIkNVqdfU0\n0ACcOlO4du1a2Ww2RUdHOwShJE2ZMkWbNm3S6tWraxWFM2fOVFlZmWbMmKExY8bUatIAAADAjcRq\ntapDhw6ungZQKaeu97zyJJ7u3btXWBcSEqLg4GCdOHFCp0+fdmqn8fHx+vrrrzVr1iwFBwfXYroA\nAAAAgPpUYxSWlpYqMzNTVqtVbdq0qXRMWFiYJOno0aM17jAjI0MLFy7UAw88oEcffbR2swUAAAAA\n1Ksao7CgoEBlZWXy8fGp8gbJKzdq5ufnV7ut0tJSPf/88/Ly8tKf//znOkwXAAAAAFCfaryn8NKl\nS5IkDw+PKsdceZxrUVFRtduKiYlRamqq3njjDQUFBdVmngAAAACAa6DGM4VeXl6SpMuXL1c5pri4\nWJLk7e1d5ZgDBw5o2bJl6t+/vwYMGFDbeQIAAAAAroEazxT6+fnJ3d1dhYWFKi0trfRFjLm5uZJ+\nepljZS5duqTp06erZcuWeumllxzWOfFGjAoCAnzk7s7jcVG/6vOx0wAA1+H7HABqp8YotFqtCg8P\nV3p6ujIzMxUREVFhzJV3rnTs2LHSbRw6dEiZmZmyWCzq1q1bhfUWi0Vff/21OnbsqNatW2vr1q3V\nzik398Z58SduDLzXCgBuDnyfoz7xCwaYwqn3FPbs2VPp6enauXNnhSg8fPiwcnJy1LlzZzVr1qzS\nz99yyy0aP358pesKCgr0/vvvq1WrVurfv7+aNm1ay0MAAAAAANSVxebE9ZuZmZkaOHCgAgMDlZiY\naI+/8vJyTZgwQcnJyZo/f76GDBkiSTp16pSKiorUqlWrau8zlKSsrCz17dtX3bp108qVK52aNL8B\nRH3jN8sAcHPg+xz1iTOFMIVTL68PDQ3Vc889pzNnzigyMlILFixQTEyMhg0bpuTkZPXr188ehJI0\nffp0DRgwQHv37r1mEwcAAAAAXD2nLh+VpHHjxik0NFQrVqzQ2rVrVVpaqvDwcM2ZM0ejRo2qMN7N\nzanelPTTPYVVvQMRAAAAAHDtOHX56PWGy0JQ37jcCABuDnyfoz5x+ShM4fzpPAAAAADATYcoBAAA\nAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiM\nKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAA\nAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBg\nRCEAAAAAGIwoBAAAAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEA\nAADAYEQhAAAAABjM3dUTAADgelFWVqbjx4+5eho3hLCwW2W1Wl09DQBAPSAKAQD4/x0/fkxTFnwk\nH/8Wrp7Kde1i3o/6y/OPKCKivaunAgCoB0QhAAD/wce/hXwDWrt6GgAANBjuKQQAAAAAgxGFAAAA\nAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAAAAAYjCgEAAAAAIMR\nhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADAYUQgAAAAABiMKAQAAAMBgRCEAAAAAGIwoBAAA\nAACDEYUAAAAAYDCiEAAAAAAMRhQCAAAAgMGIQgAAAAAwGFEIAAAAAAYjCgEAAADAYEQhAAAAABiM\nKAQAAAAAgxGFAAAAAGAwohAAAAAADEYUAgAAAIDBiEIAAAAAMBhRCAAAAAAGIwoBAAAAwGBEIQAA\nAAAYjCgEAAAAAIMRhQAAAABgMKIQAAAAAAxGFAIAAACAwYhCAAAAADCYe20GJyUlKSEhQampqSop\nKVFoaKgGDhyoqKgoeXp6OrWNL774Qu+++64OHjyowsJC+fv7q2vXroqOjlbXrl3rdBAAAAAAgLpx\nOgoXL16s2NhYBQcHa8SIEfL19VVycrIWLVqklJQUxcfHy82t+hOPcXFxev311+Xj46OBAweqVatW\nSktL02effaZt27YpJiZGffr0ueqDAgAAAAA4x6koTEtL01tvvaWQkBAlJibK19dXkvTUU09p2rRp\n2rx5s1auXKlx48ZVuY3vv/9eCxculL+/v9atW6eQkBD7ug0bNmjWrFmaP38+UQgAAAAADcipewrX\nrl0rm82m6OhoexBeMWXKFNlsNq1evbrabezbt0++vr6KjIx0CEJJGjJkiDw9PfXDDz8oJyenlocA\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_f1()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models performance" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- None of these measures takes into account the **business and economical realities** that take place in fraud detection. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Losses due to fraud or customer satisfaction costs, are not considered in the evaluation of the different models. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Financial Evaluation of a Fraud Detection Model

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Motivation\n", "\n", "- Typically, a fraud model is evaluated using standard **cost-insensitive measures**.\n", "- However, in practice, the cost associated with **approving a fraudulent transaction** (False Negative) is quite different from the cost associated with **declining a legitimate transaction** (False Positive).\n", "- Furthermore, the costs are **not constant** among transactions. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Cost Matrix\n", "\n", " \n", "| \t| Actual Positive ($y_i=1$) \t| Actual Negative \t($y_i=0$)|\n", "|---\t|:-:\t|:-:\t|\n", "| Pred. Positive ($c_i=1$)\t| $C_{TP_i}=C_a$\t| $C_{FP_i}=C_a$ \t|\n", "| Pred. Negative ($c_i=0$) \t| $C_{FN_i}=Amt_i$\t| $C_{TN_i}=0$\t|\n", "\n", "Where:\n", "\n", "- $C_{FN_i}$ = Amount of the transaction $i$\n", "- $C_a$ is the administrative cost of dealing with an alert\n", "\n", "For more info see [Correa Bahnsen et al., 2014] " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 10. 18.89 10. 0. ]\n", " [ 10. 1563.82 10. 0. ]\n", " [ 10. 26.06 10. 0. ]]\n" ] } ], "source": [ "# The cost matrix is already calculated for the dataset\n", "# cost_mat[C_FP,C_FN,C_TP,C_TN]\n", "print(data.cost_mat[[10, 17, 50]])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Financial savings\n", "\n", "The financial cost of using a classifier $f$ on $\\mathcal{S}$ is calculated by\n", " \n", " $$ Cost(f(\\mathcal{S})) = \\sum_{i=1}^N y_i(1-c_i)C_{FN_i} + (1-y_i)c_i C_{FP_i}.$$\n", "\n", "Then the financial savings are defined as the cost of the algorithm versus the cost of using no algorithm at all.\n", "\n", " $$ Savings(f(\\mathcal{S})) = \\frac{ Cost_l(\\mathcal{S}) - Cost(f(\\mathcal{S}))} {Cost_l(\\mathcal{S})},$$\n", "\n", "where $Cost_l(\\mathcal{S})$ is the cost of the costless class" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models Savings" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## costcla.metrics.savings_score(y_true, y_pred, cost_mat)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Calculation of the cost and savings\n", "from costcla.metrics import savings_score, cost_loss" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "# Evaluate the savings for each model\n", "results[\"Savings\"] = np.zeros(results.shape[0])\n", "for model in ci_models:\n", " results[\"Savings\"].loc[model] = savings_score(y_test, classifiers[model][\"c\"], cost_mat_test)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# Plot the results\n", "def fig_sav():\n", " plt.bar(np.arange(results.shape[0])-0.4, results['Precision'], 0.2, label='Precision', color=colors[0])\n", " plt.bar(np.arange(results.shape[0])-0.4+0.2, results['Recall'], 0.2, label='Recall', color=colors[1])\n", " plt.bar(np.arange(results.shape[0])-0.4+0.4, results['F1Score'], 0.2, label='F1Score', color=colors[2])\n", " plt.bar(np.arange(results.shape[0])-0.4+0.6, results['Savings'], 0.2, label='Savings', color=colors[3])\n", "\n", " plt.xticks(range(results.shape[0]), results.index) \n", " plt.tick_params(labelsize=22)\n", " plt.ylim([0, 1])\n", " plt.xlim([-0.5, results.shape[0] -1 + .5])\n", " plt.legend(loc='center left', bbox_to_anchor=(1, 0.5),fontsize=22)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models Savings" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAHzCAYAAACXNLhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVdX+//H34aACgjOaqIBhigNOmaWQ5JA5S14Hckr0\nqnjloZnlWNey+mpfK70/4VqOOOWUaE6h5aw4m1OCKU6FQ6KIMwie3x89ON9OgIAioPv1fDzu4xFr\nrb32Zx+7J9+svdc2WSwWiwAAAAAAhmSX3wUAAAAAAPIPoRAAAAAADIxQCAAAAAAGRigEAAAAAAMj\nFAIAAACAgREKAQAAAMDACIUAAAAAYGA5DoVHjhxRq1at5O3trdDQ0Byf8Pjx4xoyZIh8fX1Vq1Yt\nNWvWTOPGjdPly5dzPBcAAAAA4PHYZ3dgSkqKQkNDNWPGDJlMJplMphyfbPv27Ro8eLDMZrM6duwo\nNzc3nThxQsuWLdOWLVu0ePFilS9fPsfzAgAAAAAeTbZDYc+ePXXkyBH17NlTRYoU0YwZM3J0ouTk\nZI0ZM0YWi0ULFy5UjRo1rH2vvPKKPvzwQ40fP17Tpk3L0bwAAAAAgEeX7dtHb968qRkzZmjMmDEq\nUqRIjk+0adMmXblyRS1btrQJhJLUuXNnubm5aevWrbp06VKO5wYAAAAAPJpsh8IlS5bI19f3kU+0\ne/dumUwmNWrUKF2fyWTSyy+/LIvFoj179jzyOQAAAAAAOZPtUOjs7PxYJzp16pQkycPDI8N+Dw8P\nWSwW6zgAAAAAwJOXZ6+kSExMlCS5uLhk2F+8eHGbcQAAAACAJy/PQuG9e/ckSYUKFcqwv3Dhwjbj\nAAAAAABPXp6FQgcHB0nS/fv3M+xPSkqyGQcAAAAAePLyLBSWLFlSknT9+vUM+xMSEmzGPUxKSmru\nFQYAAAAABpbt9xQ+rqpVq2rfvn06ffq0XnnllXT9p0+flslkUvXq1bOcKyHhzpMoEXhsrq4uunLl\nZn6XAQBPFb47UVC5uma8FwbwrMmzlUJfX19ZLBZt3749Xd/9+/e1a9cu2dvbZxgYAQAAAABPxiOH\nQpPJlGnfxYsXdfr0ad29e9fa1qRJE3l4eGjbtm3av3+/zfhZs2bp2rVr6tChg0qUKPGoJQEAAAAA\ncshksVgsWQ06deqUtm3bZv15586d2rlzp3x9fW1eaN+tWzcVLVpUvXr10r59+zRz5kz5+flZ+w8e\nPKh+/frpwYMH6tixo9zc3HT48GFt3rxZXl5eWrhwYbZCIbeYoKDiFigAyDm+O1FQcfsojCJbzxQe\nPXpUkyZNsmkzmUyKiopSVFSUta1Vq1YqWrSoJMnOLv0iZP369bV06VKFhYVp48aNunHjhp577jkF\nBQVp0KBBKlas2ONcCwAAAAAgh7K1UljQ8NtEFFT8thsAco7vThRUrBTCKPJsoxkAAAAAQMFDKAQA\nAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAA\nAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAM\njFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBih\nEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEA\nAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAA\nADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABg\nYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAI\nhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoB\nAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAA\nAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZmn5PBkZGR\nWrhwoaKjo5WcnCwPDw+1bdtWQUFBKlKkSLbmWLFihSIiInTixAnduXNHxYoVk4+Pj7p166ZmzZo9\n0kUAAAAAAB6NyWKxWLIzcOrUqQoLC5Obm5tat24tZ2dn7dy5U/v371fDhg0VHh4uO7uHLzyOHDlS\n33//vcqUKaNWrVqpbNmyunTpklatWqVbt24pJCREISEhWdZy5crN7F0dkMdcXV349xMAcojvThRU\nrq4u+V0CkCeyFQpjYmLUqVMnVaxYUREREXJ2drb2DR8+XOvWrdPIkSPVp0+fTOc4fPiwunXrJldX\nV61du1bFihWz9p09e1bt27eXxWLR9u3bVbJkyYfWw384UFDxFxsAyDm+O1FQEQphFNl6pnDJkiWy\nWCzq16+fTSCUpKFDh8pisWjRokUPnePMmTOSpAYNGtgEQkny9PRU5cqVlZqaqt9//z0n9QMAAAAA\nHkO2QuGePXskSY0bN07X5+7uLjc3N50/f16XLl3KdI6qVatK+r9w+FfJycn6448/VKRIEVWuXDlb\nhQMAAAAAHl+WoTAlJUXnzp2T2WxWxYoVMxzj6ekpSTp58mSm89SoUUM9evTQiRMnNGzYMB06dEi/\n/fab9u/fr6FDhyoxMVHvvvtuupVIAAAAAMCTk+Xuo7du3VJqaqqKFSsmk8mU4ZjixYtLkm7cuPHQ\nuT788EPVqFFDn332mX744Qdre5kyZRQWFsbuowAAAACQx7IMhffu3ZMkFSpUKNMxhQsXliTdvXv3\noXMtWLBAEydOVOXKlfXWW2+pdOnSunjxopYsWaJ33nlHn3zyiTp27JiT+gEAAAAAjyHLUOjg4CBJ\nun//fqZjkpKSJEmOjo6Zjjlw4IA+++wzeXt7a8mSJdYgKUldu3ZVmzZt9MEHH6hu3bry8PDI9gUA\nAAAAAB5dls8Uuri4yN7eXrdv31ZKSkqGYxISEiTpoa+SWLp0qSQpMDDQJhBKkpOTkzp27KiUlBSt\nX78+28UDAAAAAB5PliuFZrNZlStX1qlTp3Tu3Dl5eXmlGxMbGytJ8vb2znSeK1euSJJKly6dYX/J\nkiVlsVh04cKFLIsuWdJJ9vbmLMcB+YF3GgFAzvHdCQD5J8tQKEl+fn46deqUtm/fni4UHj9+XPHx\n8apZs6ZKlSqV6RxlypSRJJ07dy7D/t9++81m3MMkJNzJTtlAnuMFzACQc3x3oqDilxUwimy9pzAw\nMFBms1nh4eG6du2atf3Bgwf66quvZDKZ1Lt3b2v7xYsXdfr0aZuNZ5o1ayaLxaKFCxfazCFJly9f\n1sqVK2UymdSiRYvHvSYAAAAAQDaZLBaLJTsDw8PD9fnnn8vV1VXt27eXo6OjNm3apOjoaLVq1UqT\nJ0+2ju3Vq5f27dunmTNnys/Pz9o+fPhwrVu3TiVKlFD79u1VpkwZXb58WWvXrlViYqKCg4M1dOjQ\nLGvht4koqPhtNwDkHN+dKKhYKYRRZOv2UUnq06ePPDw8NHv2bC1ZskQpKSmqXLmyxo4dq+7du6cb\nb2eXfhHyyy+/lL+/vyIiIvT999/r9u3bKlasmOrUqaPu3bvL39//8a4GAAAAAJAj2V4pLEj4bSIK\nKn7bDQA5x3cnCipWCmEU2XqmEAAAAADwbCIUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAw\nQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRC\nAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAA\nAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAA\nwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICB\nEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMU\nAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQA\nAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAA\nAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAM\njFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAw+/wuAAAAAHjW\npaamKjY2Nr/LyBEvLy+Zzeb8LiNfhIaGKjQ0VBMnTlRAQECOjx89erRWrFih+fPn66WXXnoCFeYu\nQiEAAADwhMXGxqrX6G/lVLxsfpeSLXcS/9D8Cd1VtWrVXJlv79696t27d4Z9hQsXVtmyZdWwYUP1\n7dtXVapUyZVzPg4/Pz8VLVpUPj4+j3R827ZtVbVqVbm7u+dyZU8GoRAAAADIA07Fy8q5ZIX8LiNf\nubm5qVevXjZtV69e1ZEjRxQREaHVq1frP//5j5o1a5ZPFf6pbt26qlu37iMf7+fnJz8/v1ys6Mki\n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\nd5lxdHSUxWLRhQsXMh1Trlw5ffzxx+nav//+e40ePVply5ZV586d5eDgoB07dmjixInavXu3vv76\na+vYxYsX6+OPP1bRokX1xhtvqEKFCoqLi1NkZKS2bNmiL774Qm3atEl3jo8++khOTk7617/+JS8v\nL0nStWvX1LVrV8XFxalx48Zq166dbty4oR9//FGjRo3S4cOHNW7cuGx/Bo+KUAgAAACgwMlJIJSk\nZs2aaebMmVq0aJEePHigt99+W88//3yWx8XHx+ujjz5SyZIltWLFCpUsWVLSn6G0X79+2rp1q9au\nXau2bdvqjz/+0IQJE+Tg4KClS5fazB8YGKjAwEB99NFHatq0qRwdHa19N27ckNls1tSpU23O/dln\nnykuLk7Dhg3TgAEDrO3vvPOOOnfurMWLF6t169Zq2LBhjj6LnOI9hQAAAADyRHJysuLi4h76v+Tk\n5Eeau169ehozZozs7e21dOlStWnTRs2bN9fw4cO1cOFCnT59OsPj1q5dq7t37yogIMAaCNMMHTpU\nwcHB1vZ169YpKSlJ7dq1Sxc4fXx81KhRI928eVNbt2616bt//746depk03br1i1FRkaqdOnS6Z6X\ndHJyUnBwsCwWi1auXPlIn0dOsFIIAAAAIE9ER0erefPmmfabTCbNmzdPL7300iPN36tXL7322mv6\n9ttvtXXrVp05c0YXLlzQ2rVrJUnPP/+8BgwYYPOs3tGjR2UymeTt7Z1uvtq1a6t27drWn3/55ReZ\nTCbVrVs3w/PXrl1bO3bsUExMjFq1amXTV6NGDZufjx49qtTUVLm7u2d4y6urq6sk6fjx49m8+kdH\nKAQAAACQJzw9PfX+++/LYrFkOuaFF154rHNUqlRJI0eO1MiRI5WQkKCDBw/qwIED2rZtm2JjYzVq\n1CjFxMRo1KhRkv58rk9Stt5dmDa2dOnSGfaXKlVKkpSQkJCur3jx4hnO9fPPP2calE0mk+Lj47Os\n63ERCgEAAADkibT3B+aVkiVLqnnz5mrevLlGjBihtWvXasSIEZo3b5569uypihUrWt9/eP/+/Szn\nSxubWah98OCBJMnOLv1Ten9vS5vLx8dHAwcOzPScf9/59EkgFAIAAAAwhLZt22r58uXatWuXYmJi\nVLFiRZUpU0bS/63cPUzaCuHVq1cz7E+bI23F8GHSzmsymR56S21eYKMZAAAAAE+1s2fPKiAgQC1b\n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\nKenPrNSzZ0+dPXtWtWvXlr+/v65du6aPPvpIFy5cSFdDYmKiunTpooSEBLVo0ULVqlVTSkqK9uzZ\no9DQUO3YsSNd2M0LWYbCtD+w+/fvZzom7T2FaX/YGTl8+LBmzJih1q1bq02bNjmtEwAAAMBTytPT\nU15eXoqNjVW3bt00fPhw+fr6Zrm7aXh4uO7du6eRI0fabGrZqVMnvfnmm5o7d66Cg4Pl7OysN954\nQ+PHj9emTZuUmppqM3dycrI2b94sBwcHvf766w89p8Vi0axZszRnzhw1aNDA2v7xxx9r8eLFWrVq\nlTUULl68WGfOnNHLL7+suXPnWscGBgaqe/fu6eZev3694uPj1b9/fw0fPtymb/To0YqMjNThw4dV\np06dh9aY27IMhS4uLrK3t9ft27eVkpIie/v0hyQkJEiSSpYsmeEc9+7d04gRI1SuXDl99NFHNn0W\niyXHRZcs6SR7+2d3e1w83VxdXfK7BAB46vDdCTzb7OzsNGXKFA0aNEi//vqrBgwYoKJFi6p27dqq\nX7++XnrpJb344ovp7k785z//qVatWql+/fo27d7e3nJzc9OFCxd0+vRp1a5dW8WKFdOrr76qzZs3\nKyoqSq+++qp1/Pbt23Xz5k21bdtWRYsWzbLepk2b2gRCSfL19dWiRYt09uxZa9uWLVtkMpnUu3dv\nm7FVqlRRp06dFB4ebtOemJho/Tz+7n/+5380YcKELGt7ErIMhWazWZUrV9apU6d07tw5eXl5pRuT\n9s4Vb2/vDOc4evSozp07J5PJpIYNG6brN5lM2rt3r7y9vVWhQoUM79X9q4SE/LnXFsiKq6uLrly5\nmd9lAMBThe9OFFT8siJ3vfDCC1q3bp0iIiIUGRmpn3/+Wbt379bu3btlsVhUtGhRderUSUOGDJGL\ny5+ffZUqVVSlShVJf672JSQkKCUlRRaLRcWKFdOFCxesdy1KUrt27bRp0yatX7/eJhSuW7dOJpNJ\nHTp0yLJOk8mkGjVqpGtPqynt8Trpz+cdJVlXDv/q1VdfTRcK/fz89J///EczZ87U7du31b59e/n4\n+MjOzi7T/VvyQrZeSeHn56dTp05p+/bt6ULh8ePHFR8fr5o1a6pUqVIZHv/cc8+pb9++GfbdunVL\nS5cuVfny5dW6dWuVKFEih5cAAAAA4GlQuHBhBQYGKjAwUCkpKTp27JgOHjyo3bt3KyoqSvPnz9fW\n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\nq/EAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_sav()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Threshold Optimization" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Convert a classifier cost-sensitive by selecting a proper threshold\n", "from training instances according to the savings" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "$$ t \\quad = \\quad argmax_t \\: Savings(c(t), y) $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Threshold Optimization - Code" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "```\n", "costcla.models.ThresholdingOptimization(calibration=True)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "fit(y_prob_train=None, cost_mat, y_true_train)\n", "```\n", "- Parameters\n", " - **y_prob_train** : Predicted probabilities of the training set\n", " - **cost_mat** : Cost matrix of the classification problem. \n", " - **y_true_cal** : True class" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "predict(y_prob)\n", "```\n", "- Parameters\n", " - **y_prob** : Predicted probabilities\n", "\n", "- Returns\n", " - **y_pred** : Predicted class" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Threshold Optimization" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from costcla.models import ThresholdingOptimization\n", "\n", "for model in ci_models:\n", " classifiers[model+\"-TO\"] = {\"f\": ThresholdingOptimization()}\n", " # Fit\n", " classifiers[model+\"-TO\"][\"f\"].fit(classifiers[model][\"p_train\"], cost_mat_train, y_train)\n", " # Predict\n", " classifiers[model+\"-TO\"][\"c\"] = classifiers[model+\"-TO\"][\"f\"].predict(classifiers[model][\"p\"])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "New thresholds\n", "DT-TO - 0.0128205128205\n", "RF-TO - 0.0253164556962\n" ] } ], "source": [ "print('New thresholds')\n", "for model in ci_models:\n", " print(model + '-TO - ' + str(classifiers[model+'-TO']['f'].threshold_))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "for model in ci_models:\n", " # Evaluate\n", " results.loc[model+\"-TO\"] = 0\n", " results.loc[model+\"-TO\", measures.keys()] = \\\n", " [measures[measure](y_test, classifiers[model+\"-TO\"][\"c\"]) for measure in measures.keys()]\n", " results[\"Savings\"].loc[model+\"-TO\"] = savings_score(y_test, classifiers[model+\"-TO\"][\"c\"], cost_mat_test) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Threshold Optimization" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAHzCAYAAACXNLhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlUVfX+//HX4aAMgiNoogKGKc5DZikUqWXmSF4Hcrqi\nV8UrSzNzrmtZfbWvld6fcC1HnHJKNKfQclbUHHJK8CpOhUOiiIoKguf3R4vz7QQIKAK6n4+1vmtd\nPp/P/uz3Pvdzv67X2nt/tslisVgEAAAAADAku8IuAAAAAABQeAiFAAAAAGBghEIAAAAAMDBCIQAA\nAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAAAAADy3MoPHLkiFq3bi1fX1+FhYXl+YTHjx/XkCFD5Ofn\npzp16qhFixYaP368Ll++nOe5AAAAAACPxj63A9PS0hQWFqaZM2fKZDLJZDLl+WQ7duzQ4MGDZTab\n1bFjR3l4eOjEiRNavny5tm7dqiVLlqhixYp5nhcAAAAA8HByHQp79uypI0eOqGfPnnJwcNDMmTPz\ndKLU1FSNHTtWFotFixYtUq1atax9L730kj744ANNmDBB06dPz9O8AAAAAICHl+vHR2/evKmZM2dq\n7NixcnBwyPOJNm/erCtXrqhVq1Y2gVCSOnfuLA8PD23btk2XLl3K89wAAAAAgIeT61C4dOlS+fn5\nPfSJ9uzZI5PJpKZNm2bqM5lMevHFF2WxWLR3796HPgcAAAAAIG9yHQpdXFwe6USnTp2SJHl5eWXZ\n7+XlJYvFYh0HAAAAAHj8CuyTFElJSZIkV1fXLPtLlSplMw4AAAAA8PgVWCi8e/euJKlYsWJZ9hcv\nXtxmHAAAAADg8SuwUOjo6ChJunfvXpb9KSkpNuMAAAAAAI9fgYXCMmXKSJKuX7+eZX9iYqLNuAdJ\nS0vPv8IAAAAAwMBy/Z3CR1W9enXt27dPp0+f1ksvvZSp//Tp0zKZTKpZs2aOcyUm3n4cJRqSu7ur\nrly5WdhlAFlifaKoYm2iKGN95h9396z3wgCeNgV2p9DPz08Wi0U7duzI1Hfv3j3t3r1b9vb2WQZG\nAAAAAMDj8dCh0GQyZdt38eJFnT59Wnfu3LG2vfLKK/Ly8tL27du1f/9+m/GzZ8/WtWvX1KFDB5Uu\nXfphSwIAAAAA5FGuHh89deqUtm/fbv37559/lsVi0c8//6w5c+ZY27t166YSJUpo5MiR2rdvn2bN\nmiV/f39Jktls1sSJE9WvXz/169dPHTt2lIeHhw4fPqwtW7bIx8dHI0aMyOfLAwAAAAA8SK5C4dGj\nRzV58mSbNpPJpOjoaEVHR1vbWrdurRIlSkiS7Owy34Rs1KiRli1bpvDwcG3atEk3btzQM888o+Dg\nYA0aNEglS5Z8lGsBAAAAAOSRyWKxWAq7iLzi5en8w8voKMpYnyiqWJsoylif+YeNZmAUBbbRDAAA\nAACg6CEUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAA\nAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAM\njFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBih\nEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEA\nAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAA\nADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABg\nYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAI\nhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoB\nAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAA\nAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAA\nA7PPy+CoqCgtWrRIMTExSk1NlZeXl9q2bavg4GA5ODjkao6VK1cqMjJSJ06c0O3bt1WyZEnVrVtX\n3bp1U4sWLR7qIgAAAAAADyfXoXDatGkKDw+Xh4eHunXrJhcXF+3atUtTp05VdHS0IiIiZGf34BuP\no0aN0nfffSc3Nzd16NBB5cuX16VLl7R69Wpt27ZNoaGhCg0NfeSLAgAAAADkjslisVhyGhQbG6tO\nnTqpcuXKioyMlIuLi7Vv+PDhWr9+vUaNGqU+ffpkO8fhw4fVrVs3ubu7a926dSpZsqS17+zZs2rf\nvr0sFot27NihMmXKPLCeK1du5uLSkBvu7q78niiyWJ8oqlibKMpYn/nH3d21sEsACkSu3ilcunSp\nLBaL+vXrZxMIJWno0KGyWCxavHjxA+c4c+aMJKlx48Y2gVCSvL29VbVqVaWnp+u3337LS/0AAAAA\ngEeQq1C4d+9eSVKzZs0y9Xl6esrDw0Pnz5/XpUuXsp2jevXqkv4vHP5Zamqqfv/9dzk4OKhq1aq5\nKhwAAAAA8OhyDIVpaWk6d+6czGazKleunOUYb29vSdLJkyeznadWrVrq0aOHTpw4oWHDhunQoUP6\n9ddftX//fg0dOlRJSUl69913M92JBAAAAAA8PjluNHPr1i2lp6erZMmSMplMWY4pVaqUJOnGjRsP\nnOuDDz5QrVq19Omnn+r777+3tru5uSk8PJzdRwEAAACggOUYCu/evStJKlasWLZjihcvLkm6c+fO\nA+dauHChJk2apKpVq+rtt99WuXLldPHiRS1dulTvvPOOPv74Y3Xs2DEv9QMAAAAAHkGOodDR0VGS\ndO/evWzHpKSkSJKcnJyyHXPgwAF9+umn8vX11dKlS61BUpK6du2qNm3a6P3331eDBg3k5eWV6wsA\nAAAAADy8HN8pdHV1lb29vZKTk5WWlpblmMTEREl64Kckli1bJkkKCgqyCYSS5OzsrI4dOyotLU0b\nNmzIdfEAAAAAgEeT451Cs9msqlWr6tSpUzp37px8fHwyjYmLi5Mk+fr6ZjvPlStXJEnlypXLsr9M\nmTKyWCy6cOFCjkWXKeMse3tzjuOQO3yDB0UZ6xNFFWsTRRnrE0Be5BgKJcnf31+nTp3Sjh07MoXC\n48ePKyEhQbVr11bZsmWzncPNzU2SdO7cuSz7f/31V5txD5KYeDs3ZSMX+MAtijLWJ4oq1iaKMtZn\n/iFcwyhy9Z3CoKAgmc1mRURE6Nq1a9b2+/fv68svv5TJZFLv3r2t7RcvXtTp06dtNp5p0aKFLBaL\nFi1aZDOHJF2+fFmrVq2SyWTSa6+99qjXBAAAAADIpVzdKfTy8tJ7772nzz77TIGBgWrfvr2cnJy0\nefNmxcTEqHXr1ja7ho4cOVL79u3TrFmz5O/vL0lq3bq12rZtq/Xr16tt27Zq37693NzcdPnyZa1b\nt063b99WSEjIAx9BBQAAAADkr1yFQknq06ePvLy8NGfOHC1dulRpaWmqWrWqxo0bp+7du2cab2eX\n+SbkF198oYCAAEVGRuq7775TcnKySpYsqfr166t79+4KCAh4tKsBAAAAAOSJyWKxWAq7iLziOfn8\nw3sHKMpYnyiqWJsoylif+Yd3CmEUuXqnEAAAAADwdCIUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRC\nAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAA\nAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAA\nwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICB\nEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMU\nAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQA\nAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAA\nAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAM\njFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBih\nEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAw+8Iu\nAAAAAHjapaenKy4urrDLyBMfHx+ZzebCLqNQhIWFKSwsTJMmTVJgYGCejx8zZoxWrlypBQsW6IUX\nXngMFeYvQiEAAADwmMXFxanXmG/kXKp8YZeSK7eTfteCid1VvXr1fJnvp59+Uu/evbPsK168uMqX\nL68mTZqob9++qlatWr6c81H4+/urRIkSqlu37kMd37ZtW1WvXl2enp75XNnjQSgEAAAACoBzqfJy\nKVOpsMsoVB4eHurVq5dN29WrV3XkyBFFRkZqzZo1+ve//60WLVoUUoV/aNCggRo0aPDQx/v7+8vf\n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\nf/89r9cAAAAAwEAqVaqkcuXK6erVqzp58mSWY3799Vfrfy5WrJiqV68u6f9ejfuzGTNmaPDgwTpx\n4kS257x06ZL19bcMzs7OCgkJUa1atXT58mVruPurWrVqyWw2KyYmJsvP+R08eFCSVKdOnWzP/zjl\nGAodHR0lSffu3ct2TMaFOTk5ZTvGbDbLZDKpU6dOqlixok1f3bp15efnp7S0NO3YsSNXhQMAAAAw\nrs6dO8tisWjq1Km6f/++Td/cuXP1+uuv2+wIGhgYKIvForlz59qMv3DhgmbMmKG9e/fKy8sry3Nt\n3bpVr776qj7++ONMfUlJSfrtt9/k5OSkkiVLZnl8yZIl1apVK925c0czZ8606btz547mzJkjk8mk\nzp075/r681OOj4+6urpab7WmpaXJ3j7zIRkvRGb1EmSGjEdMy5Url2X/c889p127dlnfM3yQMmWc\nZW9vznEccsfd3TXnQUAhYX2iqGJtoihjfcIIBg0apF27dmnz5s1666231LJlS5lMJh08eFC7d+9W\n1apV1b17d+v47t2768cff1R0dLS6deumV199VTdu3NCaNWt0+/ZtffHFF9YbYpLtJi6vvPKK/Pz8\ntH79ep0+fVp+fn4qWbKkrly5ok2bNunmzZt69913s8xKGUaPHq1Dhw4pPDxcR48eVd26dXXjxg1t\n27ZN58+fV5cuXTK9k5hfG8nkJMdQaDabVbVqVZ06dUrnzp2Tj49PpjFxcXGSJF9f32znqVatmiwW\nS7ahL+Mx1ew+FvlniYm3cxyD3HF3d9WVKzcLuwwgS6xPFFWsTRRlrM/8k9/h+nbSk/Oa1OOoNafN\nVvJ6nKOjoxYuXKiIiAh9//33mjt3rtLT0+Xh4aF+/fqpf//+NruN2tvbWz8Ev2bNGs2aNUt2dnaq\nX7+++vfvr6ZNm2Z7Xjs7O82YMUMLFizQ+vXrtWLFCt28eVOurq6qXbu2xo4dq9dee+2B11GhQgWt\nWLFC06dP17Zt27R7924VL15cNWrU0KBBg7LcdfVBv5nJZHro3zTTXJZcxM/PPvtMERERGjVqVKZv\nER4/flydOnVS7dq1tWLFimznSEhI0CuvvKIqVaooKioq0wV069ZNR44c0VdffaWAgIAH1sP/o8s/\n/MOBooz1iaKKtYmijPWZf/IzFKanp1tvpDwpfHx8ZDbzdJ4R5Oo7hUFBQVqwYIEiIiLUoUMH6644\n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\nqj179qh79+5q2bKlkpOTtWHDBtWtW1f9+/fXp59+qvnz5+v27duZPnHxZ3/eOOdJRCgEAAAACkDy\nlZuFXUJdG8Y8AAAgAElEQVSuPY5ac7OT59///nd9++23OnHihObNm6fg4GC5ubnp22+/1cyZM7Vp\n0ybNmDFDJpNJnp6eGjp0qIKDg6139STJ1dVVS5Ys0VdffaWNGzdq+vTpcnJy0ksvvaTBgwerVq1a\n1rFTpkzR5MmTtWvXLs2aNUuVKlVS9+7d1bdvXyUnJ2vr1q06cOCAVq5cqZ49e1qv46/X8qTvUmqy\nPIGx9soT9D+oos7d3ZXfE0UW6xNFFWsTRRnrM/+4u7vm21zp6emKi4vLt/kKgo+Pj8xmc2GXgQLA\nnUIAAADgMTObzapevXphlwFkiY1mAAAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAA\nDIxQCAAAAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgY\noRAAAAAADIxQCAAAAAAGZl/YBQAAAABPu/T0dMXFxRV2GXni4+Mjs9lc2GWgABAKAQAAgMcsLi5O\na//eVxWdnQu7lFy5ePu22s2bo+rVq+fLfD/99JN69+6dq7GhoaEKDQ21/n3r1i198sknWrVqlSpV\nqqRNmzY98Pgff/xRq1ev1qlTp3TlyhXduXNHJUqUkKenpwICAtS7d2+VLFnyka7naUMoBAAAAApA\nRWdnebq4FnYZhcrDw0O9evV64JiGDRta//Pu3bs1duxYXblyRSaTKcf533vvPa1du1alSpVSixYt\n5OXlpfv37+vSpUvaunWrwsLCFBkZqcWLF6tChQqPfD1PC0IhAAAAgAJRvnx5BQcH52rs4sWLNWHC\nBNWsWVMTJkxQ//79Hzh+48aNWrt2rWrWrKkFCxbIxcXFpj89PV3Dhg3TDz/8oKlTp2rixIkPfR1P\nG0IhAAAAgCLn3Llz6tevn9555x1dvnw5x/E//fSTTCaT2rRpkykQSpLZbNa4ceNUpkwZ1alTJ1P/\n/v37NWvWLB06dEjJycmqVKmSgoKC1KNHDxUrVsxm7O7duxUREaEjR47o5s2bKlWqlOrXr69+/frp\n+eeftxnr6+srNzc3RUZGauTIkTp06JA++eQTtWvXTpKUlJSkr7/+Wps3b1Z8fLwcHR1VrVo1devW\n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\n2DEdPHhQe/bsUXR0tBYsWKBt27YpMjJSLi4uSklJ0bRp07R27VpdunQp03x/DVItW7aUs7OzNm3a\npAkTJsjOzk6pqanaunWrypQpYxMUHySrJyAzzvXnJx2vX78u6f823vyzihUrZmqrWbOmpk2bpgkT\nJmjRokVauHChXFxc9NJLL6lDhw5q1apVrurLb7kKhUFBQVqwYIEiIiLUoUMHa/i7f/++vvzyy0y3\nTC9evKg7d+6oYsWKcnJyUpUqVTRy5Mgs546Pj9eyZcseOAYAAADA08Xe3t76rcC+ffsqPj5eAwcO\nVFxcnCIiIhQaGqoBAwZo79698vT01DvvvCNPT085ODhIkiZPnqxz587ZzOng4KDXXntNa9as0d69\ne9W0aVNt3bpVycnJ6tSpU5aPbeaHrO7yZXfnr3nz5nrllVe0c+dObd++XTt37tSmTZv0448/ys/P\nTzNmzMjxXcv8lqtfxcvLS++9954uX76swMBATZ48WWFhYercubN27dql1q1bW3fxkaSRI0eqTZs2\nOnDgwGMrHAAAAMDTo1KlSho4cKAsFouOHz+uI0eOaO/evXJ3d9fy5csVEhKiNm3aqGXLlmrZsmW2\nAa9du3ayWCyKioqSJEVFRclkMql9+/b5XnPGtxSz+jRfVnc2M5jNZgUEBOiDDz7Qhg0b9O2336pa\ntWqKjo7WypUr873OnOQ6Kvfp00f/+c9/5OXlpaVLl2rWrFmyWCwaN26cvvjii8wT5yGFZ7UdLAAA\nAICnw8iRI/Xiiy9q9+7dDxyXnp4u6Y+vGvz222+SpAYNGmR6PPPXX3+12fDlz/z8/FS2bFlt375d\nKSkp2rJli7y8vFSvXr1Hv5C/8Pb2lvTHdxj/avv27ZnaUlNTdfr06UzttWvX1rvvvmsNxAUtV4+P\nZmjevLmaN2+e47gFCxbkes5KlSopJiYmL2UAAAAAeII8++yzWr16tf71r39p9uzZ8vT0zDTm8uXL\nmjFjhkwmk81eI38NUdeuXdPo0aNVrlw5JSQkWHf0zGA2m9W6dWstXrxYERERunPnjs1TjfnJz89P\nhw4d0sKFC+Xn52dtP3nypCIjIzONf/vtt3XixAmtWLFCNWrUsOn75ZdfJP2xH0tBy1MoBAAAAIC8\n6t+/v+Li4rR27Vq1bdtW/v7+qlGjhkqUKKGbN2/q5MmT2rlzp9LS0tSnTx+99tprSktL07PPPqvT\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_sav()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Models Savings" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- There are significant differences in the results when evaluating a model using a traditional cost-insensitive measures" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Train models that take into account the different financial costs" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Example-Dependent Cost-Sensitive Classification

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## *Why \"Example-Dependent\"" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Cost-sensitive classification ussualy refers to class-dependent costs, where the cost dependends on the class but is assumed constant accross examples." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "In fraud detection, different transactions have different amounts, which implies that the costs are not constant" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Bayes Minimum Risk (BMR)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The BMR classifier is a decision model based on quantifying tradeoffs between various decisions using probabilities and the costs that accompany such decisions. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "In particular:\n", "\n", "$$ R(c_i=0|\\mathbf{x}_i)=C_{TN_i}(1-\\hat p_i)+C_{FN_i} \\cdot \\hat p_i, $$\n", "and\n", "$$ R(c_i=1|\\mathbf{x}_i)=C_{TP_i} \\cdot \\hat p_i + C_{FP_i}(1- \\hat p_i), $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# BMR Code" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "costcla.models.BayesMinimumRiskClassifier(calibration=True)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "fit(y_true_cal=None, y_prob_cal=None)\n", "```\n", "- Parameters\n", " - **y_true_cal** : True class\n", " - **y_prob_cal** : Predicted probabilities" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "predict(y_prob,cost_mat)\n", "```\n", "- Parameters\n", " - **y_prob** : Predicted probabilities\n", " - **cost_mat** : Cost matrix of the classification problem. \n", "\n", "- Returns\n", " - **y_pred** : Predicted class" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# BMR Code" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from costcla.models import BayesMinimumRiskClassifier\n", "\n", "for model in ci_models:\n", " classifiers[model+\"-BMR\"] = {\"f\": BayesMinimumRiskClassifier()}\n", " # Fit\n", " classifiers[model+\"-BMR\"][\"f\"].fit(y_test, classifiers[model][\"p\"])\n", " # Calibration must be made in a validation set\n", " # Predict\n", " classifiers[model+\"-BMR\"][\"c\"] = classifiers[model+\"-BMR\"][\"f\"].predict(classifiers[model][\"p\"], cost_mat_test)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "for model in ci_models:\n", " # Evaluate\n", " results.loc[model+\"-BMR\"] = 0\n", " results.loc[model+\"-BMR\", measures.keys()] = \\\n", " [measures[measure](y_test, classifiers[model+\"-BMR\"][\"c\"]) for measure in measures.keys()]\n", " results[\"Savings\"].loc[model+\"-BMR\"] = savings_score(y_test, classifiers[model+\"-BMR\"][\"c\"], cost_mat_test) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# BMR Results" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAHzCAYAAACXNLhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlUVfX+//HX4aCCgoqCJiigOOA8VN4UitIyU1HyOpDT\nBb1OycrMWetaVl/ta6X3J97KEaecEs0pspyHNIecEr2KqYVDoogzCJ7fHy7OtxMgQwwe9vOx1l3r\nsj+f/dnvfT73tnqtz96fbbJYLBYBAAAAAAzJoagLAAAAAAAUHUIhAAAAABgYoRAAAAAADIxQCAAA\nAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDAch0Kjxw5orZt28rf31+RkZG5vuDx48f1xhtvKCAg\nQA0aNFCrVq00YcIEXb58OddjAQAAAAD+GsecdkxNTVVkZKRmzZolk8kkk8mU64vt2LFDQ4YMkdls\nVqdOneTp6amTJ09qxYoV2rp1q5YuXaoqVarkelwAAAAAQN7kOBT26tVLR44cUa9evVSqVCnNmjUr\nVxdKSUnRuHHjZLFYtHjxYtWrV8/a9swzz+idd97RxIkT9dlnn+VqXAAAAABA3uX48dGbN29q1qxZ\nGjdunEqVKpXrC23evFlXrlxRmzZtbAKhJHXp0kWenp7atm2bLl26lOuxAQAAAAB5k+NQuGzZMgUE\nBOT5Qnv27JHJZFKLFi0ytJlMJv3tb3+TxWLR3r1783wNAAAAAEDu5DgUuri4/KULnT59WpLk4+OT\nabuPj48sFou1HwAAAACg4BXaJymSkpIkSa6urpm2lytXzqYfAAAAAKDgFVoovHfvniSpRIkSmbaX\nLFnSph8AAAAAoOAVWih0cnKSJN2/fz/T9uTkZJt+AAAAAICCV2ih0M3NTZJ0/fr1TNsTExNt+j1K\nampa/hUGAAAAAAaW4+8U/lW1a9fWvn37dObMGT3zzDMZ2s+cOSOTyaS6detmO1Zi4p2CKPGx4eHh\nqitXbhZ1GcgD5s6+MX/2i7mzb8yffSvO8+fhkfleGEBxU2grhQEBAbJYLNqxY0eGtvv37+uHH36Q\no6NjpoERAAAAAFAw8hwKTSZTlm0XL17UmTNndPfuXeux5557Tj4+Ptq+fbv2799v03/OnDm6du2a\nOnbsqPLly+e1JAAAAABALuXo8dHTp09r+/bt1r9/+uknWSwW/fTTT5o7d671ePfu3VWmTBmNGjVK\n+/bt0+zZsxUYGChJMpvNmjRpkvr166d+/fqpU6dO8vT01OHDh7Vlyxb5+flp5MiR+Xx7AAAAAIBH\nyVEoPHr0qKZMmWJzzGQyaffu3dq9e7f1WNu2bVWmTBlJkoNDxkXIZs2aafny5ZoxY4Y2bdqkGzdu\n6IknnlB4eLgGDx6ssmXL/pV7AQAAAADkkslisViKuojcKq4vM6crzi9sF3fMnX1j/uwXc2ffmD/7\nVpznj41mYBSFttEMAAAAAODxQygEAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAw\nMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCE\nQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDACIUA\nAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigEAAAAAAMjFAIAAACAgREKAQAA\nAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigEAAAAAAMjFAIAAACA\ngREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigEAAAAAAMj\nFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAAAAAGRigE\nAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAADIxQCAAA\nAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgYoRAAAAAA\nDIxQCAAAAAAGRigEAAAAAAMjFAIAAACAgREKAQAAAMDACIUAAAAAYGCEQgAAAAAwMEIhAAAAABgY\noRAAAAAADIxQCAAAAAAG5pibzjExMVq8eLFiY2OVkpIiHx8ftW/fXuHh4SpVqlSOxli1apWio6N1\n8uRJ3blzR2XLllXDhg3VvXt3tWrVKk83AQAAAADImxyHwunTp2vGjBny9PRU9+7d5eLiol27dmna\ntGnavXu3oqKi5ODw6IXH0aNH6+uvv5a7u7s6duyoSpUq6dKlS1qzZo22bdumiIgIRURE/OWbAgAA\nAADkjMlisViy63TixAl17txZVatWVXR0tFxcXKxtw4cP14YNGzR69GiFhYVlOcbhw4fVvXt3eXh4\naP369Spbtqy17ezZswoODpbFYtGOHTvk5ub2yHquXLmZg1uzXx4ersX+Hosr5s6+MX/2i7mzb8yf\nfSvO8+fh4VrUJQCFIkfvFC5btkwWi0X9+vWzCYSSNHToUFksFi1ZsuSRY/zyyy+SpKeeesomEEqS\nr6+vqlevrrS0NP3222+5qR8AAAAA8BfkKBTu3btXktSyZcsMbd7e3vL09NT58+d16dKlLMeoXbu2\npP8Lh3+UkpKi33//XaVKlVL16tVzVDgAAAAA4K/LNhSmpqbq3LlzMpvNqlq1aqZ9fH19JUmnTp3K\ncpx69eqpZ8+eOnnypIYNG6ZDhw7p119/1f79+zV06FAlJSXprbfeyrASCQAAAAAoONluNHPr1i2l\npaWpbNmyMplMmfYpV66cJOnGjRuPHOudd95RvXr19OGHH+qbb76xHnd3d9eMGTPYfRQAAAAAClm2\nofDevXuSpBIlSmTZp2TJkpKku3fvPnKsRYsWafLkyapevbpee+01VaxYURcvXtSyZcv05ptv6v33\n31enTp1yUz8AAAAA4C/INhQ6OTlJku7fv59ln+TkZEmSs7Nzln0OHDigDz/8UP7+/lq2bJk1SEpS\nt27d1K5dO7399ttq0qSJfHx8cnwDAAAAAIC8y/adQldXVzk6Our27dtKTU3NtE9iYqIkPfJTEsuX\nL5ckhYaG2gRCSSpdurQ6deqk1NRUffvttzkuHgAAAADw12S7Umg2m1W9enWdPn1a586dk5+fX4Y+\ncXFxkiR/f/8sx7ly5YokqWLFipm2u7m5yWKx6MKFC9kW7eZWWo6O5mz72TO+i2O/mDv7xvzZL+bO\nvjF/9o35A+xbtqFQkgIDA3X69Gnt2LEjQyg8fvy4EhISVL9+fVWoUCHLMdzd3SVJ586dy7T9119/\nten3KImJd3JStt0qzh+BLe6YO/vG/Nkv5s6+MX/2rTjPH2EXRpGj7xSGhobKbDYrKipK165dsx5/\n8OCBPv30U5lMJvXp08d6/OLFizpz5ozNxjOtWrWSxWLR4sWLbcaQpMuXL2v16tUymUx68cUX/+o9\nAQAAAAByKEcrhT4+PhoxYoQ++ugjhYSEKDg4WM7Oztq8ebNiY2PVtm1bm11DR40apX379mn27NkK\nDAyUJLVt21bt27fXhg0b1L59ewUHB8vd3V2XL1/W+vXrdefOHQ0aNOiRj6ACAAAAAPJXjkKhJIWF\nhcnHx0dz587VsmXLlJqaqurVq2v8+PHq0aNHhv4ODhkXIT/55BMFBQUpOjpaX3/9tW7fvq2yZcuq\ncePG6tGjh4KCgv7a3QAAAAAAcsVksVgsRV1EbhXX59bTFedn84s75s6+MX/2i7mzb8yffSvO88c7\nhTCKHL1TCAAAAAAongiFAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAA\nAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQAAAAAAyMUAgAAAAA\nBkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQAAAAAAyM\nUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQ\nAAAAAAyMUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBghEIAAAAAMDBCIQAA\nAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBghEIAAAAA\nMDBCIQAAAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiFAAAAAGBg\nhEIAAAAAMDBCIQAAAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEAAADAwAiF\nAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQAAAAAAyMUAgAAAAABkYoBAAAAAADIxQCAAAAgIERCgEA\nAADAwAiFAAAAAGBghEIAAAAAMDBCIQAAAAAYGKEQAAAAAAzMsagLAAAAAIq7tLQ0xcXFFXUZueLn\n5yez2VzUZRSJyMhIRUZGavLkyQoJCcn1+WPHjtWqVau0cOFCPf300wVQYf4iFAIAAAAFLC4uTr3H\nfqnS5SoVdSk5cifpdy2c1EO1a9fOl/F+/PFH9enTJ9O2kiVLqlKlSmrevLn69u2rmjVr5ss1/4rA\nwECVKVNGDRs2zNP57du3V+3ateXt7Z3PlRUMQiEAAABQCEqXqyQXN6+iLqNIeXp6qnfv3jbHrl69\nqiNHjig6Olpr167Vv//9b7Vq1aqIKnyoSZMmatKkSZ7PDwwMVGBgYD5WVLAIhQAAAAAKRaVKlRQe\nHp5p24oVK/TOO+/o7bff1pYtW1SqVKlCrs642GgGAAAAQJHr2rWrateurcTERO3fv1+S1KpVK9Wt\nW1eJiYmKiIhQs2bNNHPmTOs5ycnJmjFjhjp27KjGjRurWbNm6ty5s+bPn6+0tLQM10hLS9O8efMU\nEhKipk2bqlmzZgoPD9eBAwds+k2fPl3+/v5avXq1zfHo6Gj17NlTTz/9tBo0aKCgoCC9/vrr2rdv\nn02/MWPGyN/fP8PxK1eu6IMPPlCbNm3UqFEjPfnkk+rSpYvmz5+v1NTUTMfYuXOnDhw4oPDwcDVv\n3lyNGzdWly5dtGnTptz/yFnIVSiMiYlR79699dRTT6lRo0YKDg7W559/ruTk5ByPkZaWprlz51on\n7m9/+5v69OmjLVu25Lp4AAAAAMVHjRo1JEmXL1+2OT516lQlJSVp0KBBaty4saSHgbBnz56aPn26\nSpcurb59+yo0NFTJycmaNGmShgwZYjOGxWLRwIED9dFHH6l8+fIaOHCgunXrphMnTqhnz57asGGD\nta/JZJLJZLI5/4svvtC4ceN0+fJlde3aVW+88YaCgoKsgW3btm2PPD8+Pl6dO3fW4sWLVa1aNfXr\n10/dunWz1hsREWHTP32M/fv365///KeqVaum8PBwBQUF6dixY3rjjTf0888/5/GXtpXjx0enT5+u\nGTNmyNPTU927d5eLi4t27dqladOmaffu3YqKipKDw6MzZmpqqgYOHKjdu3erZcuWateunRISErR2\n7VoNHjxY77//vrp27fqXbwoAAACA/UlISJAklS9f3ub46dOntXjxYpugNWPGDB07dkzdu3fXe++9\nZz3+1ltvqV+/ftq2bZtWrVqlV199VZK0ePFi7dy5U6+++qomTZpk7d+zZ0916NBBEyZM0IsvvqiS\nJUtmWtvChQtVqlQprVq1Sq6urtbj4eHhCgkJ0YoVKxQUFJTlvb3//vtKSEjQkCFDbALgW2+9pdde\ne03btm3T2rVrFRwcbG2zWCyaM2eO5s2bp6eeesp6/L333tPSpUu1Zs0a1a9fP8tr5lSOVgpPnDih\nzz77TN7e3lqzZo1GjhypwYMHa9GiRWrfvr327dunBQsWZDvO7NmztWvXLo0aNUpz5szRoEGD9Pbb\nb2vZsmVydXXVmjVr/vINAQAAALA/v/zyiw4fPiwnJ6cMn3Fo165dhpW3r776SiVKlNDIkSNtjjs6\nOuqNN96QxWKxefxzxYoVMplM6tevn03/atWqadSoUerbt6+SkpKyrO/mzZsymUwZFsKqV6+un376\nSZGRkVmee/36dW3fvl3Ozs4aMGCATVuJEiXUt29fWSwWrVu3LsO5L7zwgk0glKSAgABZLBadPXs2\ny2vmRo5WCpctWyaLxaJ+/frJxcXFpm3o0KFav369lixZorCwsCzHSEtL0/z581WrVq0ML5f6+vpm\neN4WAAAAQPGSkpKi+Ph4m2PXr1/X8ePHNWPGDKWmpmr48OE2K3GSVLduXZu/f/31V127dk2enp5K\nSkrKEObKly8vBwcHHT9+3HrdU6dOydHRMdNPXvTs2TPb2p9//nlt3LhRoaGh6tu3r4KCglShQgVJ\nyvaJydjYWD148ED16tXLdCUy/dMXJ06csDluMplUr169DP3Tf5979+5lW3dO5CgU7t27V5LUsmXL\nDG3e3t7y9PTU+fPndenSJT3xxBOZjnHgwAElJiaqV69e1mPXr1+XlHF5GAAAAEDxExsbq9atW2c4\nbjKZVKlSJU2aNCnTj8X/OS9cvXpVknTx4sVMx0sf89atW0pJSVFiYqIePHjwl3LHRx99JEdHR8XE\nxGjs2LGSpFq1aqlVq1Z67bXXssxBknTt2jVJsobIP0s/npiYmKHNzc0tw7H0VVOLxZK7m8hCtqEw\nNTVV586dk9lsVtWqVTPt4+vrq4sXL+rUqVNZ/hjHjx+XyWRSzZo1tXDhQs2dO1cXL16UJHl5eWnQ\noEG8TwgAAAAUY76+vho5cqRNmClRooQqV66sOnXqZHnen1fi0kORp6enxo8f/8hw5OjoaD0/JSUl\nz7U7OTnpk08+0VtvvaVNmzZpx44d2r9/v7744gvNnz9f/+///T8999xzmZ7750df/yy9/uxWHAtK\ntqHw1q1bSktLU9myZbO8mXLlykmSbty4keU4ly5dkiR9+eWXOn36tHr27ClfX1+dOXNGc+bM0Tvv\nvKOrV69q0KBBebkPAAAAAI+5cuXK5cuH6d3d3SU93IE0J+OVL19ejo6Oun37tu7fv68SJUrk+dpe\nXl7q06eP+vTpozt37mjBggWaNm2a/vWvf2nr1q2ZnpO+Epi+wvln2a0kFrRso2j6c6qP+uHSn4u9\ne/duln1u374ti8WiEydO6KuvvtLrr7+udu3aKSIiQgsWLJDJZNKMGTP0+++/5/YeAAAAABiIl5eX\nKlasqKtXr+rUqVOZ9vn111+t/71EiRKqXbu2pP97Ne6PZs6cqSFDhujkyZNZXvPSpUvW19/SlS5d\nWoMGDVK9evV0+fJla7j7s3r16slsNis2NjbTz/kdPHhQktSgQYMsr1+Qsg2FTk5OkqT79+9n2Sf9\nxpydnbPsYzabZTKZ1LlzZ1WpUsWmrWHDhgoICFBqaqp27NiRo8IBAAAAGFeXLl1ksVg0bdo0PXjw\nwKZt3rx5eumll2x2BA0JCZHFYtG8efNs+l+4cEEzZ87U3r175ePjk+m1tm7dqueff17vv/9+hrak\npCT99ttvcnZ2VtmyZTM9v2zZsmrTpo3u3r2rWbNm2bTdvXtXc+fOlclkUpcuXXJ8//kp28dHXV1d\nrUutqampcnTMeEr6C5GZvQSZLv0R04oVK2baXqtWLe3atcv6nuGjuLmVlqOjOdt+9szDwzX7Tngs\nMXf2jfmzX8ydfWP+7Bvzh6IwePBg7dq1S5s3b9arr76q1q1by2Qy6eDBg/rhhx9UvXp19ejRw9q/\nR48e+v7777V79251795dzz//vG7cuKG1a9fqzp07+uSTT6wLYpLtJi7PPfecAgICtGHDBp05c0YB\nAQEqW7asrly5ok2bNunmzZt66623Ms1K6caMGaNDhw5pxowZOnr0qBo2bKgbN25o27ZtOn/+vLp2\n7ZrhncT82kgmO9mGQrPZrOrVq+v06dM6d+6c/Pz8MvSJi4uTJPn7+2c5Ts2aNWWxWLIMfemPqWb1\nscg/Sky8k20fe+bh4aorV24WdRnIA+bOvjF/9ou5s2/Mn30rzvOX32H3TpL9vCZVELVmt9lKbs9z\ncnLSokWLFBUVpW+++Ubz5s1TWlqaPD091a9fP/Xv399mt1FHR0frh+DXrl2r2bNny8HBQY0bN1b/\n/v3VokWLLK/r4OCgmTNnauHChdqwYYNWrlypmzdvytXVVfXr19e4ceP04osvPvI+KleurJUrV+qz\nzz7Ttm3b9MMPP6hkyZKqU6eOBg8enOmuq4/6zUwmU55/0wxjWXIQPz/66CNFRUVp9OjRGb5FePz4\ncXXu3Fn169fXypUrsxwjISFBzz33nKpVq6aYmJgMN9C9e3cdOXJEn3/+uYKCgh5ZT3H9B0+64vwP\n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\nr82fscOHDxu9e/c2QkNDjY8++sgZzXUYVxtXM2fONMLCwozVq1eXuv7gwYNGaGiocc899xg3b94s\nWp6Xl2eEhoYaI0aMMDp06GDMnj27zOOMGjXKiIiIMEJDQ43x48cXWzd27FgjLCzM2Ldvn839U1NT\njV69ehlhYWHGl19+WYEzdCxXG1ePPfaYERYWZvOzbcOGDUZoaKjRq1evYsvPnz9vhIaGFo3Dsn6G\nCgoKjD59+hT136xZs4qt79u3rxEWFmYkJibarJGQkGB07tzZCAsLM7777rsKnCFgTjxTWMPq1aun\np556Si+++KKys7M1e/ZsGcz9U6s89dRTqlevnk6dOqUrV67UdHPqtNowXjIzM/Xiiy/KarUqJiam\nxNWUQrfffruWL18uPz8/LV68WPHx8dXc0prjymMmOTlZ0dHR8vT01LJly4pdybpVx44dtWTJEnl4\neOj111/XxYsXq7mljuNq4+r++++Xt7e3bt68qfT09BLrfX191blzZ3322WfF3od8q4SEBB07dqzo\ndsXKaNasmUaMGCHDMLRv375K16kurjKuCq8u22pD27ZtFRQUpLVr19qssXfvXqWkpFSp/0JCQtS/\nf/+iegDKRih0EaNHj1ZoaKgSEhK0Z8+emm4OKqBevXpFz+GUdasLHMeVx8u6deuUkZGh/v37l3lr\nmyT5+/tr/PjxMgzDVM8Eu/KYiY2NVX5+vkaPHq2goKAytw0JCdGIESOUm5urlStXVlMLncdVxtUP\nP/ygzMxMtWzZUk2bNi11m4EDByorK0ufffZZqesLbz0sfCatsjw9PSW53s9paVxlXBX+geu3v/2t\nzW0GDhyolJQUm2F73bp18vDwUN++favUFi8vL0mlvyYNQHGMEhcyYMAAGYbBX7Rqmbi4OGVlZall\ny5Ylnm2A87jqeNm/f78sFovdf+Eu/Et2bbgS4SiuPGb2798vSXb3X+HPYV3pv+ocV9euXdOPP/5Y\n9O/06dPasmWLnnnmGfn4+GjevHk29x0yZIg8PDy0Zs2aEusKCgq0ceNGderUqUrPbOfn5+vzzz+X\nxWIp8QyxK6rucXX58uVi/ZeQkKC1a9dq5syZ8vf319///neb+xZegS2t/zIzM/Xll1+qf//+8vb2\nrnT7srOztWPHDklS+/btK10HMAsmmnEhbdu2lSSbM2qhZuTk5OjHH38stsz4/w/3f/vtt/rXv/4l\nq9WqmTNnltg3IyOjxL6/1qpVK4e21yxcdbz88MMPkn6+imSPkJAQubu76+LFi8rJySk2+2NtVZvH\nzPnz5yXZ33933HGHpJ9nSqwLqmtcGYah6OhoRUdHl1gXEhKi999/X506dbK5v4+PjwYMGKDNmzcr\nKSmp2FXdXbt26dKlS5oxY0a57bhy5UqJn7cbN24oKSlJsbGxOn78uO6++24NHjy4AmfnHK40rgzD\nsDl5yz333KO5c+cWjY3SBAUF6f7779f27duVkZEhHx+fonWbNm3SzZs3NXLkyHLbceHChRKfmVlZ\nWTpz5oyWLFmilJQU9e7dW926dbPzzADzIhS6kMLbVH494yFqVnx8fJlXDe644w49//zzpT479vHH\nH5d5W5nFYjHVs2SO5Ijxkpqaqps3bxZb5u3tXaW/she2p/C2JXt4enoqMzNTmZmZLnflrDKqa8wk\nJycrLy+v2HpfX1/5+vpWsuUV77+GDRsW26+2q65xZbFY9Oijjxb7Zf3mzZtKTk7Wli1bNG7cOI0Z\nM0Zz5syR1Wot9TijRo3Spk2btGbNGj333HNFy9euXauGDRvq97//fZntNAyj1ABVyNPTU2PGjNGs\nWbNUr169MmtVB1caVxaLRVOmTFG7du2Kll2/fl3nz5/X+vXrFR4ermeeeUbTpk2zecyIiAgdOnRI\nGzZsKDaD77p169SyZUt179693CA7fvx4m+t8fHzq5OzOgLMQCl1IWlqaJMnPz6+GW4JbBQcH689/\n/nOxiRf+97//KSYmRvfdd59iY2Nt7jtgwACFh4dXRzNNxxHjZcaMGTp8+HDR1xaLRRERESXeN1gR\nhX/xzsjIsGt7wzCUnZ0tSWrUqFGlj+tKqmvMPPbYY8WuaBX+ovrr9w1WhLe3t9LS0pSRkVEUkMpS\n2M91pe+qc1yFhYWVGnImTpyoqKgoffzxx2rVqpWefvrpUo/TpUsXBQUFaf369ZoxY4YsFovS0tK0\nY8cOhYeHy9PTU/n5+TbbabFYNHXq1BKvk3n11VeVnJys999/Xw888EBFTt2pXG1c3XvvvaUG0EmT\nJikyMlIxMTFq06aNzfc8Dho0SPPmzdOaNWuKQmFiYqKOHj1q9xh+6aWX1KxZs6KvCwoKNHv2bGVn\nZ+uTTz4p9soMAGUjFLqQ7777ThaLxe7bllA9fH19S7yrq1+/ftq9e7cOHz6sDRs2aNiwYaXuGxwc\nXKXZ02CbI8ZLVFSUrl27VmxZVW9NbNu2rU6ePKmTJ0/anLnyVqdPn1Z+fr4CAwPl7l43PpKra8zM\nnTu3xOyThbc/Vlbbtm115MgRnThxotgvm7acOnXKIcd1Fa4yrv70pz9p8+bNio2NtRkKJWnkyJF6\n5513tHPnTvXp00cbN25UXl6eXbceSj/PIvvrWwsLCgo0depUzZ07V+vXr3eZSUpqy7hyc3PTtGnT\n9Nhjjyk2NtZmKPTw8NCQIUO0cuVKnThxQmFhYVq7dq3c3Nz08MMP23Wsrl27lgh+Fy5c0Lx58zR3\n7lwtWbLE7nYDZucan3RQbm6utm3bJknq06dPzTYG5bJYLHrhhRckSW+88YbdV4XgGI4aL/fdd58e\nfPDBYv/CwsKq1LYePXrIMAxt2bLFru0Lz6NXr15VOq6rc8aY6d69e4n+q+qVgcL+szWr5a9t27ZN\nFoulTvSfK42rwkB+6dKlMrcbPny43Nzcil5vsG7dOgUHB5c7829ZBgwYoO7du+vUqVNatmxZpetU\nB1cdV/7+/pJU7qtaIiIiiiacMQxDGzduVJcuXar0x7lx48bpjjvu0L59+7R58+ZK1wHMhlDoImJi\nYpSamqpu3boxS1Ytce+992rYsGG6fPlyqZMlwHlcebwMGTJETZs21f79+xUXF1fmtqmpqVq+fLnc\n3d31+OOPV1MLa05tGDNjxoxRgwYNtHHjRh07dqzMbb///nutW7dODRs21OjRo6uphc7jSuPq3Llz\nkn4JF7Y0a9ZMvXr10s6dO3XixAl99913ioiIqPLxZ8+eLavVqoULFyolJaXK9ZzJFcdVYf+Vd7W9\nffv2at++vbZt26YDBw4oNTW1yv1ntVqL3rU5f/58ZWZmVqkeYBaEwhqWm5urBQsWKCYmRo0bN9Y/\n/vGPmm4SKmDmzJlq2LChVq9eraNHj9Z0c+q82jBePDw89Oqrr8pisSgqKsrmFcOTJ08qMjJSGRkZ\neu6558p9J15d4epj5rbbbtMLL7ygvLw8TZo0yearGb755htNmDBBeXl5evnll6s0uU1Nc7VxlZ+f\nr9dee00Wi8WuWT9HjRqlmzdvKjo6Wu7u7g55jjskJETjxo3T9evX9fLLL1e5nrO50ri6fv263nrr\nLbv7LyIiQqmpqVq8eLEaNWqkAQMGVLkNXbt21e9+9ztduXJFb731VpXrAWZQNx5gqQUuXryopUuX\nFn2dk5Oj8+fPF02dHRQUpH/+85/6zW9+U2adWx8wR83z9/fX5MmTFR0drZdeeqnoeQhUTW0fL716\n9dLChQv117/+VVFRUYqJiVG3bt3UtGlTZWZm6r///a8OHjwoq9WqWbNm6cknn6yRdtaE2jBmCq9U\nzJs3TxMmTNBdd92lzp07q3HjxkpLS9ORI0d0+PBheXl5KTo6Wg899FANt9g+rjSuDMPQnj17lJ6e\nXrQsLy9Ply9f1vbt25WSkqJ77rnHrglH+vTpI39/f+3Zs0f9+vWz+cL7ipo2bZo2bdqkr776Sl98\n8YVDwoqzVPe4MgxDW7du1ffff1+0LDc3VxcuXNC2bdt09epV9enTp9isorYMGzZMb7zxhvbs2aNx\n48Y57LU8s2bN0q5du/TJJ5/o4YcftusZb8DMCIXVwGKxKCUlRW+++WbRMqvVKj8/P7Vv317Tp09X\neHi4XZNMWCwWWSwWZzYXt7Dne/3kk0/q008/1cmTJ/XBBx8UTZFNX1VOXRkv/fr10/bt27Vy5Urt\n3r1bmzdvVnp6ury8vNS6dWtNnDhRY8eOVYsWLWqkfc7i6mPG3voRERHq06ePVq5cqT179mj9+vVF\n71MLDg7WtGnTNHbsWDVu3Nip7XUUVxtXFotFW7du1datW4st8/Hx0Z133qlJkyZp1KhRJV5HUdqx\n3dzcNGLECP373/8udYIZW+0t7xy8vb313HPPac6cOXr11VfVs2dPu2akdQZXG1cWi0WffvppsWVu\nbm7y8/NTu3btNHz4cA0ZMqTU/X7dFm9vbw0cOFAbN27UiBEj7NqncHlZAgICNHHiRC1atEgvvfSS\n1qxZ43J/gAJcicXg0hMAAAAAmBZ/MgEAAAAAEyMUAgAAAICJEQoBAAAAwMQIhQAAAABgYoRCAAAA\nADAxQiEAAAAAmBihEAAAAABMjFAIAAAAACZGKAQAAAAAEyMUAgAAAICJEQoBAAAAwMT+H+oPDhZP\n9l/tAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_sav()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# BMR Results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Why so important focusing on the Recall" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Average cost of a False Negative" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2231.760665914221\n" ] } ], "source": [ "print(data.data[data.target == 1, 2].mean())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Average cost of a False Positive" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10.0\n" ] } ], "source": [ "print(data.cost_mat[:,0].mean())" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# BMR Results\n", "\n", "- Bayes Minimum Risk increases the savings by using a cost-insensitive method and then introducing the costs\n", "- Why not introduce the costs during the estimation of the methods?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Cost-Sensitive Decision Trees (CSDT)\n", "\n", "A a new cost-based impurity measure taking into account the costs when all the examples in a leaf\n", "\n", "```\n", "costcla.models.CostSensitiveDecisionTreeClassifier(criterion='direct_cost', criterion_weight=False, pruned=True)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## Cost-Sensitive Random Forest (CSRF)\n", "\n", "Ensemble of CSDT\n", "\n", "```\n", "costcla.models.CostSensitiveRandomForestClassifier(n_estimators=10, max_samples=0.5, max_features=0.5,combination='majority_voting)```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# CSDT & CSRF Code" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from costcla.models import CostSensitiveDecisionTreeClassifier\n", "from costcla.models import CostSensitiveRandomForestClassifier\n", "\n", "\n", "classifiers = {\"CSDT\": {\"f\": CostSensitiveDecisionTreeClassifier()},\n", " \"CSRF\": {\"f\": CostSensitiveRandomForestClassifier(combination='majority_bmr')}}\n", "\n", "# Fit the classifiers using the training dataset\n", "for model in classifiers.keys():\n", " classifiers[model][\"f\"].fit(X_train, y_train, cost_mat_train)\n", " if model == \"CSRF\":\n", " classifiers[model][\"c\"] = classifiers[model][\"f\"].predict(X_test, cost_mat_test)\n", " else:\n", " classifiers[model][\"c\"] = classifiers[model][\"f\"].predict(X_test)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "for model in ['CSDT', 'CSRF']:\n", " # Evaluate\n", " results.loc[model] = 0\n", " results.loc[model, measures.keys()] = \\\n", " [measures[measure](y_test, classifiers[model][\"c\"]) for measure in measures.keys()]\n", " results[\"Savings\"].loc[model] = savings_score(y_test, classifiers[model][\"c\"], cost_mat_test)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# CSDT & CSRF Results" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4UAAAHzCAYAAACXNLhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlUVfX+//HX4aCAgICiJiigqJE5V94UitQyS1HympLT\nBb1OydLMWeva+LV+NniveC2nMDO1Eg2HyHIeyjRzKKGrEFY4JII4g+D5/eHi3Hs6zB5F3c/HWq11\n+Xw++7Pf+4Pr5qu992ebLBaLRQAAAAAAQ3Kq7AIAAAAAAJWHUAgAAAAABkYoBAAAAAADIxQCAAAA\ngIERCgEAAADAwAiFAAAAAGBghEIAAAAAMLByh8IDBw6oS5cuCgkJUVxcXLlPeOjQIY0aNUqhoaFq\n1qyZOnbsqGnTpunkyZPlngsAAAAAcH2cyzowPz9fcXFxmjdvnkwmk0wmU7lPtm3bNo0cOVJms1k9\nevSQn5+ffv75Z3366afavHmzli1bprp165Z7XgAAAABAxZQ5FPbv318HDhxQ//795eLionnz5pXr\nRHl5eZoyZYosFouWLFmipk2bWvsefPBBvfjii3rllVc0Z86ccs0LAAAAAKi4Mj8+eu7cOc2bN09T\npkyRi4tLuU+0ceNGnTp1Sp07d7YJhJLUq1cv+fn5acuWLTpx4kS55wYAAAAAVEyZQ+Hy5csVGhpa\n4RN9++23MplMateunV2fyWTSX/7yF1ksFu3atavC5wAAAAAAlE+ZQ6GHh8d1nejIkSOSpMDAwCL7\nAwMDZbFYrOMAAAAAADfeTfskRU5OjiTJ09OzyH4vLy+bcQAAAACAG++mhcLLly9LkqpUqVJkf9Wq\nVW3GAQAAAABuvJsWCl1dXSVJV65cKbI/NzfXZhwAAAAA4Ma7aaHQx8dHknTmzJki+7Ozs23GlSQ/\nv8BxhQEAAACAgZX5O4XXq0mTJtq9e7fS0tL04IMP2vWnpaXJZDLpnnvuKXWu7OyLN6JEh6tVy1On\nTp2r7DLuCKylY7GejsV6Og5r6Visp2Oxno5zu6xlrVpF74UB3Glu2p3C0NBQWSwWbdu2za7vypUr\n+uabb+Ts7FxkYAQAAAAA3BgVDoUmk6nYvuPHjystLU2XLl2ytj388MMKDAzU1q1btWfPHpvxCxYs\nUFZWlrp37y5vb++KlgQAAAAAKKcyPT565MgRbd261frzDz/8IIvFoh9++EELFy60tvfp00fu7u6a\nMGGCdu/erfnz5yssLEySZDabNX36dA0ePFiDBw9Wjx495Ofnp/3792vTpk0KDg7W+PHjHXx5AAAA\nAICSlCkUHjx4UDNmzLBpM5lM2rlzp3bu3Glt69Kli9zd3SVJTk72NyHbtGmjTz75RLNnz9aGDRt0\n9uxZ3XXXXYqJidGIESNUvXr167kWAAAAAEA5mSwWi6Wyiyiv2+HFZOn2eYn6dsBaOhbr6Visp+Ow\nlo7FejoW6+k4t8tastEMjOKmbTQDAAAAALj1EAoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAA\nGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAw\nQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRC\nAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAA\nAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAA\nwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMUAgAAAICB\nEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQAAAAAAyMU\nAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAAAAZGKAQA\nAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAMjFAIAAAA\nAAZGKAQAAAAAAyMUAgAAAICBEQoBAAAAwMAIhQAAAABgYIRCAAAAADAwQiEAAAAAGBihEAAAAAAM\njFAIAAAAAAZGKAQAAAAAAyMUAgAAAICBOZdncFJSkpYsWaLk5GTl5eUpMDBQXbt2VUxMjFxcXMo0\nx8qVK5WQkKCff/5ZFy9eVPXq1dW8eXP16dNHHTt2rNBFAAAAAAAqpsyhcNasWZo9e7b8/PzUp08f\neXh4aMeOHZo5c6Z27typ+Ph4OTmVfONx4sSJ+vzzz+Xr66vu3burdu3aOnHihBITE7VlyxbFxsYq\n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\nvJ555hlt2bJFq1evVkREhLXPYrFowYIF+uCDD3T//fdb219++WUtW7ZMiYmJuvfee4s9Z1mV6U5h\nSkqK5syZo4CAACUmJmr8+PEaMWKEPvroI3Xt2lW7d+/Whx9+WOo88+fP144dOzRhwgQtWLBAw4cP\n1wsvvKDly5fL09NTiYmJ131BAAAAAG4/v/zyi/bv3y9XV1e7zzg8+eSTdnfePvvsM1WpUkXjx4+3\naXd2dtaoUaNksVhsHv/89NNPZTKZNHjwYJvx9evX14QJEzRo0CDl5OQUW9+5c+dkMpnsboQ1aNBA\nP/zwg+Li4oo99syZM9q6davc3Nw0dOhQm74qVapo0KBBslgsWrNmjd2xHTp0sAmEkhQaGiqLxaL0\n9PRiz1keZbpTuHz5clksFg0ePFgeHh42faNHj9batWu1dOlSRUdHFztHQUGBFi1apMaNG9u9XBoU\nFGT3vC0AAACAO0teXp4yMjJs2s6cOaNDhw5p9uzZys/P19ixY23uxEnSPffcY/Pzb7/9pqysLPn5\n+SknJ8cuzHl7e8vJyUmHDh2ynvfw4cNydnYu8pMX/fr1K7X2Rx55ROvXr1dUVJQGDRqk8PBw1ahR\nQ5JKfWIyOTlZV69eVdOmTYu8E1n46YuUlBSbdpPJpKZNm9qNL1yfy5cvl1p3WZQpFO7atUuS1L59\ne7u+gIAA+fn56ddff9WJEyd01113FTnH999/r+zsbPXv39/adubMGUn2t4cBAAAA3HmSk5PVqVMn\nu3aTyaTatWtr+vTpRX4s/s954fTp05Kk48ePFzlf4Zznz59XXl6esrOzdfXq1evKHW+++aacnZ2V\nlJSkyZMnS5IaN26sjh076plnnik2B0lSVlaWJFlD5J8VtmdnZ9v1+fj42LUV3jW1WCzlu4hilBoK\n8/PzdfToUZnNZtWrV6/IMUFBQTp+/LgOHz5c7GIcOnRIJpNJjRo10uLFi7Vw4UIdP35ckuTv76/h\nw4fzPiEAAABwBwsKCtL48eNtwkyVKlVUp04d3X333cUe9+c7cYWhyM/PT1OnTi0xHDk7O1uPz8vL\nq3Dtrq6uevvtt/X8889rw4YN2rZtm/bs2aP3339fixYt0r/+9S89/PDDRR7750df/6yw/tLuON4o\npYbC8+fPq6CgQNWrVy/2Yry8vCRJZ8+eLXaeEydOSJI+/vhjHTlyRP369VNQUJDS0tK0YMECvfji\nizp9+rSGDx9ekesAAAAoUkFBgdLT0657nho1WjqgGsDYvLy8HPJhel9fX0nXdiAty3ze3t5ydnbW\nhQsXdOXKFVWpUqXC5/b399fAgQM1cOBAXbx4UR9++KFmzpypf/zjH9q8eXORxxTeCSy8w/lnpd1J\nvNFKDYWFz6mWtHCFz8VeunSp2DEXLlyQxWJRSkqKVq1apbp161r7wsPD1bt3b82ePVs9e/ZU7dq1\ny3wBAAAAJUlPT9OExH/IvZZn6YOLceHUOc2v8Y58fOqWPhjADefv76+aNWvq9OnTOnz4sBo3bmw3\n5rffflP9+vUlXcsyTZo0UXJysnbt2qWwsDCbsXPnztX+/fs1atSoYu9YnjhxQq6urjaPoFarVk3D\nhw/X+vXrlZycrKysrCKDXdOmTWU2m5WcnKzc3Fy5uLjY9O/du1eS1KxZs/IthIOUen/S1dVVknTl\nypVixxR+p9DNza3YMWazWSaTST179rQJhNK1FytDQ0OVn5+vbdu2lalwAACAsnKv5SlPP+8K/3M9\ngRLAjdGrVy9ZLBbNnDlTV69eten74IMP9Nhjj9nsCBoZGSmLxaIPPvjAZvyxY8c0d+5c7dq1S4GB\ngUWea/PmzXrkkUf06quv2vXl5OTo999/l5ubm6pXr17k8dWrV1fnzp116dIlzZs3z6bv0qVLWrhw\noUwmk3r16lXm63ekUu8Uenp6Wm+15ufny9nZ/pDCFyKLegmyUOEjpjVr1iyyv3HjxtqxY4f1PcOS\n+PhUk7OzudRxt4Ja/EvEYVhLx2I9HYv1dBzW0rFYTyk726P0QWVU0fV0VA01anjcMb/T67kO1hOS\nNGLECO3YsUMbN27UU089pU6dOslkMmnv3r365ptv1KBBA/Xt29c6vm/fvvr666+1c+dO9enTR488\n8ojOnj2r1atX6+LFi3r77betN8Qk201cHn74YYWGhmrdunVKS0tTaGioqlevrlOnTmnDhg06d+6c\nnn/++SKzUqFJkyZp3759mj17tg4ePKjmzZvr7Nmz2rJli3799Vc9/fTTdu8kOmojmdKUGgrNZrMa\nNGigI0eO6OjRowoODrYbk5qaKkkKCQkpdp5GjRrJYrEUG/oKH1Mt7mOR/ys7+2KpY24FtWp56tSp\nc5Vdxh2BtXQs1tOxWE/HYS0di/W8JivrvMPmquh6OqqGrKzzd8Tv9Hr/bN6s9XR0YLyY84dD57uR\n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\nuwwAwA3EO4UAAAAAYGCEQgAAAAAwMB4fBQAAAG6wgoICpaamVnYZ5RIcHMwmUQZBKAQAAABusNTU\nVK352yDVrVatskspk+MXL6rbooVq0qSJQ+b77rvvNHDgwDKNjY2NVWxsrPXn8+fP67XXXtOqVavk\n7++vDRs2lHj8119/rcTERB05ckSnTp3SpUuX5O7uroCAAIWHh2vgwIGqXr36dV3PnYZQCAAAANwE\ndatVU4CHZ2WXUan8/Pw0YMCAEse0bt3a+r+/+eYbTZkyRadOnZLJZCp1/nHjxmnNmjXy8vJSx44d\nFRgYqKtXr+rEiRPavHmz4uLilJCQoKVLl6pOnYrvrHynIRQCAAAAuClq166tmJiYMo1dunSpXnnl\nFd1zzz165ZVXNGTIkBLHr1+/XmvWrNE999yjxYsXy8PDw6a/oKBAY8aM0VdffaWZM2dq+vTpFb6O\nOw2hEAAAAMAt5+jRoxo8eLCee+45nTx5stTx3333nUwmk5588km7QChJZrNZU6dOlY+Pj5o1a2bX\nv2fPHs2fP1/79u3ThQsX5O/vr6ioKPXr109VqlSxGfvNN98oPj5eBw4c0Llz5+Tl5aWWLVtq8ODB\nuu+++2zGhoSEyNfXVwkJCZowYYL27dun1157Td26dZMk5eTk6P3339fGjRuVkZEhV1dXNWrUSH36\n9FFkZGR5lqzCCIUAAAAAbjmxsbFFhrviuLm5yWKx6NixY8WOqVOnjl5++WW79s8//1yTJ09W7dq1\n1atXL7m6umr79u1644039O233+q9996zjl22bJlefvllubu76/HHH5e/v78yMjKUlJSkzZs36623\n3tKTTz5pd46XXnpJ1apV07PPPqvg4GBJUlZWlnr37q2MjAy1b99e3bp109mzZ/XVV19p0qRJ2r9/\nv6ZNm1bmNagoQiEAAACAW055AqEkdezYUfPnz9fSpUt19epV/e1vf1PDhg1LPS4zM1MvvfSSfHx8\ntHLlSvn4+Ei6FkoHDx6sLVu2aO3ateratav++OMPTZ8+Xa6urvrkk09s5o+KilJUVJReeukldejQ\nQW5ubta+s2fPymw2a9asWTbnfv3115WRkaExY8Zo6NCh1vbnnntOvXr10rJly/TEE0+obdu25VqL\n8uI7hQAAAABuiry8PGVkZJT4T15eXoXmbt26taZMmSJnZ2d98sknevLJJ9WpUyeNHTtWS5YsUVpa\n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\nnJ3tD8nOzpYk+fj4FDnH5cuXNWHCBNWpU0cvvfSSTZ/FYil30T4+1eTsfHtsj1urlmdll3DHYC0d\ni/V0LNbTca5nLbOzHfP+SY0aHnfM75T1dNx1SBVfzztlLSXHXQt/No3FyclJM2fO1IgRI/Sf//xH\nQ4cOlbu7u1q0aKE2bdrogQce0H333Wf3dOLf//53denSRW3atLFpDwkJkZ+fn44dO6a0tDS1aNFC\n1atX10MPPaRNmzZp586deuihh6zjt23bpnPnzqlr165yd3cvtd4OHTrYBEJJCg0N1dKlS5Wenm5t\n27x5s0wmkwYOHGgztlGjRurZs6fi4+Nt2nNycqzr8Wf/93//p+nTp5da241Qaig0m81q0KCBjhw5\noqNHjyo4ONhuTOE3V0JCQoqc4+DBgzp69KhMJpPatm1r128ymfTdd98pJCRE/v7+RT6r+7+ysyvn\nWdvyqlXLU6dOnavsMu4IrKVjsZ6OxXo6zvWuZVbWeYfUkZV1/o74nbKe/z2/o1T0Ou6UtSyswRFu\nhz+bBEbHaty4sdatW6eEhAQlJSXphx9+0Lfffqtvv/1WFotF7u7u6tmzp0aNGiVPz2tr36hRIzVq\n1EjStbt92dnZys/Pl8ViUfXq1XXs2DHrU4uS1K1bN23cuFFffvmlTShct26dTCaTunfvXmqdJpNJ\nTZs2tWsvrKnw9Trp2vuOkqx3Dv/XQw89ZBcKw8LC9M9//lPz58/XhQsXFBERoebNm8vJyanY/Vtu\nhjJ9kiIsLExHjhzRtm3b7ELhoUOHlJmZqXvvvVc1atQo8vi77rpLgwYNKrLv/Pnz+uSTT1S3bl09\n8cQT8vb2LuclAAAAALgdVK1aVVFRUYqKilJ+fr5+/PFH7d27V99++6127typxYsXa8uWLUpISJCH\nh4dyc3M1a9YsrVmzRidOnLCb789BqlOnTqpWrZo2bNigV155RU5OTsrLy9PmzZvl4+NjExRLUtQT\nkIXn+t8nHc+cOSPpvxtv/q+6devatd1zzz2aNWuWXnnlFS1ZskQfffSRPDw89OCDD6p79+7q3Llz\nmepztDKFwqioKC1evFjx8fHq3r27NfxdvXpV77zzjt0t0+PHj+vSpUuqW7eu3NzcVL9+fU2YMKHI\nuTMyMvTJJ5+UOAYAACMpKChQenradc9To8bNfScFAMrD2dnZ+q3AQYMGKSMjQ8OGDVNqaqri4+MV\nGxuroUOHateuXQoICNBzzz2ngIAAubi4SJJmzJiho0eP2szp4uKiRx99VKtXr9auXbvUrl07bd68\nWRcuXFDPnj2LfGzTEYq6y1fcnb8OHTro4Ycf1vbt27V161Zt375dGzZs0Ndff63Q0FDNnTu31Hct\nHa1MoTAwMFDjxo3Tm2++qcjISEVERMjNzU0bN25UcnKyunTpYt3FR5ImTJig3bt3a/78+XZbsAIA\ngJKlp6dpQuI/5H4dj65dOHVO82u8Ix8f+/9SDQC3In9/fw0bNkzjx4/XoUOHdODAAe3atUu1atXS\np59+anc37u233y5ynm7duikxMVFJSUlq166dkpKSZDKZFBER4fCaPTw8lJOTo7Nnz9rtqFrUnc1C\nZrNZ4eHhCg8PlyT99NNPmjhxonbu3KmVK1eqV69eDq+1JGUKhZIUHR2twMBALVy4UMuXL1d+fr4a\nNGigqVOnFrmzTnlSeFHbwQIAYGTutTzl6ccrFQDuDBMmTNCWLVs0c+bMYr9TKF17UkK69lWD33//\nXZLUqlUru0D422+/2Wz48r9CQ0NVo0YNbd26Vbm5udq0aZMCAwPVokULx1zM/wgKCtL+/ft1+PBh\n1a5d26Zv69atduPz8vL0+++/q2HDhjbt9957r55//nk9++yzOnTokMPrLE2ZQ6F07VZnhw4dSh23\nePHiMs/p7++v5OTk8pQBAAAA4DbSsGFDJSYm6h//+IcWLFiggIAAuzEnT57U3LlzZTKZbPYaSUuz\nfZw+KytLkyZNUs2aNZWZmWnd0bOQ2WxWly5dtHTpUsXHx+vSpUs2TzU6UmhoqPbt26ePPvpIoaGh\n1vbDhw8rISHBbvwzzzyjn3/+WStWrNDdd99t0/fTTz9JurYfy81WrlAIAAAAAOU1ZMgQpaamas2a\nNeratavCwsJ09913y93dXefOndPhw4e1fft25efnKzo6Wo8++qjy8/PVsGFDpaWlaeDAgWrXrp1O\nnz6tL774QpGRkWrRooU++OADxcXF6ZdfftGQIUOs5+vWrZs+/vhja8gs7tHRoj6PV55P5vXr10/L\nli3T5s2bNWDAAN1///06e/asEhMTNWzYML311ls248eMGaPY2FhFRUXpscceU1BQkK5evaqffvpJ\nmzdvlp+fn55++ukyn99RCIUAAADATXAm52Rll1Bmjq7VbDZrxowZeuqpp/T5559b3xfMzc2Vm5ub\n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\npCFDhhRtT0lJUVJSUrGJZzp27KiIiAht2bJF33//fbHy586dq7S0NPXp00dBQRVb4BwAAAAAUH4m\nwzAMRw5csGCB3nrrLYWEhKh3797y9fXVpk2blJiYqB49eui9994rOvaPf/yj9uzZozlz5hQ9ZZSk\nvXv3asSIESosLFR0dLTCwsJ04MABffPNN2rQoIESEhIIhQAAAABwG5U50YzVsGHDFBERoXnz5mnJ\nkiXKz89XvXr1NGXKFA0ePNjmeC8v24eQzZs312effabZs2fr66+/1tWrV1W7dm0NHz5cTz/9tGrU\nqOHc3QAAAAAAysXhJ4UAAAAAgLuPQ+8UAgAAAADuTg4PH/V03333XbHJdKz8/Px07733qkmTJura\ntau6deumqlWrFu23vl/pqFatWmnhwoUuqbO7steWVr6+vgoLC1Pbtm01bNgw1a1bt2jfrFmzNGvW\nrDKvYTKZtHDhQrVs2dIldXY1d+pPDz/8sFJTHV/ANzY2VtOnTy+27cqVK1qyZIm2bdumpKQkpaen\nq3r16qpTp45at26tQYMGKTw83OFrlJc79anSluYpyZ/+9Cf96U9/KrYtNTVVixYt0s6dO3X69Gll\nZGTI399f4eHhat++vQYOHKj77ruvXNeR3KvfSdLEiRO1Zs0am+1VqlTRPffco0aNGik2NlZdunQp\ntr+goEBNmjSRJNWvX1/r1q0r9ToZGRlq3769cnNz1a5dO82bN69o36BBg7Rv374SzzObzQoMDFSj\nRo3Ut29f9e7du9h+d+p3kv2fU9WqVRUSEqIHHnhAjz/+uE1ZZ8+e1e9+9ztJUtu2bTV//vxSr5Oc\nnKzu3btLkvr166cZM2YU7evSpYvOnTtX4nne3t4KDg7WAw88oJiYGJufqzPS0tL06aefatu2bUpO\nTlZmZqaCg4MVFhamLl26qG/fvqpVq5bNeYmJifr000/1448/6uLFi0pPT1fVqlUVGhqqli1baujQ\noapXr16xcyZPnqwVK1YU22Y2mxUQEKC6deuqefPmio6OLuqjVje2s6PefPNN9e3bt1znuEJlt6eV\nl5eXAgIC1LBhQ/3+97/XY489ZrNedml97kZ16tTR119/XY5WADwLobCcwsLC9Mc//rHo75mZmfrp\np5+0c+dOffHFFwoPD9fbb7+tBx98UJI0ePBgm//4Nm/erN27d6tdu3bFJuKRpNq1a9/6m3ATN7el\nJBmGoYsXL2rPnj365JNPtGzZMs2bN0/NmjUrdlybNm308MMPl1r+rQwhruIO/WnMmDHKysoqtm3F\nihU6fvy4evbsafOLTVRUVLG/r1mzRlOnTtX169fVqFEj9e7dWzVr1lRWVpYOHjyohQsXauHChRo1\napTGjRtXdqM4wR361PPPP2+z7Z///KdSUlI0cOBAmzJursfHH3+suLg45efnq1mzZurfv78CAwN1\n9epV/fDDD/rwww81d+5cPf/883r88cfLrE9J3KHfSb8GHpPJpB49eui3v/1t0faMjAydPHlS3377\nrb755hs9++yzGjNmjM35Xl5eOnXqlPbt22fTjjdavXq18vLyZDKZ7NZhwIABioyMLLYvOztbycnJ\n2rBhg7Zv365NmzYVm1TNyh363Y33ExsbW+wX7/T0dB05ckQbN27UV199penTpysmJsbmXC8vL+3e\nvVvnzp1TWFiY3WssX768xLa8sQ4jR460WaYqMzNTJ0+e1KZNm7Rp0yYNGzZMkyZNcvje7Fm5cqVe\neeUVXb9+XU2bNlX//v1Vo0YNnT9/Xnv27NG7776rf/zjH5oxY4a6detWdN7ixYv16quvymw2q2PH\njuratauqVq2qy5cva9euXVq8eLFWrFihDz74QO3bt7e5x0ceeaToM5Kfn68rV67o0KFD+vTTT7Vw\n4UL17NlTr7zyivz9/SVJgYGBJf77MGvWLGVnZ2v06NE2cys88MADTrdPeblDe1rl5OTo7Nmz2rBh\ng6ZPn641a9bo448/LvallfX8kvrcjaw/BwB2GHDI7t27jaioKOOxxx4rcX9ubq4xd+5co0mTJkaz\nZs2MAwcO2C0rLi7OsFgsxsyZM29Vdd1aWW1p9eGHHxpRUVFG7969i7bNnDnTiIqKMt55551bXc1b\nyt3707PPPmtYLBZj1apVpR63bt06IyoqymjdurWxdevWEo85fvy48Yc//MGIiooy4uLiXFbHG7l7\nnxowYIBhsViM7777rtTj5s+fb0RFRRmdO3e2+zPfu3ev8fDDDxtRUVHGJ598Uq56uFu/mzhxomGx\nWIylS5eWuP+7774zoqKijKZNmxo5OTlF2/Pz842oqCijf//+RpMmTYwpU6aUep3Y2FgjJibGiIqK\nMoYPH15s36BBgwyLxWLs2LHD7vmpqalGx44dDYvFYnz99ddF292t3z3xxBOGxWKx+1lctWqVERUV\nZXTs2LHY9jNnzhhRUVFF/bS0n2lhYaHRqVOnovacNGlSsf2dO3c2LBaLkZSUZLeMEydOGA899JBh\nsViMQ4cOleMOba1Zs8aIiooy2rRpY+zcubPEY5YvX240adLEaNSokbFv3z7DMAzjwoULRf382LFj\nJZ5n/Tx269bNKCwsLNo+adIkw2KxGIsXLy7xvJSUFGPEiBFGVFSUMXjwYCM3N7fUe2jfvr1hsViM\ns2fPOnLLt5Q7tqdhGEZ2drbRr18/w2KxGPPnzy+2z5E+B6BsvFPoIlWqVNGTTz6pl156SdnZ2Zoy\nZYoM5vBxypNPPqkqVaro+PHjunz5cmVX57a6E/pTZmamXnrpJZnNZsXHx9s8LbL6zW9+owULFigo\nKEhz5sxRYmLiba7pv7lznzp37pzi4uLk6+ur+fPnF3tydqNmzZpp7ty58vHx0VtvvaULFy64rA7u\n1u9atmwpf39/5eTk6OrVqzb7AwMD9dBDD+mLL74oti7ujU6cOKGDBw+We9jejWrVqqX+/fvLMAzt\n2LGj3Oe7S7+zPu21V4f69esrIiJCy5cvt1vG9u3blZKS4lR7NmjQQF27di0qr6KysrL08ssvy2w2\na/bs2WrTpk2Jx/Xr108TJ05UjRo1iobX7tu3T/n5+WrRooUaNmxY4nnDhg3TkCFDNGDAAGVmZjpc\nr9q1a+vDDz9Uy5YttXfv3jKH47oLd21P6deh2EOGDJFhGE71GQD2EQpdbMCAAYqKitKJEye0bdu2\nyq7OHa1KlSpFQ0RKG6p0N3Pn/rRixQplZGSoa9eupQ7dk6SQkBANHz5chmFU6juz7tynEhISVFBQ\noAEDBigiIqLUYxs0aKD+/fsrLy9PixYtcnld3KXf/fzzz8rMzFRoaKjuvffeEo/p3r27srKy9MUX\nX5S43zrU0foOXEX5+vpKqli/cZd+Z/1C5j//8z/tHtO9e3elpKTYDb8rVqyQj4+POnfu7FRd/Pz8\nJJW8fJWj/vWvfykjI0OdO3dW8+bNSz12yJAh2r59u5566ilJ//55pqamlvrFxwsvvKCRI0cqICCg\nXHXz9vbW5MmTK/3fvPJw5/a88RrO9BkA9vHJugW6devGt1kusGnTJmVlZSk0NLTU9wTudu7an3bt\n2iWTyeTwEwPrk4GKPGlxFXfuU7t27ZIkh9vT2i9uVXvezn535coVnT17tujPyZMntW7dOo0ePVoB\nAQF6/fXX7Z7bq1cv+fj4aNmyZTb7CgsLtXr1ajVv3typd4wLCgr05ZdfymQy2bxj64jb3e8uXbpU\nrD1PnDih5cuXa+LEiQoJCdHLL79s91zrE9GS2jMzM1Nff/21unbt6tT7WdnZ2frmm28kSY0bN65w\nOeX5N8jLy0tms7no782aNVPNmjV17NgxDRkyRN9//32F62FP48aNVadOHV2+fFlHjx51efmu5u7t\nuWbNmgp/BgGUjYlmboH69etLkkOzYXmy3NxcnT17ttg24/8nZ9i/f78++OADmc1mTZw40ebcjIwM\nm3NvVqdOHZfWt7K4a3/6+eefJf361MoRDRo0kLe3ty5cuKDc3FybiQJc4U7uU2fOnJHkeHtah2gl\nJyffkvrcrn5nGIbi4uIUFxdns69Bgwb66KOPSn1qERAQoG7dumnt2rVKTk4u9pR1y5YtunjxosaP\nH19mPS5fvmzz879+/bqSk5OVkJCgw4cP67e//a169uxpc6479TvDMOxO3tK0aVO99tprdof3SVJE\nRIRatmypjRs3KiMjo9gTnTVr1ignJ0ePPvpomfU4f/68zWc8KytLp06d0ty5c5WSkqKHH35Ybdu2\ndfDObJX3M3Mjf39//e1vf9PYsWP1/fff64knnlBQUJCaNm2q5s2bq1WrVmratKnTT6Xq1aunc+fO\nKSUlxWaSLndT2e1p/XLoRnl5eTpz5oz+9a9/acOGDapTp47NpE5WJfW5G/n5+Sk4OLjc9wZ4CkLh\nLWAd4nDzjI4oLjExsdRvJBs2bKjnn3++xHfVFi9eXOqwOZPJVKnvrrmSK/pTamqqcnJyim3z9/d3\n6qmFtT7WYWCO8PX1VWZmpjIzM2/JE5Pb1afOnTun/Pz8YvsDAwMVGBhYwZqXvz2rV69e7DxXu139\nzmQy6fHHHy8WDnJycnTu3DmtW7dOgwcP1sCBAzV16tRiTyZuFBsbqzVr1mjZsmV67rnnirYvX75c\n1atX1+9///tS62kYRomBzcrX11cDBw7UpEmTVKVKFZv97tTvTCaTxowZo0aNGhVtu3btms6cOaOV\nK1cqOjpao0eP1tixY+1eMyYmRnv27NGqVauKzXC7YsUKhYaGql27dmUG2eHDh9vdFxAQ4JLZiCvy\nb9CNWrZsqQ0bNmjJkiXauHGjfvzxR23ZskWbN2+WJAUHB2vQoEEaPXp0hb/EstbtTvh9oDLb0zAM\nvffeeyXO7iv9OgS7e/fumjZtmt1gV1qfk2yXTwFQHKHwFkhPT5ckBQUFVXJN3FtkZKT+/Oc/F3v/\n4H//938VHx+vFi1aKCEhwe653bp1U3R09O2oZqVzRX8aP3689u7dW/R3k8mkmJgYm/UGy8P6BCEj\nI8Oh4w3DUHZ2tiTZTLvuKrerTz3xxBPFnqBZfxG/eb3B8vD391d6eroyMjKKAllprO1+q9rydvY7\ni8VSYqgaOXKkJkyYoMWLF6tOnTpF7y/drHXr1oqIiNDKlSs1fvx4mUwmpaen65tvvlF0dLR8fX1V\nUFBgt54mk0nPPvuszZOcN954Q+fOndNHH32kVq1a2T3f3frdgw8+WGIAHTVqlIYNG6b4+HjVq1fP\nZt1Fqx49euj111/XsmXLikJhUlKSDhw44HAfnzZtWrF17AoLCzVlyhRlZ2frs88+s1mrriKsX4xY\n+2pF+Pv7a8SIERoxYoRycnJ04MAB7d27Vzt27ND333+vDz74QDt27FBCQoLdLyVKcyf9PlCZ7Wky\nmTRw4ECbfjtnzhzt379fL730kmJjY0u99s197malLbMCgFB4Sxw6dEgmk6lCQzA8SWBgoM3aZ126\ndNHWrVu1d+9erVq1Sn369Cnx3MjISKdmv7uTuKI/TZgwQVeuXCm2zdmhkPXr19fRo0d19OhRuzNl\n3ujkyZMqKChQeHi4zeLDrnK7+tRrr71mM9uldbhlRdWvX1/79u3TkSNHSv3Fxur48eMuua497tLv\n/ud//kdr165VQkKC3VAoSY8++qjee+89bd68WZ06ddLq1auVn5/v0FBH6dd3om4eylhYWKhnn31W\nr732mlauXGl36Nud0u+8vLw0duxYPfHEE0pISLAbCn18fNSrVy8tWrRIR44ckcVi0fLly+Xl5aV+\n/fo5dK02bdrYBL/z58/r9ddf12uvvaa5c+c6XG976tWrp8TERB0+fFgtWrRwujwfHx+1atVKrVq1\n0ujRo3XkyBE99dRTOnDggFatWuXwvVsZhqEjR45IqtiQzNutstuzpC+H6tSpo/79++v9999Xjx49\nSp2gpqQ+B8BxTDTjYnl5eVq/fr0kqVOnTpVbmTuQyWTSiy++KEl6++23HX4KdbdyVX9q0aKFfve7\n3xX7Y7FYnKpb+/btZRiG1q1b59Dx1vvo2LGjU9ctr1vRp9q1a2fTns7+MmJtT3uzaN5s/fr1MplM\nt6Q93anfWQPyxYsXSz2ub9++8vLyKlpOYcWKFYqMjCxzZtzSdOvWTe3atdPx48fLvayAu/a7kJAQ\nSSpzKZOYmJiiCWcMw9Dq1avVunVrp75MGjx4sBo2bKgdO3Zo7dq1FS7Hql27djIMQ2vWrHHo+JUr\nV5ZrGKfFYtHjjz8uwzB0+PDhctdv8+bNSk9P1/3336/atWuX+/zbzR3b02KxKDY2VpcvX9Zf//pX\nh68FoPwIhS4WHx+v1NRUtW3b1qlZ1TzZgw8+qD59+ujSpUslTj7hSdy5P/Xq1Uv33nuvdu3apU2b\nNpV6bGpqqhYsWCBvb2+7kwTcSndCnxo4cKCqVaum1atX6+DBg6Uee+zYMa1YsULVq1fXgAEDXF4X\nd+p3p0+flvTvMGNPrVq11LFjR23evFlHjhzRoUOHFBMT4/T1p0yZIrPZrFmzZiklJaVc57pjv7O2\nZ1lPoxs3bqzGjRtr/fr12r17t1JTU51uT7PZXLT25YwZM8q9Vt3NevXqpXvuuUcHDx7U6tWrSz12\n6dKlmjRpkp555hlJv64d2aJFizInarK+w+nIkO4bXbt2TW+//bZMJpNGjhxZrnMri7u25/jx4xUY\nGKjPP/9c+/fvd/g8AOVDKHSRvLw8zZw5U/Hx8QoODtYrr7xS2VW6o02cOFHVq1fX0qVLdeDAgcqu\nzm13J/QnHx8fvfHGGzKZTJowYYLdJ4ZHjx7VsGHDlJGRoeeee67MNfhuFXfvU/fcc49efPFF5efn\na9SoUXaXgvjhhx80YsQI5efn69VXX3VqcpubuVu/Kygo0JtvvimTyVTirJ83i42NVU5OjuLi4uTt\n7e2S944bNGigwYMH69q1a3r11VfLfb479btr167pnXfecbg9Y2JilJqaqjlz5qhGjRrq1q2b03Vo\n06aNHnnkEV2+fFnvvPOOU2X5+PgULVfywgsvlLiMhmEYSkhI0MsvvyxfX1+98MILkn4dlpiVlaXn\nnntOaWlpJZZ/8uRJLVq0SF5eXurRo4fD9Tpz5oyGDx+uU6dOqVu3bnaH6bobd23PoKAgjR07VoWF\nhZo2bZoKCwsrcHcAysI7heV04cIFzZs3r+jvubm5OnPmTNHU5xEREfr73/+u//iP/yi1nNIWd8Wv\nTwWefvppxcXFadq0aUXvs9xt7vT+1LFjR82aNUuTJ0/WhAkTFB8fr7Zt2+ree+9VZmamfvzxR333\n3Xcym82aNGmShg4dWin1lO6MPmV9EvP6669rxIgReuCBB/TQQw8pODhY6enp2rdvn/bu3Ss/MGdg\nbAAAA2RJREFUPz/FxcXpD3/4Q4Wu4079zjAMbdu2TVevXi3alp+fr0uXLmnjxo1KSUlR06ZNHZrg\npFOnTgoJCdG2bdvUpUsXuwvel9fYsWO1Zs0affvtt9qwYUO5wtHt7neGYeirr77SsWPHirbl5eXp\n/PnzWr9+vdLS0tSpU6dis4ra06dPH7399tvatm2bBg8e7LJlZCZNmqQtW7bos88+U79+/Rx6J9me\nTp066W9/+5umTJmiF198UXPnzlWHDh10zz336MKFC9q5c6eSkpIUGhqq2bNnF00mNHnyZJ05c0a7\ndu1S165d1bFjRzVo0EA+Pj5KT09XYmKidu3aJS8vL02aNMnmibl1Dc8bh09mZGQoMTFR27dvV35+\nvvr27VvpX6yUV2W2Z2kGDRqkJUuW6NixY5o3b94d8/QVuJMQCsvBZDIpJSWl2Lh2s9msoKAgNW7c\nWOPGjVN0dLRDk2iYTCaZTKZbWV235si9Dx06VJ9//rmOHj2qjz/+uGi66bul7e6W/tSlSxdt3LhR\nixYt0tatW7V27VpdvXpVfn5+qlu3rkaOHKlBgwbd8ndq3L1POVp+TEyMOnXqpEWLFmnbtm1auXJl\n0XpxkZGRGjt2rAYNGlTh9bbcrd+ZTCZ99dVX+uqrr4ptCwgI0P33369Ro0YpNjbWZubHkq7t5eWl\n/v376x//+EeJE8zYq29Z9+Dv76/nnntOU6dO1RtvvKEOHToUDX9zt35nMpn0+eefF9vm5eWloKAg\nNWrUSH379lWvXr1KPO/muvj7+6t79+5avXq1+vfv79A51u2lCQsL08iRIzV79mxNmzZNy5Ytcyoo\nP/LII2rVqpUSEhK0detWrV69WhkZGapevbruv/9+Pfnkk+rTp0+xUOvn56f58+dr/fr1WrdunQ4d\nOqTNmzcrLy+v6N+uoUOHKjY2tsTJfEwmkzZs2KANGzYUbatWrZpq1aqlvn37KjY2tlxh153+T6us\n9iyNl5eXXnzxRQ0dOlSzZ89Wz549FRoa6vD5AMpmMnhkBQAAAAAey73GTgEAAAAAbitCIQAAAAB4\nMEIhAAAAAHgwQiEAAAAAeDBCIQAAAAB4MEIhAAAAAHgwQiEAAAAAeDBCIQAAAAB4MEIhAAAAAHgw\nQiEAAAAAeDBCIQAAAAB4sP8D0fEvHPseNXUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig_sav()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Lessons Learned (so far ...)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Selecting models based on traditional statistics does not give the best results in terms of cost" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Models should be evaluated taking into account real financial costs of the application" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Algorithms should be developed to incorporate those financial costs" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "
\n", "\n", "
\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# CostCla Library\n", "\n", "- **CostCla** is a Python open source cost-sensitive classification library built on top of Scikit-learn, Pandas and Numpy. \n", "\n", "- Source code, binaries and documentation are distributed under 3-Clause BSD license in the website http://albahnsen.com/CostSensitiveClassification/" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# CostCla Algorithms\n", "\n", "- Cost-proportionate over-sampling [Elkan, 2001] \n", "\n", "- SMOTE [Chawla et al., 2002] \n", "\n", "- Cost-proportionate rejection-sampling [Zadrozny et al., 2003]\n", "\n", "- Thresholding optimization [Sheng and Ling, 2006] \n", "\n", "- Bayes minimum risk [Correa Bahnsen et al., 2014a] \n", "\n", "- Cost-sensitive logistic regression [Correa Bahnsen et al., 2014b] \n", "\n", "- Cost-sensitive decision trees [Correa Bahnsen et al., 2015a] \n", "\n", "- Cost-sensitive ensemble methods: cost-sensitive bagging, cost-sensitive pasting, cost-sensitive random forest and cost-sensitive random patches [Correa Bahnsen et al., 2015c]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# CostCla Databases\n", "\n", "- Credit Scoring1 - Kaggle credit competition [Data], cost matrix: [Correa Bahnsen et al., 2014] \n", "\n", "- Credit Scoring 2 - PAKDD2009 Credit [Data], cost matrix: [Correa Bahnsen et al., 2014a] \n", "\n", "- Direct Marketing - PAKDD2009 Credit [Data], cost matrix: [Correa Bahnsen et al., 2014b] \n", "\n", "- Churn Modeling, soon \n", "\n", "- Fraud Detection, soon" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Future Work\n", "\n", "- CSDT in Cython\n", "- Cost-sensitive class-dependent algorithms\n", "- Sampling algorithms\n", "- Probability calibration (Only ROCCH)\n", "- Other algorithms\n", "- More databases" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "You find the presentation and the IPython Notebook here:\n", " \n", "* http://nbviewer.ipython.org/format/slides/github/\n", "albahnsen/CostSensitiveClassification/blob/\n", "master/doc/tutorials/slides_edcs_fraud_detection.ipynb#/\n", "* https://github.com/albahnsen/CostSensitiveClassification/ blob/master/doc/tutorials/slides_edcs_fraud_detection.ipynb\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Thanks!

\n", "
\n", "\n", " \n", " \n", "\n", "
\n", "\n", " \n", " \n", " \n", " \n", "\n", "al.bahnsen@gmail.com \n", "
\n", " \n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "http://github.com/albahnsen \n", "\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "http://linkedin.com/in/albahnsen \n", "\n", "
\n", "\n", "\n", " \n", " \n", " \n", "\n", " \n", "@albahnsen \n", "\n", "
\n", "
" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Format from https://github.com/ellisonbg/talk-2013-scipy\n", "from IPython.display import display, HTML\n", "s = \"\"\"\n", "\n", "\n", "\"\"\"\n", "display(HTML(s))" ] } ], "metadata": { "celltoolbar": "Slideshow", "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }