{"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":"code","source":"import nltk\nimport tensorflow as tf\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport time\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import roc_curve, auc\nimport pandas as pd\n\nimport os\nprint(os.listdir(\"/kaggle/input/quora-insincere-questions-classification\"))\n\ntest_df = pd.read_csv('/kaggle/input/quora-insincere-questions-classification/test.csv')\ntest_df\n\nnp.random.seed(42)\ntf.random.set_seed(42)\n\ndef stratify(df0, df1, SAMPLE_SIZE):\n    n_samples = min(len(df0), len(df1))\n    SAMPLE_SIZE = min(n_samples, SAMPLE_SIZE)\n    sample0 = df0.sample(n=SAMPLE_SIZE, random_state=42, replace=False).drop_duplicates()\n    sample1 = df1.sample(n=SAMPLE_SIZE, random_state=42, replace=False).drop_duplicates()\n    sample_df = pd.concat([sample0, sample1])\n    return sample_df\n\n\nclass RNNModelManager:\n        def __init__(self, sentences, labels):\n            self.test_accuracy = None\n            self.test_loss = None\n            self.test_pred = None\n            self.sentences = sentences\n            self.labels = labels\n            self.padded_sequences = None\n            self.stop_words = None\n            self.sequences = None\n            self.train_inputs = None\n            self.train_targets = None\n            self.val_inputs = None\n            self.val_targets = None\n            self.test_inputs = None\n            self.test_targets = None\n            self.model = None\n            self.vocab_size = None\n            self.val_loss = None\n            self.val_accuracy = None\n\n        \n        def preprocess(self, sentences):\n            nltk.download('punkt', quiet=True)\n            nltk.download('stopwords', quiet=True)\n            self.stop_words = nltk.corpus.stopwords.words('english')\n\n            # removing stop words\n            processed_sentences = [self.remove_stop_words(sentence) for sentence in sentences]\n\n            # tokenization\n            tokenizer = tf.keras.preprocessing.text.Tokenizer()\n            tokenizer.fit_on_texts(processed_sentences)\n            sequences = np.array(tokenizer.texts_to_sequences(processed_sentences))\n\n            # padding sequences to maximum length\n            max_length = max([len(seq) for seq in sequences])\n            padded_sequences = tf.keras.preprocessing.sequence.pad_sequences(sequences, maxlen=max_length)\n            self.vocab_size = len(tokenizer.word_index) + 1\n            return padded_sequences\n            \n            \n            \n        def preprocess_split(self, train_size, test_size):\n            start = time.time()\n\n            self.padded_sequences = self.preprocess(self.sentences)\n            \n            # stratify\n            self.train_inputs, val_inputs, self.train_targets, val_targets = train_test_split(self.padded_sequences\n                                                                        , self.labels\n                                                                        , train_size=train_size\n                                                                        , random_state=42)\n            self.test_inputs, self.val_inputs, self.test_targets, self.val_targets = train_test_split(val_inputs\n                                                                      , val_targets\n                                                                      , test_size=test_size\n                                                                      , random_state=42)\n            print(\"--- preprocessing done in %s s ---\" % (time.time() - start))\n\n        def remove_stop_words(self, sentence):\n            return [word for word in sentence if word not in self.stop_words]\n\n        def compile_fit_model(self, model, epochs):\n            start = time.time()\n            self.model = model\n            self.model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n            self.model.fit(self.train_inputs, self.train_targets, epochs=epochs) # , validation_split=0.2, shuffle=True\n            print(\"--- model training done in %s s ---\" % (time.time() - start))\n            return self.model\n\n        def evaluate(self):\n            start = time.time()\n            self.val_loss, self.val_accuracy = self.model.evaluate(self.val_inputs, self.val_targets)\n            print(\"Validation Loss: {:.4f}\".format(self.val_loss))\n            print(\"Validation Accuracy: {:.4f}\".format(self.val_accuracy))\n            print(\"--- evaluation done in %s seconds ---\" % (time.time() - start))\n\n        \n        def plot_roc(self, test_targets, test_pred):\n            fpr, tpr, thresholds = roc_curve(test_targets, test_pred)\n            roc_auc = auc(fpr, tpr)\n\n            print(\"Test AUC: \", roc_auc)\n\n            # ROC (AUC)\n            plt.figure()\n            plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)\n            plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n            plt.xlim([0.0, 1.0])\n            plt.ylim([0.0, 1.0])\n            plt.xlabel('False Positive Rate')\n            plt.ylabel('True Positive Rate')\n            plt.title('Receiver Operating Characteristic')\n            plt.legend(loc=\"lower right\")\n            plt.show()\n            \n        def predict_report(self):\n            start = time.time()\n            self.test_pred = self.model.predict(self.test_inputs)\n            # false positive rate and true positive rate\n            self.plot_roc(self.test_targets, self.test_pred)\n\n            print(\"--- prediction done in %s seconds ---\" % (time.time() - start))\n\n\nparams = [\n    {   'sample': 1\n        , 'train_size': 0.90\n        , 'test_size': 0.01\n        , 'lstm_units': 32\n        , 'lstm_activation': 'tanh'\n        , 'lstm_recurrent_activation': 'sigmoid'\n        , 'lstm_kernel_regularizer': tf.keras.regularizers.l2(0.0001)\n        , 'lstm_bias_regularizer': tf.keras.regularizers.l2(0.0001)\n        , 'lstm_dropout': 0.0\n        , 'lstm_kernel_constraint': None\n        , 'dense_units': 16\n        , 'dense_activation': 'tanh'\n        , 'emb_output_dim': 16\n        , 'epochs': 20},\n]\n\nraw_df = pd.read_csv('/kaggle/input/quora-insincere-questions-classification/train.csv')\ntest_df = pd.read_csv('/kaggle/input/quora-insincere-questions-classification/test.csv')\n\nresults = []\n# padded_test_sequences = []\n# model = None\n\n# for p in params:\np = params[0]\nprint('>>> \\n\\nParams: ', p)\nSAMPLE_SIZE = int(len(raw_df) * p['sample'])\nprint('SAMPLE_SIZE: ', SAMPLE_SIZE)\nraw_sicnere = raw_df[raw_df['target'] == 0]\nraw_insicnere = raw_df[raw_df['target'] == 1]\nsample_df = stratify(raw_sicnere, raw_insicnere, SAMPLE_SIZE)\n\nsentences = sample_df.question_text\nlabels = np.array(sample_df.target)\n\nrnn = RNNModelManager(sentences, labels)\nrnn.preprocess_split(p['train_size'], p['test_size'])\npadded_test_sequences = rnn.preprocess(test_df.question_text) \n\nmodel = tf.keras.Sequential([\n    tf.keras.layers.Embedding(input_dim=rnn.vocab_size, output_dim=p['emb_output_dim']),\n    tf.keras.layers.Bidirectional(\n        tf.keras.layers.LSTM(units=p['lstm_units'], activation=p['lstm_activation']\n                             , recurrent_activation=p['lstm_recurrent_activation']\n                             , kernel_regularizer=p['lstm_kernel_regularizer'], bias_regularizer=p['lstm_bias_regularizer']\n                             , dropout=p['lstm_dropout'], kernel_constraint=p['lstm_kernel_constraint'])),\n    tf.keras.layers.Dense(p['dense_units'], activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nmodel = rnn.compile_fit_model(model, epochs=p['epochs'])\n# rnn.evaluate()\n#     rnn.plot_roc(self.test_targets, self.test_pred)\n# rnn.predict_report()\n#     model.reset_states()\n#     del model, rnn\n# results.append(model.predict(padded_test_sequences))\n\npred = model.predict(padded_test_sequences)\n\nsubmission = pd.DataFrame.from_dict({'qid': test_df['qid']})\nsubmission['prediction'] = (pred).astype(int)\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T09:19:52.403745Z","iopub.execute_input":"2023-02-24T09:19:52.404600Z","iopub.status.idle":"2023-02-24T20:23:29.032955Z","shell.execute_reply.started":"2023-02-24T09:19:52.404497Z","shell.execute_reply":"2023-02-24T20:23:29.031677Z"},"trusted":true},"execution_count":null,"outputs":[]}]}