{"nbformat": 4, "cells": [{"cell_type": "code", "execution_count": null, "outputs": [], "source": ["from multiprocessing import Pool, cpu_count\n", "import gc; gc.enable()\n", "import xgboost as xgb\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn import *\n", "import sklearn\n", "\n", "train = pd.read_csv('../input/train.csv')\n", "test = pd.read_csv('../input/sample_submission_zero.csv')\n", "\n", "transactions = pd.read_csv('../input/transactions.csv', usecols=['msno'])\n", "transactions = pd.DataFrame(transactions['msno'].value_counts().reset_index())\n", "transactions.columns = ['msno','trans_count']\n", "train = pd.merge(train, transactions, how='left', on='msno')\n", "test = pd.merge(test, transactions, how='left', on='msno')\n", "transactions = []; print('transaction merge...')\n", "\n", "user_logs = pd.read_csv('../input/user_logs.csv', usecols=['msno'])\n", "user_logs = pd.DataFrame(user_logs['msno'].value_counts().reset_index())\n", "user_logs.columns = ['msno','logs_count']\n", "train = pd.merge(train, user_logs, how='left', on='msno')\n", "test = pd.merge(test, user_logs, how='left', on='msno')\n", "user_logs = []; print('user logs merge...')\n", "\n", "members = pd.read_csv('../input/members.csv')\n", "train = pd.merge(train, members, how='left', on='msno')\n", "test = pd.merge(test, members, how='left', on='msno')\n", "members = []; print('members merge...') "], "metadata": {"_uuid": "0797f9105fc62785850af750fd949002f8b9a322", "_cell_guid": "f229ddc8-6924-4abf-8719-e0ec3c652863"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["gender = {'male':1, 'female':2}\n", "train['gender'] = train['gender'].map(gender)\n", "test['gender'] = test['gender'].map(gender)\n", "\n", "train = train.fillna(0)\n", "test = test.fillna(0)\n"], "metadata": {"_uuid": "b24e7f1fb0c01887208a020356d783e46c7b4172", "collapsed": true, "_cell_guid": "48c17f47-87b0-4bc5-99f2-f4ba90faa921"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["import time\n", "start=time.time()\n", "transactions = pd.read_csv('../input/transactions.csv')\n", "transactions = transactions.sort_values(by=['transaction_date'], ascending=[False]).reset_index(drop=True)\n", "transactions = transactions.drop_duplicates(subset=['msno'], keep='first')\n", "\n", "train = pd.merge(train, transactions, how='left', on='msno')\n", "test = pd.merge(test, transactions, how='left', on='msno')\n", "transactions=[]\n", "print('time costs {}s'.format(time.time()-start))\n", "print(\"train merge complete.\")\n", "print(\"test merge complete.\")"], "metadata": {"_uuid": "2d1849e5b6c07933039b3d025b3390a7db320c01", "_cell_guid": "4a52098a-2eee-401f-8b5d-eddaa5e28fbd"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["\n", "start=time.time()\n", "def transform_df(df):\n", "    df = pd.DataFrame(df)\n", "    df = df.sort_values(by=['date'], ascending=[False])\n", "    df = df.reset_index(drop=True)\n", "    df = df.drop_duplicates(subset=['msno'], keep='first')\n", "    return df\n", "\n", "def transform_df2(df):\n", "    df = df.sort_values(by=['date'], ascending=[False])\n", "    df = df.reset_index(drop=True)\n", "    df = df.drop_duplicates(subset=['msno'], keep='first')\n", "    return df\n", "\n", "df_iter = pd.read_csv('../input/user_logs.csv', low_memory=False, iterator=True, chunksize=10000000)\n", "last_user_logs = []\n", "i = 0 #~400 Million Records - starting at the end but remove locally if needed\n", "for df in df_iter:\n", "    if i>35:\n", "        if len(df)>0:\n", "            print(df.shape)\n", "            p = Pool(cpu_count())\n", "            df = p.map(transform_df, np.array_split(df, cpu_count()))   \n", "            df = pd.concat(df, axis=0, ignore_index=True).reset_index(drop=True)\n", "            df = transform_df2(df)\n", "            p.close(); p.join()\n", "            last_user_logs.append(df)\n", "            print('...', df.shape)\n", "            df = []\n", "    i+=1\n", "\n", "last_user_logs = pd.concat(last_user_logs, axis=0, ignore_index=True).reset_index(drop=True)\n", "last_user_logs = transform_df2(last_user_logs)\n", "\n", "train = pd.merge(train, last_user_logs, how='left', on='msno')\n", "test = pd.merge(test, last_user_logs, how='left', on='msno')\n", "last_user_logs=[]\n", "print('merge last_user_logs over! Time costs {}'.format(time.time()-start))"], "metadata": {"_uuid": "0de7839769997cade8bb31b96ec40df398edee90", "_cell_guid": "ef0ff7bd-cc4a-4603-b8a4-72591b6ba6c7"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["train = train.fillna(0)\n", "test = test.fillna(0)\n", "\n", "cols = [c for c in train.columns if c not in ['is_churn','msno']]\n", "print(len(cols))"], "metadata": {"_uuid": "10a1d624dcb3c7b4a4209aa642f5a837d92a2f09", "_cell_guid": "df0fd7c7-dad2-41b9-b144-0ea2d4b9fae4"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["print(\"start to train...\")\n", "\n", "start=time.time()\n", "def xgb_score(preds, dtrain):\n", "    labels = dtrain.get_label()\n", "    return 'log_loss', metrics.log_loss(labels, preds)\n", "\n", "fold = 3\n", "for i in range(fold):\n", "    print(\"fold{}\".format(i))\n", "    params = {\n", "        'eta': 0.02, #use 0.002\n", "        'max_depth': 5,\n", "        'objective': 'binary:logistic',\n", "        'eval_metric': 'logloss',\n", "        'seed': i,\n", "        'gamma':1,\n", "        'colsample':0.9,\n", "        'silent': True\n", "    }\n", "    x1, x2, y1, y2 = model_selection.train_test_split(train[cols], train['is_churn'], test_size=0.3, random_state=i)\n", "    watchlist = [(xgb.DMatrix(x1, y1), 'train'), (xgb.DMatrix(x2, y2), 'valid')]\n", "    model = xgb.train(params, xgb.DMatrix(x1, y1), 350,  watchlist, feval=xgb_score, maximize=False, verbose_eval=50, early_stopping_rounds=50) #use 1500\n", "    if i != 0:\n", "        pred += model.predict(xgb.DMatrix(test[cols]), ntree_limit=model.best_ntree_limit)\n", "    else:\n", "        pred = model.predict(xgb.DMatrix(test[cols]), ntree_limit=model.best_ntree_limit)\n", "pred /= fold\n", "test['is_churn'] = pred.clip(0.0000001, 0.999999)\n", "test[['msno','is_churn']].to_csv('submission3.csv.gz', index=False, compression='gzip')\n", "print('Write file job over!')\n", "print('time costs {}s'.format(time.time()-start))"], "metadata": {"_uuid": "cb258ccda2afac4d0e8ed0285da798c3808a5920", "_kg_hide-output": false, "_cell_guid": "00d437d9-df05-4f0c-a947-e2ca6cf0bac2"}}, {"cell_type": "code", "execution_count": null, "outputs": [], "source": ["import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline\n", "\n", "plt.rcParams['figure.figsize'] = (7.0, 7.0)\n", "xgb.plot_importance(booster=model); plt.show()"], "metadata": {"_uuid": "6b2d56d3d5338a5ea313e4c319c505ec44297f88", "scrolled": true, "_cell_guid": "e5930876-404e-4587-9fbc-4b8f32e2a761"}}], "metadata": {"kernelspec": {"display_name": "Python 3", "name": "python3", "language": "python"}, "language_info": {"name": "python", "version": "3.6.1", "mimetype": "text/x-python", "pygments_lexer": "ipython3", "codemirror_mode": {"version": 3, "name": "ipython"}, "nbconvert_exporter": "python", "file_extension": ".py"}}, "nbformat_minor": 1}