{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport datetime\nimport os\n#print(os.listdir(\"../input\"))\n\nimport time\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import (accuracy_score, f1_score, precision_score, \nauc, recall_score, roc_curve, roc_auc_score)\nfrom sklearn.metrics import confusion_matrix, classification_report\nfrom imblearn.over_sampling import SMOTE, ADASYN, RandomOverSampler\nfrom sklearn.ensemble import RandomForestClassifier\n\nimport xgboost as xgb\n\n%matplotlib inline\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3f2d3f15ec2958ee8cecba33e3f36bed24e882bc","collapsed":true},"cell_type":"code","source":"# seaborn settings \n\nsns.set(rc={'figure.figsize':(10,4)});\nplt.figure(figsize=(10,4));","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a1bdde7979f338beafa1dbcd92a28fc695db68fa","collapsed":true},"cell_type":"code","source":"print(sns.__version__)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"collapsed":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv', nrows=18790469)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"fa5b24bcef79a03f6337b8bb66f302cd84436ae8"},"cell_type":"code","source":"test = pd.read_csv('../input/test.csv', nrows=18790469)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0b079a79155f4976b0cb1b69dd8831a9ab956431","collapsed":true},"cell_type":"code","source":"test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"aa3aaf00c6de1c9034b21a432fd70ea90d037314","collapsed":true},"cell_type":"code","source":"train.columns = ['ip', 'app', 'device', 'os', 'channel', 'click_time', 'attributed_time', 'is_attributed']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1bca518d048f1f0f57dab1185bdce00389d4cea9","collapsed":true},"cell_type":"code","source":"train.nunique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a8ef361ce9209f33e190db5110179fde7989fa6b","collapsed":true},"cell_type":"code","source":"train['click_time'] = train['click_time'].astype('datetime64[ns]')\ntest['click_time'] = test['click_time'].astype('datetime64[ns]')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1ae08907298d14050c9c2f90cb4982ea5297aee3","collapsed":true},"cell_type":"code","source":"train.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c69976e2c58d2c9cdbf7f28a7b01ca3cdfce03f7","collapsed":true},"cell_type":"code","source":"train.head(1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e8db1f16d3f35c57db68148c373a40dfee5bd0bc","collapsed":true},"cell_type":"code","source":"train.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"0f2653e6cd96bc79d0adc6b89f2cf506756589e4"},"cell_type":"code","source":"user_agent = ['ip','app','device','os','channel']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0d69293aceac3f9bbcb68e08fe5952834bdd3df7","collapsed":true},"cell_type":"code","source":"# concatenate all computer related features into one string for data exploration purposes. \n# we should be reasonably certain that each user agent is one unique individual. \n# click time and attributed time may help shed further light here. \n\ntrain['user_agent'] = train[user_agent].apply(lambda x: '.'.join(x.astype(str)), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d1f80759d1410dc8a0c0788a8867c5fab2552ffa","collapsed":true},"cell_type":"code","source":"train.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"5c964827845d78ca11f379908f591eae42222480"},"cell_type":"code","source":"train['day'] = train['click_time'].dt.day.astype('uint8')\ntrain['hour'] = train['click_time'].dt.hour.astype('uint8')\ntrain['minute'] = train['click_time'].dt.minute.astype('uint8')\ntrain['second'] = train['click_time'].dt.second.astype('uint8')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b07c631d324a544a7e07e8e7e983d033116277b8","collapsed":true},"cell_type":"code","source":"test['day'] = test['click_time'].dt.day.astype('uint8')\ntest['hour'] = test['click_time'].dt.hour.astype('uint8')\ntest['minute'] = test['click_time'].dt.minute.astype('uint8')\ntest['second'] = test['click_time'].dt.second.astype('uint8')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"ddd82be9219b4bbdf7833ef94496bd3c32be6087","collapsed":true},"cell_type":"code","source":"train.head(1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"47610f9413770b2df054913a27553c6385c5714e","collapsed":true},"cell_type":"code","source":"# prepare X and y for train, test splits and CV \n\ny = train['is_attributed']\nX = train.drop(['ip', 'is_attributed','click_time',\n                'attributed_time'], axis=1).select_dtypes(include=[np.number])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e4409d02c022cfa7e8379444bed8667019c11536","collapsed":true},"cell_type":"code","source":"test.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"705aa452c0f84e37354c47a3a29bfc2ee1a1b766","collapsed":true},"cell_type":"code","source":"test = test.drop(['click_time'], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"baae759d3ea90f5f617ef365b9fea01f1a02e0d6","collapsed":true},"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, \n                                                    test_size = 0.2, random_state=44)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bf0a2fcce599b60a74c2cfe1f88a0f0a2a0af4a7","collapsed":true},"cell_type":"code","source":"# Split into X and y\n\n# Create a model\n# Params from: https://www.kaggle.com/aharless/swetha-s-xgboost-revised\nclf_xgBoost = xgb.XGBClassifier(\n    max_depth = 4,\n    subsample = 0.8,\n    colsample_bytree = 0.7,\n    colsample_bylevel = 0.7,\n    scale_pos_weight = 2, # default 9 \n    min_child_weight = 0,\n    reg_alpha = 4,\n    n_jobs = 4, \n    objective = 'binary:logistic'\n)\n# Fit the models\nmodel = clf_xgBoost.fit(X_train, y_train)\n# default ROC score is .9455","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"c29971d0fc141bcd49c4f2e537e1658d53324dfa"},"cell_type":"code","source":"def summary_stats(model, X_train=X_train, y_train=y_train, \n                  X_test=X_test, y_test=y_test):\n    '''\n    input model (linear regression, random forest), X_train, y_train, X_test and y_test\n    '''\n    model.fit(X_train, y_train)\n    \n    try: \n        prob_y = model.predict_proba(X_test)\n        prob_y = [p[1] for p in prob_y]\n    except: \n        pass\n    \n    p = model.predict(X_test)\n    \n    print(\"ROC Score: {:.04f}\\nRecall Score: {:.04f}\\n\\\nAccuracy Score: {:.04f}\\nMisclassification Rate: {:04f}\\n\\\nPrecision Score: {:.04f}\\nF1 Score: {:.04f}\\n\"\n          .format(roc_auc_score(y_test, prob_y),\n                  recall_score(y_test,p),\n                  accuracy_score(y_test,p),\n                  1-accuracy_score(y_test,p),\n                  precision_score(y_test,p),\n                  f1_score(y_test,p)))\n    \n    print(confusion_matrix(y_test, p))\n    print(\"\\n\")\n    print(classification_report(y_test, p))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8bafa2f17f5039c263e6e5bed8ce14e30de88a02","collapsed":true},"cell_type":"code","source":"summary_stats(clf_xgBoost)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"37da4f20a27aa8a574744589c0fc14811dba5b18"},"cell_type":"code","source":"submission_cols = ['click_id','is_attributed']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"7a887e0b71b5f854f0830498340cffd5a7d104ff"},"cell_type":"code","source":"sub = pd.DataFrame()\nsub['click_id'] = test['click_id']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"3bc40212ab816d7c1bbfa715b5f50a97c49612b5"},"cell_type":"code","source":"watchlist = [(xgb.DMatrix(X_train, y_train), 'train'), (xgb.DMatrix(X_test, y_test), 'valid')]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"bfcf8f8f3f627382ca944223cad4a892ab5a8928"},"cell_type":"code","source":"params = {'eta': 0.1, \n          'max_depth': 4, \n          'subsample': 0.9, \n          'colsample_bytree': 0.7, \n          'colsample_bylevel':0.7,\n          'min_child_weight':100,\n          'alpha':4,\n          'objective': 'binary:logistic', \n          'eval_metric': 'auc', \n          'random_state': 99, \n          'scale_pos_weight': 150,\n          'silent': True}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"24b65f903f67f29366ed548057f3614b14dc2836","collapsed":true},"cell_type":"code","source":"model = xgb.train(params, xgb.DMatrix(X_train, y_train), 270, watchlist, maximize=True, verbose_eval=10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bdc3e236544f59837f9780fd7e43314190fb0643","collapsed":true},"cell_type":"code","source":"test.drop(['click_id','ip'], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"38c3fb48f9c15b8d1efd042955f1af9381fec70d","collapsed":true},"cell_type":"code","source":"sub['is_attributed'] = model.predict(xgb.DMatrix(test), ntree_limit=model.best_ntree_limit)\nsub.to_csv('xgb_sub.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}