{"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":"markdown","source":"Credit Fraud Detector","metadata":{"id":"re_x2VXHUteq"}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n#from sklearn.manifold import TSNE\nimport matplotlib.patches as mpatches\n\n\nfrom sklearn.model_selection import train_test_split\nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import NearMiss\nfrom imblearn.metrics import classification_report_imbalanced\nfrom sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score, accuracy_score, classification_report\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"id":"Lw4mawAAUt_u","outputId":"70e4651c-492b-4e5c-b46f-6bb26ae97a50","execution":{"iopub.status.busy":"2021-05-20T11:14:52.384578Z","iopub.execute_input":"2021-05-20T11:14:52.385323Z","iopub.status.idle":"2021-05-20T11:15:00.682578Z","shell.execute_reply.started":"2021-05-20T11:14:52.385174Z","shell.execute_reply":"2021-05-20T11:15:00.681369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/creditcards-fraud-detection/creditcard_train.csv')\ndf.head()","metadata":{"id":"DgErqF0EX2Hr","outputId":"72b49bf1-8b12-4aca-b05b-1493f813b033","execution":{"iopub.status.busy":"2021-05-20T11:18:17.625376Z","iopub.execute_input":"2021-05-20T11:18:17.625907Z","iopub.status.idle":"2021-05-20T11:18:21.007469Z","shell.execute_reply.started":"2021-05-20T11:18:17.625870Z","shell.execute_reply":"2021-05-20T11:18:21.006118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1 = pd.read_csv('../input/creditcards-fraud-detection/creditcard_test.csv')\ndf1.head()","metadata":{"id":"IwtVl_w6rTv_","outputId":"41e78544-1076-43c7-f845-00c4e7ba7dbe","execution":{"iopub.status.busy":"2021-05-20T11:18:12.833311Z","iopub.execute_input":"2021-05-20T11:18:12.833705Z","iopub.status.idle":"2021-05-20T11:18:14.413593Z","shell.execute_reply.started":"2021-05-20T11:18:12.833672Z","shell.execute_reply":"2021-05-20T11:18:14.412085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = df.sort_values(by=['Time'])","metadata":{"id":"23LHGA4Udak1","execution":{"iopub.status.busy":"2021-05-20T11:15:01.082624Z","iopub.status.idle":"2021-05-20T11:15:01.083434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.describe()","metadata":{"id":"YqI2coetYRAV","outputId":"09ab5fe0-6eac-4d5b-eb28-e892f5efdcad","execution":{"iopub.status.busy":"2021-05-20T11:15:01.084898Z","iopub.status.idle":"2021-05-20T11:15:01.085602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[df['Class'] == 1].sum()['Class'] ","metadata":{"id":"ncm6zEqPh6R2","outputId":"decd7c1e-09fb-4bce-8ced-2f897cdbaaff","execution":{"iopub.status.busy":"2021-05-20T11:15:01.087001Z","iopub.status.idle":"2021-05-20T11:15:01.087470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.isnull().sum().max()","metadata":{"id":"4zQXOUJuYRpA","outputId":"896caaab-6992-4d8c-8569-63b7be664235","execution":{"iopub.status.busy":"2021-05-20T11:15:01.088545Z","iopub.status.idle":"2021-05-20T11:15:01.089066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.columns","metadata":{"id":"SHq7lMXUYViI","outputId":"d12cc057-18d6-4f6c-e8df-b6a0e46aaf8d","execution":{"iopub.status.busy":"2021-05-20T11:15:01.090078Z","iopub.status.idle":"2021-05-20T11:15:01.090551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('No Frauds', round(df['Class'].value_counts()[0]/len(df) * 100,2), '% of the dataset')\nprint('Frauds', round(df['Class'].value_counts()[1]/len(df) * 100,2), '% of the dataset')","metadata":{"id":"7oNIejUUYjNw","outputId":"fc3544b6-e019-45db-a159-5190a56211c9","execution":{"iopub.status.busy":"2021-05-20T11:15:01.091435Z","iopub.status.idle":"2021-05-20T11:15:01.091874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1, 2, figsize=(18,4))\n\namount_val = df['Amount'].values\ntime_val = df['Time'].values\n\nsns.distplot(amount_val, ax=ax[0], color='r')\nax[0].set_title('Distribution of Transaction Amount', fontsize=14)\nax[0].set_xlim([min(amount_val), max(amount_val)])\n\nsns.distplot(time_val, ax=ax[1], color='b')\nax[1].set_title('Distribution of Transaction Time', fontsize=14)\nax[1].set_xlim([min(time_val), max(time_val)])\n\n\n\nplt.show()","metadata":{"id":"DyPeUrakZQg_","outputId":"016fc849-35ae-48a2-c03a-dbcf7b2b20e3","execution":{"iopub.status.busy":"2021-05-20T11:15:01.092769Z","iopub.status.idle":"2021-05-20T11:15:01.093264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler, RobustScaler\n\nstd_scaler = StandardScaler()\nrob_scaler = RobustScaler()\n\ndf['scaled_amount'] = rob_scaler.fit_transform(df['Amount'].values.reshape(-1,1))\ndf['scaled_time'] = rob_scaler.fit_transform(df['Time'].values.reshape(-1,1))\n\ndf.drop(['Time','Amount'], axis=1, inplace=True)","metadata":{"id":"Z4xJQn8yaZzM","execution":{"iopub.status.busy":"2021-05-20T11:15:01.094137Z","iopub.status.idle":"2021-05-20T11:15:01.094632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1['scaled_amount'] = rob_scaler.fit_transform(df1['Amount'].values.reshape(-1,1))\ndf1['scaled_time'] = rob_scaler.fit_transform(df1['Time'].values.reshape(-1,1))\n\ndf1.drop(['Time','Amount'], axis=1, inplace=True)","metadata":{"id":"o3jUCLfevDuQ","execution":{"iopub.status.busy":"2021-05-20T11:15:01.095451Z","iopub.status.idle":"2021-05-20T11:15:01.095905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scaled_amount = df['scaled_amount']\nscaled_time = df['scaled_time']\n\ndf.drop(['scaled_amount', 'scaled_time'], axis=1, inplace=True)\ndf.insert(0, 'scaled_amount', scaled_amount)\ndf.insert(1, 'scaled_time', scaled_time)\n\ndf.head(20)","metadata":{"id":"JSe1EiwmeWyk","outputId":"4c0e5289-1d74-4764-e117-a03974601933","execution":{"iopub.status.busy":"2021-05-20T11:15:01.096807Z","iopub.status.idle":"2021-05-20T11:15:01.097313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scaled_amount1 = df1['scaled_amount']\nscaled_time1 = df1['scaled_time']\n\ndf1.drop(['scaled_amount', 'scaled_time'], axis=1, inplace=True)\ndf1.insert(0, 'scaled_amount', scaled_amount1)\ndf1.insert(1, 'scaled_time', scaled_time1)\n\ndf1.head()","metadata":{"id":"3ZiCAlQgvRFU","outputId":"2614b4dc-3fec-4641-f883-7be7ff40e78c","execution":{"iopub.status.busy":"2021-05-20T11:15:01.098251Z","iopub.status.idle":"2021-05-20T11:15:01.098915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Under-Sampling:","metadata":{"id":"YPSAzLdEjSzb"}},{"cell_type":"code","source":"df = df.sample(frac=1)\n\nfraud_df = df.loc[df['Class'] == 1]\nnon_fraud_df = df.loc[df['Class'] == 0][:343]\n\nnormal_distributed_df = pd.concat([fraud_df, non_fraud_df])\n\nnew_df = normal_distributed_df.sample(frac=1, random_state=42)\n\nnew_df.head()","metadata":{"id":"XB1QuiegjTzb","outputId":"5d21560c-cc35-4a4c-97b9-bd2204b84a13","execution":{"iopub.status.busy":"2021-05-20T11:15:01.099835Z","iopub.status.idle":"2021-05-20T11:15:01.100354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"colors = [\"#0101DF\", \"#DF0101\"]\nprint('Distribution of the Classes in the subsample dataset')\nprint(new_df['Class'].value_counts()/len(new_df))\n\nsns.countplot('Class', data=new_df, palette=colors)\nplt.title('Equally Distributed Classes', fontsize=14)\nplt.show()","metadata":{"id":"fE5zQ55Tlhx9","outputId":"99d5c145-d7ef-40e2-96c9-cf43f605545e","execution":{"iopub.status.busy":"2021-05-20T11:15:01.101313Z","iopub.status.idle":"2021-05-20T11:15:01.101797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Correlation Matrices","metadata":{"id":"7LPJpSbwlx-A"}},{"cell_type":"code","source":"f, (ax1, ax2) = plt.subplots(2, 1, figsize=(24,20))\n\ncorr = df.corr()\nsns.heatmap(corr, cmap='coolwarm_r', annot_kws={'size':20}, ax=ax1)\nax1.set_title(\"Imbalanced Correlation Matrix \\n (don't use for reference)\", fontsize=14)\n\n\nsub_sample_corr = new_df.corr()\nsns.heatmap(sub_sample_corr, cmap='coolwarm_r', annot_kws={'size':20}, ax=ax2)\nax2.set_title('SubSample Correlation Matrix \\n (use for reference)', fontsize=14)\nplt.show()","metadata":{"id":"MQXZ9yxglzOB","outputId":"586f8b67-ff39-4327-b6df-b64ba0b339f7","execution":{"iopub.status.busy":"2021-05-20T11:15:01.102638Z","iopub.status.idle":"2021-05-20T11:15:01.103100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = new_df.drop('Class', axis=1)\ny = new_df['Class']","metadata":{"id":"g-g3jhDLqFX4","execution":{"iopub.status.busy":"2021-05-20T11:15:01.104009Z","iopub.status.idle":"2021-05-20T11:15:01.104432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X.values\ny_train = y.values","metadata":{"id":"rR_aibqHs-PL","execution":{"iopub.status.busy":"2021-05-20T11:15:01.105222Z","iopub.status.idle":"2021-05-20T11:15:01.105639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"id":"bOwG92m2qGRg","execution":{"iopub.status.busy":"2021-05-20T11:15:01.106507Z","iopub.status.idle":"2021-05-20T11:15:01.106937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nfrom keras import backend as K\nfrom keras.models import Sequential\nfrom keras.layers import Activation\nfrom keras.layers.core import Dense\nfrom keras.optimizers import Adam\nfrom keras.metrics import categorical_crossentropy\n\nn_inputs = X_train.shape[1]\n\nundersample_model = Sequential([\n    Dense(n_inputs, input_shape=(n_inputs, ), activation='relu'),\n    Dense(32, activation='relu'),\n    Dense(2, activation='softmax')\n])","metadata":{"id":"LqklZFUZoeu7","execution":{"iopub.status.busy":"2021-05-20T11:15:01.107882Z","iopub.status.idle":"2021-05-20T11:15:01.108329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"undersample_model.summary()","metadata":{"id":"Jg6Op7TJpSGo","outputId":"c022333a-ddc3-4c84-acd1-2f956537da97","execution":{"iopub.status.busy":"2021-05-20T11:15:01.109175Z","iopub.status.idle":"2021-05-20T11:15:01.109598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"undersample_model.compile(Adam(lr=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])","metadata":{"id":"ar33iKlWqU2J","execution":{"iopub.status.busy":"2021-05-20T11:15:01.110562Z","iopub.status.idle":"2021-05-20T11:15:01.111046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"undersample_model.fit(X_train, y_train, validation_split=0.2, batch_size=25, epochs=20, shuffle=True, verbose=2)","metadata":{"id":"cBJ5YKyYqXzQ","outputId":"07112ce1-3339-436a-f207-89325aabe9b7","execution":{"iopub.status.busy":"2021-05-20T11:15:01.111997Z","iopub.status.idle":"2021-05-20T11:15:01.112436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = df1.values","metadata":{"id":"TSd97fJ0t_d6","execution":{"iopub.status.busy":"2021-05-20T11:15:01.113310Z","iopub.status.idle":"2021-05-20T11:15:01.113745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"undersample_predictions = undersample_model.predict(test, verbose=0)","metadata":{"id":"SYJUTUYurFy3","execution":{"iopub.status.busy":"2021-05-20T11:15:01.114616Z","iopub.status.idle":"2021-05-20T11:15:01.115073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = []\nfor i in range(85443):\n  if (undersample_predictions[i][0] > undersample_predictions[i][1]):\n    predictions.append(0)\n  else:\n    predictions.append(1)","metadata":{"id":"ip0_10BK0jut","execution":{"iopub.status.busy":"2021-05-20T11:15:01.116005Z","iopub.status.idle":"2021-05-20T11:15:01.116428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_submission = pd.DataFrame({'Id': range(85443), 'Predicted': predictions})\n# you could use any filename. We choose submission here\nmy_submission.to_csv('submission.csv', index=False)\n","metadata":{"id":"o4ZVnozi2vyP","execution":{"iopub.status.busy":"2021-05-20T11:15:01.117401Z","iopub.status.idle":"2021-05-20T11:15:01.117829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = new_df.drop('Class', axis=1)\ny = new_df['Class']","metadata":{"id":"S01bgtig_S47","execution":{"iopub.status.busy":"2021-05-20T11:15:01.118659Z","iopub.status.idle":"2021-05-20T11:15:01.119129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"id":"Xbafb9kk_Up3","execution":{"iopub.status.busy":"2021-05-20T11:15:01.120173Z","iopub.status.idle":"2021-05-20T11:15:01.120596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"undersample_model.fit(X_train, y_train)\n\npred_prob = undersample_model.predict_proba(X_test)","metadata":{"id":"PZkPn3Sf9h90","outputId":"61e460ab-343d-42bb-f510-af40f1483399","execution":{"iopub.status.busy":"2021-05-20T11:15:01.121480Z","iopub.status.idle":"2021-05-20T11:15:01.121916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_curve\nfpr, tpr, thresh = roc_curve(y_test, pred_prob[:,1], pos_label=1)\n\nrandom_probs = [0 for i in range(len(y_test))]\np_fpr, p_tpr, _ = roc_curve(y_test, random_probs, pos_label=1)","metadata":{"id":"AjZbuv7zAGvL","execution":{"iopub.status.busy":"2021-05-20T11:15:01.122742Z","iopub.status.idle":"2021-05-20T11:15:01.123222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score\n\nauc_score = roc_auc_score(y_test, pred_prob[:,1])\n\nprint(auc_score)","metadata":{"id":"-7i95cLH9JYF","outputId":"45eeb8e5-1286-48c3-8c83-4a0224058806","execution":{"iopub.status.busy":"2021-05-20T11:15:01.124185Z","iopub.status.idle":"2021-05-20T11:15:01.124634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.style.use('seaborn')\n\nplt.plot(fpr, tpr, linestyle='--',color='orange')\nplt.plot(p_fpr, p_tpr, linestyle='--', color='blue')\nplt.title('ROC curve')\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive rate')\n\nplt.legend(loc='best')\nplt.savefig('ROC',dpi=300)\nplt.show();","metadata":{"id":"XJwkPkqf9hRj","outputId":"67a8fc79-62ae-4e53-d611-a1135c06fb30","execution":{"iopub.status.busy":"2021-05-20T11:15:01.125539Z","iopub.status.idle":"2021-05-20T11:15:01.125998Z"},"trusted":true},"execution_count":null,"outputs":[]}]}