{"cells":[{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":"import pandas as pd\nimport numpy as np"},{"cell_type":"code","execution_count":2,"metadata":{},"outputs":[],"source":"sample_train_df = pd.read_csv('../input/talkingdata-adtracking-fraud-detection/train_sample.csv')\nsample_train_df.head()"},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[],"source":"sample_train_df.info()"},{"cell_type":"code","execution_count":5,"metadata":{},"outputs":[],"source":"sample_train_df['is_attributed'].value_counts()"},{"cell_type":"code","execution_count":6,"metadata":{},"outputs":[],"source":"sample_train_df[~sample_train_df['attributed_time'].isnull()].head()"},{"cell_type":"markdown","metadata":{},"source":"### Data exploration"},{"cell_type":"code","execution_count":8,"metadata":{},"outputs":[],"source":"import matplotlib.pyplot as plt\nimport seaborn as sns"},{"cell_type":"markdown","metadata":{},"source":"#### Univariate analysis:"},{"cell_type":"code","execution_count":15,"metadata":{},"outputs":[],"source":"print(sample_train_df[sample_train_df['is_attributed'] == 0]['ip'].nunique())\nprint(sample_train_df[sample_train_df['is_attributed'] == 1]['ip'].nunique())"},{"cell_type":"markdown","metadata":{},"source":"The proportion of non-attributed clicks are lower than attributed ones. May be a reapeat of same ips in case of non-attribution case."},{"cell_type":"code","execution_count":45,"metadata":{},"outputs":[],"source":"df = sample_train_df.groupby('ip')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.scatterplot(x=df['ip'], y=df['average'])\nplt.show()"},{"cell_type":"markdown","metadata":{},"source":"Clearly some ips have low average conversion."},{"cell_type":"code","execution_count":46,"metadata":{},"outputs":[],"source":"df = sample_train_df.groupby('app')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.scatterplot(x=df['app'], y=df['average'])\nplt.show()"},{"cell_type":"markdown","metadata":{},"source":"Only few apps have good conversion rate."},{"cell_type":"code","execution_count":47,"metadata":{},"outputs":[],"source":"df = sample_train_df.groupby('channel')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.scatterplot(x=df['channel'], y=df['average'])\nplt.show()"},{"cell_type":"markdown","metadata":{},"source":"Only a few channels have good conversion rate."},{"cell_type":"code","execution_count":48,"metadata":{},"outputs":[],"source":"df = sample_train_df.groupby('os')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.scatterplot(x=df['os'], y=df['average'])\nplt.show()"},{"cell_type":"code","execution_count":77,"metadata":{},"outputs":[],"source":"def bin_os(x):\n    return x // 30\ndf = sample_train_df.copy()\ndf['os'] = df['os'].apply(bin_os)\n\ndf = df.groupby('os')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.barplot(x=df['os'], y=df['average'])\nplt.show()"},{"cell_type":"markdown","metadata":{},"source":"OS bin with 30 versions is showing good relation."},{"cell_type":"code","execution_count":53,"metadata":{},"outputs":[],"source":"df = sample_train_df.copy()\ndf['click_hour'] = pd.to_datetime(df['click_time']).dt.hour\n\ndf = df.groupby('click_hour')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.barplot(x=df['click_hour'], y=df['average'])\nplt.show()"},{"cell_type":"code","execution_count":61,"metadata":{},"outputs":[],"source":"def bin_hour(x):\n    return x // 3\n\ndf = sample_train_df.copy()\ndf['click_hour'] = pd.to_datetime(df['click_time']).dt.hour.apply(bin_hour)\n\ndf = df.groupby('click_hour')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.barplot(x=df['click_hour'], y=df['average'])\nplt.show()"},{"cell_type":"code","execution_count":56,"metadata":{},"outputs":[],"source":"df = sample_train_df.copy()\ndf['click_day'] = pd.to_datetime(df['click_time']).dt.day\n\ndf = df.groupby('click_day')['is_attributed'].agg(['sum', 'count']).reset_index()\ndf['average'] = df['sum'] / df['count']\n\nsns.barplot(x=df['click_day'], y=df['average'])\nplt.show()"},{"cell_type":"markdown","metadata":{},"source":"Cant use attributed time as it is post event.\nClick time is having realtion with hour, when binned in 3 hours."},{"cell_type":"markdown","metadata":{},"source":"### Data cleanup and preparation"},{"cell_type":"code","execution_count":80,"metadata":{},"outputs":[],"source":"def cleanup_and_prep(df):\n    df['os'] = df['os'].apply(bin_os)\n    df['click_hour'] = pd.to_datetime(df['click_time']).dt.hour.apply(bin_hour)\n    df = df.drop(columns=['attributed_time', 'click_time'])\n    return df\n    \nprep_df = cleanup_and_prep(sample_train_df)\nprep_df.head()"},{"cell_type":"markdown","metadata":{},"source":"### Modelling"},{"cell_type":"code","execution_count":81,"metadata":{},"outputs":[],"source":"from sklearn.model_selection import train_test_split"},{"cell_type":"code","execution_count":82,"metadata":{},"outputs":[],"source":"X = prep_df.drop(columns=['is_attributed'])\ny = prep_df['is_attributed']"},{"cell_type":"code","execution_count":83,"metadata":{},"outputs":[],"source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)"},{"cell_type":"code","execution_count":85,"metadata":{},"outputs":[],"source":"y_train.sum()/y_train.count()"},{"cell_type":"code","execution_count":86,"metadata":{},"outputs":[],"source":"y_test.sum()/y_test.count()"},{"cell_type":"code","execution_count":87,"metadata":{},"outputs":[],"source":"from sklearn.model_selection import GridSearchCV\nfrom sklearn.tree import DecisionTreeClassifier"},{"cell_type":"code","execution_count":101,"metadata":{},"outputs":[],"source":"params = {'max_depth': np.arange(5, 10),\n          'min_samples_leaf': np.arange(50, 1000, 50)}\n\ngrid = GridSearchCV(estimator=DecisionTreeClassifier(),\n                    param_grid=params,\n                    scoring='roc_auc',\n                    cv=5)\ngrid.fit(X_train, y_train)"},{"cell_type":"code","execution_count":102,"metadata":{},"outputs":[],"source":"grid.best_score_"},{"cell_type":"code","execution_count":103,"metadata":{},"outputs":[],"source":"grid.best_params_"},{"cell_type":"markdown","metadata":{},"source":"### Actual model"},{"cell_type":"code","execution_count":104,"metadata":{},"outputs":[],"source":"full_df = pd.read_csv('../input/talkingdata-adtracking-fraud-detection/train.csv')\nfull_df.shape"},{"cell_type":"code","execution_count":105,"metadata":{},"outputs":[],"source":"pre_full_df = cleanup_and_prep(full_df) "},{"cell_type":"code","execution_count":106,"metadata":{},"outputs":[],"source":"X = pre_full_df.drop(columns=['is_attributed'])\ny = pre_full_df['is_attributed']"},{"cell_type":"code","execution_count":107,"metadata":{},"outputs":[],"source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)"},{"cell_type":"code","execution_count":108,"metadata":{},"outputs":[],"source":"y_train.sum()/y_train.count()"},{"cell_type":"code","execution_count":109,"metadata":{},"outputs":[],"source":"y_test.sum()/y_test.count()"},{"cell_type":"code","execution_count":110,"metadata":{},"outputs":[],"source":"model = DecisionTreeClassifier(max_depth=8,\n                               min_samples_leaf=550)\nmodel.fit(X_train, y_train)"},{"cell_type":"code","execution_count":111,"metadata":{},"outputs":[],"source":"y_pred = model.predict(X_test)"},{"cell_type":"code","execution_count":112,"metadata":{},"outputs":[],"source":"from sklearn.metrics import roc_auc_score"},{"cell_type":"code","execution_count":113,"metadata":{},"outputs":[],"source":"roc_auc_score(y_pred, y_test)"},{"cell_type":"markdown","metadata":{},"source":"### Submission"},{"cell_type":"code","execution_count":122,"metadata":{},"outputs":[],"source":"test_df = pd.read_csv('../input/talkingdata-adtracking-fraud-detection/test.csv')"},{"cell_type":"code","execution_count":123,"metadata":{},"outputs":[],"source":"test_df.info()"},{"cell_type":"code","execution_count":124,"metadata":{},"outputs":[],"source":"submission_df = test_df[['click_id']]"},{"cell_type":"code","execution_count":125,"metadata":{},"outputs":[],"source":"X_test = test_df.copy()\nX_test['os'] = X_test['os'].apply(bin_os)\nX_test['click_hour'] = pd.to_datetime(X_test['click_time']).dt.hour.apply(bin_hour)\nX_test = X_test.drop(columns=['click_id', 'click_time'])"},{"cell_type":"code","execution_count":126,"metadata":{},"outputs":[],"source":"X_test.info()"},{"cell_type":"code","execution_count":128,"metadata":{},"outputs":[],"source":"submission_df['is_attributed'] = model.predict(X_test)"},{"cell_type":"code","execution_count":129,"metadata":{},"outputs":[],"source":"submission_df.to_csv('submission.csv', index=False)"}],"metadata":{"kernelspec":{"display_name":"Python [conda env:kaggle] *","language":"python","name":"conda-env-kaggle-py"},"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.6.10"}},"nbformat":4,"nbformat_minor":2}