{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import dask\nimport dask.dataframe as dd\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nimport random\n\nseed=53\ntf.random.set_seed(seed)\nrandom.seed(seed)\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        \n\nprint(tf.__version__)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes = {\n        'ip'            : 'uint32',\n        'app'           : 'object',\n        'device'        : 'object',\n        'os'            : 'object',\n        'channel'       : 'object',\n        'click_time'    : 'object',\n        'is_attributed' : 'uint8',\n        }","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dd = dd.read_csv('/kaggle/input/talkingdata-adtracking-fraud-detection/train.csv', dtype=dtypes,\n                      usecols=['ip','app','device','os','channel','click_time','is_attributed'])","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dd.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dd.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dd, val_df = train_dd.random_split([0.9, 0.1], random_state=seed, shuffle=True) \nprint(len(train_dd))\nprint(len(val_df))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = train_dd[train_dd.is_attributed == 1] ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = df.compute()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2 = train_dd[train_dd.is_attributed == 0] ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2 = df2.sample(frac=0.0025)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2 = df2.compute()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2.sample(10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.concat([df, df2])\ntrain_dd = None","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.is_attributed.value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_df = val_df.compute()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_df.is_attributed.value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# distribution of 1 in validaton set\nprint(46127/(18445145 + 46127))\n# distribution of 1 in training set (prior to down sampling)\nprint(410719/166412618)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['click_time'] = pd.to_datetime(train_df['click_time'], infer_datetime_format=True)\nval_df['click_time'] = pd.to_datetime(val_df['click_time'], infer_datetime_format=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['day'] = train_df['click_time'].dt.day.astype(str)\ntrain_df['hour'] = train_df['click_time'].dt.hour.astype(str)\ntrain_df['minute'] = train_df['click_time'].dt.minute.astype(str)\ntrain_df['second'] = train_df['click_time'].dt.second.astype(str)\n\nval_df['day'] = val_df['click_time'].dt.day.astype(str)\nval_df['hour'] = val_df['click_time'].dt.hour.astype(str)\nval_df['minute'] = val_df['click_time'].dt.minute.astype(str)\nval_df['second'] = val_df['click_time'].dt.second.astype(str)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.drop(['click_time'], axis='columns', inplace=True)\nval_df.drop(['click_time'], axis='columns', inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.sample(10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def df_to_dataset(dataframe, shuffle=True, batch_size=32, labels=True):\n    dataframe = dataframe.copy()\n    if labels:\n        labels = dataframe.pop('is_attributed')\n        ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))\n    else:\n        ds = tf.data.Dataset.from_tensor_slices((dict(dataframe)))\n    if shuffle:\n        ds = ds.shuffle(buffer_size=len(dataframe))\n    ds = ds.batch(batch_size)\n    return ds","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds = df_to_dataset(train_df, batch_size=128).prefetch(tf.data.experimental.AUTOTUNE)\nval_ds = df_to_dataset(val_df, shuffle=False, batch_size=128).prefetch(tf.data.experimental.AUTOTUNE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import feature_column\n\nfeature_columns = []\n\n# numeric cols\nfor col in ['ip']:\n    feature_columns.append(feature_column.numeric_column(col))\n\n#app, device, os, channel as categorical treatment\n\n# embedding columns\napp = feature_column.categorical_column_with_vocabulary_list(\n      'app', train_df.app.unique())\napp_embedding = feature_column.embedding_column(app, dimension=64)\nfeature_columns.append(app_embedding)\n\nos = feature_column.categorical_column_with_vocabulary_list(\n      'os', train_df.os.unique())\nos_embedding = feature_column.embedding_column(os, dimension=32)\nfeature_columns.append(os_embedding)\n\ndevice = feature_column.categorical_column_with_vocabulary_list(\n      'device', train_df.device.unique())\ndevice_embedding = feature_column.embedding_column(device, dimension=32)\nfeature_columns.append(device_embedding)\n\nchannel = feature_column.categorical_column_with_vocabulary_list(\n      'channel', train_df.channel.unique())\nchannel_embedding = feature_column.embedding_column(channel, dimension=32)\nfeature_columns.append(channel_embedding)\n\nday = feature_column.categorical_column_with_vocabulary_list(\n      'day', train_df.day.unique())\nday_embedding = feature_column.embedding_column(day, dimension=8)\nfeature_columns.append(day_embedding)\n\nhour = feature_column.categorical_column_with_vocabulary_list(\n      'hour', train_df.hour.unique())\nhour_embedding = feature_column.embedding_column(hour, dimension=8)\nfeature_columns.append(hour_embedding)\n\nminute = feature_column.categorical_column_with_vocabulary_list(\n      'minute', train_df.minute.unique())\nminute_embedding = feature_column.embedding_column(minute, dimension=8)\nfeature_columns.append(minute_embedding)\n\nsecond = feature_column.categorical_column_with_vocabulary_list(\n      'second', train_df.second.unique())\nsecond_embedding = feature_column.embedding_column(second, dimension=8)\nfeature_columns.append(second_embedding)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = None\nval_df=None","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_layer = tf.keras.layers.DenseFeatures(feature_columns)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.keras.backend.clear_session()\nfrom tensorflow.keras.layers import Dense\nmodel = tf.keras.Sequential([\n  feature_layer,\n  Dense(128, activation='relu'),\n  Dense(128, activation='relu'),\n  Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),\n             loss='bce',\n             metrics=[tf.keras.metrics.AUC(name='auc')])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = tf.keras.callbacks.EarlyStopping(patience=10, verbose=1, restore_best_weights=True)\n\nhistory = model.fit(train_ds, epochs=20, validation_data=val_ds, callbacks=[es], verbose=2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\nhistory = history.history\n\nfig, (ax1, ax2) = plt.subplots(2, 1, sharex='col', figsize=(20, 14))\n\nax1.plot(history['loss'], label='Training')\nax1.plot(history['val_loss'], label='Validation')\nax1.legend(loc='best')\nax1.set_title('Loss')\n\nax2.plot(history['auc'], label='Training')\nax2.plot(history['val_auc'], label='Validation')\nax2.legend(loc='best')\nax2.set_title('AUC')\n\nplt.xlabel('Epochs')\nsns.despine()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dtypes = {\n        'ip'            : 'uint32',\n        'app'           : 'object',\n        'device'        : 'object',\n        'os'            : 'object',\n        'channel'       : 'object',\n        'click_time'    : 'object',\n        }","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/talkingdata-adtracking-fraud-detection/test.csv', dtype=dtypes,\n                     usecols=['ip','app','device','os','channel','click_time'])\ntest_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Partition test set so it fits in memory.","metadata":{}},{"cell_type":"code","source":"print(test_df.shape)\ntotal = test_df.shape[0]\nh = int(total/3)\ntest_df1 = test_df.iloc[0:h]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df1['click_time'] = pd.to_datetime(test_df1['click_time'], infer_datetime_format=True)\ntest_df1['day'] = test_df1['click_time'].dt.day.astype(str)\ntest_df1['hour'] = test_df1['click_time'].dt.hour.astype(str)\ntest_df1['minute'] = test_df1['click_time'].dt.minute.astype(str)\ntest_df1['second'] = test_df1['click_time'].dt.second.astype(str)\n\ntest_df1.drop(['click_time'], axis='columns', inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds = df_to_dataset(test_df1, shuffle=False, batch_size=64, labels=False).prefetch(tf.data.experimental.AUTOTUNE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions1 = model.predict(test_ds, verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df1 = test_df.iloc[h:2*h]\n\ntest_df1['click_time'] = pd.to_datetime(test_df1['click_time'], infer_datetime_format=True)\ntest_df1['day'] = test_df1['click_time'].dt.day.astype(str)\ntest_df1['hour'] = test_df1['click_time'].dt.hour.astype(str)\ntest_df1['minute'] = test_df1['click_time'].dt.minute.astype(str)\ntest_df1['second'] = test_df1['click_time'].dt.second.astype(str)\n\ntest_df1.drop(['click_time'], axis='columns', inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds = df_to_dataset(test_df1, shuffle=False, batch_size=128, labels=False).prefetch(tf.data.experimental.AUTOTUNE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions2 = model.predict(test_ds, verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df1 = test_df.iloc[2*h:]\n\ntest_df1['click_time'] = pd.to_datetime(test_df1['click_time'], infer_datetime_format=True)\ntest_df1['day'] = test_df1['click_time'].dt.day.astype(str)\ntest_df1['hour'] = test_df1['click_time'].dt.hour.astype(str)\ntest_df1['minute'] = test_df1['click_time'].dt.minute.astype(str)\ntest_df1['second'] = test_df1['click_time'].dt.second.astype(str)\n\ntest_df1.drop(['click_time'], axis='columns', inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds = df_to_dataset(test_df1, shuffle=False, batch_size=128, labels=False).prefetch(tf.data.experimental.AUTOTUNE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions3 = model.predict(test_ds, verbose=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = np.append(predictions1, predictions2)\npredictions = np.append(predictions, predictions3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_df.shape)\nprint(predictions.shape)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.read_csv('/kaggle/input/talkingdata-adtracking-fraud-detection/sample_submission.csv')\nsubmission_df['is_attributed'] = predictions\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}