{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Introduction\n\n- This kernel is dedicated to implementing various feature engineering methodologies which is quite essential in Applied machine learning. The main objective is to maximize the score and achive higher rank using various techniques.\n\n- This kernel is referenced by [Feature Engineering Kaggle Course](https://www.kaggle.com/learn/feature-engineering) and few other blog posts which are mentioned in the end.\n\n- The data used in this notebook is provided in the [Talking Data ADtracking fraud detection Competition](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection)\n\n### Feature Engineering:\n\n![fe.jpg](attachment:fe.jpg)\n\n\n### Data Description\n\n- `ip:` ip address of click.\n\n- `app:` app id for marketing.\n\n- `device:` device type id of user mobile phone (e.g., iphone 6 plus, iphone 7, huawei mate 7, etc.)\n\n- `os:` os version id of user mobile phone\n\n- `channel:` channel id of mobile ad publisher\n\n- `click_time:` timestamp of click (UTC)\n\n- `attributed_time:` if user download the app for after clicking an ad, this is the time of the app download\n\n- **`is_attributed:`** the target that is to be predicted, indicating the app was downloaded **[target Variable]**\n\nTest data is similar, with the following differences:\n\n- `click_id:` reference for making predictions\n\n- `is_attributed:` not included\n\n### Content:\n\n- Data Preparation\n\n- Extracting features of timmestamp.\n\n- Label Encoding\n\n- Light GBM Modelling\n\n- Encoding categorical features:\n   \n   `1. Count Encoding`\n    \n   `2. Target Encoding`\n   \n   `3. CatBoost Encoding`\n    \n- Feature Generation\n    \n    `1. Interactions`\n    \n    `2. Last Activity` \n    \n    `3. Time since last activity`\n    \n    `4. Past downloads`\n\n- Test Data Preparation\n\n- Submissions.\n","attachments":{"fe.jpg":{"image/jpeg":"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REAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREB//Z"}}},{"metadata":{},"cell_type":"markdown","source":"### Let's Begin."},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport missingno as msno\nfrom plotly.offline import iplot, init_notebook_mode\ninit_notebook_mode()\nimport plotly.graph_objs as go\nimport plotly.express as px\nimport seaborn as sns","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd\n\nclick_data = pd.read_csv('../input/talkingdata-adtracking-fraud-detection/train_sample.csv',parse_dates=['click_time'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"click_data.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"print(\"Shape of click_data is : {}\".format(click_data.shape))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Add new columns for timestamp features day, hour, minute, and second\n\nclicks = click_data.copy()\nclicks['day'] = clicks['click_time'].dt.day.astype('uint8')\nclicks['hour'] = clicks['click_time'].dt.hour.astype('uint8')\nclicks['minute'] = clicks['click_time'].dt.minute.astype('uint8')\nclicks['second'] = clicks['click_time'].dt.second.astype('uint8')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"clicks.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## [Label Encoding:](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)\n\n- Giving labels to categorical features."},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn import preprocessing\n\ncat_features = ['ip', 'app', 'device', 'os', 'channel']\nlable_encoder = preprocessing.LabelEncoder()\n\nfor feature in cat_features:\n    encoded = lable_encoder.fit_transform(clicks[feature])\n    clicks[feature +'_labels'] = encoded","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"clicks.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"feature_cols = ['day', 'hour', 'minute', 'second', \n                'ip_labels', 'app_labels', 'device_labels',\n                'os_labels', 'channel_labels']\n\nvalid_fraction = 0.1\nclicks_srt = clicks.sort_values('click_time')\nvalid_rows = int(len(clicks_srt) * valid_fraction)\ntrain = clicks_srt[:-valid_rows * 2]\nvalid = clicks_srt[-valid_rows * 2:-valid_rows]\ntest = clicks_srt[-valid_rows:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"valid.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Missing Values."},{"metadata":{"trusted":true},"cell_type":"code","source":"# msno.bar(train)\n\nplt.style.use('seaborn-colorblind')\nf, (ax1, ax2) = plt.subplots(1, 2, figsize = (16, 6))\n\nmsno.bar(train, ax = ax1, color=(10/255, 3/255, 250/255), fontsize=10)\nmsno.bar(test, ax = ax2, color=(251/255, 0/255, 0/255), fontsize=10)\n\nax1.set_title('Train Missing Values Map', fontsize = 16)\nax2.set_title('Test Missing Values Map', fontsize = 16);","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Target Variable Analysis."},{"metadata":{},"cell_type":"markdown","source":"### Training Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.style.use('dark_background')\nplt.figure(figsize=(10,8))  \n# sns.set(style=\"darkgrid\")\nax = sns.countplot(x = train['is_attributed'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Validation Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.style.use('dark_background')\nplt.figure(figsize=(10,8))  \n# sns.set(style=\"darkgrid\")\nax = sns.countplot(x = valid['is_attributed'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Test Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.style.use('dark_background')\nplt.figure(figsize=(10,8))  \n# sns.set(style=\"darkgrid\")\nax = sns.countplot(x = test['is_attributed'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Modelling."},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\n\ndtrain = lgb.Dataset(train[feature_cols], label=train['is_attributed'])\ndvalid = lgb.Dataset(valid[feature_cols], label=valid['is_attributed'])\ndtest = lgb.Dataset(test[feature_cols], label=test['is_attributed'])\n\nparam = {'num_leaves': 64, 'objective': 'binary'}\nparam['metric'] = 'auc'\nnum_round = 1000\nbst = lgb.train(param, dtrain, num_round, valid_sets=[dvalid], early_stopping_rounds=3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn import metrics\n\nypred = bst.predict(test[feature_cols])\nscore = metrics.roc_auc_score(test['is_attributed'], ypred)\nprint(f\"Test score: {score}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn import preprocessing, metrics\nimport lightgbm as lgb\n\nclicks = pd.read_parquet('../input/feature-engineering-data/baseline_data.pqt')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Baseline Model:\n\n- The model used here is Light GBM(Gradient Boosting Method).\n\n#### **Why LightGBM**\n\n- Light GBM is a fast, distributed, high-performance gradient boosting framework based on decision tree algorithm, used for ranking, classification and many other machine learning tasks.\n\n- Since it is based on decision tree algorithms, it splits the tree leaf wise with the best fit whereas other boosting algorithms split the tree depth wise or level wise rather than leaf-wise. \n\n- So when growing on the same leaf in Light GBM, the leaf-wise algorithm can reduce more loss than the level-wise algorithm and hence results in much better accuracy which can rarely be achieved by any of the existing boosting algorithms.\n\n- Also, it is surprisingly **very fast, hence the word ‘Light’.**\n\nSource: [Light GBM vs XGBoost](https://www.analyticsvidhya.com/blog/2017/06/which-algorithm-takes-the-crown-light-gbm-vs-xgboost/)"},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_data_splits(dataframe, valid_fraction=0.1):\n    \"\"\"Splits a dataframe into train, validation, and test sets.\n\n    First, orders by the column 'click_time'. Set the size of the \n    validation and test sets with the valid_fraction keyword argument.\n    \"\"\"\n\n    dataframe = dataframe.sort_values('click_time')\n    valid_rows = int(len(dataframe) * valid_fraction)\n    train = dataframe[:-valid_rows * 2]\n\n    valid = dataframe[-valid_rows * 2:-valid_rows]\n    test = dataframe[-valid_rows:]\n    \n    return train, valid, test\n\ndef train_model(train, valid, test=None, feature_cols=None):\n    if feature_cols is None:\n        feature_cols = train.columns.drop(['click_time', 'attributed_time',\n                                           'is_attributed'])\n    dtrain = lgb.Dataset(train[feature_cols], label=train['is_attributed'])\n    dvalid = lgb.Dataset(valid[feature_cols], label=valid['is_attributed'])\n    \n    param = {'num_leaves': 64, 'objective': 'binary', \n             'metric': 'auc', 'seed': 7}\n    num_round = 1000\n    bst = lgb.train(param, dtrain, num_round, valid_sets=[dvalid], \n                    early_stopping_rounds=20, verbose_eval=False)\n    \n    valid_pred = bst.predict(valid[feature_cols])\n    valid_score = metrics.roc_auc_score(valid['is_attributed'], valid_pred)\n    print(f\"Validation AUC score: {valid_score}\")\n    \n    if test is not None: \n        test_pred = bst.predict(test[feature_cols])\n        test_score = metrics.roc_auc_score(test['is_attributed'], test_pred)\n        return bst, valid_score, test_score\n    else:\n        return bst, valid_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Baseline model\")\ntrain, valid, test = get_data_splits(clicks)\n_ = train_model(train, valid)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Encoding the categorical features: \n\n- As the data is split into train and validation set encoding will not overestimate the model's performance that means there will be not any kind of Data leakages.\n\n- All of them will be executed using [category_encoders package](https://github.com/scikit-learn-contrib/category_encoders).\n\n### 1. Count Encoding\n\n### 2. Target Encoding\n\n### 3. CatBoost Encoding."},{"metadata":{},"cell_type":"markdown","source":"## Count Encoding:\n\n- The concept is quite simple, it's basically **replacing categorical variables by it's count.**\n- Count Encoding just requires the categorical variables when instantiated.\n\n\n![count-encode.png](attachment:count-encode.png)\n\nImage Credits: [Socrates Data Science Blog](https://blog.socratesk.com/blog/2018/06/17/featuren-engineering-and-extraction)","attachments":{"count-encode.png":{"image/png":"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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"import category_encoders as ce\n\ncat_features = ['ip', 'app', 'device', 'os', 'channel']\ntrain, valid, test = get_data_splits(clicks)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import category_encoders as ce\n\ncount_enc = ce.CountEncoder(cols=cat_features)\n\ncount_enc.fit(train[cat_features])\n\ntrain_encoded = train.join(count_enc.transform(train[cat_features]).add_suffix(\"_count\"))\nvalid_encoded = valid.join(count_enc.transform(valid[cat_features]).add_suffix(\"_count\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_ = train_model(train_encoded, valid_encoded)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Target Encoding:\n\n-  It is based on encoding categorical variable values with mean of **target variable per value.**\n- Target Encoding requires a target variable when instantiated.\n- In this case feature **\"is_attributed\"** is the target variable.\n\n- **NOTE: When using target variable, it is very important not to leak any information into the validation set(Data Leakage). Every such feature should be computed on the training set and then only merged or concatenated with the validation and test subsets.**\n\n![target-encode.png](attachment:target-encode.png)\n\nImage Credits: [Socrates Data Science Blog](https://blog.socratesk.com/blog/2018/06/17/featuren-engineering-and-extraction)","attachments":{"target-encode.png":{"image/png":"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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"import category_encoders as ce\n\n\ntarget_enc = ce.TargetEncoder(cols = cat_features)\n\ntarget_enc.fit(train[cat_features], train['is_attributed'])\n\ntrain_encoded = train.join(target_enc.transform(train[cat_features]).add_suffix(\"_target\"))\n\nvalid_encoded = valid.join(target_enc.transform(valid[cat_features]).add_suffix(\"_target\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_encoded = train_encoded.drop(['ip_target'],axis = 1)\n# valid_encoded = valid_encoded.drop(['ip_target'],axis = 1)\n_ = train_model(train_encoded, valid_encoded)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## CatBoost Encoding:\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"\ncat_features = ['app', 'device', 'os', 'channel']\n\ncb_enc = ce.CatBoostEncoder(cols=cat_features, random_state=7)\n\ncb_enc.fit(train[cat_features], train['is_attributed'])\n\ntrain_encoded = train.join(cb_enc.transform(train[cat_features]).add_suffix('_cb'))\nvalid_encoded = valid.join(cb_enc.transform(valid[cat_features]).add_suffix('_cb'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_ = train_model(train_encoded, valid_encoded)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## [Feature Generation.](https://www.kaggle.com/matleonard/feature-generation)\n\n### 1. Interactions\n\n### 2. Last Activity \n\n### 3. Time since last activity\n\n### 4. Past downloads"},{"metadata":{},"cell_type":"markdown","source":"## 1. Interactions:\n\n- As the name suggest interactions is a method of combining two features in order to up the performance of the model.\n\n- What we have done here is we have combine the categorical features together to obtain some new features.\n\n- If you wanna go deeper into this I found this article helpful: [Interactions by christophm](https://christophm.github.io/interpretable-ml-book/interaction.html)\n\n- The features we will create are: \n\n`interaction_features = ['ip_app','ip_device', 'ip_os', 'ip_channel', 'app_device', \n'app_os','app_channel', 'device_os','device_channel', 'os_channel']`"},{"metadata":{"trusted":true},"cell_type":"code","source":"import itertools\n\ncat_features = ['ip', 'app', 'device', 'os', 'channel']\ninteractions = pd.DataFrame(index=clicks.index)\n\n# Iterate through each pair of features, combine them into interaction features\n\nfor c1, c2 in itertools.combinations(cat_features,2):\n    new_col = '_'.join([c1,c2])\n    values = clicks[c1].map(str) + \"_\" + clicks[c2].map(str)\n    encoder = preprocessing.LabelEncoder()\n    interactions[new_col] = encoder.fit_transform(values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"clicks = clicks.join(interactions)\nprint(\"Score with interactions\")\ntrain, valid, test = get_data_splits(clicks)\n_ = train_model(train, valid)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"interaction_features = ['ip_app','ip_device', 'ip_os', 'ip_channel', 'app_device', 'app_os','app_channel', 'device_os', \n                        'device_channel', 'os_channel']\nclicks[interaction_features].head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Activity\n\n- This feature will give the number of events from the same IP in the last six hours. It's likely that someone who is visiting often will download the app.\n\n- The function count_past_events will execute the process using a random series."},{"metadata":{"trusted":true},"cell_type":"code","source":"def count_past_events(series):\n    activity = pd.Series(series.index, index = series, name=\"past_6_hours\").sort_index()\n    past_6_hours = activity.rolling('6H').count() - 1\n    return past_6_hours","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"- As this dataset is huge calculating activity of each ip for past 6 hours can be a lot time consuming step.\n- So I have used the dataset provided by [Matt Leonard](https://www.kaggle.com/matleonard) for these files.\n\n- Credits: [feature engineering data](https://www.kaggle.com/matleonard/feature-engineering-data)"},{"metadata":{"trusted":true},"cell_type":"code","source":"past_events = pd.read_parquet('../input/feature-engineering-data/past_6hr_events.pqt')\nclicks['ip_past_6hr_counts'] = past_events\n\ntrain, valid, test = get_data_splits(clicks)\n_ = train_model(train, valid)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(clicks.ip_past_6hr_counts[6:]);\nplt.title(\"Activity of ip within 6 hrs\");","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Time since last activity"},{"metadata":{"trusted":true},"cell_type":"code","source":"def time_diff(series):\n    \"\"\"Returns a series with the time since the last timestamp in seconds.\"\"\"\n    return series.diff().dt.total_seconds()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"past_events = pd.read_parquet('../input/feature-engineering-data/time_deltas.pqt')\nclicks['past_events_6hr'] = past_events\n\ntrain, valid, test = get_data_splits(clicks.join(past_events))\n_ = train_model(train, valid)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Number of previous Downloads"},{"metadata":{"trusted":true},"cell_type":"code","source":"def previous_attributions(series):\n    \"\"\"Returns a series with the number of times an app has been downloaded.\"\"\"\n    sums = series.expanding(min_periods=2).sum() - series\n    return sums","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"past_events = pd.read_parquet('../input/feature-engineering-data/downloads.pqt')\nclicks['ip_past_6hr_counts'] = past_events\n\ntrain, valid, test = get_data_splits(clicks)\n_ = train_model(train, valid)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preparing Test Data."},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv('../input/talkingdata-adtracking-fraud-detection/test.csv',\n                         parse_dates=['click_time'])\ntest.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# feature_cols = ['day', 'hour', 'minute', 'second', \n#                 'ip_labels', 'app_labels', 'device_labels',\n#                 'os_labels', 'channel_labels']\n\ntest_x = test.copy()\ntest_x['day'] = test_x['click_time'].dt.day.astype('uint8')\ntest_x['hour'] = test_x['click_time'].dt.hour.astype('uint8')\ntest_x['minute'] = test_x['click_time'].dt.minute.astype('uint8')\ntest_x['second'] = test_x['click_time'].dt.second.astype('uint8')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn import preprocessing\n\ncat_features = ['ip', 'app', 'device', 'os', 'channel']\nlable_encoder = preprocessing.LabelEncoder()\n\nfor feature in cat_features:\n    encoded = lable_encoder.fit_transform(test_x[feature])\n    test_x[feature +'_labels'] = encoded","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_x.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_x = test_x.drop([\"click_time\",\"ip\",\"channel\",\"click_id\",\"app\",\"device\",\"os\"], axis = 1)\ntest_x.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"predictions = bst.predict(test_x)\nprint(predictions.shape)\n\npredict = np.array(predictions)\npredict = np.around(predict,decimals = 0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = {\n    \"click_id\": test.click_id,\n    \"is_attributed\": predict\n}\nsub = pd.DataFrame(data = data)\nsub['is_attributed'] = sub['is_attributed'].astype(int)\n# sub.to_csv(\"submission.csv\",index = False)\nsub.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**This is just a basic model which achieved score of 0.703**\n- Alot can be done with it and there is a huge scope of improvement which will come up future versions.\n"},{"metadata":{},"cell_type":"markdown","source":"## References:\n\n1. [Feature Engineering Kaggle Course](https://www.kaggle.com/learn/feature-engineering)\n\n2. [Wronsinski Github Blog on Categorical Encoding](https://wrosinski.github.io/fe_categorical_encoding/)\n\n3. [Talking Data ADtracking fraud detection Competition](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection)\n\n4. [Feature Engineering Data](https://www.kaggle.com/matleonard/feature-engineering-data)\n\n5. [Light GBM Documentation](https://lightgbm.readthedocs.io/en/latest)\n"},{"metadata":{},"cell_type":"markdown","source":"**This is the end of this kernel. Feel free to fork and if you found this useful do upvote.**"}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}