{"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":"raw","source":"import numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.metrics import auc\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix\n","metadata":{"id":"Y7Hx1vRljWgZ"}},{"cell_type":"code","source":"from google.colab import drive\ndrive.mount('/content/drive')","metadata":{"id":"sRDN0XcQoiNf","outputId":"50d5da99-e042-46b0-b893-3d35fec85e7e"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('drive/MyDrive/emsi-5iir-ds/train.csv')\ntest = pd.read_csv('drive/MyDrive/emsi-5iir-ds/test.csv')\n\npd.set_option('display.max_columns', None)\ntrain.head(10)","metadata":{"id":"I2DxEs1yok9O","outputId":"c24a8084-a77c-4006-8f69-599ddfad501b"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## feature ingineering\n","metadata":{"id":"-Zkl1EaCOWD8"}},{"cell_type":"code","source":"# to keep the originalr version of our data \ntrain_data, test_data = train, test\n##\nimport string \nlist(string.ascii_uppercase)\nalphabet_upper = list(string.ascii_uppercase)\n\nchar_counts = []\nfor character in alphabet_upper:\n    char_counts.append(train_data[\"f_27\"].str.count(character).sum())\n\nchar_counts_df = pd.DataFrame({\"Character\": alphabet_upper, \"Character Count\": char_counts})\n\nchar_counts_df = char_counts_df.loc[char_counts_df[\"Character Count\"] > 0]\nprint(np.sum(char_counts)) #No other hidden characters\n\nplt.subplots(figsize=(15,7))\nsns.barplot(data = char_counts_df, x=\"Character\", y=\"Character Count\", color=\"blue\");\nplt.title(\"Total number of characters in f_27 - train\");","metadata":{"id":"ISYb7Jx-PZAl","outputId":"65726847-8010-4ad3-e1f9-88919e8c9479"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"char_counts_df = char_counts_df.set_index(\"Character\", drop=False)\nfor i in range(10):\n    char_counts_df[\"character\"+str(i+1)] = train_data[\"f_27\"].str[i].value_counts()\nchar_counts_df = char_counts_df.fillna(0)\n\n\nf,ax = plt.subplots(figsize=(15,20))\ncharacter_cols = [i for i in char_counts_df.columns if \"character\" in i]\nfor i, column in enumerate(character_cols):\n    ax = plt.subplot(5,2,i+1)\n    ax = sns.barplot(data = char_counts_df, x=\"Character\", y=column, color=\"blue\");\n    plt.title(\"Character value counts in position: \" +str(i+1));\n    ax.set_ylabel(\"Character Count\")","metadata":{"id":"LyZ1VW3xrjco","outputId":"25ee72ab-2eff-4fd1-9893-d3ae55fd5219"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"we found out that the most used cahrs are the first 10\nthe rest are less frequently used\n\n\n**so we can separete it into 10 columns**","metadata":{"id":"2uUphlOeP0K2"}},{"cell_type":"code","source":"# Extract the 10 letters of f_27 into individual features\nfor df in [train_data, test_data]:\n    for i in range(10):\n        df[f'ch{i}'] = df.f_27.str.get(i).apply(ord) - ord('A')","metadata":{"id":"jHjlwGb30CXq"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n**and also we can use the unique chars as a separated column** for example: f_27's first sample is \"ABABDADBAB\" 'A' is repeated 3 times...","metadata":{"id":"ThATivhw0chs"}},{"cell_type":"code","source":"df[\"unique_characters\"] = df.f_27.apply(lambda s: len(set(s)))","metadata":{"id":"xdbIo5As0nd7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib.colors import ListedColormap\n\nplt.figure(figsize=(11, 5))\ncmap = ListedColormap([\"b\", \"k\"])\n\nax = plt.subplot(1, 3, 1)\nax.scatter(train['f_02'], train['f_21'], s=1,\n           c=train.target, cmap=cmap)\nax.set_xlabel('f_02')\nax.set_ylabel('f_21')\n\nax0 = ax\n\nax = plt.subplot(1, 3, 2, sharex=ax0, sharey=ax0)\nax.scatter(train['f_05'], train['f_22'], s=1,\n           c=train.target, cmap=cmap)\nax.set_xlabel('f_05')\nax.set_ylabel('f_22')\nax.set_aspect('equal')\n\nax = plt.subplot(1, 3, 3, sharex=ax0, sharey=ax0)\nax.scatter(train['f_00'] + train['f_01'], train['f_26'], s=1,\n           c=train.target, cmap=cmap)\nax.set_xlabel('f_00 + f_01')\nax.set_ylabel('f_26')\nax.set_aspect('equal')\n\n\nplt.tight_layout(w_pad=1.0)\nplt.show()","metadata":{"id":"5vtpQF43giw7","outputId":"2e36077d-23ef-4bdc-f9c0-9f58e60fdec6"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**from the graph we can notice that there is a combinition between some features \nwe craete a connection between these features so we can help the model** ","metadata":{"id":"gu7OmKuvBLRK"}},{"cell_type":"code","source":"# Extract the 10 letters of f_27 into individual features\nfor df in [train_data, test_data]:\n    for i in range(10):\n        df[f'f_27{i}'] = df.f_27.str.get(i).apply(ord) - ord('A')\n\n    df[\"unique_characters\"] = df.f_27.apply(lambda s: len(set(s)))\n\n    df['i_02_21'] = (df.f_21 + df.f_02 > 5).astype(int) - (df.f_21 + df.f_02 < -5).astype(int)\n    df['i_05_22'] = (df.f_22 + df.f_05 > 5).astype(int) - (df.f_22 + df.f_05 < -5).astype(int)\n    i_00_01_26 = df.f_00 + df.f_01 + df.f_26\n    df['i_00_01_26'] = (i_00_01_26 > 5.0).astype(int) - (i_00_01_26 < -5.0).astype(int)","metadata":{"id":"ZfZgt4lhZr7U"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\nfig, ax = plt.subplots(figsize=(13,13))\nsns.heatmap(train_data.corr(), vmin=-1, vmax=1, cmap='seismic', linewidths=0.2, ax=ax);","metadata":{"id":"8f-BJcs4tGeQ","outputId":"be509689-0c22-4da7-9144-9d797c5b6673"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.drop(['id', 'f_27'], axis=1, inplace=True)","metadata":{"id":"BLo20g2iorDc"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.preprocessing import MinMaxScaler\n\nX = train_data.drop(['target'], axis=1)\ny = train_data['target']\n\n\n\nscaler = StandardScaler()\nX = scaler.fit_transform(X)\n\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n","metadata":{"id":"CgT-z9_UowVJ"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dropout\nfrom tensorflow import keras \nimport tensorflow as tf  ","metadata":{"id":"QEEYOGCFoyly"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# len(X[0, :])","metadata":{"id":"p6nd5rpcZDii","outputId":"741be6e5-7241-484e-afd3-61262df0dc1b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# len(X[0, :])\nmodel = Sequential()\nmodel.add(Flatten())\nmodel.add(Dense(128, input_dim=len(X[0, :]), activation='swish'))\nmodel.add(Dense(128, activation='swish'))\nmodel.add(Dense(128, activation='swish'))\nmodel.add(Dense(128, activation='swish'))\nmodel.add(Dense(1, activation='sigmoid'))\n\n_optimizer = tf.keras.optimizers.experimental.Adam(\n    learning_rate=0.001,\n    ema_momentum=2,\n    ema_overwrite_frequency=None,\n    jit_compile=True,\n    name='Adam'\n)\n\nmodel.compile(optimizer=_optimizer, loss='binary_crossentropy', metrics=\"accuracy\")\nres = model.fit(x = X_train, y= y_train, epochs=100, verbose=1)\n","metadata":{"id":"cspO8nO-pmUo","outputId":"04765dbd-46ae-49db-edb0-2da796ce51aa"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## now we evaluate our model ","metadata":{"id":"CcoopT8hGog2"}},{"cell_type":"markdown","source":"**we use ROC method to evaluate it** ","metadata":{"id":"lyv21PPEI2kT"}},{"cell_type":"code","source":"from sklearn.metrics import roc_curve,roc_auc_score\ny_preds = model.predict(X_test).ravel()\nfpr, tpr, thresholds_keras = roc_curve(y_test, y_preds)\n\nauc_keras = auc(fpr, tpr)\nplt.plot(fpr,tpr) \nplt.axis([0,1,0,1]) \nplt.xlabel('False Positive Rate') \nplt.ylabel('True Positive Rate') \nplt.show()\n\n\n","metadata":{"id":"sqY7r_oCHaFy","outputId":"83485885-f6d1-4a33-a88f-528f884b987e"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\nmat = confusion_matrix(y_test, y_preds.round())\naccuracy = (mat[0][0]+mat[1][1]) / (mat[0][0]+ mat[0][1]+ mat[1][0]+ mat[1][1])\nprint(f'accuracy: {accuracy*100:.2f}%')\nlabels=['true','false']\nsns.heatmap(mat, square=True, annot=True, fmt='d', cbar=False, cmap='Blues',\n            xticklabels=labels, yticklabels=labels)\n \nplt.xlabel('Predicted label')\nplt.ylabel('Actual label')\nplt.show()","metadata":{"id":"-moqK_k0Vpsn","outputId":"f28e88b5-2b95-4767-b60d-8680e6a90c9f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.model_selection import cross_val_score\n\n# fig, ax = plt.subplots()\n# scores = cross_val_score(estimator=model, X=X, y=y, cv=5)\n\n# bar_colors = ['tab:red', 'tab:blue', 'tab:red', 'tab:orange']\n# models_names = [f'p{i}' for i in range(1, 6)]\n\n# ax.bar(models_names, scores*100, color=bar_colors)\n\n# plt.show()\n\n\n","metadata":{"id":"VMLNP4OSqRS_","outputId":"87114adc-7f70-4a3b-ea41-18979aa4071b"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(scaler.transform(test_data.drop(['id', 'f_27'], axis =1)))\nsubmitions = pd.DataFrame()\nsubmitions['id'] = test_data['id']\nsubmitions['target'] = predictions.round()\nsubmitions = submitions.reset_index(drop=True)\nsubmitions.to_csv('my_submition.csv', index=False)","metadata":{"id":"5pcWu1FedmPS","outputId":"5a0b4b26-709d-40e0-ec7e-4b4b4c632e06"},"execution_count":null,"outputs":[]}]}