{ "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": [ "### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. Настроили блокнот для работы с аппаратным ускорителем GPU." ], "metadata": { "id": "gz18QPRz03Ec" } }, { "cell_type": "code", "source": [ "# импорт модулей\n", "import os\n", "os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')\n", "\n", "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "from tensorflow.keras.models import Sequential\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n" ], "metadata": { "id": "mr9IszuQ1ANG" }, "execution_count": 26, "outputs": [] }, { "cell_type": "code", "source": [ "import tensorflow as tf\n", "device_name = tf.test.gpu_device_name()\n", "if device_name != '/device:GPU:0':\n", " raise SystemError('GPU device not found')\n", "print('Found GPU at: {}'.format(device_name))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "o63-lKG_RuNc", "outputId": "40173ad5-1e1c-4d91-b297-c732c5db0e57" }, "execution_count": 27, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Found GPU at: /device:GPU:0\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 2) Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным значению (4k – 1)=23, где k=6 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных." ], "metadata": { "id": "FFRtE0TN1AiA" } }, { "cell_type": "code", "source": [ "# загрузка датасета\n", "from keras.datasets import imdb\n", "\n", "vocabulary_size = 5000\n", "index_from = 3\n", "\n", "(X_train, y_train), (X_test, y_test) = imdb.load_data(\n", " path=\"imdb.npz\",\n", " num_words=vocabulary_size,\n", " skip_top=0,\n", " maxlen=None,\n", " seed=26,\n", " start_char=1,\n", " oov_char=2,\n", " index_from=index_from\n", " )\n", "\n", "# вывод размерностей\n", "print('Shape of X train:', X_train.shape)\n", "print('Shape of y train:', y_train.shape)\n", "print('Shape of X test:', X_test.shape)\n", "print('Shape of y test:', y_test.shape)" ], "metadata": { "id": "Ixw5Sp0_1A-w", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "cf28ed89-8490-4713-ea5c-7896c36e46d3" }, "execution_count": 28, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of X train: (25000,)\n", "Shape of y train: (25000,)\n", "Shape of X test: (25000,)\n", "Shape of y test: (25000,)\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 3) Вывели один отзыв из обучающего множества в виде списка индексов слов. Преобразовали список индексов в текст и вывели отзыв в виде текста. Вывели длину отзыва. Вывели метку класса данного отзыва и название класса (1 – Positive, 0 – Negative)." ], "metadata": { "id": "aCo_lUXl1BPV" } }, { "cell_type": "code", "source": [ "# создание словаря для перевода индексов в слова\n", "# заргузка словаря \"слово:индекс\"\n", "word_to_id = imdb.get_word_index()\n", "# уточнение словаря\n", "word_to_id = {key:(value + index_from) for key,value in word_to_id.items()}\n", "word_to_id[\"\"] = 0\n", "word_to_id[\"\"] = 1\n", "word_to_id[\"\"] = 2\n", "word_to_id[\"\"] = 3\n", "# создание обратного словаря \"индекс:слово\"\n", "id_to_word = {value:key for key,value in word_to_id.items()}" ], "metadata": { "id": "9W3RklPcZyH0" }, "execution_count": 29, "outputs": [] }, { "cell_type": "code", "source": [ "print(X_train[26])\n", "print('len:',len(X_train[26]))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Nu-Bs1jnaYhB", "outputId": "e4abd078-aea3-448f-b9aa-3b7142595f46" }, "execution_count": 33, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[1, 4, 78, 46, 304, 39, 2, 7, 968, 2, 295, 209, 101, 147, 65, 10, 10, 2643, 2, 497, 8, 30, 6, 147, 284, 5, 996, 174, 10, 10, 11, 4, 130, 4, 2, 4979, 11, 2, 10, 10, 2]\n", "len: 41\n" ] } ] }, { "cell_type": "code", "source": [ "review_as_text = ' '.join(id_to_word[id] for id in X_train[26])\n", "print(review_as_text)\n", "print('len:',len(review_as_text))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JhTwTurtZ6Sp", "outputId": "1e65df22-05f7-4036-d3b1-7be8168a7c88" }, "execution_count": 34, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " the bad out takes from of fire together without any real story br br dean tries to be a real actor and fails again br br in the end the quit in br br \n", "len: 193\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 4) Вывели максимальную и минимальную длину отзыва в обучающем множестве." ], "metadata": { "id": "4hclnNaD1BuB" } }, { "cell_type": "code", "source": [ "print('MAX Len: ',len(max(X_train, key=len)))\n", "print('MIN Len: ',len(min(X_train, key=len)))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xJH87ISq1B9h", "outputId": "241e484b-d13f-462f-9bb3-214c81c00f77" }, "execution_count": 35, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "MAX Len: 2494\n", "MIN Len: 11\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 5) Провели предобработку данных. Выбрали единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины." ], "metadata": { "id": "7x99O8ig1CLh" } }, { "cell_type": "code", "source": [ "# предобработка данных\n", "from tensorflow.keras.utils import pad_sequences\n", "max_words = 500\n", "X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')\n", "X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')" ], "metadata": { "id": "lrF-B2aScR4t" }, "execution_count": 36, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 6) Повторили пункт 4." ], "metadata": { "id": "HL2_LVga1C3l" } }, { "cell_type": "code", "source": [ "print('MAX Len: ',len(max(X_train, key=len)))\n", "print('MIN Len: ',len(min(X_train, key=len)))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "81Cgq8dn9uL6", "outputId": "94d17c54-1e36-4036-d4a8-cb1c38a5c65a" }, "execution_count": 37, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "MAX Len: 500\n", "MIN Len: 500\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 7) Повторили пункт 3. Сделали вывод о том, как отзыв преобразовался после предобработки." ], "metadata": { "id": "KzrVY1SR1DZh" } }, { "cell_type": "code", "source": [ "print(X_train[26])\n", "print('len:',len(X_train[26]))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vudlgqoCbjU1", "outputId": "3292596a-45a0-49d1-a723-4398190ddb47" }, "execution_count": 38, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 1 4 78\n", " 46 304 39 2 7 968 2 295 209 101 147 65 10 10\n", " 2643 2 497 8 30 6 147 284 5 996 174 10 10 11\n", " 4 130 4 2 4979 11 2 10 10 2]\n", "len: 500\n" ] } ] }, { "cell_type": "code", "source": [ "review_as_text = ' '.join(id_to_word[id] for id in X_train[26])\n", "print(review_as_text)\n", "print('len:',len(review_as_text))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dbfkWjDI1Dp7", "outputId": "7b53084e-40fc-47e6-ea72-4eb76d213e55" }, "execution_count": 39, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " the bad out takes from of fire together without any real story br br dean tries to be a real actor and fails again br br in the end the quit in br br \n", "len: 2947\n" ] } ] }, { "cell_type": "markdown", "source": [ "#### После обработки в начало отзыва добавилось необходимое количество токенов , чтобы отзыв был длинной в 500 индексов." ], "metadata": { "id": "mJNRXo5TdPAE" } }, { "cell_type": "markdown", "source": [ "### 8) Вывели предобработанные массивы обучающих и тестовых данных и их размерности." ], "metadata": { "id": "YgiVGr5_1D3u" } }, { "cell_type": "code", "source": [ "# вывод данных\n", "print('X train: \\n',X_train)\n", "print('X train: \\n',X_test)\n", "\n", "# вывод размерностей\n", "print('Shape of X train:', X_train.shape)\n", "print('Shape of X test:', X_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7MqcG_wl1EHI", "outputId": "b068f5d7-4f3a-41f8-90e8-4b2be5076170" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "X train: \n", " [[ 0 0 0 ... 1039 7 12]\n", " [ 0 0 0 ... 5 2 1773]\n", " [ 0 0 0 ... 220 175 96]\n", " ...\n", " [ 1 3264 153 ... 157 746 14]\n", " [ 0 0 0 ... 3459 55 680]\n", " [ 0 0 0 ... 14 31 56]]\n", "X train: \n", " [[ 0 0 0 ... 241 3366 56]\n", " [ 0 0 0 ... 18 4 755]\n", " [ 0 0 0 ... 149 14 20]\n", " ...\n", " [ 0 0 0 ... 2 2152 1835]\n", " [ 0 0 0 ... 3768 3508 3311]\n", " [ 0 0 0 ... 511 8 2725]]\n", "Shape of X train: (25000, 500)\n", "Shape of X test: (25000, 500)\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 9) Реализовали модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Добились качества обучения по метрике accuracy не менее 0.8." ], "metadata": { "id": "amaspXGW1EVy" } }, { "cell_type": "code", "source": [ "embed_dim = 32\n", "lstm_units = 64\n", "\n", "model = Sequential()\n", "model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,)))\n", "model.add(layers.LSTM(lstm_units))\n", "model.add(layers.Dropout(0.5))\n", "model.add(layers.Dense(1, activation='sigmoid'))\n", "\n", "model.summary()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 262 }, "id": "ktWEeqWd1EyF", "outputId": "01618308-359e-40c5-d675-bea723939cd5" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential_4\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential_4\"\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_4 (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m160,000\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ lstm_4 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m24,832\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dropout_4 (\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_4 (\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_4 (Embedding)         │ (None, 500, 32)        │       160,000 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ lstm_4 (LSTM)                   │ (None, 64)             │        24,832 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout_4 (Dropout)             │ (None, 64)             │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_4 (Dense)                 │ (None, 1)              │            65 │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n" ], "text/html": [ "
 Total params: 184,897 (722.25 KB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n" ], "text/html": [ "
 Trainable params: 184,897 (722.25 KB)\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": "code", "source": [ "# компилируем и обучаем модель\n", "batch_size = 64\n", "epochs = 3\n", "model.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n", "model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CuPqKpX0kQfP", "outputId": "297fa800-d027-4d99-cc37-16302d8190fb" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/3\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 21ms/step - accuracy: 0.9593 - loss: 0.1184 - val_accuracy: 0.8632 - val_loss: 0.4331\n", "Epoch 2/3\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 22ms/step - accuracy: 0.9652 - loss: 0.1055 - val_accuracy: 0.8722 - val_loss: 0.5389\n", "Epoch 3/3\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 20ms/step - accuracy: 0.9741 - loss: 0.0829 - val_accuracy: 0.8648 - val_loss: 0.4959\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 46 } ] }, { "cell_type": "code", "source": [ "test_loss, test_acc = model.evaluate(X_test, y_test)\n", "print(f\"\\nTest accuracy: {test_acc}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hJIWinxymQjb", "outputId": "71a3184a-4574-40ed-f456-8f18db1fd4bf" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 8ms/step - accuracy: 0.8566 - loss: 0.5214\n", "\n", "Test accuracy: 0.8555999994277954\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 10) Оценили качество обучения на тестовых данных:\n", "### - вывели значение метрики качества классификации на тестовых данных\n", "### - вывели отчет о качестве классификации тестовой выборки \n", "### - построили ROC-кривую по результату обработки тестовой выборки и вычислили площадь под ROC-кривой (AUC ROC)" ], "metadata": { "id": "mgrihPd61E8w" } }, { "cell_type": "code", "source": [ "#значение метрики качества классификации на тестовых данных\n", "print(f\"\\nTest accuracy: {test_acc}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Rya5ABT8msha", "outputId": "6f69b050-952c-4fd8-f5a4-de52004fdf39" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Test accuracy: 0.8555999994277954\n" ] } ] }, { "cell_type": "code", "source": [ "#отчет о качестве классификации тестовой выборки\n", "y_score = model.predict(X_test)\n", "y_pred = [1 if y_score[i,0]>=0.5 else 0 for i in range(len(y_score))]\n", "\n", "from sklearn.metrics import classification_report\n", "print(classification_report(y_test, y_pred, labels = [0, 1], target_names=['Negative', 'Positive']))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2kHjcmnCmv0Y", "outputId": "2025617c-d67c-4c54-eda5-ee74671a41ab" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step\n", " precision recall f1-score support\n", "\n", " Negative 0.85 0.87 0.86 12500\n", " Positive 0.87 0.84 0.85 12500\n", "\n", " accuracy 0.86 25000\n", " macro avg 0.86 0.86 0.86 25000\n", "weighted avg 0.86 0.86 0.86 25000\n", "\n" ] } ] }, { "cell_type": "code", "source": [ "#построение ROC-кривой и AUC ROC\n", "from sklearn.metrics import roc_curve, auc\n", "\n", "fpr, tpr, thresholds = roc_curve(y_test, y_score)\n", "plt.plot(fpr, tpr)\n", "plt.grid()\n", "plt.xlabel('False Positive Rate')\n", "plt.ylabel('True Positive Rate')\n", "plt.title('ROC')\n", "plt.show()\n", "print('AUC ROC:', auc(fpr, tpr))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 490 }, "id": "Kp4AQRbcmwAx", "outputId": "7ba7f48a-0f40-4708-87ac-ef85edaf4de0" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUztJREFUeJzt3Xl4E+XaBvA7SbM03UvpSrHsi+wgHFBAtFBEUdSjKHyA6MEFqhwqCihQUQEVRTiKoiBWcAH1uHAEgYKigCAIVFmLUPYuUEqbrtnm/f4IDda20JQk0yT377q4mExnJk8e6sl9Zt6ZVyGEECAiIiLyEkq5CyAiIiJyJoYbIiIi8ioMN0RERORVGG6IiIjIqzDcEBERkVdhuCEiIiKvwnBDREREXoXhhoiIiLwKww0RERF5FYYbIiIi8ioMN0TUoKSlpUGhUNj/+Pn5IS4uDg899BDOnj1bbXshBFasWIF+/fohNDQUer0eHTt2xIsvvojS0tJa3+frr7/GbbfdhoiICGg0GsTGxuL+++/HDz/84MqPR0RuoODcUkTUkKSlpWHs2LF48cUX0axZM1RUVGDHjh1IS0tDQkIC9u/fD51OBwCwWq0YMWIEPv/8c/Tt2xf33HMP9Ho9tmzZgk8//RTt27fHxo0bERUVZT++EAIPP/ww0tLS0LVrV/zzn/9EdHQ0cnJy8PXXX2P37t3Ytm0b+vTpI1cLiOhaCSKiBuTDDz8UAMSuXbuqrJ8yZYoAIFatWmVfN2fOHAFATJ48udpxVq9eLZRKpRg8eHCV9fPmzRMAxL///W8hSVK1/ZYvXy5+/fVXJ30aIpIDL0sRkUfo27cvAODYsWMAgPLycsybNw+tW7fG3Llzq20/dOhQjBkzBuvWrcOOHTvs+8ydOxdt27bF66+/DoVCUW2/UaNGoWfPni78JETkagw3ROQRTpw4AQAICwsDAGzduhUXL17EiBEj4OfnV+M+o0ePBgB899139n0KCgowYsQIqFQq1xdNRLKo+X8RiIhkVlRUhPz8fFRUVODXX3/FrFmzoNVqcccddwAADh48CADo3Llzrceo/NmhQ4eq/N2xY0dXlk5EMmO4IaIGKTExscrrhIQEfPzxx2jSpAkAoLi4GAAQFBRU6zEqf2YwGKr8faV9iMjzMdwQUYO0aNEitG7dGkVFRVi2bBl+/vlnaLVa+88rA0plyKnJ3wNQcHDwVfchIs/HMTdE1CD17NkTiYmJuPfee7F69Wp06NABI0aMQElJCQCgXbt2AIA//vij1mNU/qx9+/YAgLZt2wIA9u3b58rSiUhmDDdE1OCpVCrMnTsX2dnZePvttwEAN910E0JDQ/Hpp5/CarXWuN/y5csBwD5O56abbkJYWBg+++yzWvchIs/HcENEHuHmm29Gz549sWDBAlRUVECv12Py5MnIzMzE888/X237NWvWIC0tDUlJSfjHP/4BANDr9ZgyZQoOHTqEKVOmQNTwDNOPP/4YO3fudPnnISLX4ZgbIvIYzzzzDO677z6kpaXh8ccfx9SpU7F37168+uqr2L59O+699174+/tj69at+Pjjj9GuXTt89NFH1Y5x4MABvPHGG/jxxx/tTyjOzc3FN998g507d+KXX36R6RMSkTNw+gUialAqp1/YtWsXevToUeVnkiShdevWAIDMzEyoVCpIkoTly5dj6dKl2LdvH0wmE1q0aIH7778fTz/9NAICAmp8n//+9794//338dtvv8FgMKBx48bo168fnnjiCfTv39/ln5OIXIfhhoiIiLwKx9wQERGRV2G4ISIiIq/CcENEREReheGGiIiIvArDDREREXkVhhsiIiLyKj73ED9JkpCdnY2goCAoFAq5yyEiIqI6EEKguLgYsbGxUCqvfG7G58JNdnY24uPj5S6DiIiI6uH06dNo0qTJFbfxuXATFBQEwNac4OBgpx7bbDZjw4YNGDRoENRqtVOPTZexz+7BPrsH++w+7LV7uKrPBoMB8fHx9u/xK/G5cFN5KSo4ONgl4Uav1yM4OJj/4bgQ++we7LN7sM/uw167h6v7XJchJRxQTERERF6F4YaIiIi8CsMNEREReRWGGyIiIvIqDDdERETkVRhuiIiIyKsw3BAREZFXYbghIiIir8JwQ0RERF6F4YaIiIi8iqzh5ueff8bQoUMRGxsLhUKBb7755qr7bN68Gd26dYNWq0XLli2Rlpbm8jqJiIjIc8gabkpLS9G5c2csWrSoTtsfP34ct99+OwYMGICMjAz8+9//xr/+9S+sX7/exZUSERGRp5B14szbbrsNt912W523X7x4MZo1a4Y33ngDANCuXTts3boVb775JpKSklxVJhERkU+wWCUYLRIEACGE7W8JEBAQAhAAJFG5bFtRdZ1t4swi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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "AUC ROC: 0.9165464031999999\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 11) Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. " ], "metadata": { "id": "MsM3ew3d1FYq" } }, { "cell_type": "markdown", "source": [ "Таблица1:" ], "metadata": { "id": "xxFO4CXbIG88" } }, { "cell_type": "markdown", "source": [ "| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки |\n", "|----------|-------------------------------------|---------------------------|-----------------------------------------|\n", "| Рекуррентная | 184 897 | 3 | accuracy:0.8556 ; loss:0.5214 ; AUC ROC:0.9165 |\n" ], "metadata": { "id": "xvoivjuNFlEf" } }, { "cell_type": "markdown", "source": [ "#### По результатам применения рекуррентной нейронной сети, а также по данным таблицы 1 можно сделать вывод, что модель хорошо справилась с задачей определения тональности текста. Показатель accuracy = 0.8556 превышает требуемый порог 0.8. Значение AUC ROC = 0.9165 (> 0.9) говорит о высокой способности модели различать два класса (положительные и отрицательные отзывы)." ], "metadata": { "id": "YctF8h_sIB-P" } } ] }