{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np # linear algebra\n", "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", "\n", "from matplotlib import pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(32769, 10)\n", "\n", "(58921, 10)\n", "\n" ] } ], "source": [ "train_df = pd.read_csv('/media/lvision/Sabrent/kaggle/2013/amazon-employee-access-challenge/train.csv')\n", "test_df = pd.read_csv('/media/lvision/Sabrent/kaggle/2013/amazon-employee-access-challenge/test.csv')\n", "print(train_df.shape)\n", "print(type(train_df))\n", "print(test_df.shape)\n", "print(type(test_df))\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "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", "
ACTIONRESOURCEMGR_IDROLE_ROLLUP_1ROLE_ROLLUP_2ROLE_DEPTNAMEROLE_TITLEROLE_FAMILY_DESCROLE_FAMILYROLE_CODE
013935385475117961118300123472117905117906290919117908
11171831540117961118343123125118536118536308574118539
21367241445711821911822011788411787926795219721117880
31361355396117961118343119993118321240983290919118322
4142680590511792911793011956911932312393219793119325
\n", "
" ], "text/plain": [ " ACTION RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME \\\n", "0 1 39353 85475 117961 118300 123472 \n", "1 1 17183 1540 117961 118343 123125 \n", "2 1 36724 14457 118219 118220 117884 \n", "3 1 36135 5396 117961 118343 119993 \n", "4 1 42680 5905 117929 117930 119569 \n", "\n", " ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE \n", "0 117905 117906 290919 117908 \n", "1 118536 118536 308574 118539 \n", "2 117879 267952 19721 117880 \n", "3 118321 240983 290919 118322 \n", "4 119323 123932 19793 119325 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "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", "
idRESOURCEMGR_IDROLE_ROLLUP_1ROLE_ROLLUP_2ROLE_DEPTNAMEROLE_TITLEROLE_FAMILY_DESCROLE_FAMILYROLE_CODE
01787667273411807911808011787811787911817719721117880
12406444378117961118327118507118863122008118398118865
23754432395117961118300119488118172301534249618118175
344321919986117961118225118403120773136187118960120774
454209350015117961118343119598118422300136118424118425
\n", "
" ], "text/plain": [ " id RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME \\\n", "0 1 78766 72734 118079 118080 117878 \n", "1 2 40644 4378 117961 118327 118507 \n", "2 3 75443 2395 117961 118300 119488 \n", "3 4 43219 19986 117961 118225 118403 \n", "4 5 42093 50015 117961 118343 119598 \n", "\n", " ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE \n", "0 117879 118177 19721 117880 \n", "1 118863 122008 118398 118865 \n", "2 118172 301534 249618 118175 \n", "3 120773 136187 118960 120774 \n", "4 118422 300136 118424 118425 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_df.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "y = train_df['ACTION']\n", "X = train_df.drop(columns='ACTION') # or X = train_df.drop('ACTION', axis=1)\n", "\n", "X_test = test_df.drop(columns='id')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "SEED = 1\n", "\n", "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, random_state=SEED)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# From now on, we try different packages\n", "# including: catboost, xgboost, lightgbm, h2o, etc." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import catboost as ctb" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "65d847025e294ae2997a373903dc358c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5400959\tbest: 0.5400959 (0)\ttotal: 53.7ms\tremaining: 53.6s\n", "200:\ttest: 0.8020842\tbest: 0.8020842 (200)\ttotal: 1.05s\tremaining: 4.17s\n", "400:\ttest: 0.8237941\tbest: 0.8237941 (400)\ttotal: 2.03s\tremaining: 3.03s\n", "600:\ttest: 0.8328464\tbest: 0.8330283 (598)\ttotal: 3.01s\tremaining: 2s\n", "800:\ttest: 0.8366271\tbest: 0.8370599 (785)\ttotal: 4.01s\tremaining: 997ms\n", "999:\ttest: 0.8417832\tbest: 0.8417832 (999)\ttotal: 5s\tremaining: 0us\n", "\n", "bestTest = 0.8417831567\n", "bestIteration = 999\n", "\n", "CPU times: user 1min 59s, sys: 11.3 s, total: 2min 10s\n", "Wall time: 5.1 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss', # objective function\n", " 'eval_metric':'AUC', # metric\n", " 'verbose': 200, # output to stdout info about training process every 200 iterations\n", " 'random_seed': SEED\n", " }\n", "cbc_1 = ctb.CatBoostClassifier(**params)\n", "cbc_1.fit(X_train, y_train, # data to train on (required parameters, unless we provide X as a pool object, will be shown below)\n", " eval_set=(X_valid, y_valid), # data to validate on\n", " use_best_model=True, # True if we don't want to save trees created after iteration with the best validation score\n", " plot=True # True for visualization of the training process (it is not shown in a published kernel - try executing this code)\n", " );" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8]\n" ] } ], "source": [ "cat_features = list(range(X.shape[1]))\n", "print(cat_features)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8]\n" ] } ], "source": [ "condition = True # here we specify what condition should be satisfied only by the names of categorical features\n", "cat_features_names = [col for col in X.columns if condition]\n", "cat_features = [X.columns.get_loc(col) for col in cat_features_names]\n", "print(cat_features)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "45657692d7724ffb91700b3bd11e56ed", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5637606\tbest: 0.5637606 (0)\ttotal: 29.9ms\tremaining: 29.9s\n", "200:\ttest: 0.8959353\tbest: 0.8959406 (199)\ttotal: 5s\tremaining: 19.9s\n", "400:\ttest: 0.8985289\tbest: 0.8990341 (378)\ttotal: 10.6s\tremaining: 15.8s\n", "600:\ttest: 0.9005314\tbest: 0.9006239 (594)\ttotal: 16.2s\tremaining: 10.8s\n", "800:\ttest: 0.9003434\tbest: 0.9014996 (744)\ttotal: 21.7s\tremaining: 5.38s\n", "999:\ttest: 0.8999324\tbest: 0.9014996 (744)\ttotal: 26.3s\tremaining: 0us\n", "\n", "bestTest = 0.9014995851\n", "bestIteration = 744\n", "\n", "Shrink model to first 745 iterations.\n", "CPU times: user 11min 50s, sys: 32.5 s, total: 12min 23s\n", "Wall time: 26.5 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_2 = ctb.CatBoostClassifier(**params)\n", "cbc_2.fit(X_train, y_train,\n", " eval_set=(X_valid, y_valid),\n", " use_best_model=True,\n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "90ef940925ff43c3835084146f73ccea", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5637606\tbest: 0.5637606 (0)\ttotal: 18.8ms\tremaining: 18.8s\n", "200:\ttest: 0.8959353\tbest: 0.8959406 (199)\ttotal: 5.08s\tremaining: 20.2s\n", "400:\ttest: 0.8985289\tbest: 0.8990341 (378)\ttotal: 10.6s\tremaining: 15.9s\n", "600:\ttest: 0.9005314\tbest: 0.9006239 (594)\ttotal: 16.3s\tremaining: 10.8s\n", "800:\ttest: 0.9003434\tbest: 0.9014996 (744)\ttotal: 21.9s\tremaining: 5.43s\n", "Stopped by overfitting detector (200 iterations wait)\n", "\n", "bestTest = 0.9014995851\n", "bestIteration = 744\n", "\n", "Shrink model to first 745 iterations.\n", "CPU times: user 11min 39s, sys: 33.3 s, total: 12min 12s\n", "Wall time: 25.5 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'early_stopping_rounds': 200,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_2 = ctb.CatBoostClassifier(**params)\n", "cbc_2.fit(X_train, y_train, \n", " eval_set=(X_valid, y_valid), \n", " use_best_model=True, \n", " plot=True\n", " );\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fca6c6a6371e4eaf8f846498e00b6716", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.054241\n", "0:\tlearn: 0.6174190\ttest: 0.6184174\tbest: 0.6184174 (0)\ttotal: 33.4ms\tremaining: 33.3s\n", "200:\tlearn: 0.8536408\ttest: 0.8762504\tbest: 0.8762504 (200)\ttotal: 6.53s\tremaining: 26s\n", "400:\tlearn: 0.8636365\ttest: 0.8807679\tbest: 0.8807842 (398)\ttotal: 13s\tremaining: 19.5s\n", "600:\tlearn: 0.8688402\ttest: 0.8825358\tbest: 0.8826348 (587)\ttotal: 19.5s\tremaining: 12.9s\n", "800:\tlearn: 0.8726251\ttest: 0.8827334\tbest: 0.8829701 (760)\ttotal: 25.9s\tremaining: 6.44s\n", "999:\tlearn: 0.8763252\ttest: 0.8832531\tbest: 0.8835157 (986)\ttotal: 32.7s\tremaining: 0us\n", "bestTest = 0.8835157454\n", "bestIteration = 986\n", "Shrink model to first 987 iterations.\n", "CPU times: user 42.1 s, sys: 4.77 s, total: 46.8 s\n", "Wall time: 33.2 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'task_type': 'GPU',\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_3 = ctb.CatBoostClassifier(**params)\n", "cbc_3.fit(X_train, y_train,\n", " eval_set=(X_valid, y_valid), \n", " use_best_model=True,\n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "304ea78e73654e3cbb24bb980f297d15", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.054241\n", "0:\tlearn: 0.6174190\ttest: 0.6184174\tbest: 0.6184174 (0)\ttotal: 26.4ms\tremaining: 26.3s\n", "200:\tlearn: 0.8536408\ttest: 0.8762504\tbest: 0.8762504 (200)\ttotal: 6.61s\tremaining: 26.3s\n", "400:\tlearn: 0.8636365\ttest: 0.8807679\tbest: 0.8807842 (398)\ttotal: 13.1s\tremaining: 19.6s\n", "600:\tlearn: 0.8688402\ttest: 0.8825358\tbest: 0.8826348 (587)\ttotal: 19.5s\tremaining: 13s\n", "800:\tlearn: 0.8726251\ttest: 0.8827334\tbest: 0.8829701 (760)\ttotal: 26s\tremaining: 6.45s\n", "999:\tlearn: 0.8763252\ttest: 0.8832522\tbest: 0.8835146 (986)\ttotal: 32.4s\tremaining: 0us\n", "bestTest = 0.8835146129\n", "bestIteration = 986\n", "Shrink model to first 987 iterations.\n", "CPU times: user 42.5 s, sys: 4.17 s, total: 46.7 s\n", "Wall time: 32.9 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'task_type': 'GPU',\n", " 'border_count': 32,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_4 = ctb.CatBoostClassifier(**params)\n", "cbc_4.fit(X_train, y_train, \n", " eval_set=(X_valid, y_valid), \n", " use_best_model=True, \n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "np.random.seed(SEED)\n", "noise_cols = [f'noise_{i}' for i in range(5)]\n", "for col in noise_cols:\n", " X_train[col] = y_train * np.random.rand(X_train.shape[0])\n", " X_valid[col] = np.random.rand(X_valid.shape[0])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "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", "
RESOURCEMGR_IDROLE_ROLLUP_1ROLE_ROLLUP_2ROLE_DEPTNAMEROLE_TITLEROLE_FAMILY_DESCROLE_FAMILYROLE_CODEnoise_0noise_1noise_2noise_3noise_4
167732779813501179611180521229381179051179062909191179080.4170220.0978500.6656000.9790250.491624
234918070145711179611182251199241186852794433085741186870.7203240.8559000.3117630.9293460.391708
327313403951131179611183001198901194331336861184241194350.0001140.2878380.8966240.7040500.606467
78554208547331182901182911201261189801662031182951189820.3023330.2643200.4821950.0284930.182570
164751635860461179611184461203173070243064041183311183320.1467560.0228760.0093070.7267500.623357
\n", "
" ], "text/plain": [ " RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME \\\n", "16773 27798 1350 117961 118052 122938 \n", "23491 80701 4571 117961 118225 119924 \n", "32731 34039 5113 117961 118300 119890 \n", "7855 42085 4733 118290 118291 120126 \n", "16475 16358 6046 117961 118446 120317 \n", "\n", " ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE noise_0 \\\n", "16773 117905 117906 290919 117908 0.417022 \n", "23491 118685 279443 308574 118687 0.720324 \n", "32731 119433 133686 118424 119435 0.000114 \n", "7855 118980 166203 118295 118982 0.302333 \n", "16475 307024 306404 118331 118332 0.146756 \n", "\n", " noise_1 noise_2 noise_3 noise_4 \n", "16773 0.097850 0.665600 0.979025 0.491624 \n", "23491 0.855900 0.311763 0.929346 0.391708 \n", "32731 0.287838 0.896624 0.704050 0.606467 \n", "7855 0.264320 0.482195 0.028493 0.182570 \n", "16475 0.022876 0.009307 0.726750 0.623357 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0989b54b37b94b029a8bad387709377a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.4990944\tbest: 0.4990944 (0)\ttotal: 12.7ms\tremaining: 12.7s\n", "200:\ttest: 0.5831370\tbest: 0.5894476 (7)\ttotal: 2.58s\tremaining: 10.3s\n", "400:\ttest: 0.5831376\tbest: 0.5894476 (7)\ttotal: 4.77s\tremaining: 7.13s\n", "600:\ttest: 0.5831376\tbest: 0.5894476 (7)\ttotal: 7.19s\tremaining: 4.77s\n", "800:\ttest: 0.5831378\tbest: 0.5894476 (7)\ttotal: 9.2s\tremaining: 2.29s\n", "999:\ttest: 0.5831381\tbest: 0.5894476 (7)\ttotal: 10.9s\tremaining: 0us\n", "\n", "bestTest = 0.5894475816\n", "bestIteration = 7\n", "\n", "Shrink model to first 8 iterations.\n", "CPU times: user 4min 25s, sys: 13.9 s, total: 4min 39s\n", "Wall time: 11.1 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_5 = ctb.CatBoostClassifier(**params)\n", "cbc_5.fit(X_train, y_train, \n", " eval_set=(X_valid, y_valid), \n", " use_best_model=True, \n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9, 10, 11, 12, 13]\n" ] } ], "source": [ "ignored_features = list(range(X_train.shape[1] - 5, X_train.shape[1]))\n", "print(ignored_features)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "25685cacd69345c78b865ceb0a659e05", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5637606\tbest: 0.5637606 (0)\ttotal: 19.2ms\tremaining: 19.2s\n", "200:\ttest: 0.8959353\tbest: 0.8959406 (199)\ttotal: 5.03s\tremaining: 20s\n", "400:\ttest: 0.8985289\tbest: 0.8990341 (378)\ttotal: 10.5s\tremaining: 15.8s\n", "600:\ttest: 0.9005314\tbest: 0.9006239 (594)\ttotal: 16.2s\tremaining: 10.8s\n", "800:\ttest: 0.9003434\tbest: 0.9014996 (744)\ttotal: 21.7s\tremaining: 5.38s\n", "Stopped by overfitting detector (200 iterations wait)\n", "\n", "bestTest = 0.9014995851\n", "bestIteration = 744\n", "\n", "Shrink model to first 745 iterations.\n", "CPU times: user 11min 46s, sys: 34.3 s, total: 12min 21s\n", "Wall time: 25.4 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'cat_features': cat_features,\n", " 'ignored_features': ignored_features,\n", " 'early_stopping_rounds': 200,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "cbc_6 = ctb.CatBoostClassifier(**params)\n", "cbc_6.fit(X_train, y_train, \n", " eval_set=(X_valid, y_valid), \n", " use_best_model=True, \n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "X_train = X_train.drop(columns=noise_cols)\n", "X_valid = X_valid.drop(columns=noise_cols)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "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", "
RESOURCEMGR_IDROLE_ROLLUP_1ROLE_ROLLUP_2ROLE_DEPTNAMEROLE_TITLEROLE_FAMILY_DESCROLE_FAMILYROLE_CODE
16773277981350117961118052122938117905117906290919117908
23491807014571117961118225119924118685279443308574118687
32731340395113117961118300119890119433133686118424119435
7855420854733118290118291120126118980166203118295118982
16475163586046117961118446120317307024306404118331118332
\n", "
" ], "text/plain": [ " RESOURCE MGR_ID ROLE_ROLLUP_1 ROLE_ROLLUP_2 ROLE_DEPTNAME \\\n", "16773 27798 1350 117961 118052 122938 \n", "23491 80701 4571 117961 118225 119924 \n", "32731 34039 5113 117961 118300 119890 \n", "7855 42085 4733 118290 118291 120126 \n", "16475 16358 6046 117961 118446 120317 \n", "\n", " ROLE_TITLE ROLE_FAMILY_DESC ROLE_FAMILY ROLE_CODE \n", "16773 117905 117906 290919 117908 \n", "23491 118685 279443 308574 118687 \n", "32731 119433 133686 118424 119435 \n", "7855 118980 166203 118295 118982 \n", "16475 307024 306404 118331 118332 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "train_data = ctb.Pool(data=X_train,\n", " label=y_train,\n", " cat_features=cat_features\n", " )\n", "\n", "valid_data = ctb.Pool(data=X_valid,\n", " label=y_valid,\n", " cat_features=cat_features\n", " )" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "823cbebb18b3407b856e04b0f831bf11", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5637606\tbest: 0.5637606 (0)\ttotal: 16.6ms\tremaining: 16.6s\n", "200:\ttest: 0.8959353\tbest: 0.8959406 (199)\ttotal: 5.04s\tremaining: 20s\n", "400:\ttest: 0.8985289\tbest: 0.8990341 (378)\ttotal: 10.6s\tremaining: 15.8s\n", "600:\ttest: 0.9005314\tbest: 0.9006239 (594)\ttotal: 16.3s\tremaining: 10.8s\n", "800:\ttest: 0.9003434\tbest: 0.9014996 (744)\ttotal: 21.8s\tremaining: 5.4s\n", "Stopped by overfitting detector (200 iterations wait)\n", "\n", "bestTest = 0.9014995851\n", "bestIteration = 744\n", "\n", "Shrink model to first 745 iterations.\n", "CPU times: user 11min 48s, sys: 34.4 s, total: 12min 22s\n", "Wall time: 25.3 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", "# 'cat_features': cat_features, # we don't need to specify this parameter as \n", "# pool object contains info about categorical features\n", " 'early_stopping_rounds': 200,\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "\n", "cbc_7 = ctb.CatBoostClassifier(**params)\n", "cbc_7.fit(train_data, # instead of X_train, y_train\n", " eval_set=valid_data, # instead of (X_valid, y_valid)\n", " use_best_model=True, \n", " plot=True\n", " );" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2c50fefd00644e2785a0cc3df1922786", "version_major": 2, "version_minor": 0 }, "text/plain": [ "MetricVisualizer(layout=Layout(align_self='stretch', height='500px'))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Training on fold [0/4]\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 20.9ms\tremaining: 20.9s\n", "200:\ttest: 0.8938231\tbest: 0.8938231 (200)\ttotal: 9.4s\tremaining: 37.4s\n", "400:\ttest: 0.8976768\tbest: 0.8976768 (400)\ttotal: 20.5s\tremaining: 30.7s\n", "600:\ttest: 0.9016370\tbest: 0.9016602 (599)\ttotal: 31.9s\tremaining: 21.2s\n", "800:\ttest: 0.9027846\tbest: 0.9027909 (799)\ttotal: 43.4s\tremaining: 10.8s\n", "999:\ttest: 0.9035137\tbest: 0.9035137 (999)\ttotal: 54.9s\tremaining: 0us\n", "\n", "bestTest = 0.9035137273\n", "bestIteration = 999\n", "\n", "Training on fold [1/4]\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 23ms\tremaining: 23s\n", "200:\ttest: 0.8827467\tbest: 0.8832037 (146)\ttotal: 9.55s\tremaining: 38s\n", "400:\ttest: 0.8844741\tbest: 0.8844968 (397)\ttotal: 20.8s\tremaining: 31s\n", "600:\ttest: 0.8860410\tbest: 0.8864452 (506)\ttotal: 32.8s\tremaining: 21.8s\n", "800:\ttest: 0.8864595\tbest: 0.8864742 (799)\ttotal: 44.7s\tremaining: 11.1s\n", "999:\ttest: 0.8850072\tbest: 0.8864950 (822)\ttotal: 56.4s\tremaining: 0us\n", "\n", "bestTest = 0.8864949928\n", "bestIteration = 822\n", "\n", "Training on fold [2/4]\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 21.1ms\tremaining: 21.1s\n", "200:\ttest: 0.8794576\tbest: 0.8794576 (200)\ttotal: 9.18s\tremaining: 36.5s\n", "400:\ttest: 0.8834346\tbest: 0.8834346 (400)\ttotal: 20.2s\tremaining: 30.2s\n", "600:\ttest: 0.8866012\tbest: 0.8866091 (599)\ttotal: 31.4s\tremaining: 20.8s\n", "800:\ttest: 0.8891931\tbest: 0.8891961 (797)\ttotal: 42.8s\tremaining: 10.6s\n", "999:\ttest: 0.8906350\tbest: 0.8907859 (990)\ttotal: 54s\tremaining: 0us\n", "\n", "bestTest = 0.8907858827\n", "bestIteration = 990\n", "\n", "Training on fold [3/4]\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 20.1ms\tremaining: 20.1s\n", "200:\ttest: 0.8848750\tbest: 0.8848750 (200)\ttotal: 9.73s\tremaining: 38.7s\n", "400:\ttest: 0.8886395\tbest: 0.8886395 (400)\ttotal: 21.8s\tremaining: 32.6s\n", "600:\ttest: 0.8904434\tbest: 0.8904442 (599)\ttotal: 33.8s\tremaining: 22.5s\n", "800:\ttest: 0.8909729\tbest: 0.8913274 (686)\ttotal: 45.7s\tremaining: 11.3s\n", "999:\ttest: 0.8898141\tbest: 0.8913274 (686)\ttotal: 57.5s\tremaining: 0us\n", "\n", "bestTest = 0.8913273864\n", "bestIteration = 686\n", "\n", "CPU times: user 2h 7min 1s, sys: 5min 46s, total: 2h 12min 48s\n", "Wall time: 3min 43s\n" ] } ], "source": [ "%%time\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "\n", "all_train_data = ctb.Pool(data=X,\n", " label=y,\n", " cat_features=cat_features\n", " )\n", "\n", "scores = ctb.cv(pool=all_train_data,\n", " params=params, \n", " fold_count=4,\n", " seed=SEED, \n", " shuffle=True,\n", " stratified=True, # if True the folds are made by preserving the percentage of samples for each class\n", " plot=True\n", " )" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "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", "
Feature IdImportances
0RESOURCE18.981667
1ROLE_DEPTNAME16.202565
2ROLE_ROLLUP_214.275839
3MGR_ID14.208860
4ROLE_FAMILY_DESC9.218010
5ROLE_TITLE7.735600
6ROLE_FAMILY7.057141
7ROLE_ROLLUP_16.572883
8ROLE_CODE5.747437
\n", "
" ], "text/plain": [ " Feature Id Importances\n", "0 RESOURCE 18.981667\n", "1 ROLE_DEPTNAME 16.202565\n", "2 ROLE_ROLLUP_2 14.275839\n", "3 MGR_ID 14.208860\n", "4 ROLE_FAMILY_DESC 9.218010\n", "5 ROLE_TITLE 7.735600\n", "6 ROLE_FAMILY 7.057141\n", "7 ROLE_ROLLUP_1 6.572883\n", "8 ROLE_CODE 5.747437" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cbc_7.get_feature_importance(prettified=True)\n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "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", "
Feature IdImportances
0RESOURCE18.981667
1ROLE_DEPTNAME16.202565
2ROLE_ROLLUP_214.275839
3MGR_ID14.208860
4ROLE_FAMILY_DESC9.218010
5ROLE_TITLE7.735600
6ROLE_FAMILY7.057141
7ROLE_ROLLUP_16.572883
8ROLE_CODE5.747437
\n", "
" ], "text/plain": [ " Feature Id Importances\n", "0 RESOURCE 18.981667\n", "1 ROLE_DEPTNAME 16.202565\n", "2 ROLE_ROLLUP_2 14.275839\n", "3 MGR_ID 14.208860\n", "4 ROLE_FAMILY_DESC 9.218010\n", "5 ROLE_TITLE 7.735600\n", "6 ROLE_FAMILY 7.057141\n", "7 ROLE_ROLLUP_1 6.572883\n", "8 ROLE_CODE 5.747437" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "feature_importance_df = pd.DataFrame(cbc_7.get_feature_importance(prettified=True), columns=['Feature Id', 'Importances'])\n", "feature_importance_df" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 6));\n", "sns.barplot(x=\"Importances\", y=\"Feature Id\", data=feature_importance_df);\n", "plt.title('CatBoost features importance:');" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", "
\n", " Visualization omitted, Javascript library not loaded!
\n", " Have you run `initjs()` in this notebook? If this notebook was from another\n", " user you must also trust this notebook (File -> Trust notebook). If you are viewing\n", " this notebook on github the Javascript has been stripped for security. If you are using\n", " JupyterLab this error is because a JupyterLab extension has not yet been written.\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import shap\n", "explainer = shap.TreeExplainer(cbc_7) # insert your model\n", "shap_values = explainer.shap_values(train_data) # insert your train Pool object\n", "\n", "shap.initjs()\n", "shap.force_plot(explainer.expected_value, shap_values[:100,:], X_train.iloc[:100,:])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "shap.summary_plot(shap_values, X_train)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Learning rate set to 0.069882\n", "0:\ttest: 0.5797111\tbest: 0.5797111 (0)\ttotal: 18.7ms\tremaining: 18.7s\n", "200:\ttest: 0.8638646\tbest: 0.8638646 (200)\ttotal: 5.21s\tremaining: 20.7s\n", "400:\ttest: 0.8678851\tbest: 0.8679522 (398)\ttotal: 10.7s\tremaining: 16s\n", "600:\ttest: 0.8701402\tbest: 0.8701489 (589)\ttotal: 16.4s\tremaining: 10.9s\n", "800:\ttest: 0.8708947\tbest: 0.8715082 (745)\ttotal: 22.2s\tremaining: 5.51s\n", "999:\ttest: 0.8708311\tbest: 0.8721216 (875)\ttotal: 27.9s\tremaining: 0us\n", "\n", "bestTest = 0.8721216295\n", "bestIteration = 875\n", "\n", "Shrink model to first 876 iterations.\n", "Learning rate set to 0.069883\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 5.46ms\tremaining: 5.45s\n", "200:\ttest: 0.8957267\tbest: 0.8957267 (200)\ttotal: 5.18s\tremaining: 20.6s\n", "400:\ttest: 0.9009627\tbest: 0.9009908 (396)\ttotal: 11s\tremaining: 16.4s\n", "600:\ttest: 0.9022419\tbest: 0.9023966 (565)\ttotal: 16.8s\tremaining: 11.1s\n", "800:\ttest: 0.9020686\tbest: 0.9023966 (565)\ttotal: 22.6s\tremaining: 5.61s\n", "999:\ttest: 0.9010471\tbest: 0.9023966 (565)\ttotal: 28.3s\tremaining: 0us\n", "\n", "bestTest = 0.9023966387\n", "bestIteration = 565\n", "\n", "Shrink model to first 566 iterations.\n", "Learning rate set to 0.069883\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 6.12ms\tremaining: 6.11s\n", "200:\ttest: 0.9046922\tbest: 0.9051553 (194)\ttotal: 5.24s\tremaining: 20.8s\n", "400:\ttest: 0.9034313\tbest: 0.9052665 (233)\ttotal: 10.9s\tremaining: 16.3s\n", "600:\ttest: 0.9019832\tbest: 0.9052665 (233)\ttotal: 16.6s\tremaining: 11s\n", "800:\ttest: 0.8998534\tbest: 0.9052665 (233)\ttotal: 22.6s\tremaining: 5.61s\n", "999:\ttest: 0.8976830\tbest: 0.9052665 (233)\ttotal: 28.4s\tremaining: 0us\n", "\n", "bestTest = 0.9052665258\n", "bestIteration = 233\n", "\n", "Shrink model to first 234 iterations.\n", "Learning rate set to 0.069883\n", "0:\ttest: 0.5000000\tbest: 0.5000000 (0)\ttotal: 5.75ms\tremaining: 5.75s\n", "200:\ttest: 0.8932656\tbest: 0.8932656 (200)\ttotal: 5.13s\tremaining: 20.4s\n", "400:\ttest: 0.8956892\tbest: 0.8957070 (398)\ttotal: 10.8s\tremaining: 16.2s\n", "600:\ttest: 0.8978707\tbest: 0.8980333 (593)\ttotal: 16.3s\tremaining: 10.8s\n", "800:\ttest: 0.8984955\tbest: 0.8986194 (758)\ttotal: 22s\tremaining: 5.47s\n", "999:\ttest: 0.8985830\tbest: 0.8990488 (913)\ttotal: 27.8s\tremaining: 0us\n", "\n", "bestTest = 0.8990488015\n", "bestIteration = 913\n", "\n", "Shrink model to first 914 iterations.\n", "CV mean: 0.8947, CV std: 0.0132\n", "CPU times: user 52min 54s, sys: 2min 39s, total: 55min 34s\n", "Wall time: 1min 53s\n" ] } ], "source": [ "%%time\n", "\n", "from sklearn.model_selection import StratifiedKFold\n", "\n", "n_fold = 4 # amount of data folds\n", "folds = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=SEED)\n", "\n", "params = {'loss_function':'Logloss',\n", " 'eval_metric':'AUC',\n", " 'verbose': 200,\n", " 'random_seed': SEED\n", " }\n", "\n", "test_data = ctb.Pool(data=X_test,\n", " cat_features=cat_features)\n", "\n", "scores = []\n", "prediction = np.zeros(X_test.shape[0])\n", "for fold_n, (train_index, valid_index) in enumerate(folds.split(X, y)):\n", " \n", " X_train, X_valid = X.iloc[train_index], X.iloc[valid_index] # train and validation data splits\n", " y_train, y_valid = y[train_index], y[valid_index]\n", " \n", " train_data = ctb.Pool(data=X_train, \n", " label=y_train,\n", " cat_features=cat_features)\n", " valid_data = ctb.Pool(data=X_valid, \n", " label=y_valid,\n", " cat_features=cat_features)\n", " \n", " model = ctb.CatBoostClassifier(**params)\n", " model.fit(train_data,\n", " eval_set=valid_data, \n", " use_best_model=True\n", " )\n", " \n", " score = model.get_best_score()['validation']['AUC']\n", " scores.append(score)\n", "\n", " y_pred = model.predict_proba(test_data)[:, 1]\n", " prediction += y_pred\n", "\n", "prediction /= n_fold\n", "print('CV mean: {:.4f}, CV std: {:.4f}'.format(np.mean(scores), np.std(scores)))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving submission file as: catboost_submission.csv\n" ] } ], "source": [ "sub = pd.read_csv('/media/lvision/Sabrent/kaggle/2013/amazon-employee-access-challenge/sampleSubmission.csv')\n", "sub['Action'] = prediction\n", "sub_name = 'catboost_submission.csv'\n", "sub.to_csv(sub_name, index=False)\n", "\n", "print(f'Saving submission file as: {sub_name}')" ] } ], "metadata": { "interpreter": { "hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 2 }