{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "gz18QPRz03Ec" }, "source": [ "### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. Настроили блокнот для работы с аппаратным ускорителем GPU." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "mr9IszuQ1ANG" }, "outputs": [], "source": [ "# импорт модулей\n", "import os\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" ] }, { "cell_type": "markdown", "metadata": { "id": "FFRtE0TN1AiA" }, "source": [ "### 2) Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным значению (4k – 1)=31, где k=8 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "Ixw5Sp0_1A-w" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m17464789/17464789\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 0us/step\n", "Shape of X train: (25000,)\n", "Shape of y train: (25000,)\n", "Shape of X test: (25000,)\n", "Shape of y test: (25000,)\n" ] } ], "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=31,\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)" ] }, { "cell_type": "markdown", "metadata": { "id": "aCo_lUXl1BPV" }, "source": [ "### 3) Вывели один отзыв из обучающего множества в виде списка индексов слов. Преобразовали список индексов в текст и вывели отзыв в виде текста. Вывели длину отзыва. Вывели метку класса данного отзыва и название класса (1 – Positive, 0 – Negative)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "9W3RklPcZyH0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n", "\u001b[1m1641221/1641221\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2us/step\n" ] } ], "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()}" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "Nu-Bs1jnaYhB" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 13, 805, 8, 40, 14, 1179, 40, 13, 353, 8, 358, 32, 1179, 108, 13, 384, 3091, 2, 1849, 19, 6, 117, 1006, 5, 49, 836, 89, 70, 25, 140, 355, 21, 2, 13, 104, 9, 35, 463, 7, 15, 2063, 170, 355, 4, 293, 1834, 9, 4, 527, 116, 7, 4, 293, 289, 539, 15, 2, 56, 11, 4, 313, 12, 16, 17, 48, 36, 71, 467, 2, 5, 12, 2230, 72, 39, 126, 397, 928, 11, 68, 4598, 4, 22, 2, 18, 836, 5, 2, 21, 4, 34, 4, 1396, 458, 2, 12, 7, 148, 5, 889, 4, 20, 184, 753, 45, 6, 902, 88, 48, 4, 20, 16, 128, 2142, 12, 62, 28, 28, 77, 2, 4, 65, 5, 105, 26, 184, 948, 5, 50, 26, 49, 465, 5, 2, 1984, 388, 7, 4347, 200, 4, 452, 4, 539, 5, 4, 577, 11, 4, 154, 313, 225, 49, 52, 1006, 5, 2552, 2, 2, 43, 24, 195, 8, 202, 4, 22, 4, 1968, 12, 887, 4, 1962, 9, 184, 2509, 5, 2, 5, 127, 202, 4, 22, 6, 194, 2, 21, 1038, 94, 99, 117, 99, 522, 38, 11, 61, 652, 31, 8, 798, 894, 25, 66, 119, 3720, 1179, 108, 225, 6, 1257, 1166, 7, 986, 21, 4, 22, 1545, 99, 117, 8, 30, 2640]\n", "len: 220\n" ] } ], "source": [ "print(X_train[26])\n", "print('len:',len(X_train[26]))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "JhTwTurtZ6Sp" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " i tried to like this slasher like i try to enjoy all slasher films i mean mindless mixed with a little nudity and some suspense how can you go wrong but i think is an example of that formula going wrong the main issue is the horrible acting of the main three girls that up in the house it was as if they were under and it stopped me from ever getting interested in their plight the film for suspense and but the by the numbers direction it of those and leaves the movie pretty dull it's a shame because if the movie was better executed it would have have been the story and characters are pretty creepy and there are some dark and humorous moments of interaction between the mother the girls and the daughter in the old house there's some good nudity and occasional just not enough to give the film the kick it needed the finale is pretty twisted and and does give the film a big but sadly its too little too late so in my opinion one to avoid unless you really love obscure slasher films there's a fair amount of potential but the film delivers too little to be worthwhile\n", "len: 1159\n", "Label: 0 ( Negative )\n" ] } ], "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))\n", "print('Label:', y_train[26], '(', 'Positive' if y_train[26] == 1 else 'Negative', ')')" ] }, { "cell_type": "markdown", "metadata": { "id": "4hclnNaD1BuB" }, "source": [ "### 4) Вывели максимальную и минимальную длину отзыва в обучающем множестве." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "xJH87ISq1B9h" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MAX Len: 2494\n", "MIN Len: 11\n" ] } ], "source": [ "print('MAX Len: ',len(max(X_train, key=len)))\n", "print('MIN Len: ',len(min(X_train, key=len)))" ] }, { "cell_type": "markdown", "metadata": { "id": "7x99O8ig1CLh" }, "source": [ "### 5) Провели предобработку данных. Выбрали единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "lrF-B2aScR4t" }, "outputs": [], "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')" ] }, { "cell_type": "markdown", "metadata": { "id": "HL2_LVga1C3l" }, "source": [ "### 6) Повторили пункт 4." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "81Cgq8dn9uL6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MAX Len: 500\n", "MIN Len: 500\n" ] } ], "source": [ "print('MAX Len: ',len(max(X_train, key=len)))\n", "print('MIN Len: ',len(min(X_train, key=len)))" ] }, { "cell_type": "markdown", "metadata": { "id": "KzrVY1SR1DZh" }, "source": [ "### 7) Повторили пункт 3. Сделали вывод о том, как отзыв преобразовался после предобработки." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "vudlgqoCbjU1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "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", " 1 13 805 8 40 14 1179 40 13 353 8 358 32 1179\n", " 108 13 384 3091 2 1849 19 6 117 1006 5 49 836 89\n", " 70 25 140 355 21 2 13 104 9 35 463 7 15 2063\n", " 170 355 4 293 1834 9 4 527 116 7 4 293 289 539\n", " 15 2 56 11 4 313 12 16 17 48 36 71 467 2\n", " 5 12 2230 72 39 126 397 928 11 68 4598 4 22 2\n", " 18 836 5 2 21 4 34 4 1396 458 2 12 7 148\n", " 5 889 4 20 184 753 45 6 902 88 48 4 20 16\n", " 128 2142 12 62 28 28 77 2 4 65 5 105 26 184\n", " 948 5 50 26 49 465 5 2 1984 388 7 4347 200 4\n", " 452 4 539 5 4 577 11 4 154 313 225 49 52 1006\n", " 5 2552 2 2 43 24 195 8 202 4 22 4 1968 12\n", " 887 4 1962 9 184 2509 5 2 5 127 202 4 22 6\n", " 194 2 21 1038 94 99 117 99 522 38 11 61 652 31\n", " 8 798 894 25 66 119 3720 1179 108 225 6 1257 1166 7\n", " 986 21 4 22 1545 99 117 8 30 2640]\n", "len: 500\n" ] } ], "source": [ "print(X_train[26])\n", "print('len:',len(X_train[26]))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "dbfkWjDI1Dp7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " i tried to like this slasher like i try to enjoy all slasher films i mean mindless mixed with a little nudity and some suspense how can you go wrong but i think is an example of that formula going wrong the main issue is the horrible acting of the main three girls that up in the house it was as if they were under and it stopped me from ever getting interested in their plight the film for suspense and but the by the numbers direction it of those and leaves the movie pretty dull it's a shame because if the movie was better executed it would have have been the story and characters are pretty creepy and there are some dark and humorous moments of interaction between the mother the girls and the daughter in the old house there's some good nudity and occasional just not enough to give the film the kick it needed the finale is pretty twisted and and does give the film a big but sadly its too little too late so in my opinion one to avoid unless you really love obscure slasher films there's a fair amount of potential but the film delivers too little to be worthwhile\n", "len: 2839\n" ] } ], "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))" ] }, { "cell_type": "markdown", "metadata": { "id": "mJNRXo5TdPAE" }, "source": [ "#### После обработки в начало отзыва добавилось необходимое количество токенов , чтобы отзыв был длинной в 500 индексов." ] }, { "cell_type": "markdown", "metadata": { "id": "YgiVGr5_1D3u" }, "source": [ "### 8) Вывели предобработанные массивы обучающих и тестовых данных и их размерности." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "id": "7MqcG_wl1EHI" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X train: \n", " [[ 0 0 0 ... 2 4050 2]\n", " [ 0 0 0 ... 721 90 180]\n", " [ 0 0 0 ... 1114 2 174]\n", " ...\n", " [ 1 1065 2022 ... 7 1514 2]\n", " [ 0 0 0 ... 6 879 132]\n", " [ 0 0 0 ... 12 152 157]]\n", "X train: \n", " [[ 0 0 0 ... 10 342 158]\n", " [ 0 0 0 ... 2 67 12]\n", " [ 0 0 0 ... 1242 1095 1095]\n", " ...\n", " [ 0 0 0 ... 4 2 136]\n", " [ 0 0 0 ... 14 31 591]\n", " [ 0 0 0 ... 7 3923 212]]\n", "Shape of X train: (25000, 500)\n", "Shape of X test: (25000, 500)\n" ] } ], "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)" ] }, { "cell_type": "markdown", "metadata": { "id": "amaspXGW1EVy" }, "source": [ "### 9) Реализовали модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Добились качества обучения по метрике accuracy не менее 0.8." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "ktWEeqWd1EyF" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\layers\\core\\embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n", " warnings.warn(\n", "c:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\layers\\core\\embedding.py:100: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n", " super().__init__(**kwargs)\n" ] }, { "data": { "text/html": [ "
Model: \"sequential\"\n",
              "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ embedding (Embedding)           │ (None, 500, 32)        │       160,000 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ lstm (LSTM)                     │ (None, 64)             │        24,832 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout (Dropout)               │ (None, 64)             │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (Dense)                   │ (None, 1)              │            65 │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "
