{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import xgboost as xgb\n", "import matplotlib.pyplot as plt\n", "import seaborn\n", "from sklearn import preprocessing\n", "import time\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(61878, 95)\n" ] } ], "source": [ "train = pd.read_csv('input/otto_train.csv')\n", "print(train.shape)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def encode_features(dat):\n", " df = pd.DataFrame(index=dat.index.values)\n", " for c in dat.columns.values:\n", " unq = np.unique(dat[c])\n", " arr = np.zeros(len(df))\n", " for ii, u in enumerate(unq):\n", " flg = (dat[c] == u).values\n", " arr[flg] = ii\n", " df[c] = arr.astype(int)\n", " return df" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(61878, 93) (61878,)\n" ] } ], "source": [ "x = encode_features(train.drop(['id', 'target'], axis=1))\n", "y = np.array([int(v.split('_')[1])-1 for v in train.target])\n", "print(x.shape, y.shape)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n" ] } ], "source": [ "num_cls = len(np.unique(y))\n", "print(num_cls)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "prm_base = {\n", " 'booster': 'gbtree',\n", " 'objective': 'multi:softprob',\n", " 'num_class': num_cls,\n", " 'max_depth': 5,\n", " 'learning_rate': 0.1,\n", " 'colsample_bytree': 0.9,\n", " 'subsample': 0.9,\n", " 'silent': 1\n", "}\n", "num_round = 100" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.random.seed(20170611)\n", "flg_train = np.random.choice([False, True], len(y), p=[0.3, 0.7])\n", "flg_valid = np.logical_not(flg_train)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dt_xgb = xgb.DMatrix(x[flg_train], y[flg_train])\n", "dv_xgb = xgb.DMatrix(x[flg_valid], y[flg_valid])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def test_xgb(prm):\n", " time_s = time.time()\n", " obj_xgb = xgb.train(\n", " prm, dt_xgb, num_round\n", " )\n", " time_t = time.time()\n", " return time_t - time_s" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24.81910991668701" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prm = prm_base\n", "test_xgb(prm)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "prm = prm_base\n", "prm.update({'updater': 'grow_gpu'})\n", "ge = test_xgb(prm)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "prm = prm_base\n", "prm.update({'updater': 'grow_gpu_hist'})\n", "prm.update({'max_bin': 8})\n", "gh = test_xgb(prm)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "val = []\n", "cpu = range(1, 17)\n", "for c in cpu:\n", " prm = prm_base\n", " prm.update({'updater': 'grow_colmaker'})\n", " prm['nthread'] = c\n", " val.append(test_xgb(prm))\n", "ce = val" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "val = []\n", "cpu = range(1, 17)\n", "for c in cpu:\n", " prm = prm_base\n", " prm.update({'updater': 'grow_fast_histmaker'})\n", " prm.update({'max_bin': 8})\n", " prm.update({'nthread': c})\n", " val.append(test_xgb(prm))\n", "ch = val" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame({'CPU': ce})\n", "df['CPU_hist'] = ch\n", "df['GPU'] = ge\n", "df['GPU_hist'] = gh" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df.plot(style='o-')\n", "plt.xlabel('nthread')\n", "plt.ylabel('time')\n", "plt.show()" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CPUCPU_histGPUGPU_hist
0143.21390443.09380710.7931097.385136
175.98477224.48534310.7931097.385136
256.34209318.66280610.7931097.385136
343.27619114.98095110.7931097.385136
435.08781212.74703510.7931097.385136
529.96060111.47647410.7931097.385136
626.53508911.39670910.7931097.385136
725.0826119.91665910.7931097.385136
824.93010211.76131710.7931097.385136
923.93488611.54304310.7931097.385136
1023.35314611.72466110.7931097.385136
1123.15466511.52824910.7931097.385136
1222.85191711.61410410.7931097.385136
1322.55605511.89047710.7931097.385136
1422.43567411.30967710.7931097.385136
1522.29769111.82556910.7931097.385136
\n", "
" ], "text/plain": [ " CPU CPU_hist GPU GPU_hist\n", "0 143.213904 43.093807 10.793109 7.385136\n", "1 75.984772 24.485343 10.793109 7.385136\n", "2 56.342093 18.662806 10.793109 7.385136\n", "3 43.276191 14.980951 10.793109 7.385136\n", "4 35.087812 12.747035 10.793109 7.385136\n", "5 29.960601 11.476474 10.793109 7.385136\n", "6 26.535089 11.396709 10.793109 7.385136\n", "7 25.082611 9.916659 10.793109 7.385136\n", "8 24.930102 11.761317 10.793109 7.385136\n", "9 23.934886 11.543043 10.793109 7.385136\n", "10 23.353146 11.724661 10.793109 7.385136\n", "11 23.154665 11.528249 10.793109 7.385136\n", "12 22.851917 11.614104 10.793109 7.385136\n", "13 22.556055 11.890477 10.793109 7.385136\n", "14 22.435674 11.309677 10.793109 7.385136\n", "15 22.297691 11.825569 10.793109 7.385136" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }