{ "cells": [ { "cell_type": "code", "execution_count": 430, "id": "069b3b71", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "pd.set_option('display.max_colwidth', 300)\n", "import re\n", "import string\n", "from time import time\n", "from functools import partial\n", "from collections import Counter\n", "import json\n", "\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.metrics import f1_score, confusion_matrix, accuracy_score\n", "\n", "import torch\n", "from torch import nn\n", "from torch.utils.data import DataLoader, WeightedRandomSampler\n", "import torch.nn.functional as F\n", "from torchmetrics import F1Score\n", "\n", "# импортируем трансформеры\n", "import transformers\n", "from transformers import AutoTokenizer, AutoModel\n", "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n", "from transformers import BertTokenizer, BertForSequenceClassification\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from tqdm import tqdm" ] }, { "cell_type": "markdown", "id": "58ae830d", "metadata": {}, "source": [ "#### DATASET" ] }, { "cell_type": "code", "execution_count": 4, "id": "8176883f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
commenttoxic
0Верблюдов-то за что? Дебилы, бл...\\n1.0
1Хохлы, это отдушина затюканого россиянина, мол, вон, а у хохлов еще хуже. Если бы хохлов не было, кисель их бы придумал.\\n1.0
2Собаке - собачья смерть\\n1.0
3Страницу обнови, дебил. Это тоже не оскорбление, а доказанный факт - не-дебил про себя во множественном числе писать не будет. Или мы в тебя верим - это ты и твои воображаемые друзья?\\n1.0
4тебя не убедил 6-страничный пдф в том, что Скрипалей отравила Россия? Анализировать и думать пытаешься? Ватник что ли?)\\n1.0
\n", "
" ], "text/plain": [ " comment \\\n", "0 Верблюдов-то за что? Дебилы, бл...\\n \n", "1 Хохлы, это отдушина затюканого россиянина, мол, вон, а у хохлов еще хуже. Если бы хохлов не было, кисель их бы придумал.\\n \n", "2 Собаке - собачья смерть\\n \n", "3 Страницу обнови, дебил. Это тоже не оскорбление, а доказанный факт - не-дебил про себя во множественном числе писать не будет. Или мы в тебя верим - это ты и твои воображаемые друзья?\\n \n", "4 тебя не убедил 6-страничный пдф в том, что Скрипалей отравила Россия? Анализировать и думать пытаешься? Ватник что ли?)\\n \n", "\n", " toxic \n", "0 1.0 \n", "1 1.0 \n", "2 1.0 \n", "3 1.0 \n", "4 1.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('../datasets/dataset_task2.csv')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 483, "id": "c3ffe877", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(14412, 3)" ] }, "execution_count": 483, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 97, "id": "62da43b8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
commentcleaned_content
toxic
0.095869586
1.048264826
\n", "
" ], "text/plain": [ " comment cleaned_content\n", "toxic \n", "0.0 9586 9586\n", "1.0 4826 4826" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(by=df['toxic']).count()" ] }, { "cell_type": "code", "execution_count": 74, "id": "9c56d343", "metadata": {}, "outputs": [], "source": [ "def data_preprocessing(text: str) -> str:\n", " text = text.lower()\n", " text = re.sub(r'(https://\\w.*).*|(http://\\w.*).*', '', text)\n", " text = ''.join([c for c in text if c not in string.punctuation]) # Remove punctuation\n", " # text = ''.join(text)\n", " return text\n", "\n", "df['cleaned_content'] = df['comment'].apply(data_preprocessing)" ] }, { "cell_type": "code", "execution_count": 76, "id": "60e1addc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'в шапке были ссылки на инфу по текущему фильму марвел эти ссылки были заменены на фразу репортим брипидора игнорируем его посты если этого недостаточно чтобы понять что модератор абсолютный неадекват и его нужно лишить полномочий тогда эта борда пробивает абсолютное дно по неадекватности\\n'" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['cleaned_content'][6]" ] }, { "cell_type": "markdown", "id": "1defed13", "metadata": {}, "source": [ "#### LOAD MODEL" ] }, { "cell_type": "code", "execution_count": 263, "id": "7220f7c8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cuda\n" ] } ], "source": [ "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", "print(device)" ] }, { "cell_type": "raw", "id": "a2015ab1", "metadata": { "vscode": { "languageId": "raw" } }, "source": [ "# load tokenizer and model weights\n", "tokenizer_rts = BertTokenizer.from_pretrained('s-nlp/russian_toxicity_classifier')\n", "model_rts = BertForSequenceClassification.from_pretrained('s-nlp/russian_toxicity_classifier')\n", "\n", "# prepare the input\n", "batch = tokenizer_rts.encode('ты супер', return_tensors='pt')\n", "\n", "# inference\n", "model_rts(batch)\n" ] }, { "cell_type": "code", "execution_count": 463, "id": "ae4dfd73", "metadata": {}, "outputs": [], "source": [ "model_checkpoint = 'cointegrated/rubert-tiny-toxicity'\n", "tokenizer_rtt = AutoTokenizer.from_pretrained(model_checkpoint)\n", "model_rtt = AutoModelForSequenceClassification.from_pretrained(model_checkpoint)" ] }, { "cell_type": "code", "execution_count": 464, "id": "5c3326f8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "BertForSequenceClassification(\n", " (bert): BertModel(\n", " (embeddings): BertEmbeddings(\n", " (word_embeddings): Embedding(29564, 312, padding_idx=0)\n", " (position_embeddings): Embedding(512, 312)\n", " (token_type_embeddings): Embedding(2, 312)\n", " (LayerNorm): LayerNorm((312,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " (encoder): BertEncoder(\n", " (layer): ModuleList(\n", " (0-2): 3 x BertLayer(\n", " (attention): BertAttention(\n", " (self): BertSdpaSelfAttention(\n", " (query): Linear(in_features=312, out_features=312, bias=True)\n", " (key): Linear(in_features=312, out_features=312, bias=True)\n", " (value): Linear(in_features=312, out_features=312, bias=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " (output): BertSelfOutput(\n", " (dense): Linear(in_features=312, out_features=312, bias=True)\n", " (LayerNorm): LayerNorm((312,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " )\n", " (intermediate): BertIntermediate(\n", " (dense): Linear(in_features=312, out_features=600, bias=True)\n", " (intermediate_act_fn): GELUActivation()\n", " )\n", " (output): BertOutput(\n", " (dense): Linear(in_features=600, out_features=312, bias=True)\n", " (LayerNorm): LayerNorm((312,), eps=1e-12, elementwise_affine=True)\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " )\n", " )\n", " )\n", " )\n", " (pooler): BertPooler(\n", " (dense): Linear(in_features=312, out_features=312, bias=True)\n", " (activation): Tanh()\n", " )\n", " )\n", " (dropout): Dropout(p=0.1, inplace=False)\n", " (classifier): Sequential(\n", " (0): Linear(in_features=312, out_features=128, bias=True)\n", " (1): ReLU()\n", " (2): Dropout(p=0.3, inplace=False)\n", " (3): Linear(in_features=128, out_features=64, bias=True)\n", " (4): ReLU()\n", " (5): Linear(in_features=64, out_features=1, bias=True)\n", " )\n", ")" ] }, "execution_count": 464, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# fine tunuing with freeze last classifier layer \n", "for name, param in model_rtt.named_parameters():\n", " if 'encoder.layer.2' in name or 'pooler' in name:\n", " param.requires_grad = True\n", " else:\n", " param.requires_grad = False\n", "\n", "# Создаем новую \"голову\" с несколькими слоями\n", "num_features = model_rtt.classifier.in_features # # Количество входов от базовой модели\n", "num_classes = 1 # Количество ваших классов\n", "model_rtt.classifier = nn.Sequential(\n", " nn.Linear(num_features, 128),\n", " nn.ReLU(),\n", " nn.Dropout(0.3),\n", " nn.Linear(128, 64),\n", " nn.ReLU(),\n", " nn.Linear(64, num_classes)\n", ")\n", "model_rtt.to(device)" ] }, { "cell_type": "code", "execution_count": 465, "id": "d510eb6e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "312" ] }, "execution_count": 465, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_features" ] }, { "cell_type": "code", "execution_count": 466, "id": "f0543aa1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Sequential(\n", " (0): Linear(in_features=312, out_features=128, bias=True)\n", " (1): ReLU()\n", " (2): Dropout(p=0.3, inplace=False)\n", " (3): Linear(in_features=128, out_features=64, bias=True)\n", " (4): ReLU()\n", " (5): Linear(in_features=64, out_features=1, bias=True)\n", ")" ] }, "execution_count": 466, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_rtt.classifier" ] }, { "cell_type": "code", "execution_count": 467, "id": "d53e667b", "metadata": {}, "outputs": [], "source": [ "# Разделяем данные на обучающую и валидационную выборки\n", "train_text, valid_text, train_label, valid_label = train_test_split(df['cleaned_content'].to_list(),\n", " df['toxic'].to_list(),\n", " test_size=0.3,\n", " shuffle=True,\n", " random_state=42)\n", "\n", "# Токенизируем тексты\n", "# padding='max_length' - дополняет все последовательности до максимальной длины\n", "# truncation=True - обрезает слишком длинные последовательности\n", "MAX_LEN = 128\n", "train_encod = tokenizer_rtt(train_text, truncation=True, padding='max_length',\n", " max_length=MAX_LEN, return_tensors='pt')\n", "\n", "valid_encod = tokenizer_rtt(valid_text, truncation=True, padding='max_length',\n", " max_length=MAX_LEN, return_tensors='pt')" ] }, { "cell_type": "code", "execution_count": 468, "id": "375b26e7", "metadata": {}, "outputs": [], "source": [ "# Создаем сэмплер, для уравнивания дисбаланса классов\n", "# replacement=True позволяет выбирать один и тот же элемент несколько раз\n", "class_counts = Counter(train_label)\n", "class_weights = {label: 1.0 / count for label, count in class_counts.items()}\n", "sample_weights = [class_weights[label] for label in train_label]\n", "\n", "sampler = WeightedRandomSampler(\n", " weights=sample_weights,\n", " num_samples=len(sample_weights),\n", " replacement=True\n", ")" ] }, { "cell_type": "code", "execution_count": 469, "id": "ce8172fa", "metadata": {}, "outputs": [], "source": [ "# Создание кастомного Dataset\n", "class TextDataset(torch.utils.data.Dataset):\n", " def __init__(self, encoding, labels):\n", " self.encoding = encoding\n", " self.labels = labels\n", " # Этот метод возвращает общее количество элементов в датасете\n", " def __len__(self):\n", " return len(self.labels)\n", " \n", " # Этот метод возвращает один элемент датасета по индексу idx\n", " # DataLoader многократно вызывает этот метод, чтобы набрать нужное количество образцов для одного батча\n", " def __getitem__(self, idx):\n", " # encodings - это словарь ('input_ids', 'attention_mask'), \n", " # извлекаем тензоры для каждого ключа\n", " item = {key: val[idx] for key, val in self.encoding.items()}\n", " # Добавляем метку класса\n", " item['labels'] = torch.tensor(self.labels[idx])\n", " return item\n" ] }, { "cell_type": "code", "execution_count": 470, "id": "17853dee", "metadata": {}, "outputs": [], "source": [ "# Создаем экземпляры нашего датасета для обучающей и валидационной выборок\n", "train_dataset = TextDataset(train_encod, train_label)\n", "valid_dataset = TextDataset(valid_encod, valid_label)\n", "\n", "# Создание DataLoaders\n", "BATCH_SIZE = 64\n", "\n", "# Создаем загрузчики данных\n", "train_loader = DataLoader(\n", " train_dataset,\n", " batch_size=BATCH_SIZE,\n", " sampler=sampler,\n", " shuffle=False # Перемешивать данные в каждой эпохе (важно для обучения)\n", " # ВАЖНО: при использовании sampler, shuffle должен быть False!\n", ")\n", "\n", "valid_loader = DataLoader(\n", " valid_dataset,\n", " batch_size=BATCH_SIZE,\n", " shuffle=False # На валидации перемешивать не нужно\n", ")" ] }, { "cell_type": "code", "execution_count": 471, "id": "85e011c9", "metadata": {}, "outputs": [], "source": [ "# optimizer = torch.optim.Adam(model_rtt.classifier.parameters(), lr=1e-5)\n", "optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model_rtt.parameters()), lr=1e-5)\n", "f1 = F1Score(task=\"binary\") \n", "# Модели Hugging Face сами возвращают loss, если переданы labels\n", "# criterion = torch.nn.BCEWithLogitsLoss(reduction='mean')" ] }, { "cell_type": "code", "execution_count": 472, "id": "5bdcd728", "metadata": {}, "outputs": [], "source": [ "def train(num_epochs=1, \n", " model=model_rtt,\n", " optimizer=optimizer,\n", " # criterion=criterion,\n", " train_loader=train_loader,\n", " valid_loader=valid_loader,\n", " f1_score = f1.to(device)\n", " ):\n", " model_rtt.to(device)\n", " history = {\n", " 'epochs': [],\n", " 'loss_train': [],\n", " 'loss_valid': [],\n", " 'accuracy_train': [],\n", " 'accuracy_valid': [],\n", " 'f1_score': [],\n", " }\n", "\n", " for epoch in range(num_epochs):\n", " # --- Фаза обучения ---\n", " model.train() # Переводим модель в режим обучения\n", " running_loss = 0.0\n", " corrects = 0\n", " \n", " for batch in tqdm(train_loader):\n", " # Извлекаем данные из словаря по ключам\n", " # и перемещаем на нужное устройство\n", " input_ids = batch['input_ids'].to(device)\n", " attention_mask = batch['attention_mask'].to(device)\n", " label = batch['labels'].to(device)\n", " \n", " # 1. Обнуляем градиенты\n", " optimizer.zero_grad()\n", " \n", " # 2. Прямой проход (forward pass)\n", " # Используем распаковку словаря для удобной передачи в модель\n", " outputs = model(input_ids=input_ids,\n", " attention_mask=attention_mask,\n", " labels=label.unsqueeze(1))\n", " # loss = criterion(torch.sigmoid(outputs.logits), label.unsqueeze(1))\n", " # Модели Hugging Face сами возвращают loss, если переданы labels\n", " loss = outputs.loss\n", " \n", " # 3. Обратное распространение ошибки (backward pass)\n", " loss.backward()\n", " \n", " # 4. Обновление весов\n", " optimizer.step()\n", " \n", " running_loss += loss.item() * input_ids.size(0)\n", " # Получаем вероятности с помощью Sigmoid\n", " preds = torch.sigmoid(outputs.logits)\n", " # Превращаем вероятности в предсказанные классы (0 или 1) порогом 0.5\n", " preds = (preds > 0.5).long()\n", " corrects += torch.sum(preds == label.unsqueeze(1))\n", "\n", " epoch_loss = running_loss / len(train_loader.dataset)\n", "\n", " train_epoch_acc = corrects.double() / len(train_loader.dataset)\n", "\n", " # --- Фаза валидации ---\n", " model.eval() # Переводим модель в режим оценки\n", " val_loss = 0.0\n", " corrects = 0\n", " \n", " with torch.no_grad(): # Отключаем вычисление градиентов\n", " for batch in tqdm(valid_loader):\n", " input_ids = batch['input_ids'].to(device)\n", " attention_mask = batch['attention_mask'].to(device)\n", " label = batch['labels'].to(device)\n", " \n", " outputs = model(input_ids=input_ids,\n", " attention_mask=attention_mask,\n", " labels=label.unsqueeze(1))\n", " \n", " # loss = criterion(torch.sigmoid(outputs.logits), label.unsqueeze(1))\n", " loss = outputs.loss\n", " \n", " # Получаем вероятности с помощью Sigmoid\n", " preds = torch.sigmoid(outputs.logits)\n", " # Превращаем вероятности в предсказанные классы (0 или 1) порогом 0.5\n", " preds = (preds > 0.5).long()\n", " # print(torch.max(preds))\n", " val_loss += loss.item() * input_ids.size(0)\n", " # print(preds, label)\n", " corrects += torch.sum(preds == label.unsqueeze(1))\n", " # Обновляем метрику на каждом батче\n", " f1_score.update(preds, label.unsqueeze(1))\n", "\n", " val_epoch_loss = val_loss / len(valid_loader.dataset)\n", " val_epoch_acc = corrects.double() / len(valid_loader.dataset)\n", " # После окончания цикла по всем батчам вычисляем итоговый F1-score\n", " final_f1_score = f1_score.compute()\n", "\n", " print(f\"Эпоха {epoch+1}/{num_epochs}\\n\"\n", " f\"Потери на обучении: {epoch_loss:.3f} | \"\n", " f\"Потери на валидации: {val_epoch_loss:.3f}\\n\"\n", " f\"Точность на обучении: {train_epoch_acc:.3f} | \"\n", " f\"Точность на валидации: {val_epoch_acc:.3f}\\n\",\n", " f\"F1-Score на валидации: {final_f1_score:.3f}\")\n", " \n", " history['epochs'].append(epoch+1)\n", " history['loss_train'].append(epoch_loss)\n", " history['loss_valid'].append(val_epoch_loss)\n", " history['accuracy_train'].append(train_epoch_acc.item())\n", " history['accuracy_valid'].append(val_epoch_acc.item())\n", " history['f1_score'].append(final_f1_score.item())\n", "\n", " # Важно! Сбрасываем состояние метрики для следующей эпохи\n", " f1_score.reset()\n", " print(\"Обучение завершено.\")\n", " \n", " return history" ] }, { "cell_type": "code", "execution_count": 473, "id": "07f912d3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:24<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:46<00:00, 1.46it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 1/20\n", "Потери на обучении: 0.656 | Потери на валидации: 0.575\n", "Точность на обучении: 0.685 | Точность на валидации: 0.849\n", " F1-Score на валидации: 0.783\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:21<00:00, 1.12it/s]\n", "100%|██████████| 68/68 [00:43<00:00, 1.57it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 2/20\n", "Потери на обучении: 0.544 | Потери на валидации: 0.453\n", "Точность на обучении: 0.830 | Точность на валидации: 0.857\n", " F1-Score на валидации: 0.799\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:18<00:00, 1.14it/s]\n", "100%|██████████| 68/68 [00:44<00:00, 1.51it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 3/20\n", "Потери на обучении: 0.440 | Потери на валидации: 0.372\n", "Точность на обучении: 0.852 | Точность на валидации: 0.866\n", " F1-Score на валидации: 0.813\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:28<00:00, 1.06it/s]\n", "100%|██████████| 68/68 [00:47<00:00, 1.44it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 4/20\n", "Потери на обучении: 0.386 | Потери на валидации: 0.351\n", "Точность на обучении: 0.858 | Точность на валидации: 0.863\n", " F1-Score на валидации: 0.815\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:24<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:42<00:00, 1.59it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 5/20\n", "Потери на обучении: 0.351 | Потери на валидации: 0.317\n", "Точность на обучении: 0.867 | Точность на валидации: 0.876\n", " F1-Score на валидации: 0.827\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:23<00:00, 1.10it/s]\n", "100%|██████████| 68/68 [00:44<00:00, 1.52it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 6/20\n", "Потери на обучении: 0.328 | Потери на валидации: 0.326\n", "Точность на обучении: 0.872 | Точность на валидации: 0.869\n", " F1-Score на валидации: 0.822\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:26<00:00, 1.08it/s]\n", "100%|██████████| 68/68 [00:44<00:00, 1.52it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 7/20\n", "Потери на обучении: 0.328 | Потери на валидации: 0.314\n", "Точность на обучении: 0.874 | Точность на валидации: 0.875\n", " F1-Score на валидации: 0.828\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:23<00:00, 1.10it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.48it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 8/20\n", "Потери на обучении: 0.310 | Потери на валидации: 0.307\n", "Точность на обучении: 0.883 | Точность на валидации: 0.878\n", " F1-Score на валидации: 0.831\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:19<00:00, 1.13it/s]\n", "100%|██████████| 68/68 [00:44<00:00, 1.53it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 9/20\n", "Потери на обучении: 0.303 | Потери на валидации: 0.290\n", "Точность на обучении: 0.885 | Точность на валидации: 0.885\n", " F1-Score на валидации: 0.838\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:26<00:00, 1.08it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.49it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 10/20\n", "Потери на обучении: 0.297 | Потери на валидации: 0.293\n", "Точность на обучении: 0.886 | Точность на валидации: 0.884\n", " F1-Score на валидации: 0.837\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:21<00:00, 1.12it/s]\n", "100%|██████████| 68/68 [00:42<00:00, 1.60it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 11/20\n", "Потери на обучении: 0.301 | Потери на валидации: 0.289\n", "Точность на обучении: 0.884 | Точность на валидации: 0.885\n", " F1-Score на валидации: 0.838\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:19<00:00, 1.14it/s]\n", "100%|██████████| 68/68 [00:44<00:00, 1.53it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 12/20\n", "Потери на обучении: 0.290 | Потери на валидации: 0.291\n", "Точность на обучении: 0.890 | Точность на валидации: 0.883\n", " F1-Score на валидации: 0.836\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:19<00:00, 1.13it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.50it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 13/20\n", "Потери на обучении: 0.294 | Потери на валидации: 0.294\n", "Точность на обучении: 0.886 | Точность на валидации: 0.881\n", " F1-Score на валидации: 0.835\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:27<00:00, 1.07it/s]\n", "100%|██████████| 68/68 [05:58<00:00, 5.27s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 14/20\n", "Потери на обучении: 0.291 | Потери на валидации: 0.288\n", "Точность на обучении: 0.888 | Точность на валидации: 0.883\n", " F1-Score на валидации: 0.836\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:21<00:00, 1.12it/s]\n", "100%|██████████| 68/68 [00:46<00:00, 1.47it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 15/20\n", "Потери на обучении: 0.296 | Потери на валидации: 0.283\n", "Точность на обучении: 0.887 | Точность на валидации: 0.885\n", " F1-Score на валидации: 0.837\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:24<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.48it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 16/20\n", "Потери на обучении: 0.293 | Потери на валидации: 0.280\n", "Точность на обучении: 0.888 | Точность на валидации: 0.888\n", " F1-Score на валидации: 0.841\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:25<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.49it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 17/20\n", "Потери на обучении: 0.292 | Потери на валидации: 0.280\n", "Точность на обучении: 0.887 | Точность на валидации: 0.888\n", " F1-Score на валидации: 0.842\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:25<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.50it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 18/20\n", "Потери на обучении: 0.277 | Потери на валидации: 0.287\n", "Точность на обучении: 0.894 | Точность на валидации: 0.886\n", " F1-Score на валидации: 0.840\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:24<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.50it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 19/20\n", "Потери на обучении: 0.274 | Потери на валидации: 0.280\n", "Точность на обучении: 0.898 | Точность на валидации: 0.888\n", " F1-Score на валидации: 0.842\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 158/158 [02:24<00:00, 1.09it/s]\n", "100%|██████████| 68/68 [00:45<00:00, 1.49it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Эпоха 20/20\n", "Потери на обучении: 0.271 | Потери на валидации: 0.290\n", "Точность на обучении: 0.896 | Точность на валидации: 0.884\n", " F1-Score на валидации: 0.838\n", "Обучение завершено.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "history = train(num_epochs=20)" ] }, { "cell_type": "code", "execution_count": 486, "id": "65f8672d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['epochs', 'loss_train', 'loss_valid', 'accuracy_train', 'accuracy_valid', 'f1_score'])" ] }, "execution_count": 486, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history.keys()" ] }, { "cell_type": "code", "execution_count": 491, "id": "49eee111", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.2801996692256945" ] }, "execution_count": 491, "metadata": {}, "output_type": "execute_result" } ], "source": [ "min(history['loss_valid'])" ] }, { "cell_type": "code", "execution_count": 475, "id": "79109487", "metadata": {}, "outputs": [], "source": [ "with open(\"../models/rtt_metrics.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(history, file, ensure_ascii=False, indent=4)" ] }, { "cell_type": "code", "execution_count": 476, "id": "bdf69803", "metadata": {}, "outputs": [], "source": [ "PATH = '../models/model_rtt.pth'" ] }, { "cell_type": "code", "execution_count": 477, "id": "9360f2a9", "metadata": {}, "outputs": [], "source": [ "# сохранение модели\n", "torch.save(model_rtt, PATH)" ] }, { "cell_type": "raw", "id": "5f3debf4", "metadata": { "vscode": { "languageId": "raw" } }, "source": [ "# загрузка модели\n", "model_full = MyTinyBERT(num_classes=5)\n", "model_full.load_state_dict(torch.load(PATH))\n", "model_full.eval()" ] }, { "cell_type": "code", "execution_count": 338, "id": "3376b092", "metadata": {}, "outputs": [], "source": [ "def text2toxicity(text):\n", " with torch.no_grad():\n", " # Токенизируем текст и перемещаем на нужное устройство\n", " inputs = tokenizer_rtt(text, return_tensors='pt', truncation=True, padding=True).to(device)\n", " # Токенизируем текст и перемещаем на нужное устройство\n", " proba = torch.sigmoid(model_rtt(**inputs).logits).squeeze(1).cpu().numpy()\n", " for p in proba:\n", " if p > 0.5:\n", " print(f'Оскорбительный текст, с вероятностью {p:.2f}')\n", " else:\n", " print(f'Не оскорбительный текст, с вероятностью {p:.2f}')\n", " return proba" ] }, { "cell_type": "code", "execution_count": 350, "id": "fd07fa5c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Оскорбительный текст, с вероятностью 0.95\n", "Не оскорбительный текст, с вероятностью 0.01\n", "Не оскорбительный текст, с вероятностью 0.01\n", "Оскорбительный текст, с вероятностью 0.80\n", "Не оскорбительный текст, с вероятностью 0.02\n", "Не оскорбительный текст, с вероятностью 0.02\n", "Не оскорбительный текст, с вероятностью 0.02\n", "Не оскорбительный текст, с вероятностью 0.01\n", "Не оскорбительный текст, с вероятностью 0.09\n", "Оскорбительный текст, с вероятностью 0.94\n" ] } ], "source": [ "t = valid_text[:10]\n", "probability = text2toxicity(t)" ] }, { "cell_type": "code", "execution_count": 401, "id": "106a63e4", "metadata": {}, "outputs": [], "source": [ "def get_predictions(model, data_loader, device):\n", " \"\"\"\n", " Function to get a list of predictions for a given dataset.\n", " \"\"\"\n", " model.eval() # Set the model to evaluation mode\n", " all_preds = []\n", "\n", " with torch.no_grad(): # Disable gradient calculation\n", " for batch in data_loader:\n", " # Move data to the correct device\n", " input_ids = batch['input_ids'].to(device)\n", " attention_mask = batch['attention_mask'].to(device)\n", "\n", " # Get model outputs (logits)\n", " outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n", " logits = outputs.logits\n", "\n", " # Convert logits to probabilities\n", " probs = torch.sigmoid(logits)\n", "\n", " # Convert probabilities to class predictions (0 or 1), для датафрема отключать эту строку\n", " preds = (probs > 0.5).long()\n", "\n", " # Add batch predictions to the list (move to CPU to save GPU memory)\n", " all_preds.extend(preds.cpu().numpy())\n", " # all_preds.extend(probs.cpu().numpy().flatten().tolist()) # для сравнение в датафрейме\n", "\n", " return all_preds" ] }, { "cell_type": "code", "execution_count": 478, "id": "2128fa20", "metadata": {}, "outputs": [], "source": [ "predicts = get_predictions(model_rtt, valid_loader, device)" ] }, { "cell_type": "code", "execution_count": 403, "id": "b57eb536", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " array([1]),\n", " array([1]),\n", " array([0]),\n", " array([0]),\n", " ...]" ] }, "execution_count": 403, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predicts" ] }, { "cell_type": "code", "execution_count": 479, "id": "19b0b6ef", "metadata": {}, "outputs": [ { "data": { "image/png": "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CERERIphhURehUhInvT44cP8wyMiIkPBX2nyKsSiVgD47rvv4OXlBQsLC1hYWKBBgwZYv3692mERERFROagQFZJ58+Zh6tSpGD16NFq2bAlRFPHHH3/go48+wu3bt/HJJ5+oHSIREdFzY9VfXoVISBYvXozw8HC89957UlvPnj1Rv359hIaGMiEhIqKXGvMReRUiIUlKSoKvr2+Rdl9fXyQlJakQERERkf6wQiKvQqwhqV27NrZu3VqkfcuWLahTp44KEREREVF5qhAVks8//xz9+/fHgQMH0LJlSwiCgIMHD2Lfvn3FJipEREQvExZI5FWIhOSdd97BkSNHMG/ePOzYsQOiKMLDwwNHjx5F48aN1Q6PiIjohXDKRl6FSEgAoGnTpti4caPaYRAREZEKVE1IjIyMZLNGQRCQn59fThERERHpHwsk8lRNSCIjI0s8d+jQISxevFi6cysREdHLilM28lRNSHr27Fmk7fz58wgJCcGuXbswaNAgzJgxQ4XIiIiIqDxViG2/AHDz5k0EBQWhQYMGyM/PR3x8PNatW4eqVauqHRoREdELEQT9HIZM9YQkPT0dkyZNQu3atXH27Fns27cPu3btgqenp9qhERER6YUgCHo5DJmqUzZz5szB7Nmz4ezsjO+//77YKRwiIiIyfKomJJ999hksLCxQu3ZtrFu3DuvWrSu23/bt28s5MiIiIv0x8OKGXqiakLz33nsGX4IiIiLi7zp5qiYkERERal6eiIioXDAfkaf6olYiIiKiCnPreCIiIkPFKRt5TEiIiIgUxoREHqdsiIiISHWskBARESmMBRJ5TEiIiIgUxikbeZyyISIiItWxQkJERKQwFkjkMSEhIiJSGKds5HHKhoiIiFTHCgkREZHCWCCRx4SEiIhIYUbMSGQxISEiIlIY8xF5XENCREREqmOFhIiISGHcZSOPCQkREZHCjJiPyOKUDREREamOFRIiIiKFccpGHhMSIiIihTEfkccpGyIiIlIdKyREREQKE8ASiRwmJERERArjLht5nLIhIiIi1bFCQkREpDDuspHHCgkREZHCBEE/R1kdOHAAPXr0gKurKwRBwI4dO3TOBwYGQhAEnaNFixY6fXJycjBmzBjY29vDysoK/v7+uHHjhk6ftLQ0BAQEQKvVQqvVIiAgAPfu3StTrExIiIiIFGYkCHo5yiorKwsNGzbEkiVLSuzTpUsXJCUlScfu3bt1zo8bNw6RkZHYvHkzDh48iMzMTHTv3h0FBQVSn4EDByI+Ph5RUVGIiopCfHw8AgICyhQrp2yIiIgMlJ+fH/z8/J7ZR6PRwNnZudhz6enpWL16NdavX4+OHTsCADZs2AA3Nzf8+uuv6Ny5MxISEhAVFYXY2Fh4e3sDAFatWgUfHx9cuHAB9erVK1WsrJAQEREpTF9TNjk5OcjIyNA5cnJyXii2/fv3w9HREXXr1kVQUBBSUlKkcydOnEBeXh46deoktbm6usLT0xOHDh0CABw+fBharVZKRgCgRYsW0Gq1Up/SYEJCRESksKfXaTzvERYWJq3TeHyEhYU9d1x+fn7YuHEjoqOjMXfuXBw7dgzt27eXkpzk5GSYmZmhcuXKOu9zcnJCcnKy1MfR0bHI2I6OjlKf0uCUDRER0UsiJCQE48eP12nTaDTPPV7//v2lrz09PdGsWTNUq1YNP//8M/r06VPi+0RR1Nk5VNwuoqf7yGFCQkREpDB97frVaDQvlIDIcXFxQbVq1XDp0iUAgLOzM3Jzc5GWlqZTJUlJSYGvr6/U59atW0XGSk1NhZOTU6mvzSkbIiIiham1y6as7ty5g+vXr8PFxQUA0LRpU5iammLv3r1Sn6SkJJw5c0ZKSHx8fJCeno6jR49KfY4cOYL09HSpT2mwQkJERGSgMjMz8ddff0mvExMTER8fD1tbW9ja2iI0NBTvvPMOXFxccPXqVUyePBn29vbo3bs3AECr1WLYsGEIDg6GnZ0dbG1tMWHCBHh5eUm7btzd3dGlSxcEBQVhxYoVAIDhw4eje/fupd5hAzAhISIiUpxa92k9fvw42rVrJ71+vP5kyJAhCA8Px+nTp/Hdd9/h3r17cHFxQbt27bBlyxZYW1tL75k/fz5MTEzQr18/ZGdno0OHDoiIiICxsbHUZ+PGjRg7dqy0G8ff3/+Z9z4pjiCKovgiH7Yismg8Wu0QiCqkC/vmqh0CUYVT1Va5NRmPvftdvF7G+f69RnoZpyLiGhIiIiJSHadsiIiIFGbEZ+vJKlVCsnPnzlIP6O/v/9zBEBERGSI+7VdeqRKSXr16lWowQRB0HrZDRERE+rsPiSErVUJSWFiodBxERET0CuMaEiIiIoVxykbecyUkWVlZiImJwbVr15Cbm6tzbuzYsXoJjIiIyFBwUau8MickcXFx6Nq1Kx48eICsrCzY2tri9u3bsLS0hKOjIxMSIiIiKrMy34fkk08+QY8ePXD37l1YWFggNjYWf//9N5o2bYpvvvlGiRiJiIheaoIg6OUwZGVOSOLj4xEcHAxjY2MYGxsjJycHbm5umDNnDiZPnqxEjERERC81QU+HIStzQmJqaiplaU5OTrh27RqARw/gefw1ERERUVmUeQ1J48aNcfz4cdStWxft2rXDtGnTcPv2baxfvx5eXl5KxEhERPRSMzLw6RZ9KHOFZObMmXBxcQEAzJgxA3Z2dhgxYgRSUlKwcuVKvQdIRET0shME/RyGrMwVkmbNmklfOzg4YPfu3XoNiIiIiF49vDEaERGRwgx9h4w+lDkhqVGjxjO/sVeuXHmhgIiIiAwN8xF5ZU5Ixo0bp/M6Ly8PcXFxiIqKwsSJE/UVFxERkcHgolZ5ZU5IPv7442Lbly5diuPHj79wQERERPTqKfMum5L4+fnhhx9+0NdwREREBoO7bOTpbVHrtm3bYGtrq6/hiIiIDAYXtcp7rhujPfmNFUURycnJSE1NxbJly/QaHBEREb0aypyQ9OzZUychMTIygoODA9q2bYs33nhDr8E9r7RjS9QOgahC+uzn82qHQFThLOip/O8uva2PMGBlTkhCQ0MVCIOIiMhwccpGXpmTNmNjY6SkpBRpv3PnDoyNjfUSFBEREb1aylwhEUWx2PacnByYmZm9cEBERESGxogFElmlTkgWLVoE4FHZ6dtvv0WlSpWkcwUFBThw4ECFWUNCRERUkTAhkVfqhGT+/PkAHlVIli9frjM9Y2ZmhurVq2P58uX6j5CIiIgMXqkTksTERABAu3btsH37dlSuXFmxoIiIiAwJF7XKK/Makt9++02JOIiIiAwWp2zklXmXzb/+9S/MmjWrSPvXX3+Nvn376iUoIiIiQ8Jbx8src0ISExODbt26FWnv0qULDhw4oJegiIiI6NVS5imbzMzMYrf3mpqaIiMjQy9BERERGRIjQy9v6EGZKySenp7YsmVLkfbNmzfDw8NDL0EREREZEiM9HYaszBWSqVOn4p133sHly5fRvn17AMC+ffuwadMmbNu2Te8BEhERkeErc0Li7++PHTt2YObMmdi2bRssLCzQsGFDREdHw8bGRokYiYiIXmqcsZFX5oQEALp16yYtbL137x42btyIcePG4c8//0RBQYFeAyQiInrZcQ2JvOeekoqOjsbgwYPh6uqKJUuWoGvXrjh+/Lg+YyMiIqJXRJkqJDdu3EBERATWrFmDrKws9OvXD3l5efjhhx+4oJWIiKgELJDIK3WFpGvXrvDw8MC5c+ewePFi3Lx5E4sXL1YyNiIiIoNgJOjnMGSlrpDs2bMHY8eOxYgRI1CnTh0lYyIiIqJXTKkrJL///jvu37+PZs2awdvbG0uWLEFqaqqSsRERERkEI0HQy2HISp2Q+Pj4YNWqVUhKSsKHH36IzZs3o0qVKigsLMTevXtx//59JeMkIiJ6afFZNvLKvMvG0tISQ4cOxcGDB3H69GkEBwdj1qxZcHR0hL+/vxIxEhERvdS4hkTeC92Jtl69epgzZw5u3LiB77//Xl8xERER0SvmuW6M9jRjY2P06tULvXr10sdwREREBkWAgZc39EAvCQkRERGVzNCnW/TB0B8eSERERC8BVkiIiIgUxgqJPCYkREREChMMfc+uHnDKhoiIiFTHCgkREZHCOGUjjwkJERGRwjhjI49TNkRERKQ6VkiIiIgUZugPxtMHJiREREQK4xoSeUxIiIiIFMYCiTyuISEiIiLVsUJCRESkMCM+XE8WExIiIiKFccpGHqdsiIiISHWskBARESmMu2zkMSEhIiJSGO9DIo9TNkRERKQ6VkiIiIgUxgKJPCYkRERECuOUjTxO2RAREZHqmJAQEREpTBD0c5TVgQMH0KNHD7i6ukIQBOzYsUPnvCiKCA0NhaurKywsLNC2bVucPXtWp09OTg7GjBkDe3t7WFlZwd/fHzdu3NDpk5aWhoCAAGi1Wmi1WgQEBODevXtlipUJCRERkcKM9HSUVVZWFho2bIglS5YUe37OnDmYN28elixZgmPHjsHZ2Rlvv/027t+/L/UZN24cIiMjsXnzZhw8eBCZmZno3r07CgoKpD4DBw5EfHw8oqKiEBUVhfj4eAQEBJQpVkEURfE5PmOF9jBf7QiIKqbPfj6vdghEFc6Cnm8ofo11x6/rZZwhzdye+72CICAyMhK9evUC8Kg64urqinHjxmHSpEkAHlVDnJycMHv2bHz44YdIT0+Hg4MD1q9fj/79+wMAbt68CTc3N+zevRudO3dGQkICPDw8EBsbC29vbwBAbGwsfHx8cP78edSrV69U8bFCQkRE9JLIyclBRkaGzpGTk/NcYyUmJiI5ORmdOnWS2jQaDdq0aYNDhw4BAE6cOIG8vDydPq6urvD09JT6HD58GFqtVkpGAKBFixbQarVSn9JgQkJERKQwQU9HWFiYtE7j8REWFvZcMSUnJwMAnJycdNqdnJykc8nJyTAzM0PlypWf2cfR0bHI+I6OjlKf0uC2XyIiIoXpa9tvSEgIxo8fr9Om0WheaEzhqdhEUSzS9rSn+xTXvzTjPIkVEiIiopeERqOBjY2NzvG8CYmzszMAFKlipKSkSFUTZ2dn5ObmIi0t7Zl9bt26VWT81NTUItWXZ2FCQkREpDB9TdnoU40aNeDs7Iy9e/dKbbm5uYiJiYGvry8AoGnTpjA1NdXpk5SUhDNnzkh9fHx8kJ6ejqNHj0p9jhw5gvT0dKlPaXDKhoiISGFq3ag1MzMTf/31l/Q6MTER8fHxsLW1RdWqVTFu3DjMnDkTderUQZ06dTBz5kxYWlpi4MCBAACtVothw4YhODgYdnZ2sLW1xYQJE+Dl5YWOHTsCANzd3dGlSxcEBQVhxYoVAIDhw4eje/fupd5hAzAhISIiMljHjx9Hu3btpNeP158MGTIEERER+PTTT5GdnY2RI0ciLS0N3t7e2LNnD6ytraX3zJ8/HyYmJujXrx+ys7PRoUMHREREwNjYWOqzceNGjB07VtqN4+/vX+K9T0rC+5AQvUJ4HxKiosrjPiTfx/2jl3HebVxFL+NURKyQEBERKYwLNuXxe0RERESqY4WEiIhIYWW5H8erigkJERGRwpiOyGNCQkREpDBWSORxDQkRERGpjhUSIiIihfFf//KYkBARESmMUzbymLQRERGR6lghISIiUhjrI/KYkBARESmMMzbyOGVDREREqmOFhIiISGFGnLSRxYSEiIhIYZyykccpGyIiIlIdKyREREQKEzhlI4sJCRERkcI4ZSOPCQkREZHCuKhVHteQEBERkepYISEiIlIYp2zkMSEhIiJSGBMSeapP2SQmJuLSpUtF2i9duoSrV6+Wf0BERERU7lRPSAIDA3Ho0KEi7UeOHEFgYGD5B0RERKRngp7+M2SqJyRxcXFo2bJlkfYWLVogPj6+/AMiIiLSMyNBP4chUz0hEQQB9+/fL9Kenp6OgoICFSIiIiKi8qZ6QtKqVSuEhYXpJB8FBQUICwvDW2+9pWJkRERE+sEpG3mq77KZM2cOWrdujXr16qFVq1YAgN9//x0ZGRmIjo5WOToiIqIXx1028lSvkHh4eODUqVPo168fUlJScP/+fbz33ns4f/48PD091Q6PiIiIyoHqFRIAcHV1xcyZM9UOg4iISBGGPt2iD6okJKdOnYKnpyeMjIxw6tSpZ/Zt0KBBOUVFRESkDEPfIaMPqiQkjRo1QnJyMhwdHdGoUSMIggBRFIv0EwSBO22IiOilxwqJPFUSksTERDg4OEhf08vlxPFjiFizGgnnziA1NRXzFy1F+w4dpfO/7t2DbVu3IOHcGdy7dw9btu3AG+7uOmNcv3YNc7+ZjfiTJ5Cbm4uWb7XCZ5Onws7evrw/DtFzqWlngfa17eD2mgZac1OsPnIDp5MzATz613A3dwe4O1nBztIMD/MLcDH1AXadS0XGw3xpDDtLU/T0dERNWwuYGAlISMnCD6dvITPnf/8Qe12rQQ8PR1StbI5CEfjz5n3sOHMLuQVF/xFH9DJTZVFrtWrVIPx3yXG1atVKPKpWrapGeCQjO/sB6tWrh8+mTCvxfKPGjfHxJxOKPf/gwQN8NHwoBEHAqjXrsG7D98jLy8OYUR+hsLBQydCJ9EZjbISb6Q/xw6lbRc6ZGRvhda059ly4g7kxV7Hm6D9wsDLDB95VnugjYISvG0QRWPrHdSz8/RpMjAQEeb8u/VvaxtwEI3yr4nZWLuYf+BvLD1+Hs7UZBjZxKadPSfoiCPo5DJnqi1oDAgIQHh6OSpUq6bRfvXoVAQEB+P3331WKjEryVqs2eKtVmxLP9/DvBQD4558bxZ6PjzuJm//8gy3bdkh/7l98GYZWvs1x9EgsWvj46j1mIn1LSMlCQkpWsece5hci/PB1nbYfTt9CcJvqeM3CBPey81HD1gK2lqb4ev9V5OQ/SsQ3xSUhrGtd1HGwxMXUB6jvZIXCQhHbTt3C43rID6duYWK7GrC3SsXtrDwlPyLpkYHnEnqh+rbfc+fOwcvLC3/88YfUtm7dOjRs2BBOTk4qRkZKyc3NhSAIMDMzk9rMNBoYGRkh7uQJFSMjUo6FqREKRRHZeY+SDxMjI4gikF/4v6mX/AIRhaKImraWUp98UcSTkzN5/+3/uA+RoVA9ITly5Aj69++P9u3bY/Lkyejbty9Gjx6N+fPnY9u2bbLvz8nJQUZGhs6Rk5NTDpHT82rQsBEsLCywYO7XyM7OxoMHDzDvmzkoLCxEamqq2uER6Z2JkYDuHg44eSNDqoZcTctGbkEh/D0cYGoswMxYgH99RxgJAmzMjQEAl25nwUZjgna1bWEsPEpqurk/Wn/3uA+9HIwEQS+HIVN9ysbExASzZs2CRqPBjBkzYGJigpiYGPj4+JTq/WFhYfj888912qZMnY5/TwtVIFrSB1tbW3w9byG+mhGKTRvXw8jICF26doO7R30YG6meIxPplZEADGnmCgEC/u+J9SZZuQWIOPYP+jZ0RqualSGKwMl/MnD93kM8Lpok38/FxpNJ6OXpiO7uDhBFEQeupCHjYT4Kuab1pWLYqYR+qJ6Q5OXl4bPPPsPSpUsREhKCgwcPonfv3lizZg26du0q+/6QkBCMHz9ep0001igVLumJb8u38HPUr0hLuwtjYxPY2NigfeuWqOL3utqhEemNkQAEvlkFtpamWPrHNak68tiF1Af48tcrsDIzRmGhiOz8QnzRuTbuPPjf2pCT/2Tg5D8ZqKQxRu5/39+2tq1OHyJDoHpC0qxZMzx48AD79+9HixYtIIoi5syZgz59+mDo0KFYtmzZM9+v0Wig0egmIE/sqqMKrnJlWwDAkdjDuHv3Dtq2a69yRET68TgZcbAyw5I/ruFBXsk7yLJyH23zrWNviUoaY5z97/bhJz3eCuxdVYu8AhEXS1hQSxUUSySyKkRCsmjRIlhZWQF4dDO0SZMmoXPnzhg8eLDK0VFxHmRl4dq1a9Lrf27cwPmEBGi1Wri4uiL93j0kJSUhNTUFAHD16qN7zdjb28P+v/ef2RH5A2rWrIXKlW3x559xmBM2E4PfC0T1GjXL/wMRPQczYwEOVv9bmG1raYoqNhpk5RUg42E+3n+zCl5/zRyrYm/ASACsNY/WfDzILcDjW4g0r6rFrfs5yMwpQHVbC/TxckLM5TSkZOZK475V4zVcvZuNnPxC1HO0gr+HI35KSEV2PrfIv0x4YzR5gljcLVIriJycnCLVj9JghURZx44ewQfvv1ek3b9nb8yYOQs/Rm7HtH+HFDn/0cjRGDFqDABgwbxvsHNHJNLT0+FapQr69huAgCGB0v1pSBmf/Xxe7RAMRm07S4x+q+i9ko5eS0fU+duY1qlWse9bcvAa/rrzAADQ3cMBzd20sDQzxt0HeTh0NQ37L6fp9B/UxAUeTpWgMRZwKzMXv/11F8dvZOj/A73CFvR8Q/FrHLmcrpdxvGtp9TJORVQhEpKYmBh88803SEhIgCAIcHd3x8SJE9GqVavnGo8JCVHxmJAQFVUeCcnRK/pJSJrXNNyERPUtDRs2bEDHjh1haWmJsWPHYvTo0bCwsECHDh2wadMmtcMjIiJ6YYKeDkOmeoXE3d0dw4cPxyeffKLTPm/ePKxatQoJCQllHpMVEqLisUJCVFR5VEiOJeqnQvJmDVZIFHPlyhX06NGjSLu/vz8fvEdERPSKUD0hcXNzw759+4q079u3D25ubipEREREpF+Cnv4zZKpt+x06dCgWLlyI4OBgjB07FvHx8fD19YUgCDh48CAiIiKwcOFCtcIjIiLSG24glKfaGhJjY2MkJSXB0dERkZGRmDt3rrRe5PEum549ez7X2FxDQlQ8riEhKqo81pCcuKqfrdpNq9voZZyKSLUKyZN5UO/evdG7d2+1QiEiIlIUCyTyVL1TK2+CRURErwT+upOlakJSt25d2aTk7t275RQNERERqUXVhOTzzz+HVmu4e6qJiIgAPsumNFRNSAYMGABHR0c1QyAiIlIcVyjIU+0+JFw/QkRERI9ViF02REREhoz/BJenWkJSWFio1qWJiIjKFzMSWaquISEiInoVcFGrPNWfZUNERETECgkREZHCuI9DHhMSIiIihTEfkccpGyIiIlIdKyRERERKY4lEFhMSIiIihXGXjTxO2RAREZHqWCEhIiJSGHfZyGNCQkREpDDmI/I4ZUNERGSAQkNDIQiCzuHs7CydF0URoaGhcHV1hYWFBdq2bYuzZ8/qjJGTk4MxY8bA3t4eVlZW8Pf3x40bNxSJlwkJERGR0gQ9HWVUv359JCUlScfp06elc3PmzMG8efOwZMkSHDt2DM7Oznj77bdx//59qc+4ceMQGRmJzZs34+DBg8jMzET37t1RUFDwHN+EZ+OUDRERkcLU2mVjYmKiUxV5TBRFLFiwAFOmTEGfPn0AAOvWrYOTkxM2bdqEDz/8EOnp6Vi9ejXWr1+Pjh07AgA2bNgANzc3/Prrr+jcubNeY2WFhIiISGGCoJ8jJycHGRkZOkdOTk6J17106RJcXV1Ro0YNDBgwAFeuXAEAJCYmIjk5GZ06dZL6ajQatGnTBocOHQIAnDhxAnl5eTp9XF1d4enpKfXRJyYkREREL4mwsDBotVqdIywsrNi+3t7e+O677/DLL79g1apVSE5Ohq+vL+7cuYPk5GQAgJOTk857nJycpHPJyckwMzND5cqVS+yjT5yyISIiUpi+JmxCQkIwfvx4nTaNRlNsXz8/P+lrLy8v+Pj4oFatWli3bh1atGjxKK6n9iOLolik7Wml6fM8WCEhIiJSmp4WtWo0GtjY2OgcJSUkT7OysoKXlxcuXbokrSt5utKRkpIiVU2cnZ2Rm5uLtLS0EvvoExMSIiKiV0BOTg4SEhLg4uKCGjVqwNnZGXv37pXO5+bmIiYmBr6+vgCApk2bwtTUVKdPUlISzpw5I/XRJ07ZEBERKUyNXTYTJkxAjx49ULVqVaSkpODLL79ERkYGhgwZAkEQMG7cOMycORN16tRBnTp1MHPmTFhaWmLgwIEAAK1Wi2HDhiE4OBh2dnawtbXFhAkT4OXlJe260ScmJERERApT49bxN27cwLvvvovbt2/DwcEBLVq0QGxsLKpVqwYA+PTTT5GdnY2RI0ciLS0N3t7e2LNnD6ytraUx5s+fDxMTE/Tr1w/Z2dno0KEDIiIiYGxsrPd4BVEURb2PqrKH+WpHQFQxffbzebVDIKpwFvR8Q/Fr/JWSrZdxajta6GWciogVEiIiIoXxWTbymJAQEREpjRmJLCYkREREClPr1vEvE277JSIiItWxQkJERKQwNXbZvGyYkBARESmM+Yg8TtkQERGR6lghISIiUhpLJLKYkBARESmMu2zkccqGiIiIVMcKCRERkcK4y0YeExIiIiKFMR+RxykbIiIiUh0rJERERArjlI08JiRERESKY0YihwkJERGRwlghkcc1JERERKQ6VkiIiIgUxgKJPCYkRERECuOUjTxO2RAREZHqWCEhIiJSGJ9lI48JCRERkdKYj8jilA0RERGpjhUSIiIihbFAIo8JCRERkcK4y0Yep2yIiIhIdayQEBERKYy7bOQxISEiIlIa8xFZTEiIiIgUxnxEHteQEBERkepYISEiIlIYd9nIY0JCRESkMC5qlccpGyIiIlIdKyREREQK45SNPFZIiIiISHVMSIiIiEh1nLIhIiJSGKds5DEhISIiUhh32cjjlA0RERGpjhUSIiIihXHKRh4TEiIiIoUxH5HHhISIiEhpzEhkcQ0JERERqY4VEiIiIoVxl408JiREREQK46JWeZyyISIiItWxQkJERKQwFkjkMSEhIiJSGjMSWZyyISIiItWxQkJERKQw7rKRx4SEiIhIYdxlI49TNkRERKQ6QRRFUe0gyHDl5OQgLCwMISEh0Gg0aodDVCHw54KoKCYkpKiMjAxotVqkp6fDxsZG7XCIKgT+XBAVxSkbIiIiUh0TEiIiIlIdExIiIiJSHRMSUpRGo8H06dO5cI/oCfy5ICqKi1qJiIhIdayQEBERkeqYkBAREZHqmJAQERGR6piQ0EstNDQUjRo1UjsMIr25evUqBEFAfHy82qEQlSsmJAYuMDAQgiBg1qxZOu07duyAUA5Pe4qIiIAgCM889u/f/9zjT5gwAfv27dNfwESlIPd3OjAw8LnHdnNzQ1JSEjw9PfUXMNFLgLtsDFxgYCC2bNkCc3NzXLlyBZUrVwbwKCHp3bs3lP7jz87ORnp6uvS6T58+8PT0xBdffCG12drawszMTNE4iPQpOTlZ+nrLli2YNm0aLly4ILVZWFhAq9WqERrRS4sVkldAx44d4ezsjLCwsBL7/PDDD6hfvz40Gg2qV6+OuXPn6pyvXr06Zs6ciaFDh8La2hpVq1bFypUrZa9tYWEBZ2dn6TAzM4OlpaX0WqPR4IMPPkDlypVhaWkJPz8/XLp0CQCQmpoKZ2dnzJw5UxrvyJEjMDMzw549ewAUP2WzZs0a6bO4uLhg9OjRpf1WEZXKk3+ntVotBEHQadu0aRNq1aoFMzMz1KtXD+vXr5feO3ToUDRo0AA5OTkAgLy8PDRt2hSDBg0CUPyUzdmzZ9GtWzfY2NjA2toarVq1wuXLl8v1MxMpjQnJK8DY2BgzZ87E4sWLcePGjSLnT5w4gX79+mHAgAE4ffo0QkNDMXXqVEREROj0mzt3Lpo1a4a4uDiMHDkSI0aMwPnz518otsDAQBw/fhw7d+7E4cOHIYoiunbtiry8PDg4OGDNmjUIDQ3F8ePHkZmZicGDB2PkyJHo1KlTseOFh4dj1KhRGD58OE6fPo2dO3eidu3aLxQjUVlERkbi448/RnBwMM6cOYMPP/wQ77//Pn777TcAwKJFi5CVlYXPPvsMADB16lTcvn0by5YtK3a8f/75B61bt4a5uTmio6Nx4sQJDB06FPn5+eX2mYjKhUgGbciQIWLPnj1FURTFFi1aiEOHDhVFURQjIyPFx3/8AwcOFN9++22d902cOFH08PCQXlerVk0cPHiw9LqwsFB0dHQUw8PDyxRPmzZtxI8//lgURVG8ePGiCED8448/pPO3b98WLSwsxK1bt0ptI0eOFOvWrSsOGjRI9PT0FLOzs6Vz06dPFxs2bCi9dnV1FadMmVKmmIhexNq1a0WtViu99vX1FYOCgnT69O3bV+zatav0+tChQ6Kpqak4depU0cTERIyJiZHOJSYmigDEuLg4URRFMSQkRKxRo4aYm5ur6OcgUhsrJK+Q2bNnY926dTh37pxOe0JCAlq2bKnT1rJlS1y6dAkFBQVSW4MGDaSvH5eoU1JSnjuehIQEmJiYwNvbW2qzs7NDvXr1kJCQILV98803yM/Px9atW7Fx40aYm5sXO15KSgpu3ryJDh06PHdMRC+qpJ+nJ/9O+/j4YMKECZgxYwaCg4PRunXrEseLj49Hq1atYGpqqljMRBUBE5JXSOvWrdG5c2dMnjxZp10UxSI7bsRiFrs+/T9EQRBQWFj43PEUd43i4rly5Qpu3ryJwsJC/P333yWOZ2Fh8dyxEOlTcT9PT7YVFhbijz/+gLGxsbRmqiT8e02vCiYkr5hZs2Zh165dOHTokNTm4eGBgwcP6vQ7dOgQ6tatC2NjY8Vi8fDwQH5+Po4cOSK13blzBxcvXoS7uzsAIDc3F4MGDUL//v3x5ZdfYtiwYbh161ax41lbW6N69ercBkyqcnd3L/bn6fHfaQD4+uuvkZCQgJiYGPzyyy9Yu3ZtieM1aNAAv//+O/Ly8hSLmagiYELyivHy8sKgQYOwePFiqS04OBj79u3DjBkzcPHiRaxbtw5LlizBhAkTFI2lTp066NmzJ4KCgnDw4EH8+eefGDx4MKpUqYKePXsCAKZMmYL09HQsWrQIn376Kdzd3TFs2LASxwwNDcXcuXOxaNEiXLp0CSdPntT5rERKmzhxIiIiIrB8+XJcunQJ8+bNw/bt26Wfp/j4eEybNg2rV69Gy5YtsXDhQnz88ce4cuVKseONHj0aGRkZGDBgAI4fP45Lly5h/fr1OtuMiQwBE5JX0IwZM3SmS5o0aYKtW7di8+bN8PT0xLRp0/DFF1+80M2dSmvt2rVo2rQpunfvDh8fH4iiiN27d8PU1BT79+/HggULsH79etjY2MDIyAjr16/HwYMHER4eXux4Q4YMwYIFC7Bs2TLUr18f3bt3ly2JE+lTr169sHDhQnz99deoX78+VqxYgbVr16Jt27Z4+PAhBg0ahMDAQPTo0QMAMGzYMHTs2BEBAQE6a7Yes7OzQ3R0NDIzM9GmTRs0bdoUq1at4poSMji8MRoRERGpjhUSIiIiUh0TEnphM2fORKVKlYo9/Pz81A6PiIheApyyoRd29+5d3L17t9hzFhYWqFKlSjlHRERELxsmJERERKQ6TtkQERGR6piQEBERkeqYkBAREZHqmJAQGaDQ0FA0atRIeh0YGIhevXqVexxXr16FIAiIj48v92sT0cuFCQlROQoMDIQgCBAEAaampqhZsyYmTJiArKwsRa+7cOFCRERElKovkwgiUoOJ2gEQvWq6dOmCtWvXIi8vD7///js++OADZGVlFbkdfl5ent5uD67VavUyDhGRUlghISpnGo0Gzs7OcHNzw8CBAzFo0CDs2LFDmmZZs2YNatasCY1GA1EUkZ6ejuHDh8PR0RE2NjZo3749/vzzT50xZ82aBScnJ1hbW2PYsGF4+PChzvmnp2wKCwsxe/Zs1K5dGxqNBlWrVsVXX30FAKhRowYAoHHjxhAEAW3btpXet3btWri7u8Pc3BxvvPEGli1bpnOdo0ePonHjxjA3N0ezZs0QFxenx+8cERkyVkiIVGZhYSE9Wv6vv/7C1q1b8cMPP8DY2BgA0K1bN9ja2mL37t3QarVYsWIFOnTogIsXL8LW1hZbt27F9OnTsXTpUrRq1Qrr16/HokWLULNmzRKvGRISglWrVmH+/Pl46623kJSUhPPnzwN4lFQ0b94cv/76K+rXrw8zMzMAwKpVqzB9+nQsWbIEjRs3RlxcHIKCgmBlZYUhQ4YgKysL3bt3R/v27bFhwwYkJibi448/Vvi7R0QGQySicjNkyBCxZ8+e0usjR46IdnZ2Yr9+/cTp06eLpqamYkpKinR+3759oo2Njfjw4UOdcWrVqiWuWLFCFEVR9PHxET/66COd897e3mLDhg2LvW5GRoao0WjEVatWFRtjYmKiCECMi4vTaXdzcxM3bdqk0zZjxgzRx8dHFEVRXLFihWhraytmZWVJ58PDw4sdi4joaZyyISpnP/30EypVqgRzc3P4+PigdevWWLx4MQCgWrVqcHBwkPqeOHECmZmZsLOz03lGUGJiIi5fvgwASEhIgI+Pj841nn79pISEBOTk5KBDhw6ljjk1NRXXr1/HsGHDdOL48ssvdeJo2LAhLC0tSxUHEdGTOGVDVM7atWuH8PBwmJqawtXVVWfhqpWVlU7fwsJCuLi4YP/+/UXGee21157r+hYWFmV+T2FhIYBH0zbe3t465x5PLYl8CgURvQAmJETlzMrKCrVr1y5V3yZNmiA5ORkmJiaoXr16sX3c3d0RGxuL9957T2qLjY0tccw6derAwsIC+/btwwcffFDk/OM1IwUFBVKbk5MTqlSpgitXrmDQoEHFjuvh4YH169cjOztbSnqeFQcR0ZM4ZUNUgXXs2BE+Pj7o1asXfvnlF1y9ehWHDh3Cv//9bxw/fhwA8PHHH2PNmjVYs2YNLl68iOnTp+Ps2bMljmlubo5Jkybh008/xXfffYfLly8jNjYWq1evBgA4OjrCwsICUVFRuHXrFtLT0wE8utlaWFgYFi5ciIsXL+L06dNYu3Yt5s2bBwAYOHAgjIyMMGzYMJw7dw67d+/GN998o/B3iIgMBRMSogpMEATs3r0brVu3xtChQ1G3bl0MGDAAV69ehZOTEwCgf//+mDZtGiZNmoSmTZvi77//xogRI5457tSpUxEcHIxp06bB3d0d/fv3R0pKCgDAxMQEixYtwooVK+Dq6oqePXsCAD744AN8++23iIiIgJeXF9q0aYOIiAhpm3ClSpWwa9cunDt3Do0bN8aUKVMwe/ZsBb87RGRIBJETv0RERKQyVkiIiIhIdUxIiIiISHVMSIiIiEh1TEiIiIhIdUxIiIiISHVMSIiIiEh1TEiIiIhIdUxIiIiISHVMSIiIiEh1TEiIiIhIdUxIiIiISHVMSIiIiEh1/w/Lc9aMw+ERQAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cm = confusion_matrix(valid_label, predicts)\n", "df_cm = pd.DataFrame(cm, \n", " index=['Non_Toxic', 'Toxic'], \n", " columns=['Non_Toxic', 'Toxic'])\n", "sns.heatmap(df_cm, annot=True, fmt='d', cmap='Blues')\n", "plt.xlabel('Predicted')\n", "plt.ylabel('Actual')\n", "plt.title('Confusion Matrix')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "3e49d2de", "metadata": {}, "source": [ "проверка неугаданных текстов" ] }, { "cell_type": "code", "execution_count": null, "id": "87d96935", "metadata": {}, "outputs": [], "source": [ "check_df = pd.DataFrame({'text': valid_text,\n", " 'predicts': predicts,\n", " 'true_label': valid_label})" ] }, { "cell_type": "code", "execution_count": 394, "id": "b905bcc5", "metadata": {}, "outputs": [], "source": [ "check_df['delta'] = check_df['predicts'] - check_df['true_label']\n", "check_df['delta'] = check_df['delta'].abs()\n", "check_df.sort_values(by='delta', ascending=False, inplace=True)" ] }, { "cell_type": "code", "execution_count": 406, "id": "6c5f92b5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
textpredictstrue_labeldelta
1600на заводах работают смену 12 часов с 3 выходными вот в эти 3 выходных и начинается теневая экономика провинции 5к стоит поправить крыльцо со ступеньками заварить дырку в воротах 2к довести телевизор 500 рублей0.0095321.00.990468
1027а зачем мне десяток одинаковых провайдеров с конскими ценами которые блокируют все сайты из списка ркн пусть будет государственный разницы никакой0.0103051.00.989695
4177в том году делали проводку дома частично за деньги я была на 9 месяце электрик не жэковский сначала отправил меня сообщать всему подъезду что сейчас будет вырублен свет нет когда накануне всё обговаривали ни про какое объявление для соседей он не говорил хорошо середина буднего дня ну ок благо в...0.0107421.00.989258
346не смешите меня даже на самой населенной трассе москвапетербург пассажирооборот 36 миллиона человек в год где вы найдете этих туристов вовторых эти поезда не будут останавливаться в этих городках это бессмыслица и это города ничего не получат от нее кроме перекрытых за полчаса дорог и забора вдо...0.0129681.00.987032
594бывает меня вот бесит когда в предложении есть вставка поверь прям вот ухххбля сразу в голове всплывают воспоминания о разговорах за жизнь с бывалыми малолетками во времена школы института конечно и плюсом к этому частицы той невероятной дичи что они несли\\n0.0139911.00.986009
...............
1370потому что индустрия игр не благотворительность нет они получили возможность заработать больше денег при том даже сделав части покупателей скидку почему не всем потому что заработать больше денег тоже важно мы же не задаемся вопросом почему эпики могут брать такую комиссию а стим дерет 30 по...0.0088570.00.008857
48я стараюсь все равно тележки не бросать где попало но бывает другой возможности нет не могу представить ситуацию в которой нет возможности вернуть тележку а вообще способ интересный но имеет два серьёзных минуса стоимость размеры\\n0.0088410.00.008841
2437спасибо я знаю описано как будет строиться станция на 5 этапах материалы для ремонта можно трп пособирать я вчера еще сама могла долететь не очень то и далеко но сейчас посещаю туристические точки экспедиция будет там к пятнице\\n0.0088310.00.008831
1835трудно сказать что просядет а что нет евро до сих пор не подводил хотя есть мысль купить немного банковского золота немного мне предлагали такие маленькие слитки банки продают прикольная штука еще есть монеты банковские из золота я где то читал\\n0.0088050.00.008805
4180я как то покупал такой сухпаек и в одном наверное от удара так же банка открылась вот там так же было внутри хотя срок годности и снаружи вид были в норме что можно сказать бывает\\n0.0085870.00.008587
\n", "

4324 rows × 4 columns

\n", "
" ], "text/plain": [ " text \\\n", "1600 на заводах работают смену 12 часов с 3 выходными вот в эти 3 выходных и начинается теневая экономика провинции 5к стоит поправить крыльцо со ступеньками заварить дырку в воротах 2к довести телевизор 500 рублей \n", "1027 а зачем мне десяток одинаковых провайдеров с конскими ценами которые блокируют все сайты из списка ркн пусть будет государственный разницы никакой \n", "4177 в том году делали проводку дома частично за деньги я была на 9 месяце электрик не жэковский сначала отправил меня сообщать всему подъезду что сейчас будет вырублен свет нет когда накануне всё обговаривали ни про какое объявление для соседей он не говорил хорошо середина буднего дня ну ок благо в... \n", "346 не смешите меня даже на самой населенной трассе москвапетербург пассажирооборот 36 миллиона человек в год где вы найдете этих туристов вовторых эти поезда не будут останавливаться в этих городках это бессмыслица и это города ничего не получат от нее кроме перекрытых за полчаса дорог и забора вдо... \n", "594 бывает меня вот бесит когда в предложении есть вставка поверь прям вот ухххбля сразу в голове всплывают воспоминания о разговорах за жизнь с бывалыми малолетками во времена школы института конечно и плюсом к этому частицы той невероятной дичи что они несли\\n \n", "... ... \n", "1370 потому что индустрия игр не благотворительность нет они получили возможность заработать больше денег при том даже сделав части покупателей скидку почему не всем потому что заработать больше денег тоже важно мы же не задаемся вопросом почему эпики могут брать такую комиссию а стим дерет 30 по... \n", "48 я стараюсь все равно тележки не бросать где попало но бывает другой возможности нет не могу представить ситуацию в которой нет возможности вернуть тележку а вообще способ интересный но имеет два серьёзных минуса стоимость размеры\\n \n", "2437 спасибо я знаю описано как будет строиться станция на 5 этапах материалы для ремонта можно трп пособирать я вчера еще сама могла долететь не очень то и далеко но сейчас посещаю туристические точки экспедиция будет там к пятнице\\n \n", "1835 трудно сказать что просядет а что нет евро до сих пор не подводил хотя есть мысль купить немного банковского золота немного мне предлагали такие маленькие слитки банки продают прикольная штука еще есть монеты банковские из золота я где то читал\\n \n", "4180 я как то покупал такой сухпаек и в одном наверное от удара так же банка открылась вот там так же было внутри хотя срок годности и снаружи вид были в норме что можно сказать бывает\\n \n", "\n", " predicts true_label delta \n", "1600 0.009532 1.0 0.990468 \n", "1027 0.010305 1.0 0.989695 \n", "4177 0.010742 1.0 0.989258 \n", "346 0.012968 1.0 0.987032 \n", "594 0.013991 1.0 0.986009 \n", "... ... ... ... \n", "1370 0.008857 0.0 0.008857 \n", "48 0.008841 0.0 0.008841 \n", "2437 0.008831 0.0 0.008831 \n", "1835 0.008805 0.0 0.008805 \n", "4180 0.008587 0.0 0.008587 \n", "\n", "[4324 rows x 4 columns]" ] }, "execution_count": 406, "metadata": {}, "output_type": "execute_result" } ], "source": [ "check_df" ] }, { "cell_type": "code", "execution_count": null, "id": "cdc649cf", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "deep", "language": "python", "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.10.18" } }, "nbformat": 4, "nbformat_minor": 5 }