{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "gpuType": "T4" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "source": [ "# LSTM" ], "metadata": { "id": "l9vkq1kvsWn0" } }, { "cell_type": "markdown", "source": [ "## Imports" ], "metadata": { "id": "Ps_SnZslesHt" } }, { "cell_type": "code", "source": [ "import time\n", "import joblib\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "import tensorflow as tf\n", "\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import (\n", " Embedding,\n", " LSTM,\n", " Dense,\n", " Dropout,\n", " SpatialDropout1D,\n", " Input\n", ")\n", "\n", "from tensorflow.keras.callbacks import (\n", " EarlyStopping,\n", " ModelCheckpoint,\n", " ReduceLROnPlateau\n", ")\n", "\n", "from sklearn.metrics import (\n", " accuracy_score,\n", " precision_score,\n", " recall_score,\n", " f1_score,\n", " roc_auc_score,\n", " confusion_matrix,\n", " classification_report,\n", " ConfusionMatrixDisplay\n", ")" ], "metadata": { "id": "1OrUe3_Dd4Vh" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "x_train = joblib.load(\"/content/x_train.pkl\")\n", "x_test = joblib.load(\"/content/x_test.pkl\")\n", "\n", "y_train = joblib.load(\"/content/y_train.pkl\")\n", "y_test = joblib.load(\"/content/y_test.pkl\")" ], "metadata": { "id": "vzYgMugWd3yz" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "print(\"x_train:\", x_train.shape)\n", "print(\"x_test :\", x_test.shape)\n", "\n", "print(\"y_train:\", y_train.shape)\n", "print(\"y_test :\", y_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e8AWpW-zsKK6", "outputId": "8cb72de2-b114-4638-981c-0a5df95b4173" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "x_train: (1274150,)\n", "x_test : (318538,)\n", "y_train: (1274150,)\n", "y_test : (318538,)\n" ] } ] }, { "cell_type": "code", "source": [ "print(\"Train Missing:\", x_train.isna().sum())\n", "print(\"Test Missing :\", x_test.isna().sum())" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mJvlio_bsKIq", "outputId": "1ac85cdd-c2be-46c1-da53-270001d21b7c" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Train Missing: 0\n", "Test Missing : 0\n" ] } ] }, { "cell_type": "markdown", "source": [ "Tokenizer" ], "metadata": { "id": "MCombP8humm9" } }, { "cell_type": "code", "source": [ "VOCAB_SIZE = 50000\n", "\n", "tokenizer = Tokenizer(\n", " num_words=VOCAB_SIZE,\n", " oov_token=\"\"\n", ")" ], "metadata": { "id": "OQHenEKEsKGV" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "tokenizer.fit_on_texts(x_train)" ], "metadata": { "id": "JfTDyZ6psKD2" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "joblib.dump(tokenizer, \"tokenizer.pkl\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WZcO6sCBsKBG", "outputId": "c2b97edc-21ed-462d-e4bf-dbc3ee949844" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['tokenizer.pkl']" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "markdown", "source": [ "Text ---> Sequences" ], "metadata": { "id": "EvcFck9TwZUv" } }, { "cell_type": "code", "source": [ "x_tr_seq = tokenizer.texts_to_sequences(x_train)\n", "x_te_seq = tokenizer.texts_to_sequences(x_test)" ], "metadata": { "id": "g-jDOeHqsJ-o" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "Frjygx0TsJ8L" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "seq_len = [len(seq) for seq in x_tr_seq]\n", "\n", "print(\"Maximum Length :\", max(seq_len))\n", "print(\"Minimum Length :\", min(seq_len))\n", "print(\"Average Length :\", np.mean(seq_len))\n", "print(\"Median Length :\", np.median(seq_len))\n", "print(\"95th Percentile:\", np.percentile(seq_len, 95))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UmQSp1VAsJ5g", "outputId": "ac2d6d41-9d06-4c80-e79b-cee62a56c1ea" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Maximum Length : 56\n", "Minimum Length : 1\n", "Average Length : 7.173818624180827\n", "Median Length : 7.0\n", "95th Percentile: 14.0\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "8nfFjc1SsJ29" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Pad the Seqences" ], "metadata": { "id": "sixzdhuKxy0h" } }, { "cell_type": "code", "source": [ "MAX_LENGTH = 20\n", "\n", "x_tr_pad = pad_sequences(\n", " x_tr_seq,\n", " maxlen=MAX_LENGTH,\n", " padding=\"post\",\n", " truncating=\"post\"\n", ")\n", "\n", "x_te_pad = pad_sequences(\n", " x_te_seq,\n", " maxlen=MAX_LENGTH,\n", " padding=\"post\",\n", " truncating=\"post\"\n", ")" ], "metadata": { "id": "jQ-zxn-isJ0c" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "print(x_tr_pad.shape)\n", "print(x_te_pad.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SJsgGBonsJvR", "outputId": "5175a97c-c148-466b-a8b4-2a06e3ffcc8f" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(1274150, 20)\n", "(318538, 20)\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "A6UTTybVsJso" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "4qDNSuxtsJpz" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Model" ], "metadata": { "id": "ZebEGtVtzHzx" } }, { "cell_type": "code", "source": [ "VOCAB_SIZE = 50000\n", "EMBEDDING_DIM = 128\n", "\n", "model = Sequential([\n", " Input(\n", " shape=(MAX_LENGTH,)\n", " ),\n", "\n", " Embedding(\n", " input_dim=VOCAB_SIZE,\n", " output_dim=EMBEDDING_DIM,\n", " ),\n", " SpatialDropout1D(0.2),\n", "\n", " LSTM(\n", " 128,\n", " dropout=0.2,\n", " recurrent_dropout=0.2\n", " ),\n", "\n", " Dense(\n", " 64,\n", " activation=\"relu\"\n", " ),\n", " Dropout(0.3),\n", " Dense(\n", " 1,\n", " activation=\"sigmoid\"\n", " )\n", "])" ], "metadata": { "id": "mrBR29F_sJnH" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "model.summary()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 334 }, "id": "XWiv-DmVsJiJ", "outputId": "90f32915-4edd-45a8-8469-7cefb436028d" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential\"\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m20\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m6,400,000\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m20\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m8,256\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ], "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ embedding (Embedding)           │ (None, 20, 128)        │     6,400,000 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ spatial_dropout1d               │ (None, 20, 128)        │             0 │\n",
              "│ (SpatialDropout1D)              │                        │               │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ lstm (LSTM)                     │ (None, 128)            │       131,584 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (Dense)                   │ (None, 64)             │         8,256 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout (Dropout)               │ (None, 64)             │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_1 (Dense)                 │ (None, 1)              │            65 │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m6,539,905\u001b[0m (24.95 MB)\n" ], "text/html": [ "
 Total params: 6,539,905 (24.95 MB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m6,539,905\u001b[0m (24.95 MB)\n" ], "text/html": [ "
 Trainable params: 6,539,905 (24.95 MB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ], "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
              "
\n" ] }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "Compile" ], "metadata": { "id": "AwAvOcPA1oQN" } }, { "cell_type": "code", "source": [ "model.compile(\n", " optimizer='adam',\n", " loss=\"binary_crossentropy\",\n", " metrics=[\n", " \"accuracy\",\n", " tf.keras.metrics.Precision(name=\"precision\"),\n", " tf.keras.metrics.Recall(name=\"recall\")\n", " ]\n", ")" ], "metadata": { "id": "HJlrikASsJfg" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "O8NifrsMsJdI" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "early_stop = EarlyStopping(\n", " monitor=\"val_loss\",\n", " patience=3,\n", " restore_best_weights=True,\n", " verbose=1\n", ")\n", "checkpoints = ModelCheckpoint(\n", " \"best_model.keras\",\n", " monitor=\"val_accuracy\",\n", " save_best_only=True,\n", " verbose=1\n", ")\n", "reduce_lr = ReduceLROnPlateau(\n", " monitor=\"val_loss\",\n", " factor=0.5,\n", " patience=2,\n", " min_lr=1e-6,\n", " verbose=1\n", ")" ], "metadata": { "id": "AzUc0NVIsJau" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Training" ], "metadata": { "id": "Wlyn34aj3oDA" } }, { "cell_type": "code", "source": [ "from sklearn.utils import validation\n", "start = time.time()\n", "\n", "history = model.fit(\n", " x_tr_pad,\n", " y_train,\n", " validation_split=0.2,\n", " epochs=10,\n", " batch_size=512,\n", " callbacks=[\n", " early_stop,\n", " checkpoints,\n", " reduce_lr\n", " ],\n", " verbose=1\n", ")\n", "end = time.time()\n", "print(f\"Training Time: {(end-start)/60:.2f} Minutes\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kReOXN6LsJYn", "outputId": "e65150ab-06fe-46ef-e748-a1c8dd774e9e" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/10\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 82ms/step - accuracy: 0.7399 - loss: 0.5163 - precision: 0.7453 - recall: 0.7173\n", "Epoch 1: val_accuracy improved from None to 0.78913, saving model to best_model.keras\n", "\n", "Epoch 1: finished saving model to best_model.keras\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m179s\u001b[0m 86ms/step - accuracy: 0.7698 - loss: 0.4823 - precision: 0.7717 - recall: 0.7663 - val_accuracy: 0.7891 - val_loss: 0.4493 - val_precision: 0.7778 - val_recall: 0.8099 - learning_rate: 0.0010\n", "Epoch 2/10\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 81ms/step - accuracy: 0.7967 - loss: 0.4381 - precision: 0.7965 - recall: 0.7969\n", "Epoch 2: val_accuracy improved from 0.78913 to 0.79325, saving model to best_model.keras\n", "\n", "Epoch 2: finished saving model to best_model.keras\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m195s\u001b[0m 84ms/step - accuracy: 0.7964 - loss: 0.4384 - precision: 0.7951 - recall: 0.7987 - val_accuracy: 0.7933 - val_loss: 0.4453 - val_precision: 0.8063 - val_recall: 0.7723 - learning_rate: 0.0010\n", "Epoch 3/10\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 80ms/step - accuracy: 0.8081 - loss: 0.4171 - precision: 0.8044 - recall: 0.8144\n", "Epoch 3: val_accuracy improved from 0.79325 to 0.79373, saving model to best_model.keras\n", "\n", "Epoch 3: finished saving model to best_model.keras\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m203s\u001b[0m 85ms/step - accuracy: 0.8066 - loss: 0.4199 - precision: 0.8039 - recall: 0.8109 - val_accuracy: 0.7937 - val_loss: 0.4453 - val_precision: 0.7762 - val_recall: 0.8258 - learning_rate: 0.0010\n", "Epoch 4/10\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - accuracy: 0.8173 - loss: 0.3994 - precision: 0.8139 - recall: 0.8231\n", "Epoch 4: val_accuracy improved from 0.79373 to 0.79448, saving model to best_model.keras\n", "\n", "Epoch 4: finished saving model to best_model.keras\n", "\n", "Epoch 4: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m166s\u001b[0m 83ms/step - accuracy: 0.8152 - loss: 0.4032 - precision: 0.8114 - recall: 0.8212 - val_accuracy: 0.7945 - val_loss: 0.4457 - val_precision: 0.7865 - val_recall: 0.8087 - learning_rate: 0.0010\n", "Epoch 5/10\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 79ms/step - accuracy: 0.8294 - loss: 0.3765 - precision: 0.8254 - recall: 0.8359\n", "Epoch 5: val_accuracy did not improve from 0.79448\n", "\u001b[1m1991/1991\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m201s\u001b[0m 83ms/step - accuracy: 0.8283 - loss: 0.3783 - precision: 0.8241 - recall: 0.8345 - val_accuracy: 0.7924 - val_loss: 0.4627 - val_precision: 0.7882 - val_recall: 0.7999 - learning_rate: 5.0000e-04\n", "Epoch 5: early stopping\n", "Restoring model weights from the end of the best epoch: 2.\n", "Training Time: 15.72 Minutes\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "3-EX7i2csJWD" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "y_prob = model.predict(x_te_pad)\n", "y_pred = (y_prob > 0.5).astype(int)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WLkouK_fsJT_", "outputId": "ff917286-b49e-4b3c-de86-2f880da57131" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m9955/9955\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 15ms/step\n" ] } ] }, { "cell_type": "code", "source": [ "y_pred = y_pred.ravel()" ], "metadata": { "id": "1Bx1coEQsJRp" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "print(f\"Accuracy : {accuracy_score(y_test, y_pred):.4f}\")\n", "print(f\"Precision: {precision_score(y_test, y_pred):.4f}\")\n", "print(f\"Recall : {recall_score(y_test, y_pred):.4f}\")\n", "print(f\"F1 Score : {f1_score(y_test, y_pred):.4f}\")\n", "print(f\"ROC AUC : {roc_auc_score(y_test, y_prob):.4f}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "39c8TmjXsJPI", "outputId": "0581cab8-6aef-4571-aa9a-11a1e305fd2b" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Accuracy : 0.7920\n", "Precision: 0.8045\n", "Recall : 0.7715\n", "F1 Score : 0.7877\n", "ROC AUC : 0.8753\n" ] } ] }, { "cell_type": "code", "source": [ "print(\"Classification Report:\\n\")\n", "\n", "print(classification_report(y_test, y_pred))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4z3tYl-OsJMo", "outputId": "7f3159b6-af16-40ec-9ba4-bd6f9c6ea37f" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Classification Report:\n", "\n", " precision recall f1-score support\n", "\n", " 0 0.78 0.81 0.80 159267\n", " 1 0.80 0.77 0.79 159271\n", "\n", " accuracy 0.79 318538\n", " macro avg 0.79 0.79 0.79 318538\n", "weighted avg 0.79 0.79 0.79 318538\n", "\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.metrics import ConfusionMatrixDisplay\n", "import matplotlib.pyplot as plt\n", "\n", "ConfusionMatrixDisplay.from_predictions(\n", " y_test,\n", " y_pred,\n", " cmap=\"Blues\"\n", ")\n", "\n", "plt.title(\"LSTM Confusion Matrix\")\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 472 }, "id": "I1MTSsDXsJKL", "outputId": "ecf84330-1e9f-40af-8558-6cec2603091e" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "model.save(\"lstm_sentiment.keras\")" ], "metadata": { "id": "iO8CfQ5wsJHy" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "model.save(\"best_lstm.keras\")\n", "joblib.dump(history.history, \"history.pkl\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "O32y6s71sJFQ", "outputId": "7ee9c0ca-560f-4790-e0f2-fa80074f1a65" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['history.pkl']" ] }, "metadata": {}, "execution_count": 23 } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "rjjC2euYsJAx" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "gNHRcmGnsI-D" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "_B8533AZsI7v" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "U_wCt3INsI5J" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "1-lxanohsI08" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "M8v7NDmIsGrs" }, "outputs": [], "source": [] } ] }