Created
June 12, 2016 00:51
-
-
Save tvorogme/9331533b18ce651783fb18652d3963aa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Import" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 146, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import os,sys\n", | |
"import multiprocessing\n", | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"from matplotlib import pyplot as plt\n", | |
"from sklearn.preprocessing import LabelBinarizer, LabelEncoder\n", | |
"from sklearn.cross_validation import train_test_split\n", | |
"import xgboost as xgb\n", | |
"import operator\n", | |
"from sklearn.externals import joblib\n", | |
"import seaborn as sns\n", | |
"from itertools import islice" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 147, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Get data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 148, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"train_raw = pd.DataFrame.from_csv(\"data/train.csv\")\n", | |
"test = pd.read_csv('data/test.csv')\n", | |
"train_raw = train_raw[::1].reset_index(drop=True)\n", | |
"target = train_raw['burned'].values" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Get all data that we need" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"x_col = ['due', 'dist','lat','lon']\n", | |
"train = train_raw[x_col]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Data convert function" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 261, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"manager = multiprocessing.Manager()\n", | |
"return_dict = manager.dict()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 260, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def cycle_it(data_raw, min, max, n, name):\n", | |
" if n == 1: return data_raw\n", | |
" data = np.array([data_raw]*n).T\n", | |
" names = np.zeros(n).astype('object'); names[0] = name\n", | |
" for k in range(1,n):\n", | |
" bound = float(min )+ (float(max)-float(min))*k/n\n", | |
" # data[data_raw > bound,k]+=max# + data[data_raw > bound,k]\n", | |
" data[data_raw <= bound,k]+=max\n", | |
" names[k] = (name + str(round(bound,2))).replace('.','')\n", | |
" return pd.DataFrame(data, columns=names)\n", | |
"\n", | |
"holidays_list = \"1.01,2.01,3.01,4.01,5.01,6.01,7.01,8.01,\"\\\n", | |
"\"23.02,8.03,9.03,10.03,1.05,2.05,3.05,4.05,9.05,10.05,11.05,12.06,13.06\".split(',')\n", | |
"moskow_start_y = 37.655152\n", | |
"moskow_end_y = 37.551483\n", | |
"spb_start_y = 30.313870\n", | |
"spb_end_y = 30.316561\n", | |
"\n", | |
"moskow_start_x = 55.748700\n", | |
"moskow_end_x = 55.773426\n", | |
"spb_start_x = 59.930021\n", | |
"spb_end_x = 59.972441\n", | |
"holidays_list = map(lambda s: tuple(map(int,s.split('.'))),holidays_list)\n", | |
"\n", | |
"from dateutil import parser\n", | |
"\n", | |
"def preprocess_data(data, num):\n", | |
" \n", | |
" longdist = map(lambda dist: dist >= 50305, data['dist'])\n", | |
" \n", | |
" moskow_y = map(lambda lon: (moskow_start_y-lon)+(moskow_end_y-lon),data['lon'])\n", | |
" spb_y = map(lambda lon: (spb_start_y-lon)+(spb_end_y-lon),data['lon'])\n", | |
" \n", | |
" moskow_x = map(lambda lon: (moskow_start_x-lon)+(moskow_end_x-lon),data['lat'])\n", | |
" spb_x = map(lambda lon: (spb_start_x-lon)+(spb_end_x-lon),data['lat'])\n", | |
"\n", | |
" datetimes = list(data.due.apply(lambda x: parser.parse(x)))\n", | |
" \n", | |
" workday = map(lambda dt: dt.hour in range(10,19), datetimes)\n", | |
"\n", | |
" rel_times = map(lambda dt: (dt.hour*60 + dt.minute)/(24.*60), datetimes)\n", | |
"\n", | |
" rel_times = cycle_it(np.array(rel_times),0.,1.,10,'time')\n", | |
"\n", | |
" is_holiday_1 = map(lambda dt: (dt.day,dt.month) in holidays_list,# or dt.isoweekday()>=6,\n", | |
" datetimes)\n", | |
" is_holiday_2 = map(lambda dt: (dt.day, dt.month) in holidays_list or dt.isoweekday()>=6,\n", | |
" datetimes)\n", | |
" is_holiday_3 = map(lambda dt: (dt.day, dt.month) in holidays_list or dt.isoweekday() >= 5,\n", | |
" datetimes)\n", | |
" features = pd.DataFrame(np.vstack([is_holiday_2,is_holiday_3,moskow_y,moskow_x,spb_y,spb_x, workday, longdist]).T, columns=['hol2','hol3',\n", | |
" 'moskowy','moskowx','spby','spbx','workday','longdist'])\n", | |
"\n", | |
" data_new = pd.concat([rel_times,features,data[[\"dist\",\"lat\",\"lon\"]]],axis=1)\n", | |
"\n", | |
" print 'Done'\n", | |
" return_dict[num] = data_new" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 258, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"13869583.1986" | |
] | |
}, | |
"execution_count": 258, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"train_raw['dist'].max()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Convert data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 262, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Done\n", | |
"Done\n" | |
] | |
} | |
], | |
"source": [ | |
"procs = []\n", | |
"num_of_val = 0\n", | |
"for val in [train,test]:\n", | |
" num_of_val += 1\n", | |
" p = multiprocessing.Process(target=preprocess_data, args=(val, num_of_val))\n", | |
" procs.append(p)\n", | |
" p.start()\n", | |
"\n", | |
"for p in procs:\n", | |
" p.join()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 263, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"train_new = return_dict[1]\n", | |
"test_new = return_dict[2]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 277, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>time</th>\n", | |
" <th>time01</th>\n", | |
" <th>time02</th>\n", | |
" <th>time03</th>\n", | |
" <th>time04</th>\n", | |
" <th>time05</th>\n", | |
" <th>time06</th>\n", | |
" <th>time07</th>\n", | |
" <th>time08</th>\n", | |
" <th>time09</th>\n", | |
" <th>...</th>\n", | |
" <th>hol3</th>\n", | |
" <th>moskowy</th>\n", | |
" <th>moskowx</th>\n", | |
" <th>spby</th>\n", | |
" <th>spbx</th>\n", | |
" <th>workday</th>\n", | |
" <th>longdist</th>\n", | |
" <th>dist</th>\n", | |
" <th>lat</th>\n", | |
" <th>lon</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>0.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>...</td>\n", | |
" <td>1</td>\n", | |
" <td>-0.439849</td>\n", | |
" <td>0.021866</td>\n", | |
" <td>-15.016053</td>\n", | |
" <td>8.402202</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>17990.125431</td>\n", | |
" <td>55.750130</td>\n", | |
" <td>37.823242</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>0.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>1.006250</td>\n", | |
" <td>...</td>\n", | |
" <td>1</td>\n", | |
" <td>-0.439849</td>\n", | |
" <td>0.021866</td>\n", | |
" <td>-15.016053</td>\n", | |
" <td>8.402202</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>17990.125431</td>\n", | |
" <td>55.750130</td>\n", | |
" <td>37.823242</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>0.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>...</td>\n", | |
" <td>1</td>\n", | |
" <td>0.524853</td>\n", | |
" <td>0.218962</td>\n", | |
" <td>-14.051351</td>\n", | |
" <td>8.599298</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>11439.391945</td>\n", | |
" <td>55.651582</td>\n", | |
" <td>37.340891</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>0.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>...</td>\n", | |
" <td>1</td>\n", | |
" <td>-0.388555</td>\n", | |
" <td>0.255318</td>\n", | |
" <td>-14.964759</td>\n", | |
" <td>8.635654</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>14608.577392</td>\n", | |
" <td>55.633404</td>\n", | |
" <td>37.797595</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>0.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>1.006944</td>\n", | |
" <td>...</td>\n", | |
" <td>1</td>\n", | |
" <td>0.166801</td>\n", | |
" <td>-0.018534</td>\n", | |
" <td>-14.409403</td>\n", | |
" <td>8.361802</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>6070.886393</td>\n", | |
" <td>55.770330</td>\n", | |
" <td>37.519917</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 21 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" time time01 time02 time03 time04 time05 time06 \\\n", | |
"0 0.006250 1.006250 1.006250 1.006250 1.006250 1.006250 1.006250 \n", | |
"1 0.006250 1.006250 1.006250 1.006250 1.006250 1.006250 1.006250 \n", | |
"2 0.006944 1.006944 1.006944 1.006944 1.006944 1.006944 1.006944 \n", | |
"3 0.006944 1.006944 1.006944 1.006944 1.006944 1.006944 1.006944 \n", | |
"4 0.006944 1.006944 1.006944 1.006944 1.006944 1.006944 1.006944 \n", | |
"\n", | |
" time07 time08 time09 ... hol3 moskowy moskowx \\\n", | |
"0 1.006250 1.006250 1.006250 ... 1 -0.439849 0.021866 \n", | |
"1 1.006250 1.006250 1.006250 ... 1 -0.439849 0.021866 \n", | |
"2 1.006944 1.006944 1.006944 ... 1 0.524853 0.218962 \n", | |
"3 1.006944 1.006944 1.006944 ... 1 -0.388555 0.255318 \n", | |
"4 1.006944 1.006944 1.006944 ... 1 0.166801 -0.018534 \n", | |
"\n", | |
" spby spbx workday longdist dist lat lon \n", | |
"0 -15.016053 8.402202 0 0 17990.125431 55.750130 37.823242 \n", | |
"1 -15.016053 8.402202 0 0 17990.125431 55.750130 37.823242 \n", | |
"2 -14.051351 8.599298 0 0 11439.391945 55.651582 37.340891 \n", | |
"3 -14.964759 8.635654 0 0 14608.577392 55.633404 37.797595 \n", | |
"4 -14.409403 8.361802 0 0 6070.886393 55.770330 37.519917 \n", | |
"\n", | |
"[5 rows x 21 columns]" | |
] | |
}, | |
"execution_count": 277, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"train_new.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Save or load preprocess data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 239, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['test_new_geo_0',\n", | |
" 'test_new_geo_0_01.npy',\n", | |
" 'test_new_geo_0_02.npy',\n", | |
" 'test_new_geo_0_03.npy',\n", | |
" 'test_new_geo_0_04.npy',\n", | |
" 'test_new_geo_0_05.npy',\n", | |
" 'test_new_geo_0_06.npy',\n", | |
" 'test_new_geo_0_07.npy']" | |
] | |
}, | |
"execution_count": 239, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Ð”Ð»Ñ ÑохранениÑ\n", | |
"joblib.dump(train_new, 'train_new_geo_0')\n", | |
"joblib.dump(train_new, 'test_new_geo_0')\n", | |
"\n", | |
"# Ð”Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸\n", | |
"# train_new = joblib.load('train_new_geo_0')\n", | |
"# test_new = joblib.load('test_new_geo_0')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Split train/test 90%/10%" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 265, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"bound = int(train_new.shape[0]*0.9)\n", | |
"x_train, x_val = train_new[:bound], train_new[bound:]\n", | |
"y_train, y_val = target[:bound], target[bound:]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 266, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"dtrain = xgb.DMatrix(x_train, y_train)\n", | |
"dval = xgb.DMatrix(x_val, y_val)\n", | |
"dtest = xgb.DMatrix(test_new)\n", | |
"watchlist = [(dval,'eval')]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Train model on AUC score" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 278, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"params = {\"booster\": \"gbtree\",\n", | |
" \"objective\": \"binary:logistic\",\n", | |
" \"eta\": 0.05,\n", | |
" \"max_depth\": 11,\n", | |
" \"subsample\": 0.3,\n", | |
" \"colsample_bytree\": 0.95,\n", | |
" \"silent\": 0,\n", | |
" \"seed\": 0,\n", | |
" \"eval_metric\": \"auc\",\n", | |
" }\n", | |
"num_trees = 5000\n", | |
"esr = 70" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"Will train until eval error hasn't decreased in 70 rounds.\n", | |
"[0]\teval-auc:0.651055\n", | |
"[1]\teval-auc:0.658838\n", | |
"[2]\teval-auc:0.660250\n", | |
"[3]\teval-auc:0.661390\n", | |
"[4]\teval-auc:0.661811\n", | |
"[5]\teval-auc:0.662123\n", | |
"[6]\teval-auc:0.662387\n", | |
"[7]\teval-auc:0.663623\n", | |
"[8]\teval-auc:0.663565\n", | |
"[9]\teval-auc:0.663748\n", | |
"[10]\teval-auc:0.663866\n", | |
"[11]\teval-auc:0.664744\n", | |
"[12]\teval-auc:0.664760\n", | |
"[13]\teval-auc:0.664728\n", | |
"[14]\teval-auc:0.664749\n", | |
"[15]\teval-auc:0.664785\n", | |
"[16]\teval-auc:0.664793\n", | |
"[17]\teval-auc:0.664832\n", | |
"[18]\teval-auc:0.665007\n", | |
"[19]\teval-auc:0.664929\n", | |
"[20]\teval-auc:0.664915\n", | |
"[21]\teval-auc:0.664975\n", | |
"[22]\teval-auc:0.664954\n", | |
"[23]\teval-auc:0.664975\n" | |
] | |
} | |
], | |
"source": [ | |
"gbm = xgb.train(params, dtrain, num_trees, evals=watchlist, verbose_eval=True, early_stopping_rounds = esr)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"eval-auc:0.677847" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Features improvments" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 275, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n03lo5wAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7ff4df02e4d0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"importance = gbm.get_fscore()\n", | |
"importance = sorted(importance.items(), key=operator.itemgetter(1))\n", | |
"df = pd.DataFrame(importance, columns=['feature', 'fscore'])\n", | |
"df['fscore'] = df['fscore'] / df['fscore'].sum()\n", | |
"featp = df.iloc[-50:,].plot(kind='barh', x='feature', y='fscore', legend=False, figsize=(6, 10))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Generate answer" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 276, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"prediction = gbm.predict(dtest)\n", | |
"\n", | |
"response = pd.DataFrame()\n", | |
"response[\"Ids\"] = np.arange(test.shape[0])\n", | |
"response[\"Y_prob\"] = prediction\n", | |
"\n", | |
"response.to_csv('answer.csv',index=None)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"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.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment