{"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":"# Import","metadata":{}},{"cell_type":"code","source":"import os\nimport time\nimport numpy as np \nimport pandas as pd \nfrom tqdm import tqdm\nimport math\nfrom sklearn.model_selection import train_test_split\nfrom sklearn import metrics\n\nfrom keras.preprocessing.text import Tokenizer\nfrom keras.preprocessing.sequence import pad_sequences\nfrom keras.layers import Dense, Input, LSTM, Embedding, Dropout, Activation, CuDNNGRU, Conv1D\nfrom keras.layers import Bidirectional, GlobalMaxPool1D\nfrom keras.models import Model\nfrom keras import initializers, regularizers, constraints, optimizers, layers","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:40:39.150225Z","iopub.execute_input":"2021-10-15T22:40:39.150796Z","iopub.status.idle":"2021-10-15T22:40:44.251624Z","shell.execute_reply.started":"2021-10-15T22:40:39.150654Z","shell.execute_reply":"2021-10-15T22:40:44.250886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read Data","metadata":{}},{"cell_type":"code","source":"df_train = pd.read_csv('../input/quora-insincere-questions-classification/train.csv')\nprint(df_train.shape)\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:40:44.253067Z","iopub.execute_input":"2021-10-15T22:40:44.253294Z","iopub.status.idle":"2021-10-15T22:40:48.522687Z","shell.execute_reply.started":"2021-10-15T22:40:44.253262Z","shell.execute_reply":"2021-10-15T22:40:48.522018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv('../input/quora-insincere-questions-classification/test.csv')\nprint(df_test.shape)\ndf_test.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:40:48.523858Z","iopub.execute_input":"2021-10-15T22:40:48.524194Z","iopub.status.idle":"2021-10-15T22:40:49.576205Z","shell.execute_reply.started":"2021-10-15T22:40:48.524156Z","shell.execute_reply":"2021-10-15T22:40:49.575558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Pre-processing","metadata":{}},{"cell_type":"code","source":"df_train, df_val = train_test_split(df_train, test_size=0.1, random_state=2018)\n\nembed_size = 300 # how big is each word vector\nmax_features = 50000 # how many unique words to use (i.e num rows in embedding vector)\nmaxlen = 100 # max number of words in a question to use\n\nX_train = df_train[\"question_text\"].fillna(\"_NA_\").values\nX_val = df_val[\"question_text\"].fillna(\"_NA_\").values\nX_test = df_test[\"question_text\"].fillna(\"_NA_\").values\n\ntokenizer = Tokenizer(num_words=max_features)\ntokenizer.fit_on_texts(list(X_train))\nX_train = tokenizer.texts_to_sequences(X_train)\nX_val = tokenizer.texts_to_sequences(X_val)\nX_test = tokenizer.texts_to_sequences(X_test)\n\nX_train = pad_sequences(X_train, maxlen=maxlen)\nX_val = pad_sequences(X_val, maxlen=maxlen)\nX_test = pad_sequences(X_test, maxlen=maxlen)\n\ny_train = df_train['target'].values\ny_val = df_val['target'].values","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:40:49.578354Z","iopub.execute_input":"2021-10-15T22:40:49.578630Z","iopub.status.idle":"2021-10-15T22:41:52.031982Z","shell.execute_reply.started":"2021-10-15T22:40:49.578596Z","shell.execute_reply":"2021-10-15T22:41:52.031204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DNN without pretreined embeddings","metadata":{}},{"cell_type":"code","source":"inp = Input(shape=(maxlen,))\nx = Embedding(max_features, embed_size)(inp)\nx = Bidirectional(CuDNNGRU(64, return_sequences=True))(x)\nx = GlobalMaxPool1D()(x)\nx = Dense(16, activation=\"relu\")(x)\nx = Dropout(0.1)(x)\nx = Dense(1, activation=\"sigmoid\")(x)\nclf = Model(inputs=inp, outputs=x)\nclf.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n\nprint(clf.summary())","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:41:52.033143Z","iopub.execute_input":"2021-10-15T22:41:52.033379Z","iopub.status.idle":"2021-10-15T22:41:54.559708Z","shell.execute_reply.started":"2021-10-15T22:41:52.033348Z","shell.execute_reply":"2021-10-15T22:41:54.559056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf.fit(X_train, y_train, batch_size=512, epochs=2, validation_data=(X_val, y_val))","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:41:54.560898Z","iopub.execute_input":"2021-10-15T22:41:54.562336Z","iopub.status.idle":"2021-10-15T22:45:18.072754Z","shell.execute_reply.started":"2021-10-15T22:41:54.562304Z","shell.execute_reply":"2021-10-15T22:45:18.072016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_val_y = clf.predict([X_val], batch_size=1024, verbose=1)\nfor thresh in np.arange(0.1, 0.501, 0.01):\n    thresh = np.round(thresh, 2)\n    print(\"F1 score at threshold {0} is {1}\".format(thresh, metrics.f1_score(y_val, (pred_val_y>thresh).astype(int))))","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:45:18.074186Z","iopub.execute_input":"2021-10-15T22:45:18.074452Z","iopub.status.idle":"2021-10-15T22:45:22.166410Z","shell.execute_reply.started":"2021-10-15T22:45:18.074416Z","shell.execute_reply":"2021-10-15T22:45:22.165740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_test_y = clf.predict([X_test], batch_size=1024, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T22:45:22.167681Z","iopub.execute_input":"2021-10-15T22:45:22.169122Z","iopub.status.idle":"2021-10-15T22:45:32.543138Z","shell.execute_reply.started":"2021-10-15T22:45:22.169090Z","shell.execute_reply":"2021-10-15T22:45:32.542404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submit","metadata":{}},{"cell_type":"code","source":"df_submission = pd.read_csv('../input/quora-insincere-questions-classification/sample_submission.csv')\ndf_submission['target'] = (0.34*pred_test_y).astype(int) # Best threshold for f1-Score\ndf_submission.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-15T23:02:09.138776Z","iopub.execute_input":"2021-10-15T23:02:09.139043Z","iopub.status.idle":"2021-10-15T23:02:09.351618Z","shell.execute_reply.started":"2021-10-15T23:02:09.139010Z","shell.execute_reply":"2021-10-15T23:02:09.350937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T23:02:10.943315Z","iopub.execute_input":"2021-10-15T23:02:10.944080Z","iopub.status.idle":"2021-10-15T23:02:11.769610Z","shell.execute_reply.started":"2021-10-15T23:02:10.944036Z","shell.execute_reply":"2021-10-15T23:02:11.768848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}