openreplay/ee/connectors/data_analysis_cookbook/buying_clients.ipynb
2021-06-17 18:08:44 +03:00

1109 lines
No EOL
131 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"# Identifying bying clients\n",
"\n",
"In this notebook we will create a decision tree based model to identify clients who pay (buyers) and understand what makes a user a client (most relevant features).\n",
"\n",
"We divide our notebook into four stages: data preparation, feature engineering, model building, feature importance analysis"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import psycopg2\n",
"from IPython.display import display\n",
"import yaml\n"
]
},
{
"cell_type": "markdown",
"source": [
"## 1. Data preparation\n",
"\n",
"In this step we load from database (PostgreSQL in this example) data and keep it locally as a CSV file. '\n",
"The main reason for that is to be able to reproduce results quickly."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 2,
"outputs": [],
"source": [
"# Create a connection to the database\n",
"\n",
"# Load a config file with credentials\n",
"conf = yaml.load(\n",
" open(\"credentials.yml\"), Loader=yaml.FullLoader)['pg']\n",
"# Create a connection\n",
"conn = psycopg2.connect(\n",
" host=conf['host'],\n",
" port=conf['port'],\n",
" database=conf['database'],\n",
" user=conf['user'],\n",
" password=conf['password']\n",
")"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"Here we prepare two functions to obtain data from the databases (or .csv files if they were pre-downloaded)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 3,
"outputs": [],
"source": [
"def load_events(source='csv') -> pd.DataFrame:\n",
" \"\"\" Obtains session events from database or csv file\"\"\"\n",
" if source == 'db':\n",
" q = f'select * from connector_events where sessionid IN {sessions}'\n",
" all_events = pd.read_sql(q, conn)\n",
" all_events.to_csv('all_events_1454.csv', index=False)\n",
" elif source == 'csv':\n",
" all_events = pd.read_csv('all_events_1454_sep.csv', sep='|')\n",
" else:\n",
" raise ValueError(\"source parameter should be either 'csv' or 'db'\")\n",
" return all_events\n",
"\n",
"def load_sessions(source='csv') -> pd.DataFrame:\n",
" \"\"\" Obtains sessions information from database or csv file\"\"\"\n",
" if source == 'db':\n",
" q = f\"select * from connector_user_sessions where sessionid in {sessions}\"\n",
" all_sessions = pd.read_sql(q, conn)\n",
" # Saving as a CSV file is optional\n",
" all_sessions.to_csv(\"all_sessions.csv\", sep='|', index=False)\n",
" elif source == 'csv':\n",
" all_sessions = pd.read_csv(\"all_sessions.csv\", sep='|')\n",
" else:\n",
" raise ValueError(\"source parameter should be either 'csv' or 'db'\")\n",
" return all_sessions\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"In the connector's events table we found a client who had a button with a label \"PAY\" by performing a simple query\n",
"\n",
"`q = \"select session_id from connector_events where mouseclick_label = 'PAY\";`\n",
"\n",
"We went on to find all session ids of this client from our internal tables and saved it in `all_sessions_1454.csv`.\n",
"This step is unnecessary for clients and only explained for general clarity.\n",
"**The most important takeaway here, is that we have prepared a list of sessions for which we know\n",
"whether a click on \"PAY\" button has been made or not.**"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 4,
"outputs": [],
"source": [
"sessions_info = pd.read_csv(\"all_sessions_1454.csv\")\n",
"sessions = tuple(sessions_info['session_id'])"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"First off, let's see that the dataset is highly imbalanced, because the number of buyers is much less than the number of ordinary visitors.\n",
"In fact, the percentage of buying clients (0.04%) is so small, it's not event seen on the pie chart.\n",
"Hence we're going to use special techniques for imbalanced datasets."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 5,
"outputs": [
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"buyers_count = sessions_info[sessions_info.paid == 1].shape[0]\n",
"regular_count = sessions_info.shape[0] - buyers_count\n",
"ax = plt.subplot(111)\n",
"wedges, texts, _ = ax.pie(x=(buyers_count, regular_count),\n",
" shadow=False,\n",
" labels=['Paying visitors', 'Regular visitors'],\n",
" autopct='%1.2f%%',\n",
" explode=(0, 0.8))\n",
"\n",
"for w in wedges:\n",
" w.set_linewidth(1)\n",
" w.set_edgecolor('white')\n",
"\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 6,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\users\\david\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\IPython\\core\\interactiveshell.py:3361: DtypeWarning: Columns (9,11,12,13,26) have mixed types.Specify dtype option on import or set low_memory=False.\n",
" if (await self.run_code(code, result, async_=asy)):\n"
]
}
],
"source": [
"all_events = load_events()"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"Let's take a look at the events dataset by printing one session"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 7,
"outputs": [
{
"data": {
"text/plain": " sessionid connectioninformation_downlink \\\n0 4207534060820504 NaN \n2 4207534060820504 NaN \n3 4207534060820504 NaN \n4 4207534060820504 NaN \n5 4207534060820504 NaN \n6 4207534060820504 NaN \n7 4207534060820504 NaN \n\n connectioninformation_type consolelog_level consolelog_value \\\n0 NaN NaN NaN \n2 NaN NaN NaN \n3 NaN NaN NaN \n4 NaN NaN NaN \n5 NaN NaN NaN \n6 NaN NaN NaN \n7 NaN NaN NaN \n\n customevent_messageid customevent_name customevent_payload \\\n0 NaN NaN NaN \n2 NaN NaN NaN \n3 NaN NaN NaN \n4 NaN NaN NaN \n5 NaN NaN NaN \n6 NaN NaN NaN \n7 NaN NaN NaN \n\n customevent_timestamp errorevent_message ... issueevent_messageid \\\n0 NaN NaN ... 5.680858e+09 \n2 NaN NaN ... 5.680913e+09 \n3 NaN NaN ... NaN \n4 NaN NaN ... 5.680859e+09 \n5 NaN NaN ... NaN \n6 NaN NaN ... NaN \n7 NaN NaN ... 5.680898e+09 \n\n issueevent_timestamp issueevent_type \\\n0 1.614202e+12 click_rage \n2 1.614202e+12 click_rage \n3 NaN NaN \n4 1.614202e+12 click_rage \n5 NaN NaN \n6 NaN NaN \n7 1.614202e+12 cpu \n\n issueevent_contextstring issueevent_context \\\n0 SIGN OUT Triston Armstrong DEVELOPER Join GitS... NaN \n2 SAVE & NEXT NaN \n3 NaN NaN \n4 SIGN OUT Triston Armstrong DEVELOPER Join GitS... NaN \n5 NaN NaN \n6 NaN NaN \n7 https://app.gitstart.com/ NaN \n\n issueevent_payload customissue_name customissue_payload \\\n0 NaN NaN NaN \n2 NaN NaN NaN \n3 NaN NaN NaN \n4 NaN NaN NaN \n5 NaN NaN NaN \n6 NaN NaN NaN \n7 {\"Duration\":10581,\"Rate\":94} NaN NaN \n\n received_at batch_order_number \n0 1616761976450 2962 \n2 1616761976855 3003 \n3 1616761976460 2965 \n4 1616761976460 2966 \n5 1616761976464 2968 \n6 1616761976539 2972 \n7 1616761976661 2988 \n\n[7 rows x 49 columns]",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>sessionid</th>\n <th>connectioninformation_downlink</th>\n <th>connectioninformation_type</th>\n <th>consolelog_level</th>\n <th>consolelog_value</th>\n <th>customevent_messageid</th>\n <th>customevent_name</th>\n <th>customevent_payload</th>\n <th>customevent_timestamp</th>\n <th>errorevent_message</th>\n <th>...</th>\n <th>issueevent_messageid</th>\n <th>issueevent_timestamp</th>\n <th>issueevent_type</th>\n <th>issueevent_contextstring</th>\n <th>issueevent_context</th>\n <th>issueevent_payload</th>\n <th>customissue_name</th>\n <th>customissue_payload</th>\n <th>received_at</th>\n <th>batch_order_number</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>5.680858e+09</td>\n <td>1.614202e+12</td>\n <td>click_rage</td>\n <td>SIGN OUT Triston Armstrong DEVELOPER Join GitS...</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976450</td>\n <td>2962</td>\n </tr>\n <tr>\n <th>2</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>5.680913e+09</td>\n <td>1.614202e+12</td>\n <td>click_rage</td>\n <td>SAVE &amp; NEXT</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976855</td>\n <td>3003</td>\n </tr>\n <tr>\n <th>3</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976460</td>\n <td>2965</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>5.680859e+09</td>\n <td>1.614202e+12</td>\n <td>click_rage</td>\n <td>SIGN OUT Triston Armstrong DEVELOPER Join GitS...</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976460</td>\n <td>2966</td>\n </tr>\n <tr>\n <th>5</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976464</td>\n <td>2968</td>\n </tr>\n <tr>\n <th>6</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976539</td>\n <td>2972</td>\n </tr>\n <tr>\n <th>7</th>\n <td>4207534060820504</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>5.680898e+09</td>\n <td>1.614202e+12</td>\n <td>cpu</td>\n <td>https://app.gitstart.com/</td>\n <td>NaN</td>\n <td>{\"Duration\":10581,\"Rate\":94}</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1616761976661</td>\n <td>2988</td>\n </tr>\n </tbody>\n</table>\n<p>7 rows × 49 columns</p>\n</div>"
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"all_events[all_events.sessionid == all_events.iloc[0].sessionid].head(10)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"We mostly see NaNs and that's OK.\n",
"One row in session events files contains user's actions grouped by timestamp.\n",
"For example, if there was a mouse click event at a time $t$, only the columns corresponding to that click\n",
"(such as mouseclick_label, mouseclick_hesitationtime etc) will be filled and the rest will be NaNs.\n",
"The columns sessionid, received_at, batch_order_number will always be filled as the contain information about the\n",
"session unique identifier, the time at which the event was received by connectors worker and the order number\n",
"to ensure the chronological ordering is preserved when inserting in database in batches."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 8,
"outputs": [
{
"data": {
"text/plain": "['sessionid',\n 'connectioninformation_downlink',\n 'connectioninformation_type',\n 'consolelog_level',\n 'consolelog_value',\n 'customevent_messageid',\n 'customevent_name',\n 'customevent_payload',\n 'customevent_timestamp',\n 'errorevent_message',\n 'errorevent_messageid',\n 'errorevent_name',\n 'errorevent_payload',\n 'errorevent_source',\n 'errorevent_timestamp',\n 'jsexception_message',\n 'jsexception_name',\n 'jsexception_payload',\n 'metadata_key',\n 'metadata_value',\n 'mouseclick_id',\n 'mouseclick_hesitationtime',\n 'mouseclick_label',\n 'pageevent_firstcontentfulpaint',\n 'pageevent_firstpaint',\n 'pageevent_messageid',\n 'pageevent_referrer',\n 'pageevent_speedindex',\n 'pageevent_timestamp',\n 'pageevent_url',\n 'pagerendertiming_timetointeractive',\n 'pagerendertiming_visuallycomplete',\n 'rawcustomevent_name',\n 'rawcustomevent_payload',\n 'setviewportsize_height',\n 'setviewportsize_width',\n 'timestamp_timestamp',\n 'user_anonymous_id',\n 'user_id',\n 'issueevent_messageid',\n 'issueevent_timestamp',\n 'issueevent_type',\n 'issueevent_contextstring',\n 'issueevent_context',\n 'issueevent_payload',\n 'customissue_name',\n 'customissue_payload',\n 'received_at',\n 'batch_order_number']"
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's take a glance at all available features\n",
"list(all_events.columns)\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Feature engineering\n",
"\n",
"How are we going to predict buying users?\n",
"What kind of features identify them?\n",
"\n",
"- Did the user visit the website earlier?\n",
"- Was the website not illustrating images?\n",
"- Did users experience many issues on the website?\n",
"- What pages did he visit?\n",
"\n",
"All of those questions sound important.\n",
"In these section we will extract the answers to this questions from the datasets of events and sessions for each user.\n",
"We'll create a vector of numerical features and assign them to each user who visited the site.\n",
"Our goal is to see if the feature sets or buyers and is separable by some nonlinear function with a good precision. We'll be looking for this function using decision trees model.\n",
"Of course one can experiment further by applying any other algorithm."
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"Unfortunately, none of the paying clients received ids.\n",
"Hence we'll only be looking into the session features."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 9,
"outputs": [],
"source": [
"# Create a DataFrame for session features\n",
"labels = sessions_info['paid']\n",
"session_features = sessions_info.drop(['paid'], axis=1)\n",
"session_features.rename({'session_id': 'sessionid'}, axis=1, inplace=True)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"Let's get to some meaningful features. For example, let's create a function\n",
"that will tell if a specific event happened during the session."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 10,
"outputs": [],
"source": [
"def add_feature_about_event_presence(session_features, column, feature_name, dtype='int'):\n",
" temp_sessions = all_events[['sessionid', column]].dropna()\n",
" temp_sessions = temp_sessions.drop_duplicates(subset='sessionid', keep='last')\n",
" if temp_sessions.shape[0] == 0:\n",
" return session_features\n",
" session_features = session_features.merge(temp_sessions, how='left', on='sessionid')\n",
"\n",
" if dtype == 'int':\n",
" session_features.loc[session_features[column] > 0, feature_name] = 1\n",
" elif dtype == 'str':\n",
" session_features.loc[session_features[column] != '', feature_name] = 1\n",
" session_features[feature_name] = session_features[feature_name].fillna(0)\n",
" session_features = session_features.drop([column], axis=1)\n",
" return session_features"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 11,
"outputs": [],
"source": [
"for column, feature_name in [('errorevent_messageid', 'error_event'),\n",
" ('customevent_messageid', 'custom_event'),\n",
" ('jsexception_message', 'js_exception'),\n",
" ('customissue_name', 'custom_issue')\n",
" ]:\n",
" session_features = add_feature_about_event_presence(session_features, column, feature_name)\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"At some point it's interesting to take a look\n",
"at the maximum values of some parameters during the session.\n",
"These features can be added with the function below:"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 12,
"outputs": [],
"source": [
"def add_max_val(session_features, column):\n",
" feature_df = all_events[['sessionid', column]].dropna()\n",
" feature_df_agg = feature_df.groupby('sessionid').agg('max').reset_index()\n",
" if feature_df_agg.shape[0] > 0:\n",
" session_features = session_features.merge(feature_df_agg, how='left', on='sessionid')\n",
" session_features[col] = session_features[col].fillna(0)\n",
" return session_features"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 13,
"outputs": [],
"source": [
"max_feature_columns = ['pageevent_firstcontentfulpaint',\n",
" 'pageevent_firstpaint',\n",
" 'pageevent_speedindex',\n",
" 'pagerendertiming_timetointeractive',\n",
" 'pagerendertiming_visuallycomplete',\n",
" 'rawcustomevent_name',\n",
" 'rawcustomevent_payload',\n",
" 'setviewportsize_height',\n",
" 'setviewportsize_width']\n",
"\n",
"for col in max_feature_columns:\n",
" session_features = add_max_val(session_features, col)\n",
"\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"We also should handle categorical variables, the ones that can take on one of a limited,\n",
"and usually fixed, number of possible values (such us user's browser)."
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 14,
"outputs": [],
"source": [
"def add_categorial_feature(session_features, column, feature_name):\n",
" categories = list(session_features[column].unique())\n",
" session_features[feature_name] = pd.Categorical(session_features[column], categories=categories).codes"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 15,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\users\\david\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\IPython\\core\\interactiveshell.py:3361: DtypeWarning: Columns (1,2,3,4,5,8,9,10,11) have mixed types.Specify dtype option on import or set low_memory=False.\n",
" if (await self.run_code(code, result, async_=asy)):\n"
]
}
],
"source": [
"# Get additional information from sessions table\n",
"sessions_table = load_sessions()"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 16,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"54057\n"
]
}
],
"source": [
"sessions_table = sessions_table.drop_duplicates(subset=['sessionid'], keep='last')\n",
"print(sessions_table.shape[0])"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 17,
"outputs": [],
"source": [
"for iss in ['click_rage', 'missing_resource', 'dead_click', 'js_exception', 'bad_request', 'cpu', 'memory']:\n",
" session_features[iss] = session_features['issue_types'].apply(lambda x: 1 if iss in x else 0)\n",
"session_features = session_features.drop(['issue_types'], axis=1)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 18,
"outputs": [
{
"data": {
"text/plain": " sessionid events_count pages_count error_event \\\n0 4323603410944837 2 1 0.0 \n1 4323604627948361 11 1 0.0 \n2 4323603204776517 1 1 0.0 \n3 4323548146402182 37 7 0.0 \n4 4323554393301661 10 3 0.0 \n5 4323594072990251 17 5 0.0 \n6 4323655897228014 1 1 0.0 \n7 4323630712718240 7 1 0.0 \n8 4323592422793765 11 1 0.0 \n9 4323618781102971 7 2 0.0 \n\n pageevent_firstcontentfulpaint pageevent_firstpaint pageevent_speedindex \\\n0 0.0 0.0 0.0 \n1 0.0 0.0 0.0 \n2 0.0 0.0 0.0 \n3 3940.0 3850.0 3825.0 \n4 0.0 0.0 0.0 \n5 0.0 0.0 166.0 \n6 0.0 0.0 0.0 \n7 0.0 0.0 0.0 \n8 2312.0 2251.0 2312.0 \n9 0.0 0.0 0.0 \n\n pagerendertiming_timetointeractive pagerendertiming_visuallycomplete \\\n0 0.0 0.0 \n1 0.0 0.0 \n2 0.0 0.0 \n3 0.0 0.0 \n4 0.0 0.0 \n5 0.0 0.0 \n6 0.0 0.0 \n7 0.0 0.0 \n8 0.0 0.0 \n9 0.0 0.0 \n\n setviewportsize_height setviewportsize_width click_rage \\\n0 0.0 0.0 0 \n1 0.0 0.0 1 \n2 0.0 0.0 0 \n3 0.0 0.0 1 \n4 0.0 0.0 0 \n5 0.0 0.0 0 \n6 0.0 0.0 0 \n7 0.0 0.0 0 \n8 0.0 0.0 0 \n9 0.0 0.0 1 \n\n missing_resource dead_click js_exception bad_request cpu memory \n0 0 0 0 0 0 0 \n1 0 0 0 0 0 0 \n2 0 0 0 0 1 0 \n3 1 0 0 0 1 0 \n4 0 0 0 0 0 0 \n5 0 0 0 0 1 0 \n6 0 0 0 0 0 0 \n7 0 0 0 0 0 0 \n8 0 1 0 0 0 0 \n9 0 0 0 0 0 0 ",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>sessionid</th>\n <th>events_count</th>\n <th>pages_count</th>\n <th>error_event</th>\n <th>pageevent_firstcontentfulpaint</th>\n <th>pageevent_firstpaint</th>\n <th>pageevent_speedindex</th>\n <th>pagerendertiming_timetointeractive</th>\n <th>pagerendertiming_visuallycomplete</th>\n <th>setviewportsize_height</th>\n <th>setviewportsize_width</th>\n <th>click_rage</th>\n <th>missing_resource</th>\n <th>dead_click</th>\n <th>js_exception</th>\n <th>bad_request</th>\n <th>cpu</th>\n <th>memory</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>4323603410944837</td>\n <td>2</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>4323604627948361</td>\n <td>11</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>4323603204776517</td>\n <td>1</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>4323548146402182</td>\n <td>37</td>\n <td>7</td>\n <td>0.0</td>\n <td>3940.0</td>\n <td>3850.0</td>\n <td>3825.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>1</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4323554393301661</td>\n <td>10</td>\n <td>3</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>5</th>\n <td>4323594072990251</td>\n <td>17</td>\n <td>5</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>166.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n <tr>\n <th>6</th>\n <td>4323655897228014</td>\n <td>1</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>7</th>\n <td>4323630712718240</td>\n <td>7</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>8</th>\n <td>4323592422793765</td>\n <td>11</td>\n <td>1</td>\n <td>0.0</td>\n <td>2312.0</td>\n <td>2251.0</td>\n <td>2312.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>9</th>\n <td>4323618781102971</td>\n <td>7</td>\n <td>2</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"session_features.head(10)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 19,
"outputs": [
{
"data": {
"text/plain": "(57794, 18)"
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"session_features.shape"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 20,
"outputs": [],
"source": [
"def add_one_hot_encoded_feature(origin_df, session_features, column):\n",
" df = origin_df[['sessionid', column]]\n",
" dummies = pd.get_dummies(df[column], prefix=column, dummy_na=True)\n",
" df = pd.concat([df, dummies], axis=1)\n",
" session_features = session_features.merge(df, how='left', on='sessionid')\n",
" session_features = session_features.drop([column], axis=1)\n",
" return session_features"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 21,
"outputs": [],
"source": [
"for col in ['user_browser', 'user_country', 'user_device', 'connection_type']:\n",
" session_features = add_one_hot_encoded_feature(sessions_table, session_features, col)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 22,
"outputs": [
{
"data": {
"text/plain": "(57794, 34)"
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"session_features.shape"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 23,
"outputs": [],
"source": [
"columns_to_merge = ['connection_effective_bandwidth', 'session_start_timestamp',\n",
" 'session_duration', 'user_device_heap_size',\n",
" 'user_device_memory_size', 'avg_cpu', 'avg_fps', 'max_cpu',\n",
" 'max_fps', 'max_total_js_heap_size', 'max_used_js_heap_size',\n",
" 'js_exceptions_count', 'long_tasks_total_duration', 'long_tasks_max_duration',\n",
" 'long_tasks_count', 'inputs_count', 'clicks_count', 'sessionid'\n",
" ]\n",
"session_features = session_features.merge(sessions_table[columns_to_merge],\n",
" how='left',\n",
" on='sessionid')"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 24,
"outputs": [
{
"data": {
"text/plain": " sessionid events_count pages_count error_event \\\n0 4323603410944837 2 1 0.0 \n1 4323604627948361 11 1 0.0 \n2 4323603204776517 1 1 0.0 \n3 4323548146402182 37 7 0.0 \n4 4323554393301661 10 3 0.0 \n\n pageevent_firstcontentfulpaint pageevent_firstpaint pageevent_speedindex \\\n0 0.0 0.0 0.0 \n1 0.0 0.0 0.0 \n2 0.0 0.0 0.0 \n3 3940.0 3850.0 3825.0 \n4 0.0 0.0 0.0 \n\n pagerendertiming_timetointeractive pagerendertiming_visuallycomplete \\\n0 0.0 0.0 \n1 0.0 0.0 \n2 0.0 0.0 \n3 0.0 0.0 \n4 0.0 0.0 \n\n setviewportsize_height ... max_cpu max_fps max_total_js_heap_size \\\n0 0.0 ... 89.0 120.0 51399294.0 \n1 0.0 ... 0.0 0.0 0.0 \n2 0.0 ... 90.0 190.0 49323074.0 \n3 0.0 ... 68.0 60.0 140152925.0 \n4 0.0 ... 38.0 61.0 86162824.0 \n\n max_used_js_heap_size js_exceptions_count long_tasks_total_duration \\\n0 46629158.0 0.0 9161.0 \n1 0.0 0.0 0.0 \n2 47140794.0 0.0 407.0 \n3 121761837.0 0.0 0.0 \n4 82145777.0 0.0 0.0 \n\n long_tasks_max_duration long_tasks_count inputs_count clicks_count \n0 68.0 7.0 0.0 0.0 \n1 0.0 0.0 1.0 0.0 \n2 73.0 3.0 1.0 0.0 \n3 0.0 0.0 0.0 0.0 \n4 0.0 0.0 0.0 0.0 \n\n[5 rows x 51 columns]",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>sessionid</th>\n <th>events_count</th>\n <th>pages_count</th>\n <th>error_event</th>\n <th>pageevent_firstcontentfulpaint</th>\n <th>pageevent_firstpaint</th>\n <th>pageevent_speedindex</th>\n <th>pagerendertiming_timetointeractive</th>\n <th>pagerendertiming_visuallycomplete</th>\n <th>setviewportsize_height</th>\n <th>...</th>\n <th>max_cpu</th>\n <th>max_fps</th>\n <th>max_total_js_heap_size</th>\n <th>max_used_js_heap_size</th>\n <th>js_exceptions_count</th>\n <th>long_tasks_total_duration</th>\n <th>long_tasks_max_duration</th>\n <th>long_tasks_count</th>\n <th>inputs_count</th>\n <th>clicks_count</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>4323603410944837</td>\n <td>2</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>...</td>\n <td>89.0</td>\n <td>120.0</td>\n <td>51399294.0</td>\n <td>46629158.0</td>\n <td>0.0</td>\n <td>9161.0</td>\n <td>68.0</td>\n <td>7.0</td>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>4323604627948361</td>\n <td>11</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>...</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>4323603204776517</td>\n <td>1</td>\n <td>1</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>...</td>\n <td>90.0</td>\n <td>190.0</td>\n <td>49323074.0</td>\n <td>47140794.0</td>\n <td>0.0</td>\n <td>407.0</td>\n <td>73.0</td>\n <td>3.0</td>\n <td>1.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>4323548146402182</td>\n <td>37</td>\n <td>7</td>\n <td>0.0</td>\n <td>3940.0</td>\n <td>3850.0</td>\n <td>3825.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>...</td>\n <td>68.0</td>\n <td>60.0</td>\n <td>140152925.0</td>\n <td>121761837.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4323554393301661</td>\n <td>10</td>\n <td>3</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>...</td>\n <td>38.0</td>\n <td>61.0</td>\n <td>86162824.0</td>\n <td>82145777.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 51 columns</p>\n</div>"
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"session_features = session_features.dropna(how='all', axis=0)\n",
"session_features = session_features.fillna(0)\n",
"session_features.head()\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 25,
"outputs": [
{
"data": {
"text/plain": "(57794, 51)"
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"session_features.shape"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 25,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Build model"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "markdown",
"source": [
"Decision tree model is chosen because it is known to work great with heterogenous datasets and correlated features"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 26,
"outputs": [],
"source": [
"import xgboost as xgb\n",
"import sklearn\n",
"from sklearn.model_selection import train_test_split"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 27,
"outputs": [],
"source": [
"x_train, x_test, y_train, y_test = train_test_split(session_features.drop(['sessionid'], axis=1),\n",
" labels,\n",
" test_size=0.15,\n",
" random_state=42)\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 28,
"outputs": [
{
"data": {
"text/plain": "(6, 17)"
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Ensure that test set has paying clients\n",
"sum(y_test), sum(y_train)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 29,
"outputs": [
{
"data": {
"text/plain": "0.0003460630241836984"
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Ratio of paying sessions will be denoted by EPSILON\n",
"EPSILON = y_train[y_train == 1].shape[0]/y_train.shape[0]\n",
"EPSILON"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 30,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\users\\david\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\xgboost\\sklearn.py:888: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n",
" warnings.warn(label_encoder_deprecation_msg, UserWarning)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[17:33:08] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n"
]
},
{
"data": {
"text/plain": "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,\n importance_type='gain', interaction_constraints='',\n learning_rate=0.300000012, max_delta_step=0, max_depth=6,\n min_child_weight=1, missing=nan, monotone_constraints='()',\n n_estimators=100, n_jobs=8, num_parallel_tree=1, random_state=0,\n reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,\n tree_method='exact', validate_parameters=1, verbosity=None)"
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xgc0 = xgb.XGBClassifier()\n",
"xgc0.fit(x_train, y_train)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 31,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[17:33:09] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n"
]
},
{
"data": {
"text/plain": "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,\n importance_type='gain', interaction_constraints='',\n learning_rate=0.300000012, max_delta_step=0, max_depth=6,\n min_child_weight=1, missing=nan, monotone_constraints='()',\n n_estimators=100, n_jobs=8, num_parallel_tree=1, random_state=0,\n reg_alpha=0, reg_lambda=1, scale_pos_weight=2889.6470588235293,\n subsample=1, tree_method='exact', validate_parameters=1,\n verbosity=None)"
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xgc = xgb.XGBClassifier(scale_pos_weight=1/EPSILON)\n",
"xgc.fit(x_train, y_train)\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Evaluate and choose the best model\n",
"\n",
"In this section we will built two models\n",
"and see at their performances using different metrics"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 32,
"outputs": [],
"source": [
"from datetime import datetime\n",
"from xgboost import plot_importance\n",
"from sklearn.metrics import plot_roc_curve, recall_score, precision_score, accuracy_score, confusion_matrix\n",
"from sklearn.metrics import plot_confusion_matrix, precision_recall_curve, plot_precision_recall_curve\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 33,
"outputs": [],
"source": [
"def report(models, x_test, y_test, y_pred=None, model_names=None):\n",
"\n",
" fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 14))\n",
"\n",
" for model, name in zip(models, model_names):\n",
"\n",
" y_out = model.predict(x_test)\n",
"\n",
" precision = precision_score(y_test, y_out)\n",
" recall = recall_score(y_test, y_out)\n",
" accuracy = accuracy_score(y_test, y_out)\n",
"\n",
" print(f'Model: {name}')\n",
" print(f'Precision: {precision}')\n",
" print(f'Recall: {recall}')\n",
" print(f'Accuracy: {accuracy}')\n",
" print('-------------------------')\n",
" print()\n",
"\n",
" roc_auc = plot_roc_curve(model, x_test, y_test, ax=ax1)\n",
" precision_recall = plot_precision_recall_curve(model, x_test, y_test, ax=ax2)\n",
"\n",
" date_time = datetime.now().strftime(\"%m_%d_%H_%M_%S\")\n",
" plt.savefig(f'report_{date_time}.png', dpi=300)\n",
" plt.show()\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 34,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: XGBClassifier\n",
"Precision: 0.8\n",
"Recall: 0.6666666666666666\n",
"Accuracy: 0.9996539792387543\n",
"-------------------------\n",
"\n",
"Model: Weighted XGBClassifier\n",
"Precision: 0.6666666666666666\n",
"Recall: 1.0\n",
"Accuracy: 0.9996539792387543\n",
"-------------------------\n",
"\n"
]
},
{
"data": {
"text/plain": "<Figure size 864x1008 with 2 Axes>",
"image/png": "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OPaYMWPYaqutGDJkCDvttBM/+9nPANhrr72YOnVqIfVPnTqVr3/96wAsXryYT3/60wwZMoQbb7yRL33pS9TX11d1/LFjxzbUDbBkyRJ69OjBaaedtly7Pn368M9//rNhecqUKRx44IENy3fccQd1dXUMGjSIHXbYgW9961tV1QXw3e9+l80335z1119/pe3+93//l/79+7PlllsyefLkhvV33nknW265Jf379+f8889vWH/UUUcxY8aMqusDw7UkSVrLbL755pxwwgkNYfG0007j+OOPp0+fPixatIgDDjiA448/nhdffJEnnniCH/3oR7z00ksN+48aNYpp06Yxffp01llnHW688UYArrzySu6++24ee+wxpk2bxr333ktmFl5/XV0dl156KQBPPvkkANOmTWPUqFH85Cc/YdCgQRUfa+nSpcstL1myhHHjxnH00Uc3rLv77rsZOHAgN998c8Xv55lnnuGrX/0qv/jFL6ivr2fq1Kn079+/4rpW5KCDDuKxxx5baZv6+npuuOEGpk+fzp133smJJ57I0qVLWbp0KSeddBJ33HEH9fX1TJgwoeEXkRNOOIELL7yw6vrA2UIkSVIHOvu26dT/bWGhxxz0se6cedDglbb5xje+wdChQxk7diwPPfQQl112GQDXX389w4YN4+CDD25ou80227DNNtt84BhLlizhrbfeYqONNgLgvPPOY8qUKXTv3h2A7t2784UvfOED+51wwgk8/vjjvPPOOxxxxBGcffbZQCnkT5w4kc6dO7PPPvswZswYbr75Zs4++2w6derEhhtuyIMPPsiUKVMYM2YM48aN45hjjmHu3LkMGTKEX//61xx33HGMGTOGuro67rrrLs4880wWL15Mv379uPbaa1l//fXp06cPo0aN4u677+bUU0/lqKOOaqjtvvvuY8cdd6Rz539FxAkTJnDyySdzxRVX8Mgjj7Dbbru1eA0uvPBCvvvd77LVVlsB0KlTJ0444YQW92vJrrvu2mKbW2+9laOOOop1112Xvn370r9//4ZA3r9/f7bYYgug1Ft96623MmjQID75yU9y7LHHsmTJkuXee2sYriVJ0lqnS5cuXHTRRYwcOZK77rqrYR7j6dOns+OOO6503xtvvJGHHnqIOXPmMHDgQA466CAWLlzIG2+80RDcVuYHP/gBG2+8MUuXLmXvvffm6aefpmfPntxyyy0899xzRASvv/46AOeccw6TJ0+mZ8+eDeuW2WyzzfjJT37CmDFjmDRp0nLb/vnPf3Luuedyzz33sN5663HBBRdw8cUXc8YZZwCwySab8Kc//ekDtT388MMMHTq0YXnRokXcc889XHXVVbz++utMmDChonD9zDPPVDQM5P777+cb3/jGB9Z/+MMf5g9/+EOL+zfn1VdfXS6E9+rVi1dffRUo/dWi8fo//vGPAHzoQx+if//+PPXUU8u9/9YwXEuSpA7TUg9zW7rjjjv46Ec/yjPPPMOIESOabXPooYcyY8YMBg4cyG9+8xugNCzksssuIzM56aSTuOiiizjxxBMrPu9NN93E1VdfzZIlS5gzZw719fUMGjSIrl27ctxxx3HggQc2jF3efffdOfbYYznyyCM57LDDKj7Ho48+Sn19PbvvvjsA7777LsOGDWvYPmrUqGb3mzNnDltvvXXD8qRJkxg+fDjdunXj8MMP5/vf/z5jx46lU6dOzc6ksaqzawwfPpxp06at0j5tZbPNNuNvf/tb1eHaMdeSJGmtM23aNO6++24effRRLrnkEubMmQPA4MGDl+vRveWWWxg/fnzDzY+NRQQHHXQQDz74IN27d2f99ddfbmx2c15++WXGjBnDvffey9NPP80BBxzAokWL6Ny5M4899hhHHHEEkyZNYuTIkUBpHPe5557LrFmzGDp0KPPmzavo/WUmI0aMYNq0aUybNo36+np++tOfNmxfb731mt2vW7duy83rPGHCBO655x769OnTcP777rsPKPV+z58/v6Hta6+9xqabbgqUPscnnniixTrvv/9+hgwZ8oGvSnrHV6Rnz57MmjWrYXn27Nn07NlzheuXWbRoEd26dWv1eZcxXEuSpLVKZnLCCScwduxYevfuzSmnnMK3v/1tAI4++mgefvhhJk6c2NC+8WwgTT300EP069cPgO985zucdNJJLFxYGkP+5ptvLjfrBsDChQtZb7312HDDDfn73//OHXfc0dB2wYIF7L///lxyySU89dRTALz44ovssssunHPOOfTo0WO5cLgyu+66Kw8//DAzZ84E4K233uKFF15ocb+tt966YZ+FCxfy+9//nr/+9a+88sorvPLKK1x++eVMmDABKM2A8vOf/xwo3Rj5i1/8guHDhwNwyimncN555zWc8/333+fKK6/8wPmW9Vw3/WrtkBCAgw8+mBtuuIHFixfz8ssvM2PGDHbeeWd22mknZsyYwcsvv8y7777LDTfcsNzY+hdeeKHZsfWrynAtSZLWKtdccw29e/duGApy4okn8uyzz/LAAw/QrVs3Jk2axJVXXskWW2zBsGHDOPfcc/ne977XsP+NN97IkCFD2G677XjyySc5/fTTgdKNisOHD2ennXZim2224ZOf/CQf+tDyUWv77bdnhx12YKuttuLoo49uGLbxxhtvcOCBB7LddtvxiU98gosvvhgohdRtt92WbbbZht12243tt9++ovfYo0cPxo8fz+jRo9luu+0YNmwYzz33XIv77bfffg3TDt5yyy186lOfYt11123Yfsghh3DbbbexePFiTj/9dGbOnNnwnvr3788xxxwDwHbbbcfYsWMZPXo0W2+9Ndtss02LvfqVOPXUU+nVqxdvv/02vXr14qyzzgJg4sSJDePJBw8ezJFHHsmgQYMYOXIkl19+OZ06daJz585cdtll7Lvvvmy99dYceeSRDB5cGpb097//nW7duvHv//7vVdcYbTFFTEeoq6vLouaPXBXTz/sEAIP/56F2P7ckSbXo2WefXW5cr1Yvhx56KBdeeCEDBgzo6FLazSWXXEL37t057rjjPrCtuZ/XiHgiM+uaO5Y915IkSWpw/vnnN4xBX1t85CMfaXbaxNZwthBJkiQ12HLLLdlyyy07uox29cUvfrGwY9lzLUmSJBXEcC1JkiQVpEPCdUSMjIjnI2JmRJzWzPZ1I+LG8vY/RkSfDihTkiRJWiXtHq4johNwObAfMAgYHRGDmjQ7Dpifmf2BS4AL2rdKSZIkadV1RM/1zsDMzHwpM98FbgAOadLmEOC68utfAXvHqj5PU5IkqRmzZs2ib9++DU9dnD9/Pn379uWVV14BYMaMGRx44IH069ePoUOHMnz48Ia5n8ePH0+PHj0YMmQIgwcP5ogjjljuITNjxoxhq622YsiQIey0004ND5HZa6+9KGrK4KlTp/L1r38dgMWLF/PpT3+aIUOGcOONN/KlL32J+vr6qo4/duzY5R5+s2TJEnr06MFppy0/2KBPnz7885//bFieMmVKw2PbofR4+bq6OgYNGsQOO+zAt771rarqAvjud7/L5ptvzvrrr7/Sdv/7v/9L//792XLLLZk8eXLD+jvvvJMtt9yS/v37c/755zesP+qoo5gxY0bV9UHHhOueQOPHC80ur2u2TWYuARYAm7RLdZIkaY22+eabc8IJJzSExdNOO43jjz+ePn36sGjRIg444ACOP/54XnzxRZ544gl+9KMfLfcAlFGjRjFt2jSmT5/OOuusw4033giUHlV+991389hjjzFt2jTuvfde2uJ5InV1dVx66aUAPPnkk0Dpce6jRo3iJz/5CYMGNR0QsGJLly5dbnnJkiWMGzeOo48+umHd3XffzcCBA7n55psrfj/PPPMMX/3qV/nFL35BfX09U6dOpX///hXXtSIHHXQQjz322Erb1NfXc8MNNzB9+nTuvPNOTjzxRJYuXcrSpUs56aSTuOOOO6ivr2fChAkNv4iccMIJXHjhhVXXBzU+FV9EHA8cD9C7d+8OqeGNjzgJviRJrXbHafB/fy72mP++Lex3/kqbfOMb32Do0KGMHTuWhx56iMsuuwyA66+/nmHDhi33WOxtttmm2cdiL1myhLfeeouNNtoIgPPOO48pU6bQvXt3ALp3797s3MknnHACjz/+OO+88w5HHHEEZ599NlAK+RMnTqRz587ss88+jBkzhptvvpmzzz6bTp06seGGG/Lggw8yZcoUxowZw7hx4zjmmGOYO3cuQ4YM4de//jXHHXccY8aMoa6ujrvuuoszzzyTxYsX069fP6699lrWX399+vTpw6hRo7j77rs59dRTOeqooxpqu++++9hxxx3p3PlfEXHChAmcfPLJXHHFFTzyyCPstttuLV6CCy+8kO9+97tstdVWAHTq1IkTTjihxf1asuuuu7bY5tZbb+Woo45i3XXXpW/fvvTv378hkPfv358tttgCKPVW33rrrQwaNIhPfvKTHHvssSxZsmS5994aHRGuXwU2b7Tcq7yuuTazI6IzsCEwr+mBMvNq4GooPaGxTaptwa4nXtMRp5UkSVXo0qULF110ESNHjuSuu+6iS5cuAEyfPp0dd9xxpfveeOONPPTQQ8yZM4eBAwdy0EEHsXDhQt54442G4LYyP/jBD9h4441ZunQpe++9N08//TQ9e/bklltu4bnnniMieP311wE455xzmDx5Mj179mxYt8xmm23GT37yE8aMGcOkSZOW2/bPf/6Tc889l3vuuYf11luPCy64gIsvvrjhEeGbbLIJf/rTnz5Q28MPP8zQoUMblhctWsQ999zDVVddxeuvv86ECRMqCtfPPPNMRcNA7r//fr7xjW98YP2HP/xh/vCHP7S4f3NeffXV5UJ4r169ePXVUtTcfPPNl1v/xz/+EYAPfehD9O/fn6eeemq5998aHRGuHwcGRERfSiH6KODoJm0mAl8AHgGOAO7LNeU57ZIk6V9a6GFuS3fccQcf/ehHeeaZZxgxYkSzbQ499FBmzJjBwIED+c1vfgOUhoVcdtllZCYnnXQSF110ESeeeGLF573pppu4+uqrWbJkCXPmzKG+vp5BgwbRtWtXjjvuOA488MCGscu77747xx57LEceeSSHHXZYxed49NFHqa+vZ/fddwfg3XffZdiwYQ3bR40a1ex+c+bMWe5R35MmTWL48OF069aNww8/nO9///uMHTuWTp060dztcKt6i9zw4cOZNm3aKu3TVjbbbDP+9re/VR2u233MdXkM9VeBycCzwE2ZOT0izomIZX+D+SmwSUTMBL4JfGC6PkmSpNaaNm0ad999N48++iiXXHJJw+O+Bw8evFyP7i233ML48eMbbn5sLCI46KCDePDBB+nevTvrr7/+cmOzm/Pyyy8zZswY7r33Xp5++mkOOOAAFi1aROfOnXnsscc44ogjmDRpEiNHjgRK47jPPfdcZs2axdChQ5k37wN/yG9WZjJixAimTZvGtGnTqK+v56c//WnD9vXWW6/Z/bp168aiRYsalidMmMA999xDnz59Gs5/3333AaXe7/nz5ze0fe2119h0002B0uf4xBNPtFjn/fffz5AhQz7wVUnv+Ir07NmTWbP+dXvf7Nmz6dmz5wrXL7No0SK6devW6vMu0yHzXGfm7Zk5MDP7ZeYPyuvOyMyJ5deLMvOzmdk/M3fOzJX/pEqSJFUoMznhhBMYO3YsvXv35pRTTuHb3/42AEcffTQPP/wwEydObGjfeDaQph566CH69esHwHe+8x1OOukkFi5cCMCbb7653KwbAAsXLmS99dZjww035O9//zt33HFHQ9sFCxaw//77c8kll/DUU08B8OKLL7LLLrtwzjnn0KNHj+XC4crsuuuuPPzww8ycOROAt956ixdeeKHF/bbeeuuGfRYuXMjvf/97/vrXv/LKK6/wyiuvcPnllzNhwgSgNAPKz3/+c6B0Y+QvfvELhg8fDsApp5zCeeed13DO999/nyuvvPID51vWc930q7VDQgAOPvhg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qXz9618HYPHixXz6059myJAh3HjjjXzpS1+ivr66SzJ27NiGugGWLFlCjx49OO205Wdt3Guvvdhyyy3Zfvvt2X333Xn++eerOi/Addddx4ABAxgwYADXXXdds22mTZvGrrvuypAhQ6irq+Oxxx4DYMGCBRx00EFsv/32DB48mGuvvRaAuXPnMnLkyKprkyRJNSwz14ivoUOHZlP19fUfWNfeLrjggvzyl7+cmZnHH398nnfeeZmZ+c477+SAAQPy1ltvbWj75z//Oa+99trMzLz22mvzpJNOatg2evToHDduXGZmXnHFFbnPPvvkggULMjNzwYIFOX78+MzM3HPPPfPxxx8v/H088sgjuffee7d6/yVLliy3/N577+W2226b7733XsO622+/PXfbbbfcYost8v33329Y3/g9XXXVVXnQQQe1uo7MzHnz5mXfvn1z3rx5+dprr2Xfvn3ztdde+0C7ESNG5O23356Zmb/73e9yzz33zMzMH/zgB3nqqadmZuY//vGP3GijjXLx4sWZmXnsscfmQw891Ox5V4efR0lSK5zZvfQllQFTcwWZtC1nC1mtnH3bdOr/trDQYw76WHfOPGjwStt84xvfYOjQoYwdO5aHHnqIyy67DIDrr7+eYcOGcfDBBze03Wabbdhmm20+cIwlS5bw1ltvsdFGGwFw3nnnMWXKFLp37w5A9+7d+cIXvvCB/U444QQef/xx3nnnHY444gjOPvtsAE477TQmTpxI586d2WeffRgzZgw333wzZ599Np06dWLDDTfkwQcfZMqUKYwZM4Zx48ZxzDHHMHfuXIYMGcKvf/1rjjvuOMaMGUNdXR133XUXZ555JosXL6Zfv35ce+21rL/++vTp04dRo0Zx9913c+qpp3LUUUc11Hbfffex44470rnzv34EJ0yYwMknn8wVV1zBI488wm677faB97THHnswduzYlX7mLZk8eTIjRoxg4403BmDEiBHceeedjB49erl2EcHChaWfmQULFvCxj32sYf0bb7xBZvLmm2+y8cYbN7yPz3zmM1x//fXsvvvuVdUoSZJq01oTrjtKly5duOiiixg5ciR33XVXwzzH06dPZ8cdd1zpvjfeeCMPPfQQc+bMYeDAgRx00EEsXLiQN954gy222KLFc//gBz9g4403ZunSpey99948/fTT9OzZk1tuuYXnnnuOiOD1118H4JxzzmHy5Mn07NmzYd0ym222GT/5yU8YM2YMkyZNWm7bP//5T84991zuuece1ltvPS644AIuvvhizjjjDAA22WQT/vSnP32gtocffpihQ4c2LC9atIh77rmHq666itdff50JEyY0G65vu+02tt122w+sv+iii7j++us/sH6PPfbg0ksvXW7dq6++yuab/+te2169evHqq03vtS0NW9l333359re/zfvvv88f/vAHAL761a9y8MEH87GPfYw33niDG2+8kQ99qDTCqq6uju9973sfOJYkSVo7rDXhuqUe5rZ0xx138NGPfpRnnnmGESNGNNvm0EMPZcaMGQwcOJDf/OY3AIwaNYrLLruMzOSkk07ioosu4sQTT6z4vDfddBNXX301S5YsYc6cOdTX1zNo0CC6du3Kcccdx4EHHsiBBx4IwO67786xxx7LkUceyWGHHVbxOR599FHq6+sbemrfffddhg0b1rB91KhRze43Z84ctt5664blSZMmMXz4cLp168bhhx/O97//fcaOHUunTp0A+NznPke3bt3o06cPP/rRjz5wvFNOOYVTTjml4rorccUVV3DJJZdw+OGHc9NNN3Hcccdxzz33MHnyZIYMGcJ9993Hiy++yIgRI/jkJz9J9+7d2Wyzzfjb3/5WaB2SJKl2dPQ812u8adOmcffdd/Poo49yySWXMGfOHAAGDx68XI/uLbfcwvjx4xtufmwsIjjooIN48MEH6d69O+uvvz4vvfTSSs/78ssvM2bMGO69916efvppDjjgABYtWkTnzp157LHHOOKII5g0aVLDDXhXXnkl5557LrNmzWLo0KHMmzevoveXmYwYMYJp06Yxbdo06uvr+elPf9qwfb311mt2v27dui037/OECRO455576NOnT8P577vvvobt119/PdOmTeO3v/3tcr3Oy1x00UUMGTLkA1/LbshsrGfPnsya9a/nG82ePZuePXt+oN11113X8IvGZz/72YYbGq+99loOO+wwIoL+/fvTt29fnnvuOaDUA9+tW7eVfmaSJGnNZbhuQ5nJCSecwNixY+nduzennHIK3/72twE4+uijefjhh5k48V+zEzaeDaSphx56iH79Ss/R+c53vsNJJ53UMB74zTffXG7WDYCFCxey3nrrseGGG/L3v/+dO+64o6HtggUL2H///bnkkkt46qmnAHjxxRfZZZddOOecc+jRo8dy4XNldt11Vx5++GFmzpwJwFtvvcULL7zQ4n5bb711wz4LFy7k97//PX/961955ZVXeOWVV7j88suZMGFCRTVAqed6WcBv/NV0SAjAvvvuy1133cX8+fOZP38+d911F/vuu+8H2n3sYx/jgQceAEpjxAcMGACUngZ67733AvD3v/+d559/vmGYzgsvvNDsuHlJkrR2WGuGhXSEa665ht69ezcMBTnxxBO59tpreeCBB9hzzz2ZNGkS3/zmN/nv//5v/u3f/o0NNthgufG6y8Zcv//++/Tq1Yvx48cDpRsV33zzTXbaaSe6dOlCly5d+Na3vrXcubfffnt22GEHttpqKzbffPOGYRtvvPEGhxxyCIsWLSIzufjii4FSOJ0xYwaZyd57783222/fECxXpkePHowfP57Ro0ezePFiAM4991wGDhy40v32228/Pv/5zwOlXvtPfepTrLvuug3bDznkEE499dSGYxZp44035vTTT2ennXYC4Iwzzmi4ufFLX/oSX/nKV6irq+Oaa67h5JNPZsmSJXTt2pWrr74agNNPP51jjz2WbbfdlszkggsuYNNNNwXg/vvv54ADDii8ZkmSVBuiNJtI7aurq8um8zs/++yzy43r1erl0EMP5cILL2zoEV4T7LHHHtx6660NM7s05s+jJNWoszYsf1/QsXVotRERT2RmXXPbHBaiDnP++ec3jEFfE8ydO5dvfvObzQZrSZK0dnBYiDrMlltuyZZbbtnRZRSmR48efOYzn+noMiRJUgey51qSJEkqiOFakiRJKojhWpIkSSqI4VqSJEkqiOG6Dc2aNYu+ffs2PHVx/vz59O3bl1deeQWAGTNmcOCBB9KvXz+GDh3K8OHDefDBBwEYP348PXr0YMiQIQwePJgjjjhiuYfMjBkzhq222oohQ4aw0047NTxEZq+99qLplIStNXXq1IYnHC5evJhPf/rTDBkyhBtvvJEvfelL1NfXV3X8sWPHLvfwmyVLltCjRw9OO+205drttddebLnllmy//fbsvvvuPP/881WdF0pPXxwwYAADBgzguuuua7bNtGnT2HXXXRkyZAh1dXUNT2gEmDJlSsO12XPPPYHSo9/32GMPlixZUnV9kiSpRmXmGvE1dOjQbKq+vv4D69rbBRdckF/+8pczM/P444/P8847LzMz33nnnRwwYEDeeuutDW3//Oc/57XXXpuZmddee22edNJJDdtGjx6d48aNy8zMK664IvfZZ59csGBBZmYuWLAgx48fn5mZe+65Zz7++OOFv49HHnkk995771bvv2TJkuWW33vvvdx2223zvffea1h3++2352677ZZbbLFFvv/++w3rG7+nq666Kg866KBW15GZOW/evOzbt2/OmzcvX3vttezbt2++9tprH2g3YsSIvP322zMz83e/+13uueeemZk5f/783HrrrfMvf/lLZmb+/e9/b9jnrLPOyl/84hfNnnd1+HmUJLXCmd1LX1IZMDVXkEnXnqn47jgN/u/PxR7z37eF/c5faZNvfOMbDB06lLFjx/LQQw9x2WWXAXD99dczbNgwDj744Ia222yzTbOPzl6yZAlvvfVWw/zJ5513HlOmTKF79+4AdO/enS984Qsf2O+EE07g8ccf55133uGII47g7LPPBuC0005j4sSJdO7cmX322YcxY8Zw8803c/bZZ9OpUyc23HBDHnzwQaZMmcKYMWMYN24cxxxzDHPnzmXIkCH8+te/5rjjjmPMmDHU1dVx1113ceaZZ7J48WL69evHtddey/rrr0+fPn0YNWoUd999N6eeeipHHXVUQ2333XcfO+64I507/+tHcMKECZx88slcccUVPPLII+y2224feE977LEHY8eOXeln3pLJkyczYsSIhqcyjhgxgjvvvJPRo0cv1y4iGh4xv2DBAj72sY8B8Mtf/pLDDjuM3r17A7DZZps17POZz3yG73znO3zuc5+rqkZJ0urjz+vuAMC2HVyHasPaE647SJcuXbjooosYOXIkd911F126dAFg+vTp7Ljjjivdd9njz+fMmcPAgQM56KCDWLhwIW+88QZbbLFFi+f+wQ9+wMYbb8zSpUvZe++9efrpp+nZsye33HILzz33HBHB66+/DsA555zD5MmT6dmzZ8O6ZTbbbDN+8pOfMGbMGCZNmrTctn/+85+ce+653HPPPay33npccMEFXHzxxZxxxhkAbLLJJvzpT3/6QG0PP/wwQ4cObVhetGgR99xzD1dddRWvv/46EyZMaDZc33bbbWy77Qf/83bRRRdx/fXXf2D9HnvswaWXXrrculdffZXNN9+8YblXr168+uqrH9h37Nix7Lvvvnz729/m/fff5w9/+AMAL7zwAu+99x577bUXb7zxBieffDL/8R//AZR+QXr88cc/cCxJUu3a9jtTOroE1ZC1J1y30MPclu644w4++tGP8swzzzBixIhm2xx66KHMmDGDgQMH8pvf/AaAUaNGcdlll5GZnHTSSVx00UWceOKJFZ/3pptu4uqrr2bJkiXMmTOH+vp6Bg0aRNeuXTnuuOM48MADOfDAAwHYfffdOfbYYznyyCM57LDDKj7Ho48+Sn19PbvvvjtQGnc8bNiwhu2jRo1qdr85c+Ys9yjwSZMmMXz4cLp168bhhx/O97//fcaOHUunTp0A+NznPke3bt3o06cPP/rRjz5wvFNOOYVTTjml4rorccUVV3DJJZdw+OGHc9NNN3Hcccdxzz33sGTJEp544gnuvfde3nnnHYYNG8auu+7KwIED6dSpE+ussw5vvPEGG2ywQaH1SJKk1Z83NLaxadOmcffdd/Poo49yySWXNDzue/Dgwcv16N5yyy2MHz++4ebHxiKCgw46iAcffJDu3buz/vrr89JLL630vC+//DJjxozh3nvv5emnn+aAAw5g0aJFdO7cmccee4wjjjiCSZMmMXLkSACuvPJKzj33XGbNmsXQoUOZN29eRe8vMxkxYgTTpk1j2rRp1NfX89Of/rRh+3rrrdfsft26dWPRokUNyxMmTOCee+6hT58+Dee/7777GrZff/31TJs2jd/+9rfL9Tovc9FFFzFkyJAPfC27IbOxnj17MmvWrIbl2bNn07Nnzw+0u+666xp+0fjsZz/bcENjr1692HfffVlvvfXYdNNN2WOPPXjqqaca9lu8eDFdu3Zd4WcmSZLWXIbrNpSZnHDCCYwdO5bevXtzyimn8O1vfxuAo48+mocffpiJEyc2tG88G0hTDz30EP369QPgO9/5DieddFLDeOA333xzuVk3ABYuXMh6663HhhtuyN///nfuuOOOhrYLFixg//3355JLLmkIhS+++CK77LIL55xzDj169FgufK7MrrvuysMPP8zMmTMBeOutt3jhhRda3G/rrbdu2GfhwoX8/ve/569//SuvvPIKr7zyCpdffjkTJkyoqAYo9VwvC/iNv5oOCQHYd999ueuuu5g/fz7z58/nrrvuYt999/1Au4997GM88MADQGmM+IABAwA45JBDeOihh1iyZAlvv/02f/zjHxt64efNm8emm27aMPxHkiStXdaeYSEd4JprrqF3794NQ0FOPPFErr32Wh544AH23HNPJk2axDe/+U3++7//m3/7t39jgw024Hvf+17D/svGXL///vv06tWL8ePHA6UbFd9880122mknunTpQpcuXfjWt7613Lm33357dthhB7baais233zzhmEbb7zxBocccgiLFi0iM7n44ouBUjidMWMGmcnee+/N9ttv3xAsV6ZHjx6MHz+e0aNHs3jxYgDOPfdcBg4cuNL99ttvPz7/+c8DpV77T33qU6y77roN2w855BBOPfXUhmMWaeONN+b0009np512AuCMM85ouLnxS1/6El/5yleoq6vjmmuu4eSTT2bJkiV07dqVq6++Gij9YjBy5Ei22247PvShD/GlL32p4UbU+++/nwMOOKDwmiVJUm2I0mwita+uri6bzu/87LPPLjeuV6uXQw89lAsvvLChR3hNcNhhh3H++ec3+8uFP4+SJK0ZIuKJzKxrbpvDQtRhzj///IYx6GuCd999l8985jMt9tpLkqQ1l8NC1GG23HJLttxyy44uozDrrLNOw5R8kiRp7bTG91yvKcNeVNv8OZQkae2wRofrrl27Mm/ePIONOlRmMm/ePKfnkyRpLbBGDwvp1asXs2fPZu7cuR1ditZyXbt2pVevXh1dhiRJamNrdLju0qULffv27egyJEmStJZYo4eFSJIkSe3JcC1JkiQVxHAtSZIkFWSNeUJjRMwF/tJBp98U+GcHnVvtx+u85vMarx28zmsHr/PaoaOu88czs0dzG9aYcN2RImLqih6BqTWH13nN5zVeO3id1w5e57XD6nidHRYiSZIkFcRwLUmSJBXEcF2Mqzu6ALULr/Oaz2u8dvA6rx28zmuH1e46O+ZakiRJKog915IkSVJBDNerICJGRsTzETEzIk5rZvu6EXFjefsfI6JPB5SpKlRwjb8ZEfUR8XRE3BsRH++IOlWdlq5zo3aHR0RGxGp1J7oqU8l1jogjy/+mp0fEL9u7RlWvgv9u946I+yPiyfJ/u/fviDrVehExLiL+ERHPrGB7RMSl5Z+BpyNix/ausTHDdYUiohNwObAfMAgYHRGDmjQ7Dpifmf2BS4AL2rdKVaPCa/wkUJeZ2wG/Ai5s3ypVrQqvMxGxAXAy8Mf2rVBFqOQ6R8QA4DvA7pk5GPjv9q5T1anw3/P3gJsycwfgKODH7VulCjAeGLmS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\n"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"report([xgc0, xgc], x_test, y_test, model_names=['XGBClassifier', 'Weighted XGBClassifier'])"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"For the best model let's see the features that influenced the decision the most:\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 35,
"outputs": [
{
"data": {
"text/plain": "<AxesSubplot:title={'center':'Feature importance'}, xlabel='F score', ylabel='Features'>"
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_importance(xgc0)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 35,
"outputs": [],
"source": [
"\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}