\n" ], "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;34m500\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m160,000\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ lstm (\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 (\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 (\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" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 184,897 (722.25 KB)\n",
              "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 184,897 (722.25 KB)\n",
              "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
              "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "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()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "CuPqKpX0kQfP" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 184ms/step - accuracy: 0.8464 - loss: 0.3649 - val_accuracy: 0.8366 - val_loss: 0.3726\n", "Epoch 2/5\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m58s\u001b[0m 184ms/step - accuracy: 0.8838 - loss: 0.2931 - val_accuracy: 0.8692 - val_loss: 0.3221\n", "Epoch 3/5\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m59s\u001b[0m 188ms/step - accuracy: 0.9015 - loss: 0.2519 - val_accuracy: 0.8652 - val_loss: 0.3294\n", "Epoch 4/5\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m58s\u001b[0m 185ms/step - accuracy: 0.9151 - loss: 0.2225 - val_accuracy: 0.8636 - val_loss: 0.3255\n", "Epoch 5/5\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 184ms/step - accuracy: 0.9162 - loss: 0.2174 - val_accuracy: 0.8660 - val_loss: 0.3360\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# компилируем и обучаем модель\n", "batch_size = 64\n", "epochs = 5\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)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "id": "hJIWinxymQjb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 49ms/step - accuracy: 0.8659 - loss: 0.3349\n", "\n", "Test accuracy: 0.865880012512207\n" ] } ], "source": [ "test_loss, test_acc = model.evaluate(X_test, y_test)\n", "print(f\"\\nTest accuracy: {test_acc}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "mgrihPd61E8w" }, "source": [ "### 10) Оценили качество обучения на тестовых данных:\n", "### - вывели значение метрики качества классификации на тестовых данных\n", "### - вывели отчет о качестве классификации тестовой выборки \n", "### - построили ROC-кривую по результату обработки тестовой выборки и вычислили площадь под ROC-кривой (AUC ROC)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "id": "Rya5ABT8msha" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Test accuracy: 0.865880012512207\n" ] } ], "source": [ "#значение метрики качества классификации на тестовых данных\n", "print(f\"\\nTest accuracy: {test_acc}\")" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "id": "2kHjcmnCmv0Y" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 50ms/step\n", " precision recall f1-score support\n", "\n", " Negative 0.91 0.82 0.86 12500\n", " Positive 0.83 0.92 0.87 12500\n", "\n", " accuracy 0.87 25000\n", " macro avg 0.87 0.87 0.87 25000\n", "weighted avg 0.87 0.87 0.87 25000\n", "\n" ] } ], "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']))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Kp4AQRbcmwAx" }, "outputs": [ { "data": { "image/png": "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VZuHN7UK95e4EiIiIvdmc7jp0aMHXn75ZaxZswY//fQT7rzzTgDA6dOnER4ebvcC3cW5y+ZLwTs14fxbREREjmRzuFmyZAkOHDiAhIQEPP/882jZsiUA4IsvvkCfPn3sXqC7KNVXAABCfFUSV0JEROTebL5DcadOnayulqqyaNEiKBScVqA2RTpzuFF72ZwniYiIyAb1np56//79OHbsGACgffv26Natm92KcjcGowlVk4KrGG6IiIgcyuZwc+HCBYwZMwY//fQTgoKCAABXrlzBwIEDsW7dOjRu3NjeNbq8yyVX7//T2E8tYSVERETuz+bDCE899RSKi4vxxx9/oKCgAAUFBThy5Ai0Wi2efvppR9To8kr0RgCAj1LBqSuIiIgczOYjN5s3b8a2bdvQrl07y7L27dtj6dKlGDJkiF2LcxdXSs1HbsoMRokrISIicn82H7kxmUxQKpXVliuVSsv9b8jaucoZwaODfCSuhIiIyP3ZHG4GDRqEqVOn4vz585Zl586dw7Rp03D77bfbtTh3cfJCMYCrl4MTERGR49gcbt555x1otVrExsaiRYsWaNGiBZo1awatVou3337bETW6PH3llAtNG/lKXAkREZH7s3nMTUxMDA4cOIDt27dbLgVv164d4uLi7F6cu9CWm2cC7xoTJG0hREREHsCmcLN+/Xps2LABer0et99+O5566ilH1eVWsgvMY2581bzJIRERkaPVOdy89957mDJlClq1agUfHx989dVXOHXqFBYtWuTI+txC1V2JlQrewI+IiMjR6vxt+8477yApKQkZGRlIT0/HRx99hHfffdeRtbkNbZn5tNRNjTQSV0JEROT+6hxuMjMzER8fb3k+duxYVFRUICcnxyGFuZMLRToAgK+q3rNdEBERUR3VOdzodDr4+l692kcul0OlUqGsrMwhhbmTqiM30cG8zw0REZGj2XQoYe7cudBorp5a0ev1WLBgAQIDAy3LFi9ebL/q3IAQApcq55ZSe3FAMRERkaPVOdzceuutyMjIsFrWp08fZGZmWp5z3qTqdBVX79oc6qeSsBIiIiLPUOdwk5aW5sAy3Ne14cZHxSM3REREjtYgrk1eunQpYmNj4e3tjV69emHv3r112m7dunWQyWQYOXKkYwu8AVXjbQBAxUvBiYiIHE7yb9v169cjMTERSUlJOHDgADp37oyh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BABMmDAB0dHRSE5OBgBMnToVAwYMwBtvvIE777wT69atw2+//Ybly5dL+TGIiIiogZA83IwZMwYXL17EvHnzkJubiy5dumDz5s2WQcPZ2dmQy68eYOrTpw8++eQTzJkzB7Nnz0arVq3wzTffoEOHDlJ9BCIiImpAJA83AJCQkICEhIQaX0tLS6u2bNSoURg1apSDqyIiIiJXxHvOERERkVthuCEiIiK3wnBDREREboXhhoiIiNwKww0RERG5FYYbIiIicisMN0RERORWGG6IiIjIrTDcEBERkVtpEHcodiYhBADbpk6vK4PBgNLSUmi1Ws4460Dss3Owz87BPjsPe+0cjupz1fd21ff49XhcuCkqKgIAxMTESFwJERER2aqoqAiBgYHXXUcm6hKB3IjJZML58+fh7+8PmUxm131rtVrExMTgr7/+QkBAgF33TVexz87BPjsH++w87LVzOKrPQggUFRUhKirKakLtmnjckRu5XI4mTZo49D0CAgL4H44TsM/OwT47B/vsPOy1cziiz/90xKYKBxQTERGRW2G4ISIiIrfCcGNHarUaSUlJUKvVUpfi1thn52CfnYN9dh722jkaQp89bkAxERERuTceuSEiIiK3wnBDREREboXhhoiIiNwKww0RERG5FYYbGy1duhSxsbHw9vZGr169sHfv3uuu//nnn6Nt27bw9vZGx44dsWnTJidV6tps6fOKFSvQv39/BAcHIzg4GHFxcf/490Jmtv4+V1m3bh1kMhlGjhzp2ALdhK19vnLlCqZMmYLIyEio1Wq0bt2a/3bUga19XrJkCdq0aQMfHx/ExMRg2rRpKC8vd1K1runnn3/GiBEjEBUVBZlMhm+++eYft0lLS0O3bt2gVqvRsmVLpKSkOLxOCKqzdevWCZVKJVatWiX++OMPMWnSJBEUFCTy8vJqXH/Xrl1CoVCI1157TRw9elTMmTNHKJVKcfjwYSdX7lps7fPYsWPF0qVLxcGDB8WxY8fEww8/LAIDA8XZs2edXLlrsbXPVU6fPi2io6NF//79xT333OOcYl2YrX3W6XSiR48eYvjw4WLnzp3i9OnTIi0tTaSnpzu5ctdia5/Xrl0r1Gq1WLt2rTh9+rTYsmWLiIyMFNOmTXNy5a5l06ZN4vnnnxdfffWVACC+/vrr666fmZkpNBqNSExMFEePHhVvv/22UCgU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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "AUC ROC: 0.9420113727999999\n" ] } ], "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.figure(figsize=(8, 6))\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.savefig('roc_curve.png', dpi=300, bbox_inches='tight')\n", "plt.show()\n", "print('AUC ROC:', auc(fpr, tpr))" ] }, { "cell_type": "markdown", "metadata": { "id": "MsM3ew3d1FYq" }, "source": [ "### 11) Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. " ] }, { "cell_type": "markdown", "metadata": { "id": "xxFO4CXbIG88" }, "source": [ "Таблица1:" ] }, { "cell_type": "markdown", "metadata": { "id": "xvoivjuNFlEf" }, "source": [ "| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки |\n", "|----------|-------------------------------------|---------------------------|-----------------------------------------|\n", "| Рекуррентная | 184 897 | 5 | accuracy:0.8659 ; loss:0.3349 ; AUC ROC:0.9420 |\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YctF8h_sIB-P" }, "source": [ "#### По результатам применения рекуррентной нейронной сети, а также по данным таблицы 1 можно сделать вывод, что модель хорошо справилась с задачей определения тональности текста. Показатель accuracy = 0.8659 превышает требуемый порог 0.8. Значение AUC ROC = 0.9420 (> 0.9) говорит о высокой способности модели различать два класса (положительные и отрицательные отзывы). Модель показала хорошие результаты по метрикам precision и recall: для негативных отзывов precision = 0.91, recall = 0.82; для позитивных отзывов precision = 0.83, recall = 0.92." ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" } }, "nbformat": 4, "nbformat_minor": 0 }