{"cells":[{"metadata":{"trusted":false,"_uuid":"c32c224eaf411ea311027d3b2fab9cf51c702021"},"cell_type":"code","source":"# Load in libraries\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport lightgbm as lgb\nimport os\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport datetime as dt\nfrom sklearn import model_selection, preprocessing, metrics\ncolor = sns.color_palette()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"7413f0e954805bd5a0c807b711e671ddf8151828"},"cell_type":"code","source":"# Check for Correct Files\nprint(os.listdir('../input'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6faec3f03cd8106491254d7f73946c8d1af593c6"},"cell_type":"code","source":"# Read in datasets to use\n\ntrain = pd.read_csv(\"../input/train.csv\", parse_dates=[\"first_active_month\"])\ntest = pd.read_csv(\"../input/test.csv\", parse_dates=[\"first_active_month\"])\nhist = pd.read_csv(\"../input/historical_transactions.csv\")\nnew_trans = pd.read_csv(\"../input/new_merchant_transactions.csv\")\nhist.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"3224275d07e5def2d5c5b848c2d7cdf7e30c59a5"},"cell_type":"code","source":"# Find most frequent merchant used by each cardID\n\ncats = hist['merchant_category_id'].unique()\n\n\nfreq_merch = hist.groupby(\"card_id\")\nfreq_merch = freq_merch['merchant_category_id'] \\\n            .agg(lambda x: x.value_counts().index[0]) \\\n            .reset_index()\n\nfreq_merch['merchant_category_id'] = freq_merch['merchant_category_id'] \\\n                                    .astype('category', categories = cats)\n\nfreq_merch['merchant_category_id'].dtype","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"1f8f8d4a37310381e515f9f7a4d0543bcb14350f"},"cell_type":"code","source":"# Find total number of individual purchases\nnum_purch = hist.groupby('card_id')\nnum_purch = num_purch['purchase_amount'] \\\n            .agg(lambda x: len(x)) \\\n            .reset_index()\nnum_purch.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f6e1e0edd7ec8c3fc46144700741cd7a219d15da"},"cell_type":"code","source":"# Merge and aggregate DFs\n\n\ngdf = hist.groupby(\"card_id\")\ngdf = gdf[\"purchase_amount\"].agg(['sum', 'mean', 'std', 'min', 'max']).reset_index()\n\ngdf = pd.merge(gdf, freq_merch, on = 'card_id', how = 'left')\ngdf = pd.merge(gdf, num_purch, on = 'card_id', how = 'left')\ngdf.columns = [\"card_id\", \"sum_hist_trans\", \"mean_hist_trans\",\n              \"std_hist_trans\", \"min_hist_trans\", \"max_hist_trans\", 'freq_merch',\n              'num_purchases']\n\ntrain = pd.merge(train, gdf, on=\"card_id\", how=\"left\")\ntest = pd.merge(test, gdf, on=\"card_id\", how=\"left\")\n\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"0d8e3a783f5734f1b265f7751e67a0e13a9be5e9"},"cell_type":"code","source":"len(train['freq_merch'].unique())","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":false,"_uuid":"486c57de27405b730ff8cdc7d590e4fd8f692de0"},"cell_type":"code","source":"# Freq Merch boxplot\nplt.figure(figsize=(12,8))\nsns.boxplot(x=\"freq_merch\", y='target', data=train, showfliers=False)\nplt.xticks(rotation='vertical')\nplt.xlabel('Most Common Merchant', fontsize=12)\nplt.ylabel('Loyalty score', fontsize=12)\nplt.title(\"Frequent Merchants\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"3363cd3fb9f277ef1c2249acb48f175b5543ebb1"},"cell_type":"code","source":"# Number new merchant transactions\n\ngdf = new_trans.groupby(\"card_id\")\ngdf = gdf[\"purchase_amount\"].size().reset_index()\ngdf.columns = [\"card_id\", \"num_merch_transactions\"]\ntrain = pd.merge(train, gdf, on=\"card_id\", how=\"left\")\ntest = pd.merge(test, gdf, on=\"card_id\", how=\"left\")\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"daadaff62c0a9b09e996ac8e4c5a13a22444c9a7"},"cell_type":"code","source":"# Aggregate new merchant transactions \n\ngdf = new_trans.groupby(\"card_id\")\ngdf = gdf[\"purchase_amount\"].agg(['sum', 'mean', 'std', 'min', 'max']).reset_index()\n\ngdf.columns = [\"card_id\", \"sum_merch_trans\", \"mean_merch_trans\",\n               \"std_merch_trans\", \"min_merch_trans\", \"max_merch_trans\"]\n\ntrain = pd.merge(train, gdf, on=\"card_id\", how=\"left\")\ntest = pd.merge(test, gdf, on=\"card_id\", how=\"left\")\n\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":false,"_uuid":"8d5bec31f29084b275b00a6877c11973fbad73db"},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"760a3923b1cf8f0c97248e106e9f1951c5d7dc9a"},"cell_type":"code","source":"# Final Prep before baseline model\n\ntrain[\"year\"] = train[\"first_active_month\"].dt.year\ntest[\"year\"] = test[\"first_active_month\"].dt.year\ntrain[\"month\"] = train[\"first_active_month\"].dt.month\ntest[\"month\"] = test[\"first_active_month\"].dt.month\n\ncols_to_use = [\"feature_1\", \"feature_2\", \"feature_3\", \"year\", \"month\", \"sum_hist_trans\",\n               \"mean_hist_trans\", \"std_hist_trans\", \"min_hist_trans\", \"max_hist_trans\",\n               'freq_merch', 'num_purchases', \"num_merch_transactions\",\n               \"sum_merch_trans\", \"mean_merch_trans\", \"std_merch_trans\",\n               \"min_merch_trans\", \"max_merch_trans\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"868fcda45fe09e1500d6a3166d126426113f0281"},"cell_type":"code","source":"# Define LGBM function\ndef run_lgb(train_X, train_y, val_X, val_y, test_X):\n    params = {\n        \"objective\" : \"regression\",\n        \"metric\" : \"rmse\",\n        \"num_leaves\" : 30,\n        \"min_child_weight\" : 50,\n        \"learning_rate\" : 0.05,\n        \"bagging_fraction\" : 0.7,\n        \"feature_fraction\" : 0.7,\n        \"bagging_frequency\" : 5,\n        \"bagging_seed\" : 2018,\n        \"verbosity\" : -1\n    }\n    \n    lgtrain = lgb.Dataset(train_X, label=train_y)\n    lgval = lgb.Dataset(val_X, label=val_y)\n    evals_result = {}\n    model = lgb.train(params, lgtrain, 1000, valid_sets=[lgval], early_stopping_rounds=100,\n                      verbose_eval=100, evals_result=evals_result)\n    \n    pred_test_y = model.predict(test_X, num_iteration=model.best_iteration)\n    return pred_test_y, model, evals_result\n\ntrain_X = train[cols_to_use]\ntest_X = test[cols_to_use]\ntrain_y = train['target'].values\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6f2ea72af7ac669cebd5c970548cbbc2e8ccfc6d"},"cell_type":"code","source":"pred_test = 0\nkf = model_selection.KFold(n_splits=5, random_state=2018, shuffle=True)\nfor dev_index, val_index in kf.split(train):\n    dev_X, val_X = train_X.loc[dev_index,:], train_X.loc[val_index,:]\n    dev_y, val_y = train_y[dev_index], train_y[val_index]\n    \n    pred_test_tmp, model, evals_result = run_lgb(dev_X, dev_y, val_X, val_y, test_X)\n    pred_test += pred_test_tmp\npred_test /= 5.","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"2ffed1b192ff0bd8849ef431140fab11699fc448"},"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(12,10))\nlgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)\nax.grid(False)\nplt.title(\"LightGBM - Feature Importance\", fontsize=15)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"00139d7ebd531d12e155a2a0e5d399e062b0d1dc"},"cell_type":"code","source":"# Submit\nsub_df = pd.DataFrame({\"card_id\":test[\"card_id\"].values})\nsub_df[\"target\"] = pred_test\nsub_df.to_csv(\"baseline_lgb.csv\", index=False)\n","execution_count":null,"outputs":[]}],"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.7.0"}},"nbformat":4,"nbformat_minor":1}