841 строка
68 KiB
Plaintext
841 строка
68 KiB
Plaintext
{
|
|
"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": [
|
|
"from google.colab import drive\n",
|
|
"drive.mount('/content/drive')"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "kn5Tz1FjvRgl",
|
|
"outputId": "8f62f5e5-e68e-4d67-a452-b4e2e069b8d0"
|
|
},
|
|
"execution_count": 1,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"Mounted at /content/drive\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"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": 2,
|
|
"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": "e510ade3-1e11-4c3f-e219-a3565d1e69dc"
|
|
},
|
|
"execution_count": 3,
|
|
"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=23,\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": "2fe7dc03-bf7b-4129-8858-21426e0bdd37"
|
|
},
|
|
"execution_count": 6,
|
|
"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[\"<PAD>\"] = 0\n",
|
|
"word_to_id[\"<START>\"] = 1\n",
|
|
"word_to_id[\"<UNK>\"] = 2\n",
|
|
"word_to_id[\"<UNUSED>\"] = 3\n",
|
|
"# создание обратного словаря \"индекс:слово\"\n",
|
|
"id_to_word = {value:key for key,value in word_to_id.items()}"
|
|
],
|
|
"metadata": {
|
|
"id": "9W3RklPcZyH0"
|
|
},
|
|
"execution_count": 8,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"print(X_train[23])\n",
|
|
"print('len:',len(X_train[23]))"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "Nu-Bs1jnaYhB",
|
|
"outputId": "bcc7e2b6-b686-4b62-e975-6e5d03e60c1f"
|
|
},
|
|
"execution_count": 9,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"[1, 14, 20, 9, 290, 149, 48, 25, 358, 2, 120, 318, 302, 50, 26, 49, 221, 2057, 10, 10, 1212, 39, 15, 45, 801, 2, 2, 363, 2396, 7, 2, 209, 2327, 283, 8, 4, 425, 10, 10, 45, 24, 290, 3613, 972, 4, 65, 198, 40, 3462, 1224, 2, 23, 6, 4457, 225, 24, 76, 50, 8, 895, 19, 45, 164, 204, 5, 24, 55, 318, 38, 92, 140, 11, 18, 4, 65, 33, 32, 43, 168, 33, 4, 302, 10, 10, 17, 47, 77, 1046, 12, 188, 6, 117, 2, 33, 4, 130, 2, 4, 2, 7, 87, 3709, 2199, 7, 35, 2504, 5, 33, 211, 320, 2504, 132, 190, 48, 25, 2754, 4, 1273, 2, 45, 6, 1682, 8, 2, 42, 24, 8, 2, 10, 10, 32, 11, 32, 45, 6, 542, 3709, 22, 290, 319, 18, 15, 1288, 5, 15, 584]\n",
|
|
"len: 146\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n",
|
|
"print(review_as_text)\n",
|
|
"print('len:',len(review_as_text))"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "JhTwTurtZ6Sp",
|
|
"outputId": "a0f6038b-827a-4151-ffd2-7ccd27803460"
|
|
},
|
|
"execution_count": 10,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"<START> this movie is worth watching if you enjoy <UNK> over special effects there are some interesting visuals br br aside from that it's typical <UNK> <UNK> hollywood fare of <UNK> without substance true to the title br br it's not worth picking apart the story that's like performing brain <UNK> on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little <UNK> at the end <UNK> the <UNK> of great fx treatment of an invisible and at times half invisible man however if you ignore the standard <UNK> it's a sight to <UNK> or not to <UNK> br br all in all it's a decent fx film worth seeing for that purpose and that alone\n",
|
|
"len: 763\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": "37bdc442-4e14-4622-b26c-fe1663250bcb"
|
|
},
|
|
"execution_count": 11,
|
|
"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": 12,
|
|
"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": "4a337750-e231-490c-8a88-0d8be25c4fa9"
|
|
},
|
|
"execution_count": 13,
|
|
"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[23])\n",
|
|
"print('len:',len(X_train[23]))"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "vudlgqoCbjU1",
|
|
"outputId": "a4845da0-3cf2-4b8a-f2ec-8edaf9b12027"
|
|
},
|
|
"execution_count": 14,
|
|
"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 1 14 20 9 290 149 48 25 358 2\n",
|
|
" 120 318 302 50 26 49 221 2057 10 10 1212 39 15 45\n",
|
|
" 801 2 2 363 2396 7 2 209 2327 283 8 4 425 10\n",
|
|
" 10 45 24 290 3613 972 4 65 198 40 3462 1224 2 23\n",
|
|
" 6 4457 225 24 76 50 8 895 19 45 164 204 5 24\n",
|
|
" 55 318 38 92 140 11 18 4 65 33 32 43 168 33\n",
|
|
" 4 302 10 10 17 47 77 1046 12 188 6 117 2 33\n",
|
|
" 4 130 2 4 2 7 87 3709 2199 7 35 2504 5 33\n",
|
|
" 211 320 2504 132 190 48 25 2754 4 1273 2 45 6 1682\n",
|
|
" 8 2 42 24 8 2 10 10 32 11 32 45 6 542\n",
|
|
" 3709 22 290 319 18 15 1288 5 15 584]\n",
|
|
"len: 500\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n",
|
|
"print(review_as_text)\n",
|
|
"print('len:',len(review_as_text))"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "dbfkWjDI1Dp7",
|
|
"outputId": "54fa2d07-4f0c-492c-c541-c49e190dd377"
|
|
},
|
|
"execution_count": 15,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"<PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <START> this movie is worth watching if you enjoy <UNK> over special effects there are some interesting visuals br br aside from that it's typical <UNK> <UNK> hollywood fare of <UNK> without substance true to the title br br it's not worth picking apart the story that's like performing brain <UNK> on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little <UNK> at the end <UNK> the <UNK> of great fx treatment of an invisible and at times half invisible man however if you ignore the standard <UNK> it's a sight to <UNK> or not to <UNK> br br all in all it's a decent fx film worth seeing for that purpose and that alone\n",
|
|
"len: 2887\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### После обработки в начало отзыва добавилось необходимое количество токенов <PAD>, чтобы отзыв был длинной в 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": "b5c80133-c792-4353-fe2e-e1a1d964eb5d"
|
|
},
|
|
"execution_count": 16,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"X train: \n",
|
|
" [[ 0 0 0 ... 6 52 106]\n",
|
|
" [ 0 0 0 ... 87 22 231]\n",
|
|
" [ 0 0 0 ... 6 158 158]\n",
|
|
" ...\n",
|
|
" [ 0 0 0 ... 1005 4 1630]\n",
|
|
" [ 0 0 0 ... 9 6 991]\n",
|
|
" [ 0 0 0 ... 7 32 58]]\n",
|
|
"X train: \n",
|
|
" [[ 0 0 0 ... 4 2 2]\n",
|
|
" [ 0 0 0 ... 6 2 123]\n",
|
|
" [ 0 0 0 ... 2 11 831]\n",
|
|
" ...\n",
|
|
" [ 1 14 402 ... 819 45 131]\n",
|
|
" [ 0 0 0 ... 17 1540 2]\n",
|
|
" [ 1 17 6 ... 1026 362 37]]\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": 350
|
|
},
|
|
"id": "ktWEeqWd1EyF",
|
|
"outputId": "ab140a09-2109-4d4a-ab52-c0a9191e5072"
|
|
},
|
|
"execution_count": 17,
|
|
"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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
|
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
|
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
|
"│ embedding (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">160,000</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ lstm (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">24,832</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65</span> │\n",
|
|
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">184,897</span> (722.25 KB)\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">184,897</span> (722.25 KB)\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
|
"</pre>\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": "5a97c78d-354e-4329-8031-85f85c25c051"
|
|
},
|
|
"execution_count": 18,
|
|
"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[1m12s\u001b[0m 23ms/step - accuracy: 0.6705 - loss: 0.5794 - val_accuracy: 0.6740 - val_loss: 1.3409\n",
|
|
"Epoch 2/3\n",
|
|
"\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 19ms/step - accuracy: 0.6394 - loss: 0.8250 - val_accuracy: 0.7424 - val_loss: 0.5590\n",
|
|
"Epoch 3/3\n",
|
|
"\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 22ms/step - accuracy: 0.7780 - loss: 0.4830 - val_accuracy: 0.8268 - val_loss: 0.4142\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"<keras.src.callbacks.history.History at 0x784aa347c710>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 18
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"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": "711b2748-fd2c-4405-a6cb-92bb5f4186d3"
|
|
},
|
|
"execution_count": 19,
|
|
"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.8389 - loss: 0.3970\n",
|
|
"\n",
|
|
"Test accuracy: 0.8352800011634827\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": "3423c0f2-9ce6-4516-dce1-375ef15ef228"
|
|
},
|
|
"execution_count": 20,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"\n",
|
|
"Test accuracy: 0.8352800011634827\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": "1290e0c7-cebf-4281-fda0-a2decdf983bb"
|
|
},
|
|
"execution_count": 21,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 7ms/step\n",
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" Negative 0.86 0.80 0.83 12500\n",
|
|
" Positive 0.81 0.87 0.84 12500\n",
|
|
"\n",
|
|
" accuracy 0.84 25000\n",
|
|
" macro avg 0.84 0.84 0.84 25000\n",
|
|
"weighted avg 0.84 0.84 0.84 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": 489
|
|
},
|
|
"id": "Kp4AQRbcmwAx",
|
|
"outputId": "255628b1-4c88-4ff1-a30d-6a8307a34cef"
|
|
},
|
|
"execution_count": 22,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
],
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAU4NJREFUeJzt3Xd4U2X/BvA7STO6B6W7WPaQDYKAiCDLgeIAFH6AqPgqVHmpKKBARQWcCCqKiFhBEdzyCgKlUmQJCFR2EdoyuqCUNp1Jmjy/P0KDsS00Jclpk/tzXVyenJxz8s2X0dtznnMemRBCgIiIiMhFyKUugIiIiMieGG6IiIjIpTDcEBERkUthuCEiIiKXwnBDRERELoXhhoiIiFwKww0RERG5FIYbIiIicikMN0RERORSGG6IiIjIpTDcEFG9kpCQAJlMZvnl4eGByMhIPPbYY8jMzKyyvRACq1atwu23346AgAB4eXmhQ4cOePXVV1FSUlLj5/z444+46667EBwcDJVKhYiICIwcORK//fabI78eETmBjHNLEVF9kpCQgAkTJuDVV19F06ZNUV5ejj/++AMJCQmIiYnBkSNHoNFoAABGoxGjR4/GN998g759++LBBx+El5cXtm/fjtWrV6Ndu3bYsmULQkNDLccXQuDxxx9HQkICunTpgocffhhhYWHIzs7Gjz/+iP3792Pnzp3o3bu3VC0gohsliIjqkc8//1wAEPv27bNaP336dAFArF271rJu/vz5AoCYNm1aleOsW7dOyOVyMXToUKv1b7/9tgAg/vvf/wqTyVRlv5UrV4o9e/bY6dsQkRR4WYqIGoS+ffsCAE6fPg0AKCsrw9tvv41WrVphwYIFVbYfNmwYxo8fj40bN+KPP/6w7LNgwQK0adMG77zzDmQyWZX9xo4dix49ejjwmxCRozHcEFGDkJGRAQAIDAwEAOzYsQOXL1/G6NGj4eHhUe0+48aNAwD88ssvln3y8/MxevRoKBQKxxdNRJKo/l8EIiKJFRYWIi8vD+Xl5dizZw/mzp0LtVqNe++9FwBw7NgxAECnTp1qPEble8ePH7f6b4cOHRxZOhFJjOGGiOqlgQMHWr2OiYnBl19+iaioKABAUVERAMDX17fGY1S+p9Vqrf57rX2IqOFjuCGiemnJkiVo1aoVCgsLsWLFCvz+++9Qq9WW9ysDSmXIqc6/A5Cfn9919yGiho9jboioXurRowcGDhyIhx56COvWrUP79u0xevRoFBcXAwDatm0LADh06FCNx6h8r127dgCANm3aAAAOHz7syNKJSGIMN0RU7ykUCixYsABZWVn48MMPAQC33XYbAgICsHr1ahiNxmr3W7lyJQBYxuncdtttCAwMxNdff13jPkTU8DHcEFGDcMcdd6BHjx5YtGgRysvL4eXlhWnTpiE1NRUvv/xyle3Xr1+PhIQEDBkyBLfeeisAwMvLC9OnT8fx48cxffp0iGqeYfrll19i7969Dv8+ROQ4HHNDRA3GCy+8gBEjRiAhIQFPP/00ZsyYgYMHD+LNN9/E7t278dBDD8HT0xM7duzAl19+ibZt2+KLL76ocoyjR4/i3XffxdatWy1PKM7JycFPP/2EvXv3YteuXRJ9QyKyB06/QET1SuX0C/v27UP37t2t3jOZTGjVqhUAIDU1FQqFAiaTCStXrsTy5ctx+PBh6PV6NG/eHCNHjsTzzz8Pb2/vaj/n+++/x7Jly/Dnn39Cq9WicePGuP322/HMM8+gX79+Dv+eROQ4DDdERETkUjjmhoiIiFwKww0RERG5FIYbIiIicikMN0RERORSGG6IiIjIpTDcEBERkUtxu4f4mUwmZGVlwdfXFzKZTOpyiIiIqBaEECgqKkJERATk8mufm3G7cJOVlYXo6GipyyAiIqI6OHfuHKKioq65jduFG19fXwDm5vj5+dn12AaDAZs3b8bgwYOhVCrtemy6in12DvbZOdhn52GvncNRfdZqtYiOjrb8HL8Wtws3lZei/Pz8HBJuvLy84Ofnx784DsQ+Owf77Bzss/Ow187h6D7XZkgJBxQTERGRS2G4ISIiIpfCcENEREQuheGGiIiIXArDDREREbkUhhsiIiJyKQw3RERE5FIYboiIiMilMNwQERGRS2G4ISIiIpciabj5/fffMWzYMEREREAmk+Gnn3667j7Jycno2rUr1Go1WrRogYSEBIfXSURERA2HpOGmpKQEnTp1wpIlS2q1fXp6Ou655x70798fKSkp+O9//4snn3wSmzZtcnClRERE1FBIOnHmXXfdhbvuuqvW2y9duhRNmzbFu+++CwBo27YtduzYgffeew9DhgxxVJlERERuxWQSMAoBkxAQAjAJAZMAxHX+axICBoMBhXpp629Qs4Lv3r0b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\n"
|
|
},
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"AUC ROC: 0.9009091648\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.8389 ; loss:0.3970 ; AUC ROC:0.9009 |\n"
|
|
],
|
|
"metadata": {
|
|
"id": "xvoivjuNFlEf"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### По результатам применения рекуррентной нейронной сети можно сделать вывод, что модель хорошо справилась с задачей определения тональности текста. Показатель accuracy = 0.8389, выше порога 0.8. Значение AUC ROC = 0.9009 (> 0.9) говорит о высокой способности модели различать два класса (положительные и отрицательные отзывы)."
|
|
],
|
|
"metadata": {
|
|
"id": "YctF8h_sIB-P"
|
|
}
|
|
}
|
|
]
|
|
} |