{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom datetime import datetime\nfrom sklearn.model_selection import KFold, RepeatedKFold\nimport lightgbm as lgb\nfrom sklearn.metrics import roc_auc_score, accuracy_score\nimport gc\n\ndef extractDateFeatures(df, sourceName):\n    seasons = [0,0,1,1,1,2,2,2,3,3,3,0] #dec - feb is winter, then spring, summer, fall etc\n    df['df_day_' + sourceName] = pd.to_datetime(df[sourceName]).dt.day.astype('uint8')\n    df['df_weekday_' + sourceName] = pd.to_datetime(df[sourceName]).dt.dayofweek.astype('uint8')\n    df['df_hour_' + sourceName] = pd.to_datetime(df[sourceName]).dt.hour.astype('uint8')\n\ndtypes = {\n        'ip'            : 'uint32',\n        'app'           : 'uint16',\n        'device'        : 'uint16',\n        'os'            : 'uint16',\n        'channel'       : 'uint16',\n        'is_attributed' : 'uint8',\n        'click_id'      : 'uint32'\n        }    \n\ntrain=pd.read_csv(\"../input/train_sample.csv\",\\\n                 dtype=dtypes)\nextractDateFeatures(train,'click_time')\n\nGROUPBY_AGGREGATIONS = [\n    # Variance in day, for ip-app-channel\n    {'groupby': ['ip','app','channel'], 'select': 'df_day_click_time', 'agg': 'var', 'type': 'float32'},\n    # Variance in day, for ip-app-device\n    {'groupby': ['ip','app','device'], 'select': 'df_day_click_time', 'agg': 'var', 'type': 'float32'},\n    # Variance in day, for ip-app-os\n    {'groupby': ['ip','app','os'], 'select': 'df_day_click_time', 'agg': 'var', 'type': 'float32'},\n\n    # Count, for ip-day-hour\n    {'groupby': ['ip','df_day_click_time','df_hour_click_time'], 'select': 'channel', 'agg': 'count', 'type': 'uint32'},\n    \n    # Count, for ip-app\n    {'groupby': ['ip', 'app'], 'select': 'channel', 'agg': 'count', 'type': 'uint32'},        \n    # Count, for ip-app-os\n    {'groupby': ['ip', 'app', 'os'], 'select': 'channel', 'agg': 'count', 'type': 'uint32'},\n    # Count, for ip-app-day-hour\n    {'groupby': ['ip','app','df_day_click_time','df_hour_click_time'], 'select': 'channel', 'agg': 'count', 'type': 'uint32'},\n    \n    # Mean hour, for ip-app-channel\n    {'groupby': ['ip','app','channel'], 'select': 'df_hour_click_time', 'agg': 'mean', 'type': 'float32', 'type': 'float32'}\n]","execution_count":1,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","collapsed":true,"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"test=pd.read_csv(\"../input/test.csv\"\\\n                 ,nrows=100000, dtype=dtypes)\nextractDateFeatures(test,'click_time')","execution_count":2,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"4dbbf7d5efb45cd7533440eb338974019069aad5"},"cell_type":"code","source":"for spec in GROUPBY_AGGREGATIONS:\n    # Unique list of features to select\n    all_features = list(set(spec['groupby'] + [spec['select']]))\n    # Name of new feature\n    new_feature = '{}_{}_{}'.format('_'.join(spec['groupby']), spec['agg'], spec['select'])\n     # Perform the groupby\n    gp = train[all_features]. \\\n        groupby(spec['groupby'])[spec['select']]. \\\n        agg(spec['agg']). \\\n        reset_index(). \\\n        rename(index=str, columns={spec['select']: new_feature}).astype(spec['type'])\n     # Merge back to X_train\n    train = train.merge(gp, on=spec['groupby'], how='left')\n    \n    gp = test[all_features]. \\\n        groupby(spec['groupby'])[spec['select']]. \\\n        agg(spec['agg']). \\\n        reset_index(). \\\n        rename(index=str, columns={spec['select']: new_feature}).astype(spec['type'])\n     # Merge back to X_train\n    test = test.merge(gp, on=spec['groupby'], how='left')\n    \ndel gp\ngc.collect()\n\ntrain.fillna(0,inplace=True)\ntest.fillna(0,inplace=True)","execution_count":3,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e1973416496f86dc2369ff126e3565b529ad3ae1"},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ny_train = train['is_attributed']\nx_train = train.drop(['is_attributed','click_time','attributed_time'],axis=1)\ny_test = train['is_attributed']\nx_test = test.drop(['click_time'],axis=1)\n\ncnt = 0\np_buf = []\nn_splits = 2\nn_repeats = 1\nkf = RepeatedKFold(\n    n_splits=n_splits, \n    n_repeats=n_repeats, \n    random_state=0)\nauc_buf = []   \n\nparams = {\n        'boosting_type': 'gbdt',\n        'objective': 'binary',\n        'metric': 'auc',\n        'max_depth': 12,\n        'num_leaves': 31,\n        'learning_rate': 0.025,\n        'feature_fraction': 0.85,\n        'bagging_fraction': 0.85,\n        'bagging_freq': 5,\n        'verbose': 0,\n        'num_threads': 4,\n        'lambda_l2': 1.5,\n        'min_gain_to_split': 0,\n    }  \n\nfor train_index, valid_index in kf.split(x_train):\n    print('Fold {}/{}'.format(cnt + 1, n_splits))\n    \n    model = lgb.train(\n        params,\n        lgb.Dataset(x_train.loc[train_index], y_train.loc[train_index], feature_name=x_train.columns.tolist()),\n        num_boost_round=10000,\n        valid_sets=[lgb.Dataset(x_train.loc[valid_index], y_train.loc[valid_index])],\n        early_stopping_rounds=100,\n        verbose_eval=100,\n    )\n\n    if cnt == 0:\n        importance = model.feature_importance()\n        model_fnames = model.feature_name()\n        tuples = sorted(zip(model_fnames, importance), key=lambda x: x[1])[::-1]\n        tuples = [x for x in tuples if x[1] > 0]\n        print('Important features:')\n        print(tuples[:200])\n\n    p = model.predict(x_train.loc[valid_index], num_iteration=model.best_iteration)\n    auc = roc_auc_score(y_train.loc[valid_index], p)\n\n    print('{} AUC: {}'.format(cnt, auc))\n\n    p = model.predict(x_test, num_iteration=model.best_iteration)\n    if len(p_buf) == 0:\n        p_buf = np.array(p)\n    else:\n        p_buf += np.array(p)\n    auc_buf.append(auc)\n\n    cnt += 1\n    if cnt > 0: # Comment this to run several folds\n        break\n    \n    '''del model\n    gc.collect'''\n\nauc_mean = np.mean(auc_buf)\nauc_std = np.std(auc_buf)\nprint('AUC = {:.6f} +/- {:.6f}'.format(auc_mean, auc_std))\n\npreds = p_buf/cnt","execution_count":4,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"480f8dc85fdbedc5b14c0fa9d7570e9fe4f4355c"},"cell_type":"code","source":"import csv\n\nsubm = pd.DataFrame()\nsubm['click_id'] = test['click_id']\nsubm['is_attributed'] = preds\nsubm.to_csv('talkingdata_submission.csv', index=False,quoting=csv.QUOTE_NONNUMERIC)\nsubm.head()","execution_count":5,"outputs":[]}],"metadata":{"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":1}