From b6238272b4ebb0f31113d6c9b2f850a904b24b6a Mon Sep 17 00:00:00 2001 From: sasha Date: Thu, 11 Dec 2025 03:10:43 +0300 Subject: [PATCH] labwork 4 --- labworks/LW4/1.jpg | Bin 0 -> 22523 bytes labworks/LW4/LR4.ipynb | 1 + labworks/LW4/report.md | 367 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 368 insertions(+) create mode 100644 labworks/LW4/1.jpg create mode 100644 labworks/LW4/LR4.ipynb create mode 100644 labworks/LW4/report.md diff --git a/labworks/LW4/1.jpg b/labworks/LW4/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a91437a91c718a57d451546927492337abdef82 GIT binary patch literal 22523 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\"] = 0\n","word_to_id[\"\"] = 1\n","word_to_id[\"\"] = 2\n","word_to_id[\"\"] = 3\n","\n","# создание обратного словаря \"индекс:слово\"\n","id_to_word = {value:key for key,value in word_to_id.items()}"],"metadata":{"id":"6Uf4JIlDcCGm","executionInfo":{"status":"ok","timestamp":1765387060803,"user_tz":-180,"elapsed":361,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"8dcff087-874f-4a5b-d579-cd42b1294037"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","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[1m0s\u001b[0m 0us/step\n"]}]},{"cell_type":"code","source":["print(X_train[39])\n","print('len:',len(X_train[39]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Z0sjggGrcH-1","executionInfo":{"status":"ok","timestamp":1765387060812,"user_tz":-180,"elapsed":7,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"bf26b133-276c-420d-f55d-92e29e1b49b9"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["[1, 3206, 2, 3413, 3852, 2, 2, 73, 256, 19, 4396, 3033, 34, 488, 2, 47, 2993, 4058, 11, 63, 29, 4653, 1496, 27, 4122, 54, 4, 1334, 1914, 380, 1587, 56, 351, 18, 147, 2, 2, 15, 29, 238, 30, 4, 455, 564, 167, 1024, 2, 2, 2, 4, 2, 65, 33, 6, 2, 1062, 3861, 6, 3793, 1166, 7, 1074, 1545, 6, 171, 2, 1134, 388, 7, 3569, 2, 567, 31, 255, 37, 47, 6, 3161, 1244, 3119, 19, 6, 2, 11, 12, 2611, 120, 41, 419, 2, 17, 4, 3777, 2, 4952, 2468, 1457, 6, 2434, 4268, 23, 4, 1780, 1309, 5, 1728, 283, 8, 113, 105, 1037, 2, 285, 11, 6, 4800, 2905, 182, 5, 2, 183, 125, 19, 6, 327, 2, 7, 2, 668, 1006, 4, 478, 116, 39, 35, 321, 177, 1525, 2294, 6, 226, 176, 2, 2, 17, 2, 1220, 119, 602, 2, 2, 592, 2, 17, 2, 2, 1405, 2, 597, 503, 1468, 2, 2, 17, 2, 1947, 3702, 884, 1265, 3378, 1561, 2, 17, 2, 2, 992, 3217, 2393, 4923, 2, 17, 2, 2, 1255, 2, 2, 2, 117, 17, 6, 254, 2, 568, 2297, 5, 2, 2, 17, 1047, 2, 2186, 2, 1479, 488, 2, 4906, 627, 166, 1159, 2552, 361, 7, 2877, 2, 2, 665, 718, 2, 2, 2, 603, 4716, 127, 4, 2873, 2, 56, 11, 646, 227, 531, 26, 670, 2, 17, 6, 2, 2, 3510, 2, 17, 6, 2, 2, 2, 3014, 17, 6, 2, 668, 2, 503, 1468, 2, 19, 11, 4, 1746, 5, 2, 4778, 11, 31, 7, 41, 1273, 154, 255, 555, 6, 1156, 5, 737, 431]\n","len: 274\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[39])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KLVb0gQ7cMKH","executionInfo":{"status":"ok","timestamp":1765387060830,"user_tz":-180,"elapsed":16,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"d95be73d-324b-40de-d096-3a99a9cdfa2b"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":[" troubled magazine photographer well played with considerable intensity by michael has horrific nightmares in which he brutally murders his models when the lovely ladies start turning up dead for real that he might be the killer writer director william the story at a pace builds a reasonable amount of tension delivers a few effective moments of savage violence one woman who has a plastic garbage bag with a in it placed over her head as the definite inducing highlight puts a refreshing emphasis on the nicely drawn and engaging true to life characters further everything in a plausible everyday world and things off with a nice of female nudity the fine acting from an excellent cast helps matters a whole lot as charming love interest james as double brother b j as concerned psychiatrist dr frank curtis don as gay assistant louis pamela as detective little as a hard police chief and as sweet model r michael polished cinematography makes impressive occasional use of breathtaking shots jack score likewise does the trick up in cool bit parts are robert as a sally as a shower as a female b j with in the ring and bay in one of her standard old woman roles a solid and enjoyable picture\n","len: 1584\n"]}]},{"cell_type":"markdown","source":["4) Вывели максимальную и минимальную длину отзыва в обучающем множестве."],"metadata":{"id":"G4MDeQlFcVU0"}},{"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":"tGV9ptPGcWXJ","executionInfo":{"status":"ok","timestamp":1765387060843,"user_tz":-180,"elapsed":6,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"285002ae-1451-468f-89bb-2b96b426446b"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 2494\n","MIN Len: 11\n"]}]},{"cell_type":"markdown","source":["5) Провели предобработку данных. Выбрали единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины."],"metadata":{"id":"t6dS8DRnccz6"}},{"cell_type":"code","source":["#предобработка данных\n","from tensorflow.keras.utils import pad_sequences\n","\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":"eRN7vYrScd_T","executionInfo":{"status":"ok","timestamp":1765387062120,"user_tz":-180,"elapsed":1275,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}}},"execution_count":9,"outputs":[]},{"cell_type":"markdown","source":["6. Повторили пункт 4."],"metadata":{"id":"KduPqn6gcmJe"}},{"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":"cG5lyZ1icon9","executionInfo":{"status":"ok","timestamp":1765387062147,"user_tz":-180,"elapsed":26,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"fcc705bd-894c-4c01-8b03-0e943c05cd15"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 500\n","MIN Len: 500\n"]}]},{"cell_type":"markdown","source":["7) Повторили пункт 3. Сделали вывод о том, как отзыв преобразовался после предобработки."],"metadata":{"id":"8iQi-RT8cvrI"}},{"cell_type":"code","source":["print(X_train[39])\n","print('len:',len(X_train[39]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"4LedIjtMcwo_","executionInfo":{"status":"ok","timestamp":1765387062160,"user_tz":-180,"elapsed":6,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"fd4978d5-fb69-4946-dfbb-a426a2261e5c"},"execution_count":11,"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 1 3206 2 3413 3852 2 2 73 256 19 4396 3033\n"," 34 488 2 47 2993 4058 11 63 29 4653 1496 27 4122 54\n"," 4 1334 1914 380 1587 56 351 18 147 2 2 15 29 238\n"," 30 4 455 564 167 1024 2 2 2 4 2 65 33 6\n"," 2 1062 3861 6 3793 1166 7 1074 1545 6 171 2 1134 388\n"," 7 3569 2 567 31 255 37 47 6 3161 1244 3119 19 6\n"," 2 11 12 2611 120 41 419 2 17 4 3777 2 4952 2468\n"," 1457 6 2434 4268 23 4 1780 1309 5 1728 283 8 113 105\n"," 1037 2 285 11 6 4800 2905 182 5 2 183 125 19 6\n"," 327 2 7 2 668 1006 4 478 116 39 35 321 177 1525\n"," 2294 6 226 176 2 2 17 2 1220 119 602 2 2 592\n"," 2 17 2 2 1405 2 597 503 1468 2 2 17 2 1947\n"," 3702 884 1265 3378 1561 2 17 2 2 992 3217 2393 4923 2\n"," 17 2 2 1255 2 2 2 117 17 6 254 2 568 2297\n"," 5 2 2 17 1047 2 2186 2 1479 488 2 4906 627 166\n"," 1159 2552 361 7 2877 2 2 665 718 2 2 2 603 4716\n"," 127 4 2873 2 56 11 646 227 531 26 670 2 17 6\n"," 2 2 3510 2 17 6 2 2 2 3014 17 6 2 668\n"," 2 503 1468 2 19 11 4 1746 5 2 4778 11 31 7\n"," 41 1273 154 255 555 6 1156 5 737 431]\n","len: 500\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[39])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"CSssMrdVc16R","executionInfo":{"status":"ok","timestamp":1765387062206,"user_tz":-180,"elapsed":44,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"59e36760-8cd9-4d62-b956-4d18e352836d"},"execution_count":12,"outputs":[{"output_type":"stream","name":"stdout","text":[" troubled magazine photographer well played with considerable intensity by michael has horrific nightmares in which he brutally murders his models when the lovely ladies start turning up dead for real that he might be the killer writer director william the story at a pace builds a reasonable amount of tension delivers a few effective moments of savage violence one woman who has a plastic garbage bag with a in it placed over her head as the definite inducing highlight puts a refreshing emphasis on the nicely drawn and engaging true to life characters further everything in a plausible everyday world and things off with a nice of female nudity the fine acting from an excellent cast helps matters a whole lot as charming love interest james as double brother b j as concerned psychiatrist dr frank curtis don as gay assistant louis pamela as detective little as a hard police chief and as sweet model r michael polished cinematography makes impressive occasional use of breathtaking shots jack score likewise does the trick up in cool bit parts are robert as a sally as a shower as a female b j with in the ring and bay in one of her standard old woman roles a solid and enjoyable picture\n","len: 2940\n"]}]},{"cell_type":"markdown","source":["8) Вывели предобработанные массивы обучающих и тестовых данных и их размерности."],"metadata":{"id":"q0vqP9aFc58N"}},{"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":"g64JxLfVc607","executionInfo":{"status":"ok","timestamp":1765387062215,"user_tz":-180,"elapsed":6,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"18b90fd0-1838-4396-d59d-b248fda1d34b"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["X train: \n"," [[ 0 0 0 ... 7 4 2407]\n"," [ 0 0 0 ... 34 705 2]\n"," [ 0 0 0 ... 2222 8 369]\n"," ...\n"," [ 0 0 0 ... 11 4 4596]\n"," [ 0 0 0 ... 574 42 24]\n"," [ 0 0 0 ... 7 13 3891]]\n","X train: \n"," [[ 0 0 0 ... 6 52 20]\n"," [ 0 0 0 ... 62 30 821]\n"," [ 0 0 0 ... 24 3081 25]\n"," ...\n"," [ 0 0 0 ... 19 666 3159]\n"," [ 0 0 0 ... 7 15 1716]\n"," [ 0 0 0 ... 1194 61 113]]\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":"tt0ie0K0dAbR"}},{"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":363},"id":"jD3pkS_qdBmo","executionInfo":{"status":"ok","timestamp":1765387064134,"user_tz":-180,"elapsed":1912,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"9e9c0371-8141-4d53-afb6-ebe331e090e3"},"execution_count":14,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n"," warnings.warn(\n","/usr/local/lib/python3.12/dist-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"]},{"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;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"],"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"]},"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":"UK281-h_dcQk","executionInfo":{"status":"ok","timestamp":1765387088620,"user_tz":-180,"elapsed":24484,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"b252ad63-dabc-44fb-bf64-2d9e1e431d62"},"execution_count":15,"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[1m11s\u001b[0m 23ms/step - accuracy: 0.6315 - loss: 0.6268 - val_accuracy: 0.8072 - val_loss: 0.4273\n","Epoch 2/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 20ms/step - accuracy: 0.8559 - loss: 0.3469 - val_accuracy: 0.8496 - val_loss: 0.3603\n","Epoch 3/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 21ms/step - accuracy: 0.8993 - loss: 0.2662 - val_accuracy: 0.8666 - val_loss: 0.3242\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":15}]},{"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":"2Jdh6S_8dgXE","executionInfo":{"status":"ok","timestamp":1765387095405,"user_tz":-180,"elapsed":6779,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"492ad1bc-cd39-4e7c-dca5-c523652318b4"},"execution_count":16,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8714 - loss: 0.3110\n","\n","Test accuracy: 0.8674799799919128\n"]}]},{"cell_type":"markdown","source":["10) Оценили качество обучения на тестовых данных:\n","- вывели значение метрики качества классификации на тестовых данных\n","- вывели отчет о качестве классификации тестовой выборки\n","- построили ROC-кривую по результату обработки тестовой выборки и вычислили площадь под ROC-кривой (AUC ROC)"],"metadata":{"id":"sDkhhezJdpNi"}},{"cell_type":"code","source":["#значение метрики качества классификации на тестовых данных\n","print(f\"\\nTest accuracy: {test_acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OeP6ss3CdotA","executionInfo":{"status":"ok","timestamp":1765387095425,"user_tz":-180,"elapsed":16,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"b8cd954e-ae86-4f53-fed5-f46a01a72288"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Test accuracy: 0.8674799799919128\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":"YyVafpMldt5g","executionInfo":{"status":"ok","timestamp":1765387105893,"user_tz":-180,"elapsed":10466,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"88178647-99c1-4628-d374-e86bf709fae9"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 7ms/step\n"," precision recall f1-score support\n","\n"," Negative 0.86 0.88 0.87 12500\n"," Positive 0.87 0.86 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"]}]},{"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":"N05HejFXdyp-","executionInfo":{"status":"ok","timestamp":1765387106261,"user_tz":-180,"elapsed":366,"user":{"displayName":"Егор Кирсанов","userId":"10290320580506007453"}},"outputId":"acc69a49-92f4-4e4c-cd2d-e2870ddda448"},"execution_count":19,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUVNJREFUeJzt3Xl4E+XaBvA7SZO06Q6lK8WyL7KDcNhVyuKCcFxA4YOKikexyrGiLAIVFYobwlEUEbGCesBdjiBQ0CogCgJlp0gXEWgLpUC6Jmnm/f4IDYS22JQk0yT377p6kUxmJk8eKrmdeWdehRBCgIiIiMhDKOUugIiIiMiRGG6IiIjIozDcEBERkUdhuCEiIiKPwnBDREREHoXhhoiIiDwKww0RERF5FIYbIiIi8igMN0RERORRGG6IiIjIozDcEFGDkpqaCoVCYf3x8fFBTEwMHnzwQZw6dara+kIIrFq1CgMHDkRISAh0Oh06deqEF198EaWlpbW+z9dff43bbrsNYWFh0Gg0iI6OxujRo/HDDz848+MRkQsoOLcUETUkqampmDhxIl588UU0b94cFRUV+PXXX5Gamoq4uDgcPHgQvr6+AACz2YyxY8fis88+w4ABA3D33XdDp9Nh69at+PTTT9GhQwds3rwZERER1v0LIfDQQw8hNTUV3bp1w7333ovIyEjk5eXh66+/xu7du7F9+3b07dtXrhYQ0fUSREQNyIcffigAiF27dtksnzZtmgAg1qxZY102f/58AUBMnTq12n7Wrl0rlEqlGD58uM3y1157TQAQ//73v4UkSdW2W7lypfjtt98c9GmISA48LUVEbmHAgAEAgKysLABAeXk5XnvtNbRp0wYpKSnV1h8xYgQSEhKwYcMG/Prrr9ZtUlJS0K5dO7z++utQKBTVths/fjx69erlxE9CRM7GcENEbiE3NxcAEBoaCgDYtm0bzp8/j7Fjx8LHx6fGbSZMmAAA+O6776zbFBUVYezYsVCpVM4vmohkUfO/CEREMrt48SIKCwtRUVGB3377DXPnzoVWq8Wdd94JADh8+DAAoEuXLrXuo+q1I0eO2PzZqVMnZ5ZORDJjuCGiBik+Pt7meVxcHD7++GM0bdoUAFBcXAwACAwMrHUfVa/p9XqbP6+1DRG5P4YbImqQlixZgjZt2uDixYtYsWIFfv75Z2i1WuvrVQGlKuTU5OoAFBQU9LfbEJH745gbImqQevXqhfj4eNxzzz1Yu3YtOnbsiLFjx6KkpAQA0L59ewDA/v37a91H1WsdOnQAALRr1w4AcODAAWeWTkQyY7ghogZPpVIhJSUFp0+fxttvvw0A6N+/P0JCQvDpp5/CbDbXuN3KlSsBwDpOp3///ggNDcV///vfWrchIvfHcENEbuHmm29Gr169sGjRIlRUVECn02Hq1KnIzMzE888/X239devWITU1FcOGDcM//vEPAIBOp8O0adNw5MgRTJs2DaKGe5h+/PHH2Llzp9M/DxE5D8fcEJHbePbZZ3HfffchNTUVjz32GKZPn469e/filVdewY4dO3DPPffAz88P27Ztw8cff4z27dvjo48+qraPQ4cO4Y033sCPP/5ovUNxfn4+vvnmG+zcuRO//PKLTJ+QiByB0y8QUYNSNf3Crl270LNnT5vXJElCmzZtAACZmZlQqVSQJAkrV67E8uXLceDAARiNRrRs2RKjR4/GM888A39//xrf58svv8SyZcvw+++/Q6/Xo0mTJhg4cCAef/xxDBo0yOmfk4ich+GGiIiIPArH3BAREZFHYbghIiIij8JwQ0RERB6F4YaIiIg8CsMNEREReRSGGyIiIvIoXncTP0mScPr0aQQGBkKhUMhdDhEREdWBEALFxcWIjo6GUnntYzNeF25Onz6N2NhYucsgIiKievjrr7/QtGnTa67jdeEmMDAQgKU5QUFBDt23yWTCpk2bMHToUKjVaofumy5jn12DfXYN9tl12GvXcFaf9Xo9YmNjrd/j1+J14abqVFRQUJBTwo1Op0NQUBD/w3Ei9tk12GfXYJ9dh712DWf3uS5DSjigmIiIiDwKww0RERF5FIYbIiIi8igMN0RERORRGG6IiIjIozDcEBERkUdhuCEiIiKPwnBDREREHoXhhoiIiDwKww0RERF5FFnDzc8//4wRI0YgOjoaCoUC33zzzd9uk56eju7du0Or1aJVq1ZITU11ep1ERETkPmQNN6WlpejSpQuWLFlSp/VzcnJwxx134JZbbkFGRgb+/e9/45FHHsHGjRudXCkRERG5C1knzrzttttw22231Xn9pUuXonnz5njjjTcAAO3bt8e2bdvw5ptvYtiwYc4qk4iIqEERQsAsCUgCkIS49AOYJQFDpRkQV61f4z6uXqf6WlevU/u+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8sknnVGjWzJdGugMAL4a3qGYiIjIVewONwqFAs8//zyeffZZHD9+HCUlJejQoQMCAgKcUZ/bqjRfPnKjdtPTakRERO6o3jfx02g06NChgyNr8ShXhhsfFYcUExERuYrd4eaWW26BQlH7l/UPP/xwXQV5iitPS/lwcikiIiKXsTvcdO3a1ea5yWRCRkYGDh48iISEBEfV5fYulltuE61Q4JphkIiIiBzL7nDz5ptv1rj8hRdeQElJyXUX5CnKDGYAgBB/syIRERE5lMNGuv7f//0fVqxY4ajduT2j2XJaqlkj58xfRURERDVzWLjZsWMHfH15s7oqZ4stUy9wMDEREZFr2X1a6u6777Z5LoRAXl4efv/993rfxM8TVZ2OOnGu7rOYEhER0fWzO9wEBwfbPFcqlWjbti1efPFFDB061GGFubtjBZbxR31bhclcCRERkXexK9yYzWZMnDgRnTp1QmhoqLNq8ghateWMX96FcpkrISIi8i52jblRqVQYOnRovWb/9jZ7/jwPAOjbsrHMlRAREXkXuwcUd+zYEdnZ2c6oxaM0ujRZ5oVL97shIiIi17A73Lz88suYOnUqvvvuO+Tl5UGv19v8kMWv2ecAAF2ahshbCBERkZep85ibF198Ec888wxuv/12AMBdd91lc+ddIQQUCgXMZrPjq3RDEUG+yD1XBkOl9PcrExERkcPUOdzMnTsXjz32GH788Udn1uMxqm7i16KJv8yVEBEReZc6hxtx6cYtgwYNcloxnmTviQsAAD+1St5CiIiIvIxdY244AWTdRQRpAQBaH4fdBJqIiIjqwK773LRp0+ZvA05RUdF1FeQpqibODAvUylwJERGRd7Er3MydO7faHYqpugqTGcWGSgBAsJ9a5mqIiIi8i13h5v7770d4eLizavEY50qNAAAfpQKNL93vhoiIiFyjzgNCON6m7s4WGwAAlZJg34iIiFyszuGm6mop+nvSpVaF6HhKioiIyNXqfFpKkngzuroyXrpxX5MADiYmIiJyNV6n7AQF+goAgIaXgRMREbkcv32dQKm0jLP540yJzJUQERF5H4YbJ6g0Wwbd9G7eSOZKiIiIvA/DjROYLs0rpfXh1AtERESuxnDjBBWXBhRrfHgZOBERkasx3DhB1lnLWBsFGG6IiIhcjeHGCUJ1lrsSF126UzERERG5DsONE+grLPNK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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["AUC ROC: 0.9387573504\n"]}]}]} \ No newline at end of file diff --git a/labworks/LW4/report.md b/labworks/LW4/report.md new file mode 100644 index 0000000..1e430f5 --- /dev/null +++ b/labworks/LW4/report.md @@ -0,0 +1,367 @@ +# Отчёт по лабораторной работе №4 + +**Кирсанов Егор, Кобзев Александр — А-01-22** + +--- + +## 1. В среде Google Colab создали новый блокнот (notebook). Настроили блокнот для работы с аппаратным ускорителем GPU. + +```python +from google.colab import drive +drive.mount('/content/drive') +import os +os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4') + +from tensorflow import keras +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +import matplotlib.pyplot as plt +import numpy as np +``` + +```python +import tensorflow as tf +device_name = tf.test.gpu_device_name() +if device_name != '/device:GPU:0': + raise SystemError('GPU device not found') +print('Found GPU at: {}'.format(device_name)) +``` + +``` +Found GPU at: /device:GPU:0 +``` + +--- + +## 2. Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным (4k – 1) = 39, где k = 10 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных. + +```python +# загрузка датасета +from keras.datasets import imdb + +vocabulary_size = 5000 +index_from = 3 + +(X_train, y_train), (X_test, y_test) = imdb.load_data( + path="imdb.npz", + num_words=vocabulary_size, + skip_top=0, + maxlen=None, + seed=39, + start_char=1, + oov_char=2, + index_from=index_from + ) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of y train:', y_train.shape) +print('Shape of X test:', X_test.shape) +print('Shape of y test:', y_test.shape) +``` + +``` +Shape of X train: (25000,) +Shape of y train: (25000,) +Shape of X test: (25000,) +Shape of y test: (25000,) +``` + +--- + +## 3. Вывели один отзыв из обучающего множества в виде списка индексовслов. Преобразовали список индексов в текст и вывели отзыв в виде текста. Вывели длину отзыва. Вывели метку класса данного отзыва и название класса (1 – Positive, 0 – Negative). + +```python +# создание словаря для перевода индексов в слова +# загрузка словаря "слово:индекс" +word_to_id = imdb.get_word_index() + +# уточнение словаря +word_to_id = {key:(value + index_from) for key,value in word_to_id.items()} +word_to_id[""] = 0 +word_to_id[""] = 1 +word_to_id[""] = 2 +word_to_id[""] = 3 + +# создание обратного словаря "индекс:слово" +id_to_word = {value:key for key,value in word_to_id.items()} +``` + +```python +print(X_train[39]) +print('len:',len(X_train[39])) +``` + +``` +[1, 3206, 2, 3413, 3852, 2, 2, 73, 256, 19, 4396, 3033, 34, 488, 2, 47, 2993, 4058, 11, 63, 29, 4653, 1496, 27, 4122, 54, 4, 1334, 1914, 380, 1587, 56, 351, 18, 147, 2, 2, 15, 29, 238, 30, 4, 455, 564, 167, 1024, 2, 2, 2, 4, 2, 65, 33, 6, 2, 1062, 3861, 6, 3793, 1166, 7, 1074, 1545, 6, 171, 2, 1134, 388, 7, 3569, 2, 567, 31, 255, 37, 47, 6, 3161, 1244, 3119, 19, 6, 2, 11, 12, 2611, 120, 41, 419, 2, 17, 4, 3777, 2, 4952, 2468, 1457, 6, 2434, 4268, 23, 4, 1780, 1309, 5, 1728, 283, 8, 113, 105, 1037, 2, 285, 11, 6, 4800, 2905, 182, 5, 2, 183, 125, 19, 6, 327, 2, 7, 2, 668, 1006, 4, 478, 116, 39, 35, 321, 177, 1525, 2294, 6, 226, 176, 2, 2, 17, 2, 1220, 119, 602, 2, 2, 592, 2, 17, 2, 2, 1405, 2, 597, 503, 1468, 2, 2, 17, 2, 1947, 3702, 884, 1265, 3378, 1561, 2, 17, 2, 2, 992, 3217, 2393, 4923, 2, 17, 2, 2, 1255, 2, 2, 2, 117, 17, 6, 254, 2, 568, 2297, 5, 2, 2, 17, 1047, 2, 2186, 2, 1479, 488, 2, 4906, 627, 166, 1159, 2552, 361, 7, 2877, 2, 2, 665, 718, 2, 2, 2, 603, 4716, 127, 4, 2873, 2, 56, 11, 646, 227, 531, 26, 670, 2, 17, 6, 2, 2, 3510, 2, 17, 6, 2, 2, 2, 3014, 17, 6, 2, 668, 2, 503, 1468, 2, 19, 11, 4, 1746, 5, 2, 4778, 11, 31, 7, 41, 1273, 154, 255, 555, 6, 1156, 5, 737, 431] +len: 274 +``` + +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[39]) +print(review_as_text) +print('len:',len(review_as_text)) +``` + +``` + troubled magazine photographer well played with considerable intensity by michael has horrific nightmares in which he brutally murders his models when the lovely ladies start turning up dead for real that he might be the killer writer director william the story at a pace builds a reasonable amount of tension delivers a few effective moments of savage violence one woman who has a plastic garbage bag with a in it placed over her head as the definite inducing highlight puts a refreshing emphasis on the nicely drawn and engaging true to life characters further everything in a plausible everyday world and things off with a nice of female nudity the fine acting from an excellent cast helps matters a whole lot as charming love interest james as double brother b j as concerned psychiatrist dr frank curtis don as gay assistant louis pamela as detective little as a hard police chief and as sweet model r michael polished cinematography makes impressive occasional use of breathtaking shots jack score likewise does the trick up in cool bit parts are robert as a sally as a shower as a female b j with in the ring and bay in one of her standard old woman roles a solid and enjoyable picture +len: 1584 +``` + +--- + +## 4. Вывели максимальную и минимальную длину отзыва в обучающем множестве. + +```python +print('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` + +``` +MAX Len: 2494 +MIN Len: 11 +``` + +--- + +## 5. Провели предобработку данных. Выбрали единую длину, к которой будутприведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины. + +```python +#предобработка данных +from tensorflow.keras.utils import pad_sequences + +max_words = 500 +X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post') +X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post') +``` + +--- + +## 6. Повторили п. 4. + +```python +print('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` + +``` +MAX Len: 500 +MIN Len: 500 +``` + +--- + +## 7. Повторили п. 3. Сделали вывод о том, как отзыв преобразовался после предобработки. + +```python +print(X_train[39]) +print('len:',len(X_train[39])) +``` + +``` +[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1 3206 2 3413 3852 2 2 73 256 19 4396 3033 + 34 488 2 47 2993 4058 11 63 29 4653 1496 27 4122 54 + 4 1334 1914 380 1587 56 351 18 147 2 2 15 29 238 + 30 4 455 564 167 1024 2 2 2 4 2 65 33 6 + 2 1062 3861 6 3793 1166 7 1074 1545 6 171 2 1134 388 + 7 3569 2 567 31 255 37 47 6 3161 1244 3119 19 6 + 2 11 12 2611 120 41 419 2 17 4 3777 2 4952 2468 + 1457 6 2434 4268 23 4 1780 1309 5 1728 283 8 113 105 + 1037 2 285 11 6 4800 2905 182 5 2 183 125 19 6 +... + 2 2 3510 2 17 6 2 2 2 3014 17 6 2 668 + 2 503 1468 2 19 11 4 1746 5 2 4778 11 31 7 + 41 1273 154 255 555 6 1156 5 737 431] +len: 500 +``` + +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[17]) +print(review_as_text) +print('len:',len(review_as_text)) +``` + +``` + when many people say it's the worst movie i've ever seen they tend to say that about virtually any movie they didn't like however of the nearly movies i can remember ever seeing this one is one of two that i walked away from feeling personally and angry this is my first movie review by the way and i with imdb just to at this movie's i went to see it when it was in the theaters myself and my two buddies were 3 of 5 people there and after 15 years i can't remember very many but my attitude upon leaving the theater is still clear br br spoiler alert br br oh my where to begin fat loser left at goes on weekend meets blonde who takes an interest in him takes him home to meet the family they're all and he's the main course pathetic attempt at a dramatic escape kicks all their and runs off with the girlfriend they live happily ever after firstly the gags are so bad that it took me a while to understand that they were trying to be funny and that this was a comedy the special effects what few there are look like they were done 15 years earlier the big dramatic ending was so and poorly acted that it was nearly unbearable to watch he out the entire family with in the that stand up tom and jerry style when they step on them i'm sure that there's much much more but i have no intention on seeing it again for a +len: 2741 +``` + +### После предобработки отзыв был приведён к фиксированной длине: в начале последовательности появились токены , которые заполнили недостающие позиции. Содержательная часть отзыва сохранилась, но была сдвинута вправо, что обеспечивает единый формат данных для подачи в нейронную сеть. + +--- + +## 8. Вывели предобработанные массивы обучающих и тестовых данных и их размерности. + +```python +# вывод данных +print('X train: \n',X_train) +print('X train: \n',X_test) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of X test:', X_test.shape) +``` + +``` +X train: + [[ 0 0 0 ... 7 4 2407] + [ 0 0 0 ... 34 705 2] + [ 0 0 0 ... 2222 8 369] + ... + [ 0 0 0 ... 11 4 4596] + [ 0 0 0 ... 574 42 24] + [ 0 0 0 ... 7 13 3891]] +X train: + [[ 0 0 0 ... 6 52 20] + [ 0 0 0 ... 62 30 821] + [ 0 0 0 ... 24 3081 25] + ... + [ 0 0 0 ... 19 666 3159] + [ 0 0 0 ... 7 15 1716] + [ 0 0 0 ... 1194 61 113]] +Shape of X train: (25000, 500) +Shape of X test: (25000, 500) +``` + +--- + +## 9. Реализовали модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Добились качества обучения по метрике accuracy не менее 0.8. + +```python +embed_dim = 32 +lstm_units = 64 + +model = Sequential() +model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,))) +model.add(layers.LSTM(lstm_units)) +model.add(layers.Dropout(0.5)) +model.add(layers.Dense(1, activation='sigmoid')) + +model.summary() +``` + +``` +Model: "sequential_2" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ embedding_2 (Embedding) │ (None, 500, 32) │ 160,000 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ lstm_2 (LSTM) │ (None, 64) │ 24,832 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dropout_2 (Dropout) │ (None, 64) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_2 (Dense) │ (None, 1) │ 65 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 184,897 (722.25 KB) + Trainable params: 184,897 (722.25 KB) + Non-trainable params: 0 (0.00 B) +``` + +```python +# компилируем и обучаем модель +batch_size = 64 +epochs = 3 +model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) +model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2) +``` + +``` +Epoch 1/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 8s 20ms/step - accuracy: 0.6648 - loss: 0.5901 - val_accuracy: 0.8204 - val_loss: 0.4243 +Epoch 2/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 7s 22ms/step - accuracy: 0.8623 - loss: 0.3341 - val_accuracy: 0.8492 - val_loss: 0.3553 +Epoch 3/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 19ms/step - accuracy: 0.8987 - loss: 0.2659 - val_accuracy: 0.8632 - val_loss: 0.3416 + +``` + +```python +test_loss, test_acc = model.evaluate(X_test, y_test) +print(f"\nTest accuracy: {test_acc}") +``` + +``` +782/782 ━━━━━━━━━━━━━━━━━━━━ 7s 9ms/step - accuracy: 0.8770 - loss: 0.3202 + +Test accuracy: 0.8710799813270569 +``` + +--- + +## 10. Оценили качество обучения на тестовых данных: +- вывести значение метрики качества классификации на тестовых данных, +- вывести отчет о качестве классификации тестовой выборки. +- построить ROC-кривую по результату обработки тестовой выборки и вычислить площадь под ROC-кривой (AUC ROC). + +```python +#значение метрики качества классификации на тестовых данных +print(f"\nTest accuracy: {test_acc}") +``` + +``` +Test accuracy: 0.8710799813270569 +``` + +```python +#отчет о качестве классификации тестовой выборки +y_score = model.predict(X_test) +y_pred = [1 if y_score[i,0]>=0.5 else 0 for i in range(len(y_score))] + +from sklearn.metrics import classification_report +print(classification_report(y_test, y_pred, labels = [0, 1], target_names=['Negative', 'Positive'])) +``` + +``` +782/782 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step + precision recall f1-score support + + Negative 0.89 0.85 0.87 12500 + Positive 0.86 0.89 0.87 12500 + + accuracy 0.87 25000 + macro avg 0.87 0.87 0.87 25000 +weighted avg 0.87 0.87 0.87 25000 +``` + +```python +#построение ROC-кривой и AUC ROC +from sklearn.metrics import roc_curve, auc + +fpr, tpr, thresholds = roc_curve(y_test, y_score) +plt.plot(fpr, tpr) +plt.grid() +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC') +plt.show() +print('AUC ROC:', auc(fpr, tpr)) +``` + +![image](1.jpg) + +``` +AUC ROC: 0.9419218976 +``` + +--- + +## 11. Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. + +### В результате выполнения лабораторной работы была построена рекуррентная нейронная сеть на основе слоёв Embedding и LSTM, которая успешно справилась с задачей определения тональности текста. Модель достигла требуемого качества: accuracy выше 0.8 и AUC ROC выше 0.9, что подтверждает её способность эффективно различать позитивные и негативные отзывы. Полученные результаты демонстрируют, что рекуррентные сети хорошо подходят для анализа текстовой информации и работы с последовательностями. \ No newline at end of file