{"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":"## Imports","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom sklearn.model_selection import train_test_split\n\nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import NearMiss\nfrom imblearn.under_sampling import RandomUnderSampler\n\ntrain = pd.read_csv('../input/santander-customer-satisfaction/train.csv')\ntrain.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T15:00:09.563913Z","iopub.execute_input":"2022-07-31T15:00:09.564565Z","iopub.status.idle":"2022-07-31T15:00:20.311656Z","shell.execute_reply.started":"2022-07-31T15:00:09.564452Z","shell.execute_reply":"2022-07-31T15:00:20.309990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Shape of the dataset is', train.shape)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T15:00:20.314265Z","iopub.execute_input":"2022-07-31T15:00:20.314646Z","iopub.status.idle":"2022-07-31T15:00:20.320797Z","shell.execute_reply.started":"2022-07-31T15:00:20.314613Z","shell.execute_reply":"2022-07-31T15:00:20.319722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Detecting Categorical Variables","metadata":{}},{"cell_type":"code","source":"#Removing feature columns with low variance\n#Plotting number of unique values \nunique_numbers = train.nunique()\nunique_dict = {}\nfor i in unique_numbers.index:\n    dict_key = unique_numbers[i]\n    if dict_key in unique_dict.keys():\n        unique_dict[dict_key] += 1 \n    else:\n        unique_dict[dict_key] = 1\n\nsorted_unique_dict = {i:unique_dict[i] for i in sorted(unique_dict)}\nplt.bar(list(sorted_unique_dict.keys())[0:20], list(sorted_unique_dict.values())[0:20])\nplt.ylabel('Number of features')\nplt.xlabel('Number of unique values')\nplt.title('Variation of unique values in each feature')\nplt.show()\n\n#Drop all those features which is containing a single value\nnewdf = train.copy()\nfor i in newdf.columns:\n    if newdf[i].nunique() == 1:\n        newdf.drop([i], axis=1, inplace=True)\n\nprint(newdf.shape)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T15:00:20.322843Z","iopub.execute_input":"2022-07-31T15:00:20.323261Z","iopub.status.idle":"2022-07-31T15:00:24.229894Z","shell.execute_reply.started":"2022-07-31T15:00:20.323222Z","shell.execute_reply":"2022-07-31T15:00:24.228217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Removing duplicate columns\n\nX = newdf.drop(['TARGET','ID'], axis=1)\ny = newdf['TARGET']\nX_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-07-31T15:00:24.233248Z","iopub.execute_input":"2022-07-31T15:00:24.233960Z","iopub.status.idle":"2022-07-31T15:00:24.530307Z","shell.execute_reply.started":"2022-07-31T15:00:24.233911Z","shell.execute_reply":"2022-07-31T15:00:24.529356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Get those features which have max number of unique values\n\n#Get the two features from the feature having max number of unique values\nmost_varying_feature1 = unique_numbers.sort_values(ascending=False).index[1]\nmost_varying_feature2 = unique_numbers.sort_values(ascending=False).index[2]\n\n#Checking for data imbalace\nprint('Data imbalance before sampling: ')\nprint('Number of zeros: ', y_train.value_counts()[0],'\\nNumber of ones: ', y_train.value_counts()[0])\nprint('Shape of x_train before sampling', X_train.shape,'\\n\\n\\n')\n\n#Oversampling the minoiry class\nsm = SMOTE(sampling_strategy=0.2, random_state=42)\nX_over, y_over = sm.fit_resample(X_train, y_train)\n\nprint('Data imbalance after oversampling (SMOTE): ')\nprint('Number of zeros: ', y_over.value_counts()[0],'\\nNumber of ones: ', y_over.value_counts()[0])\nprint('Shape of x_train before sampling', X_over.shape,'\\n\\n\\n')\n\n#Undersampling\n# undersample = NearMiss(version=3, n_neighbors_ver3=3)\nundersample = RandomUnderSampler(random_state=42)\nX_under, y_under = undersample.fit_resample(X_over,y_over)\n\nprint('Data imbalance after final undersampling (random undersampler): ')\nprint('Number of zeros: ', y_under.value_counts()[0],'\\nNumber of ones: ', y_under.value_counts()[0])\nprint('Shape of x_train before sampling', X_under.shape,'\\n\\n\\n')\n\n\n#Plotting Initial Data Distribution\nfig = plt.figure(figsize=(20,5))\nax0 = fig.add_subplot(1,3,1)\ncolors = {0:'red',1:'blue'}\nax0.scatter(X_train[most_varying_feature1], X_train[most_varying_feature2], c=y_train.map(colors))\nax0.set_xlim(1,400000)\nax0.set_ylim(1,40000)\nax0.set_xlabel('Some Highly Variant Feature')\nax0.set_ylabel('Some Highly Variant Feature')\nax0.set_title('Initial Imbalance')\n\nax1 = fig.add_subplot(1,3,2)\nax1.scatter(X_over[most_varying_feature1], X_over[most_varying_feature2], c=y_over.map(colors))\nax1.set_xlim(1,400000)\nax1.set_ylim(1,40000)\nax1.set_xlabel('Some Highly Variant Feature')\nax1.set_ylabel('Some Highly Variant Feature')\nax1.set_title('Imbalance left after SMOTE')\n\nax2 = fig.add_subplot(1,3,3)\nax2.scatter(X_under[most_varying_feature1], X_under[most_varying_feature2], c=y_under.map(colors))\nax2.set_xlim(1,400000)\nax2.set_ylim(1,40000)\nax2.set_xlabel('Some Highly Variant Feature')\nax2.set_ylabel('Some Highly Variant Feature')\nax2.set_title('After final Undersampling (Balanced Data)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-31T15:00:24.532351Z","iopub.execute_input":"2022-07-31T15:00:24.533325Z","iopub.status.idle":"2022-07-31T15:00:29.638679Z","shell.execute_reply.started":"2022-07-31T15:00:24.533273Z","shell.execute_reply":"2022-07-31T15:00:29.637499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.Sequential()\nmodel.add(tf.keras.layers.Input(shape=(335,)))\nmodel.add(tf.keras.layers.BatchNormalization())\nmodel.add(tf.keras.layers.Dense(300, activation='selu'))\nmodel.add(tf.keras.layers.Dropout(0.2))\nmodel.add(tf.keras.layers.Dense(150, activation='selu'))\nmodel.add(tf.keras.layers.Dropout(0.2))\nmodel.add(tf.keras.layers.Dense(70, activation='selu'))\nmodel.add(tf.keras.layers.Dropout(0.2))\nmodel.add(tf.keras.layers.Dense(16, activation='selu'))\nmodel.add(tf.keras.layers.Dropout(0.2))\nmodel.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\nmodel.fit(X_under, y_under, epochs=100, validation_data=(X_test, y_test), batch_size=1000)","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-07-31T15:01:12.184844Z","iopub.execute_input":"2022-07-31T15:01:12.185370Z","iopub.status.idle":"2022-07-31T15:02:38.183867Z","shell.execute_reply.started":"2022-07-31T15:01:12.185334Z","shell.execute_reply":"2022-07-31T15:02:38.182824Z"},"trusted":true},"execution_count":null,"outputs":[]}]}