{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "n1dFuVqkx7-t"
      },
      "source": [
        " # Modelo BERT (Bidirectional Encoder Representations from Transformers) para análisis de sentimiento\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 42,
      "metadata": {
        "id": "DBIeaZkVcs1T",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "d8d9039e-502f-48fd-9106-e7fa0e2ce514"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Sun Mar 31 15:21:11 2024       \n",
            "+---------------------------------------------------------------------------------------+\n",
            "| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   CUDA Version: 12.2     |\n",
            "|-----------------------------------------+----------------------+----------------------+\n",
            "| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |\n",
            "| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |\n",
            "|                                         |                      |               MIG M. |\n",
            "|=========================================+======================+======================|\n",
            "|   0  Tesla T4                       Off | 00000000:00:04.0 Off |                    0 |\n",
            "| N/A   36C    P8               9W /  70W |      3MiB / 15360MiB |      0%      Default |\n",
            "|                                         |                      |                  N/A |\n",
            "+-----------------------------------------+----------------------+----------------------+\n",
            "                                                                                         \n",
            "+---------------------------------------------------------------------------------------+\n",
            "| Processes:                                                                            |\n",
            "|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |\n",
            "|        ID   ID                                                             Usage      |\n",
            "|=======================================================================================|\n",
            "|  No running processes found                                                           |\n",
            "+---------------------------------------------------------------------------------------+\n"
          ]
        }
      ],
      "source": [
        "!nvidia-smi"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "C4pqs6rbyB_D"
      },
      "source": [
        "# Instalación de librerias"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 43,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RPAgqe5WiRtX",
        "outputId": "4a9168bc-65b0-472e-c278-e3977fdcdc57"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.38.2)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.13.3)\n",
            "Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.20.3)\n",
            "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.25.2)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (24.0)\n",
            "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0.1)\n",
            "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2023.12.25)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.31.0)\n",
            "Requirement already satisfied: tokenizers<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.15.2)\n",
            "Requirement already satisfied: safetensors>=0.4.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.4.2)\n",
            "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.66.2)\n",
            "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (2023.6.0)\n",
            "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (4.10.0)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.3.2)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.6)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.7)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2024.2.2)\n",
            "Requirement already satisfied: emoji in /usr/local/lib/python3.10/dist-packages (2.11.0)\n",
            "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (2.2.1+cu121)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch) (3.13.3)\n",
            "Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.10/dist-packages (from torch) (4.10.0)\n",
            "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch) (1.12)\n",
            "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch) (3.2.1)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch) (3.1.3)\n",
            "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch) (2023.6.0)\n",
            "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.105)\n",
            "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.105)\n",
            "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.105)\n",
            "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /usr/local/lib/python3.10/dist-packages (from torch) (8.9.2.26)\n",
            "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.3.1)\n",
            "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /usr/local/lib/python3.10/dist-packages (from torch) (11.0.2.54)\n",
            "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /usr/local/lib/python3.10/dist-packages (from torch) (10.3.2.106)\n",
            "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /usr/local/lib/python3.10/dist-packages (from torch) (11.4.5.107)\n",
            "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.0.106)\n",
            "Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /usr/local/lib/python3.10/dist-packages (from torch) (2.19.3)\n",
            "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch) (12.1.105)\n",
            "Requirement already satisfied: triton==2.2.0 in /usr/local/lib/python3.10/dist-packages (from torch) (2.2.0)\n",
            "Requirement already satisfied: nvidia-nvjitlink-cu12 in /usr/local/lib/python3.10/dist-packages (from nvidia-cusolver-cu12==11.4.5.107->torch) (12.4.99)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch) (2.1.5)\n",
            "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch) (1.3.0)\n",
            "tar (child): pytorch_weights.tar.gz: Cannot open: No such file or directory\n",
            "tar (child): Error is not recoverable: exiting now\n",
            "tar: Child returned status 2\n",
            "tar: Error is not recoverable: exiting now\n",
            "mv: cannot stat 'config.json': No such file or directory\n",
            "mv: cannot stat 'vocab.txt': No such file or directory\n"
          ]
        }
      ],
      "source": [
        "!pip install transformers\n",
        "!pip install emoji\n",
        "!pip install torch\n",
        "#!wget https://users.dcc.uchile.cl/~jperez/beto/cased_2M/pytorch_weights.tar.gz\n",
        "#!wget https://users.dcc.uchile.cl/~jperez/beto/cased_2M/vocab.txt\n",
        "#!wget https://users.dcc.uchile.cl/~jperez/beto/cased_2M/config.json\n",
        "!tar -xzvf pytorch_weights.tar.gz\n",
        "!mv config.json pytorch/.\n",
        "!mv vocab.txt pytorch/."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 44,
      "metadata": {
        "id": "1acKGOV_nuYU"
      },
      "outputs": [],
      "source": [
        "#Manipular los datos\n",
        "import numpy as np\n",
        "\n",
        "#Leer el conjunto de datos\n",
        "import pandas as pd\n",
        "\n",
        "#Descargar el modelo BERT\n",
        "from transformers import BertModel, BertTokenizer, BertConfig, AdamW, get_linear_schedule_with_warmup\n",
        "\n",
        "#Librería de Deep learning\n",
        "import torch #para implementar red neuronal dentro del modelo BERT\n",
        "from torch import nn, optim #nn = para implementar la red neuronal; optim = entrenar el modelo\n",
        "from torch.utils.data import Dataset, DataLoader, TensorDataset #Ir leyendo el dataset e ir cargando los datos\n",
        "import torch.nn.functional as F\n",
        "\n",
        "#Dividir el conjunto de datos en entrenamiento y prueba\n",
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "## cargar librería para la validación cruzada estratificada\n",
        "from sklearn.model_selection import StratifiedShuffleSplit\n",
        "\n",
        "#Métricas para evaluar el modelo\n",
        "from sklearn.metrics import confusion_matrix, classification_report\n",
        "from sklearn.metrics import accuracy_score, f1_score\n",
        "\n",
        "#Búsqueda de hiperparámetros en red\n",
        "from sklearn.model_selection import ParameterGrid\n",
        "from sklearn.model_selection import GridSearchCV\n",
        "\n",
        "#Visualizar los comentarios de manera fraccionada\n",
        "from textwrap import wrap\n",
        "\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "import emoji\n",
        "\n",
        "#Identificar la cantidad de tiempo en el procesamiento\n",
        "from time import time\n",
        "\n",
        "#Para almacenar el historial de resulatdos de las métricas\n",
        "from collections import defaultdict\n",
        "from pickle import dump, load"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 45,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Hr4exYVlHcRP",
        "outputId": "aeaeedec-ab60-46b8-cfb3-e3bd00f91765"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "cuda:0\n"
          ]
        }
      ],
      "source": [
        "#Utilizar la GPU de GoogleColab para el procesamiento más rápido\n",
        "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
        "print(device)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SiAphY2oymCQ"
      },
      "source": [
        "# Lectura del conjunto de datos\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 46,
      "metadata": {
        "id": "npUE-PmcxWUi",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 423
        },
        "outputId": "d131e5ca-d1e8-4111-ade0-e665c38834bc"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                                                Título Sentimiento_Título  \\\n",
              "0                     Deficiencia en las instalaciones           Negativo   \n",
              "1                                  Propiedad increíble           Positivo   \n",
              "2                                          Lindo hotel           Positivo   \n",
              "3                                  nunca me decepciona           Positivo   \n",
              "4              Excelente opción para la noche de bodas           Positivo   \n",
              "..                                                 ...                ...   \n",
              "345                                         Buen hotel           Positivo   \n",
              "346                                 Excelente atención           Positivo   \n",
              "347  Excelente servicio, cómodas instalaciones y gr...           Positivo   \n",
              "348                                       Buena opcion           Positivo   \n",
              "349                                            ESTADIA             Neutro   \n",
              "\n",
              "                                             Contenido Sentimiento_contenido  \n",
              "0    Las instalaciones en apariencia se amormizan c...              Negativo  \n",
              "1    Encontramos que esta propiedad está en una exc...              Positivo  \n",
              "2    Súper limpio, habitación grande, con mucha luz...              Positivo  \n",
              "3    esta cadena de hoteles nos gusta, llegamos a u...              Positivo  \n",
              "4    El Hotel Dann Carlton de Bucaramanga fue la el...              Positivo  \n",
              "..                                                 ...                   ...  \n",
              "345  Es un buen hotel pero está un poco envejecido,...              Positivo  \n",
              "346  El personal es muy atento. Te guían muy bien. ...              Positivo  \n",
              "347  Nos hospedamos en el Hotel Chicamocha y durant...              Positivo  \n",
              "348  Es un hotel que ofrece aparte del alojamiento ...              Positivo  \n",
              "349  Hice el 11 de septiembre un regalo a unos chic...              Negativo  \n",
              "\n",
              "[350 rows x 4 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-bb81b7ca-61a5-4fc1-bee8-2f7ed71e47b1\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Título</th>\n",
              "      <th>Sentimiento_Título</th>\n",
              "      <th>Contenido</th>\n",
              "      <th>Sentimiento_contenido</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Deficiencia en las instalaciones</td>\n",
              "      <td>Negativo</td>\n",
              "      <td>Las instalaciones en apariencia se amormizan c...</td>\n",
              "      <td>Negativo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Propiedad increíble</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>Encontramos que esta propiedad está en una exc...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Lindo hotel</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>Súper limpio, habitación grande, con mucha luz...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>nunca me decepciona</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>esta cadena de hoteles nos gusta, llegamos a u...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Excelente opción para la noche de bodas</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>El Hotel Dann Carlton de Bucaramanga fue la el...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>345</th>\n",
              "      <td>Buen hotel</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>Es un buen hotel pero está un poco envejecido,...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>346</th>\n",
              "      <td>Excelente atención</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>El personal es muy atento. Te guían muy bien. ...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>347</th>\n",
              "      <td>Excelente servicio, cómodas instalaciones y gr...</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>Nos hospedamos en el Hotel Chicamocha y durant...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>348</th>\n",
              "      <td>Buena opcion</td>\n",
              "      <td>Positivo</td>\n",
              "      <td>Es un hotel que ofrece aparte del alojamiento ...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>349</th>\n",
              "      <td>ESTADIA</td>\n",
              "      <td>Neutro</td>\n",
              "      <td>Hice el 11 de septiembre un regalo a unos chic...</td>\n",
              "      <td>Negativo</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>350 rows × 4 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-bb81b7ca-61a5-4fc1-bee8-2f7ed71e47b1')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-bb81b7ca-61a5-4fc1-bee8-2f7ed71e47b1 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-bb81b7ca-61a5-4fc1-bee8-2f7ed71e47b1');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-50fe8cb4-bc44-4513-990e-9ab340e36c0c\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-50fe8cb4-bc44-4513-990e-9ab340e36c0c')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-50fe8cb4-bc44-4513-990e-9ab340e36c0c button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "  <div id=\"id_6196b86b-e578-4d66-a8ac-34a5c3f3bb68\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_6196b86b-e578-4d66-a8ac-34a5c3f3bb68 button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('df');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 350,\n  \"fields\": [\n    {\n      \"column\": \"T\\u00edtulo\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 299,\n        \"samples\": [\n          \"Mal Hotel.\",\n          \"Muy buen Lugar\",\n          \"Excelente opci\\u00f3n\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Sentimiento_T\\u00edtulo\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"Negativo\",\n          \"Positivo\",\n          \"Neutro\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Contenido\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 350,\n        \"samples\": [\n          \"Este es uno de los peores hoteles en los que me he alojado. Se anuncian a s\\u00ed mismos como un hotel de lujo, pero ni siquiera ofrecen la hospitalidad m\\u00e1s b\\u00e1sica. Tienen la peor situaci\\u00f3n de estacionamiento que he visto en mi vida, es de risa. B\\u00e1sicamente, intentan acomodar 100 autos en un \\u00e1rea dise\\u00f1ada para tal vez 30. Tampoco proporcionan acondicionador y sus duchas est\\u00e1n horriblemente dise\\u00f1adas. Est\\u00e1 completamente abierto y crea un gran riesgo de resbalones en el resto de la habitaci\\u00f3n porque moja todo. Tampoco nos dejaron usar el microondas para calentar la comida. S\\u00ed, no todos los hoteles tienen un microondas en sus habitaciones, pero parece una m\\u00ednima cortes\\u00eda proporcionar uno en un \\u00e1rea com\\u00fan o algo as\\u00ed. Adem\\u00e1s, mientras mi esposa estaba pagando las cosas que hab\\u00edamos cargado a la habitaci\\u00f3n y yo estaba terminando de vestirme y recoger nuestro equipaje, un miembro del personal simplemente irrumpi\\u00f3 en nuestra habitaci\\u00f3n. Totalmente inaceptable irrumpir en nuestra habitaci\\u00f3n y no salir cuando me pidieron que saliera as\\u00ed cuando todav\\u00eda estaba visti\\u00e9ndome.\\n\\nNo hay nada bonito ni lujoso en este hotel. Nos trataron como si les estuvi\\u00e9ramos imponiendo todo el tiempo. Terrible, terrible, \\u201chospitalidad\\u201d. Evitar\\u00e9 esta cadena como la peste en el futuro.\",\n          \"El personal muy cordial y amable 10/10, el desayuno muy rico pero con poca variedad 4/10 y la red de WI-FI para aquellos que vienen de negocios y necesitan adelantar trabajo o conectarse a reuniones 1/10\",\n          \"Es un hotel peque\\u00f1o, con un buen dise\\u00f1o, acogedor y bien ubicado; tienen implementados protocolos de bioseguridad que hacen que los hu\\u00e9spedes se sientan seguros; la zona tiene bastantes establecimientos comerciales y parques donde salir a caminar.\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Sentimiento_contenido\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"Negativo\",\n          \"Positivo\",\n          \"Neutro\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 46
        }
      ],
      "source": [
        "df = pd.read_excel('dataset_manual.xlsx', sheet_name = 'datos (2)')\n",
        "df"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#Selección del subconjunto de contenido y sentimiento de los comentarios\n",
        "df_contenido = df[['Contenido', 'Sentimiento_contenido']]\n",
        "df_contenido.head()"
      ],
      "metadata": {
        "id": "N7iYEFbbg98N",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        },
        "outputId": "006f6c13-1391-48e6-cdb9-55c58c5f8e36"
      },
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                                           Contenido Sentimiento_contenido\n",
              "0  Las instalaciones en apariencia se amormizan c...              Negativo\n",
              "1  Encontramos que esta propiedad está en una exc...              Positivo\n",
              "2  Súper limpio, habitación grande, con mucha luz...              Positivo\n",
              "3  esta cadena de hoteles nos gusta, llegamos a u...              Positivo\n",
              "4  El Hotel Dann Carlton de Bucaramanga fue la el...              Positivo"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-d8dfcf46-fde9-4146-8694-47532834d261\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Contenido</th>\n",
              "      <th>Sentimiento_contenido</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Las instalaciones en apariencia se amormizan c...</td>\n",
              "      <td>Negativo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Encontramos que esta propiedad está en una exc...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Súper limpio, habitación grande, con mucha luz...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>esta cadena de hoteles nos gusta, llegamos a u...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>El Hotel Dann Carlton de Bucaramanga fue la el...</td>\n",
              "      <td>Positivo</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d8dfcf46-fde9-4146-8694-47532834d261')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-d8dfcf46-fde9-4146-8694-47532834d261 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-d8dfcf46-fde9-4146-8694-47532834d261');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-d7b42329-1cfc-4f94-9967-16983cc1dedc\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-d7b42329-1cfc-4f94-9967-16983cc1dedc')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-d7b42329-1cfc-4f94-9967-16983cc1dedc button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df_contenido",
              "summary": "{\n  \"name\": \"df_contenido\",\n  \"rows\": 350,\n  \"fields\": [\n    {\n      \"column\": \"Contenido\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 350,\n        \"samples\": [\n          \"Este es uno de los peores hoteles en los que me he alojado. Se anuncian a s\\u00ed mismos como un hotel de lujo, pero ni siquiera ofrecen la hospitalidad m\\u00e1s b\\u00e1sica. Tienen la peor situaci\\u00f3n de estacionamiento que he visto en mi vida, es de risa. B\\u00e1sicamente, intentan acomodar 100 autos en un \\u00e1rea dise\\u00f1ada para tal vez 30. Tampoco proporcionan acondicionador y sus duchas est\\u00e1n horriblemente dise\\u00f1adas. Est\\u00e1 completamente abierto y crea un gran riesgo de resbalones en el resto de la habitaci\\u00f3n porque moja todo. Tampoco nos dejaron usar el microondas para calentar la comida. S\\u00ed, no todos los hoteles tienen un microondas en sus habitaciones, pero parece una m\\u00ednima cortes\\u00eda proporcionar uno en un \\u00e1rea com\\u00fan o algo as\\u00ed. Adem\\u00e1s, mientras mi esposa estaba pagando las cosas que hab\\u00edamos cargado a la habitaci\\u00f3n y yo estaba terminando de vestirme y recoger nuestro equipaje, un miembro del personal simplemente irrumpi\\u00f3 en nuestra habitaci\\u00f3n. Totalmente inaceptable irrumpir en nuestra habitaci\\u00f3n y no salir cuando me pidieron que saliera as\\u00ed cuando todav\\u00eda estaba visti\\u00e9ndome.\\n\\nNo hay nada bonito ni lujoso en este hotel. Nos trataron como si les estuvi\\u00e9ramos imponiendo todo el tiempo. Terrible, terrible, \\u201chospitalidad\\u201d. Evitar\\u00e9 esta cadena como la peste en el futuro.\",\n          \"El personal muy cordial y amable 10/10, el desayuno muy rico pero con poca variedad 4/10 y la red de WI-FI para aquellos que vienen de negocios y necesitan adelantar trabajo o conectarse a reuniones 1/10\",\n          \"Es un hotel peque\\u00f1o, con un buen dise\\u00f1o, acogedor y bien ubicado; tienen implementados protocolos de bioseguridad que hacen que los hu\\u00e9spedes se sientan seguros; la zona tiene bastantes establecimientos comerciales y parques donde salir a caminar.\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Sentimiento_contenido\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"Negativo\",\n          \"Positivo\",\n          \"Neutro\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 48
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Reemplazar etiquetas textuales del sentimiento por etiquetas numéricas\n",
        "#* Negativo = 0\n",
        "#* Neutro = 1\n",
        "#* Positivo = 2\n",
        "\n",
        "df_contenido['Sentimiento_contenido'].replace({'Negativo': 0, 'Neutro': 1, 'Positivo': 2}, inplace=True)\n",
        "\n",
        "print(df_contenido)"
      ],
      "metadata": {
        "id": "CiEtvA3KhP_h",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "fe7a172a-52b4-4ab2-df5b-853dda328c9d"
      },
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "                                             Contenido  Sentimiento_contenido\n",
            "0    Las instalaciones en apariencia se amormizan c...                      0\n",
            "1    Encontramos que esta propiedad está en una exc...                      2\n",
            "2    Súper limpio, habitación grande, con mucha luz...                      2\n",
            "3    esta cadena de hoteles nos gusta, llegamos a u...                      2\n",
            "4    El Hotel Dann Carlton de Bucaramanga fue la el...                      2\n",
            "..                                                 ...                    ...\n",
            "345  Es un buen hotel pero está un poco envejecido,...                      2\n",
            "346  El personal es muy atento. Te guían muy bien. ...                      2\n",
            "347  Nos hospedamos en el Hotel Chicamocha y durant...                      2\n",
            "348  Es un hotel que ofrece aparte del alojamiento ...                      2\n",
            "349  Hice el 11 de septiembre un regalo a unos chic...                      0\n",
            "\n",
            "[350 rows x 2 columns]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-49-96d92c8129dc>:6: SettingWithCopyWarning: \n",
            "A value is trying to be set on a copy of a slice from a DataFrame\n",
            "\n",
            "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
            "  df_contenido['Sentimiento_contenido'].replace({'Negativo': 0, 'Neutro': 1, 'Positivo': 2}, inplace=True)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#cambiar el nombre de las columnas del subconjunto de datos\n",
        "\n",
        "df_contenido = df_contenido.rename(columns={'Contenido': 'Comentario', 'Sentimiento_contenido': 'Label'})"
      ],
      "metadata": {
        "id": "PvFwdLedhrw1"
      },
      "execution_count": 50,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#Visualizar características del conjunto de datos\n",
        "print(df_contenido.head())\n",
        "print(df_contenido.shape) #tamaño del conjunto de datos\n",
        "print(\"\\n\".join(wrap(df_contenido['Comentario'][300]))) #Visualizar el comentario 300"
      ],
      "metadata": {
        "id": "674pB9pAoBKD",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "620b666a-c2bf-48c3-c99e-f9be47b43610"
      },
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "                                          Comentario  Label\n",
            "0  Las instalaciones en apariencia se amormizan c...      0\n",
            "1  Encontramos que esta propiedad está en una exc...      2\n",
            "2  Súper limpio, habitación grande, con mucha luz...      2\n",
            "3  esta cadena de hoteles nos gusta, llegamos a u...      2\n",
            "4  El Hotel Dann Carlton de Bucaramanga fue la el...      2\n",
            "(350, 2)\n",
            "Mi estancia en el Hotel Bari me pareció muy cómoda y estuve feliz con\n",
            "mi estancia. El hotel cumple con los estándares internacionales, lo\n",
            "cual fue bueno ya que estuve allí por negocios. Internet era rápido y\n",
            "el desayuno era bueno. Me doy cuenta de que atienden principalmente a\n",
            "una clientela de habla hispana, aunque me gustaría que hubiera al\n",
            "menos un canal de noticias internacional en la televisión. También\n",
            "hubiera sido bueno tener tazas o vasos en la habitación.\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Definir conjunto de comentarios y etiquetas de los sentimientos\n",
        "Comentarios = df_contenido['Comentario'].tolist()  # Lista de los comentarios en tipo string para tokenizarlos\n",
        "labels = df_contenido['Label'].tolist()  # List of corresponding labels"
      ],
      "metadata": {
        "id": "shqXaiO83Y3T"
      },
      "execution_count": 52,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "MAX_LEN = None #número de palabras en cada comentario\n",
        "RANDOM_STATE = 432\n",
        "n_classes=3\n",
        "\n",
        "np.random.seed(RANDOM_STATE)\n",
        "torch.manual_seed(RANDOM_STATE)"
      ],
      "metadata": {
        "id": "8B2GiEpE6JYM",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "bdf185ce-e969-409e-8079-6f43214f36c9"
      },
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<torch._C.Generator at 0x79d0102eafd0>"
            ]
          },
          "metadata": {},
          "execution_count": 54
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Definir los hiperparámetros y la red de parámetros\n",
        "\n",
        "\n",
        "param_grid = {\n",
        "    'learning_rate': [3e-5],  # Learning rates to tune , 2e-5,3e-5,5e-5, 6e-5, 7e-5, 8e-5, 1e-4\n",
        "    'batch_size': [32],  # #tamaño del bloque, cada bloque tiene xx comentarios 32\n",
        "    'epochs': [5],  # Number of epochs to train 3,4,5\n",
        "    'weight decay': [0.1],\n",
        "    'warmup ratio': [0.08] # 0.06,0.08,0.1\n",
        "}\n"
      ],
      "metadata": {
        "id": "dsRx3nz4ENFD"
      },
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Step 1: Tokenization: tomar el texto original y tokenizarlo\n",
        "pre_entrenado_modelo = 'bert-base-multilingual-cased'\n",
        "tokenizer = BertTokenizer.from_pretrained(pre_entrenado_modelo)\n",
        "\n",
        "# CREACIÓN DEL DATASET: clase para leer aleatoriamente los datos del conjunto de datos\n",
        "\n",
        "class UBDataset(Dataset):\n",
        "\n",
        "  def __init__(self,comentarios,labels, tokenizer,max_len):\n",
        "    self.comentarios = comentarios\n",
        "    self.labels = labels\n",
        "    self.tokenizer = tokenizer\n",
        "    self.max_len = max_len\n",
        "\n",
        "  def __len__(self):\n",
        "      return len(self.comentarios) #Longitud del conjunto de datos\n",
        "\n",
        "  def __getitem__(self, idx):\n",
        "    #getitem: es la función que pytorch va llamando para leer del conjunto de datos y seleccionar aleatoriamente paquetes del tamaño de Batch y presentarlos al modelo\n",
        "    comentario = str(self.comentarios[idx]) #para seleccionar un comentario str(self.comentarios[idx])\n",
        "    label = self.labels[idx]   #Seleccionar la etiqueta del comentario\n",
        "\n",
        "#Hasta este punto se tiene el conjunto de datos que requiere procesos para\n",
        "#configurarlo según entrada requerida por BERT\n",
        "\n",
        "    encoding = self.tokenizer(\n",
        "              comentario, #Texto a codificar\n",
        "              max_length = self.max_len, #longitud máxima del texto\n",
        "              truncation = True, #evalúa la cantidad de palabras configuradas en max_lenght\n",
        "              add_special_tokens = True, #Añadir el token de inicio \"CLS\", el token de separación \"SEP\" y los tokens vacíos\n",
        "              #return_token_type_ids = False, #No retornar los ids\n",
        "              padding='max_length',\n",
        "              #pad_to_max_length = True, #Si la frase tiene menos de la cantidad de max_lenght, lo que falta lo rellene con el token de pad\n",
        "              return_attention_mask =True, #enmascarar solamente el contenido del texto [etiqueta de 1] y no los tokens vacíos [etiqueta de 0]\n",
        "              return_tensors = 'pt' #la frase estará convertida en una cantidad numérica\n",
        "    )\n",
        "\n",
        "#Configurar el texto que devuelve la función\n",
        "\n",
        "    return {\n",
        "          'comentario': comentario,\n",
        "          'input_ids': encoding['input_ids'].flatten(), #inputs_ids=representaciones numéricas de cada token\n",
        "          'attention_mask': encoding['attention_mask'].flatten(),#,squeeze()\n",
        "          'label': torch.tensor(label, dtype=torch.long) #devuelve la etiqueta del sentimiento en el formato de pytorch\n",
        "      }\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "yMrTAghFP9tW"
      },
      "execution_count": 56,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#Tokenización de comentarios\n",
        "tokenized_Comentarios = tokenizer(Comentarios,\n",
        "                                  padding = True, #automáticamente coloca PAD a los comentarios hasta completar la máxima longitud\n",
        "                                  truncation = True, #evalúa la cantidad de palabras configuradas en max_lenght\n",
        "                                  return_tensors = 'pt') #la frase estará convertida en una cantidad numérica en formato Pytorch"
      ],
      "metadata": {
        "id": "Idt5-6XXGs4K"
      },
      "execution_count": 57,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Step 2: Conversion al formato de entrada de BERT\n",
        "input_ids = tokenized_Comentarios['input_ids'] #Contiene la secuencia  de entreda tokenizada\n",
        "attention_masks = tokenized_Comentarios['attention_mask'] #contiene el enmascaramiento del contenido del texto [etiqueta de 1] y los tokens vacíos [etiqueta de 0]"
      ],
      "metadata": {
        "id": "0nUzWVfmHQ8G"
      },
      "execution_count": 58,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Step 3: Generación de Emdeddings\n",
        "bert_model = BertModel.from_pretrained('bert-base-multilingual-cased') # Cargar los pesos pre-entrenados para el modelo BERT multilingue tokenzizado que reconoce mayúsculas y minúsculas\n",
        "with torch.no_grad(): # se utiliza para ahorrar memoria, evitando que PyTorch rastree operaciones en su interior para el cálculo del gradiente\n",
        "    outputs = bert_model(input_ids,attention_mask=attention_masks) ##pasar los \"input_ids\" y los \"attention_mask\" al modelo BERT\n",
        "    # BERT embeddings\n",
        "    embeddings = outputs.last_hidden_state  # \"outputs.last_hidden_state\" recupera los estados de la última capa del modelo BERT para cada token de la secuencia de entrada"
      ],
      "metadata": {
        "id": "vik9EslcHhhy"
      },
      "execution_count": 59,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Step 4: Convertir los embeddings y etiquetas(lables) a un array de numpy\n",
        "embeddings = embeddings.numpy()\n",
        "labels = np.array(labels)"
      ],
      "metadata": {
        "id": "ZN5ikrHgJbfX"
      },
      "execution_count": 60,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#Comprobar tamaños de Embeddings y labels\n",
        "print(\"Embeddings shape:\", embeddings.shape)\n",
        "print(\"Labels shape:\", labels.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Wob9mdSY7nVW",
        "outputId": "8ee438d6-034d-4d86-ee18-f398a3ad96e6"
      },
      "execution_count": 61,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Embeddings shape: (350, 512, 768)\n",
            "Labels shape: (350,)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#Step 5: Dividir el conjunto de datos en entrenamiento y prueba utilizando \"StratifiedShuffleSplit\"\n",
        "\n",
        "sss = StratifiedShuffleSplit(n_splits=10, #2\n",
        "                             test_size=0.2,\n",
        "                             random_state=RANDOM_STATE)\n",
        "\n",
        "# Loop para dividir conjuntos de datos de entrenamiento y prueba\n",
        "\n",
        "for train_indices, test_indices in sss.split(embeddings, labels):\n",
        "\n",
        "    # Dividir el texto\n",
        "    train_texts = [Comentarios[i] for i in train_indices]\n",
        "    test_texts = [Comentarios[i] for i in test_indices]\n",
        "\n",
        "    #Embeddeings para conjuntos de entrenamiento y prueba\n",
        "    train_embeddings = embeddings[train_indices]\n",
        "    test_embeddings = embeddings[test_indices]\n",
        "\n",
        "    #Seleccionar las etiquetas para cada conjunto de entrenamiento y prueba\n",
        "    train_labels = labels[train_indices]\n",
        "    test_labels = labels[test_indices]\n",
        "\n",
        "    test_embeddings_tensor = torch.tensor(test_embeddings)\n",
        "    test_labels_tensor = torch.tensor(test_labels)"
      ],
      "metadata": {
        "id": "SXeK2_w3Si2s"
      },
      "execution_count": 62,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#Comprbar tamaños de Train indices y test indices\n",
        "for train_indices, test_indices in sss.split(embeddings, labels):\n",
        "    print(\"Train indices:\", train_indices.shape)\n",
        "    print(\"Test indices:\", test_indices.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "K1UwXKQQ7y8m",
        "outputId": "9614e2d5-38ea-4e0f-bfdc-53b65ae69ebc"
      },
      "execution_count": 63,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n",
            "Train indices: (280,)\n",
            "Test indices: (70,)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Combinaciones de parámetros\n",
        "param_combinations = ParameterGrid(param_grid)"
      ],
      "metadata": {
        "id": "MAgMcc-voECw"
      },
      "execution_count": 64,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Iterar sobre todas las combinaciones de hiperparámetros\n",
        "%%time\n",
        "\n",
        "history_params = []\n",
        "\n",
        "tiempo_inicial = time()\n",
        "\n",
        "\n",
        "for params in param_combinations:\n",
        "\n",
        "  # Extraer hiperparámetros\n",
        "    lr = params['learning_rate']\n",
        "    batch_size = params['batch_size']\n",
        "    epochs = params['epochs']\n",
        "    weight_decay = params['weight decay']\n",
        "    warmup_ratio = params['warmup ratio']\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Crear conjuntos de datos de entrenamiento y prueba\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "\n",
        "    train_data = UBDataset(train_embeddings,\n",
        "                          train_labels,\n",
        "                          tokenizer,\n",
        "                          max_len = MAX_LEN)\n",
        "\n",
        "    test_data = UBDataset(test_embeddings,\n",
        "                          test_labels,\n",
        "                          tokenizer,\n",
        "                          max_len = MAX_LEN)\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Crear DataLoader para entrenamiento y prueba\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    train_loader = DataLoader(train_data,\n",
        "                              batch_size = batch_size,\n",
        "                              shuffle=True\n",
        "                              )\n",
        "\n",
        "    test_loader = DataLoader(test_data,\n",
        "                            batch_size = batch_size,\n",
        "                            shuffle=False)\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Definir el modelo de la red neuronal\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "\n",
        "    class BERTSentimentClassifier(nn.Module): #nn cargado de pytorch\n",
        "\n",
        "      def __init__(self, n_classes):\n",
        "        super(BERTSentimentClassifier, self).__init__()\n",
        "        self.bert = BertModel.from_pretrained(pre_entrenado_modelo) #Cargar el modelo pre-entrenado de BERT\n",
        "        self.drop = nn.Dropout(p=0.3)#para controlar el sobreajuste y ganantizar la generalización del modelo\n",
        "        self.linear = nn.Linear(self.bert .config.hidden_size, n_classes) #n_classes:=3;red neuronal con una capa lineal; self.bert.config.hidden_size= número de neuronas de entrada que son las mismas neuronas de la salida de BERT, n_classes =# de neuronas de salida\n",
        "        self.gelu = nn.GELU() #funcion utilizada en bert en las capas internas, GELU combina y mejora los resultados por ser una distribución acumulativa, usada en NLP\n",
        "        self.softmax = nn.Softmax(dim=1) # salida de probabilidades cuando se tienen mas de dos categorias\n",
        "\n",
        "    #definir cómo se conectan las capas\n",
        "      def forward(self, input_ids, attention_mask):\n",
        "        #definir que primero los datos se procesan en BERT\n",
        "        _, cls_output = self.bert(\n",
        "            input_ids = input_ids,\n",
        "            attention_mask = attention_mask,\n",
        "            return_dict=False\n",
        "        )\n",
        "        drop_output = self.drop(cls_output)\n",
        "        output = self.linear(drop_output)\n",
        "        output = self.gelu(output)\n",
        "        return self.softmax(output) #devuelve la etiqueta del sentimiento\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Definir el modelo\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    model = BERTSentimentClassifier(n_classes)#NCLASSES=3\n",
        "    #model = model.to(device) #Entrena el modelo en la GPU\n",
        "\n",
        "    # Initialize defaultdicts to store training and test history\n",
        "    train_history = defaultdict(list)\n",
        "    test_history = defaultdict(list)\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    #Definir la función del optimizador utilizando el optimizador AdamW\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    optimizer = AdamW(model.parameters(),\n",
        "                                  lr= lr, #2e-5,\n",
        "                                  weight_decay = weight_decay,\n",
        "                                  correct_bias = False, #correct_bias =false: no modifique los parámetros del optimizador\n",
        "                                  no_deprecation_warning=True)\n",
        "\n",
        "    # Número total de pasos de entrenamiento (epochs * número de batches)\n",
        "    total_steps = len(train_loader) * epochs\n",
        "\n",
        "    # Calcular el número de warmup steps\n",
        "    warmup_steps = total_steps * warmup_ratio\n",
        "\n",
        "    # Create the learning rate scheduler with warmup\n",
        "    scheduler = get_linear_schedule_with_warmup(optimizer,\n",
        "                                                num_warmup_steps=warmup_steps,\n",
        "                                                num_training_steps=total_steps)\n",
        "\n",
        "    # Almacenar la métrica de desempeño: accuracy\n",
        "    train_accuracy_scores = []\n",
        "    test_accuracy_scores = []\n",
        "    train_f1_scores = []\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Loop para entrenar el modelo\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    model.train()\n",
        "\n",
        "    for epoch in range(epochs):\n",
        "        print('Epoch {} de {}'.format(epoch+1, epochs))\n",
        "        print('------------------')\n",
        "        epoch_correct_predictions = 0\n",
        "        total_samples = 0\n",
        "        train_loss = 0\n",
        "\n",
        "        for batch in train_loader:\n",
        "                optimizer.zero_grad() #reiniciar los gradientes para la siguiente iteración\n",
        "                input_ids = batch['input_ids']\n",
        "                labels = batch['label']\n",
        "                attention_mask = (input_ids != 0).float()\n",
        "\n",
        "                #salidas del modelo\n",
        "                outputs = model(input_ids=input_ids,\n",
        "                                attention_mask=attention_mask)\n",
        "\n",
        "                #calcular el error\n",
        "                loss = nn.CrossEntropyLoss()(outputs, labels)\n",
        "                train_loss += loss.item()\n",
        "\n",
        "                #Calcular el accuracy para el actual batch del conjunto de entrenamiento\n",
        "                _, predicted = torch.max(outputs, dim=1)\n",
        "                batch_correct_predictions = (predicted == labels).sum().item()\n",
        "                epoch_correct_predictions += batch_correct_predictions\n",
        "                total_samples += labels.size(0)\n",
        "\n",
        "                #el error se regresa a la entrada de BERT para actualizar los pesos\n",
        "                loss.backward()\n",
        "\n",
        "                #actualizar el optimizador\n",
        "                optimizer.step()\n",
        "\n",
        "                #actualizar la tasa de entrenamiento\n",
        "                scheduler.step()\n",
        "\n",
        "        #Calcular el accuracy del epoch en el conjunto de entrenamiento\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        epoch_accuracy = epoch_correct_predictions / total_samples\n",
        "        train_accuracy_scores.append(epoch_accuracy)\n",
        "\n",
        "        #Calcular el loss promedio para el epoch\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        avg_train_loss = train_loss / len(train_loader)\n",
        "\n",
        "        #Calcular la métrica F1 score en el conjunto de entrenamiento\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        all_labels = torch.cat([batch['label'] for batch in train_loader]).numpy()\n",
        "        all_predicted = torch.cat([torch.argmax(model(batch['input_ids'], batch['attention_mask']), dim=1) for batch in train_loader]).numpy()\n",
        "        train_f1 = f1_score(all_labels, all_predicted, average='macro')\n",
        "        train_f1_scores.append(train_f1)\n",
        "\n",
        "       #-----------------------------------------------------------------------------------------\n",
        "       # Guardar métricas del epoch en el historial de entrenamiento\n",
        "       #-----------------------------------------------------------------------------------------\n",
        "        train_history['loss_train'].append(train_loss)\n",
        "        train_history['accuracy_train'].append(epoch_accuracy)\n",
        "        train_history['train_f1'].append(train_f1)\n",
        "\n",
        "        print('Training Loss: {:.4f}, Accuracy: {:.4f}'.format(train_loss, epoch_accuracy))\n",
        "\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        # Prueba del modelo\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        model.eval()\n",
        "        test_loss = 0\n",
        "        predictions = []\n",
        "        test_true_labels = []\n",
        "\n",
        "        with torch.no_grad():\n",
        "            for batch in test_loader:\n",
        "                input_ids_test = batch['input_ids']\n",
        "\n",
        "              # attention mask del conjunto de prueba\n",
        "                attention_mask_test = (input_ids_test != 0).float()\n",
        "\n",
        "                # Convertir los embeddings y labels del conjunto test\n",
        "                test_labels_tensor = batch['label']\n",
        "\n",
        "                outputs_test = model(input_ids_test,\n",
        "                                    attention_mask=attention_mask_test)\n",
        "\n",
        "                #calcular el error del test dataset\n",
        "                loss_test = nn.CrossEntropyLoss()(outputs_test, test_labels_tensor)#### revisar labels=test_labels\n",
        "                test_loss += loss_test.item()\n",
        "\n",
        "                #Calcular accuracy del test dataset\n",
        "                _, predicted = torch.max(outputs_test, dim=1)\n",
        "\n",
        "                #Para almacenar las predicciones y las etiquetas verdaderas\n",
        "                predictions.extend(predicted.tolist())\n",
        "                test_true_labels.extend(test_labels_tensor.tolist())\n",
        "\n",
        "                #predictions.extend(test_labels_tensor.tolist())\n",
        "                test_accuracy = (predicted == test_labels_tensor).sum().item() / len(test_labels_tensor)\n",
        "        test_accuracy_scores.append(test_accuracy)\n",
        "\n",
        "        #Calcular la perdida promedio para el epoch\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        avg_test_loss = test_loss / len(test_loader)\n",
        "\n",
        "        #calcular el F1 Score en el conjunto de prueba\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        test_f1 = f1_score(test_true_labels,\n",
        "                          predictions,\n",
        "                          average='macro')\n",
        "\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        # Guardar métricas en el historial de prueba\n",
        "        #-----------------------------------------------------------------------------------------\n",
        "        test_history['loss_test'].append(test_loss)\n",
        "        test_history['accuracy_test'].append(test_accuracy)\n",
        "        test_history['test_f1'].append(test_f1)\n",
        "\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    # Guardar los hipreparámetros con las métricas\n",
        "    #-----------------------------------------------------------------------------------------\n",
        "    history_params.append({'lr': lr, 'batch_size': batch_size, 'epochs': epochs, 'weight_decay': weight_decay, 'warmup_ratio':warmup_ratio,\n",
        "                              'loss_train': train_loss, 'accuracy_train': epoch_accuracy, 'train_f1': train_f1,\n",
        "                              'loss_test': test_loss, 'accuracy_test': test_accuracy, 'test_f1': test_f1 })\n",
        "\n",
        "\n",
        "    print('Test Loss: {:.4f}, Accuracy: {:.4f}'.format(test_loss, test_accuracy))\n",
        "    print('')\n",
        "    print('Entrenamiento: accuracy: {}'.format(train_accuracy_scores))\n",
        "    print('Prueba: accuracy: {}'.format(test_accuracy_scores))\n",
        "    print('')\n",
        "\n",
        "    tiempo_final = time()\n",
        "\n",
        "    # Calculate average performance metrics across all folds for current test size\n",
        "    #average_accuracy = sum(accuracy_scores) / len(accuracy_scores)\n",
        "    #print(\"Average Accuracy:\", average_accuracy)\n",
        "    #avg_test_loss = total_test_loss / len(test_loader)\n",
        "    print(train_accuracy_scores)\n",
        "    print(test_accuracy_scores)\n",
        "    print(train_loss)\n",
        "    print(test_loss)\n",
        "\n",
        "    tiempo_ejecucion = tiempo_final - tiempo_inicial\n",
        "    print('\\nEl tiempo, en min, de ejecucion fue:%s'% str(tiempo_ejecucion/60))"
      ],
      "metadata": {
        "id": "orjMz8hpIUm-",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "f313b83e-f686-4551-87f7-7f00a2a5f90d"
      },
      "execution_count": 65,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1 de 5\n",
            "------------------\n",
            "Training Loss: 8.5154, Accuracy: 0.6357\n",
            "Epoch 2 de 5\n",
            "------------------\n",
            "Training Loss: 7.6290, Accuracy: 0.7036\n",
            "Epoch 3 de 5\n",
            "------------------\n",
            "Training Loss: 7.6948, Accuracy: 0.7036\n",
            "Epoch 4 de 5\n",
            "------------------\n",
            "Training Loss: 7.6521, Accuracy: 0.7036\n",
            "Epoch 5 de 5\n",
            "------------------\n",
            "Training Loss: 7.6416, Accuracy: 0.7036\n",
            "Test Loss: 2.5819, Accuracy: 0.6667\n",
            "\n",
            "Entrenamiento: accuracy: [0.6357142857142857, 0.7035714285714286, 0.7035714285714286, 0.7035714285714286, 0.7035714285714286]\n",
            "Prueba: accuracy: [0.6666666666666666, 0.6666666666666666, 0.6666666666666666, 0.6666666666666666, 0.6666666666666666]\n",
            "\n",
            "[0.6357142857142857, 0.7035714285714286, 0.7035714285714286, 0.7035714285714286, 0.7035714285714286]\n",
            "[0.6666666666666666, 0.6666666666666666, 0.6666666666666666, 0.6666666666666666, 0.6666666666666666]\n",
            "7.641577124595642\n",
            "2.581861138343811\n",
            "\n",
            "El tiempo, en min, de ejecucion fue:54.80433445374171\n",
            "CPU times: user 2h 44min 23s, sys: 46min 6s, total: 3h 30min 29s\n",
            "Wall time: 54min 48s\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Obtener el histórico de la red de parámetros con las respectivas métricas\n",
        "history_params"
      ],
      "metadata": {
        "id": "SijZ9hX-h6VZ",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "9fb8629f-2d1f-4b99-9955-0f347981ebeb"
      },
      "execution_count": 66,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[{'lr': 3e-05,\n",
              "  'batch_size': 32,\n",
              "  'epochs': 5,\n",
              "  'weight_decay': 0.1,\n",
              "  'warmup_ratio': 0.08,\n",
              "  'loss_train': 7.641577124595642,\n",
              "  'accuracy_train': 0.7035714285714286,\n",
              "  'train_f1': 0.2753319357092942,\n",
              "  'loss_test': 2.581861138343811,\n",
              "  'accuracy_test': 0.6666666666666666,\n",
              "  'test_f1': 0.2745098039215686}]"
            ]
          },
          "metadata": {},
          "execution_count": 66
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Verificar el type\n",
        "type(history_params)"
      ],
      "metadata": {
        "id": "yyQu0POgyFzc",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "a92f2472-d84a-4c91-f38d-8ffbc047c3e9"
      },
      "execution_count": 67,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "list"
            ]
          },
          "metadata": {},
          "execution_count": 67
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Transformar la lista del histórico a un DataFrame\n",
        "histórico_resultados = pd.DataFrame(history_params)\n",
        "print(histórico_resultados)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WyqsBrCKyAag",
        "outputId": "3aab65a6-94f5-4786-b85b-262b65aeba1b"
      },
      "execution_count": 68,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "        lr  batch_size  epochs  weight_decay  warmup_ratio  loss_train  \\\n",
            "0  0.00003          32       5           0.1          0.08    7.641577   \n",
            "\n",
            "   accuracy_train  train_f1  loss_test  accuracy_test  test_f1  \n",
            "0        0.703571  0.275332   2.581861       0.666667  0.27451  \n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#exportar historial de parámetros y métricas\n",
        "histórico_resultados.to_excel('histórico1.xlsx', index=False)"
      ],
      "metadata": {
        "id": "q-43yFfait-v"
      },
      "execution_count": 69,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#identificar los hiperparámetros que dan el máximo Accuracy\n",
        "accuracy_max = histórico_resultados.loc[histórico_resultados['accuracy_test'].idxmax()]\n",
        "\n",
        "print(\"Fila con el máximo valor en la columna 'Accuracy_test':\")\n",
        "print(accuracy_max)"
      ],
      "metadata": {
        "id": "eGLxFKaIrYvk",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "2dc330b0-74c6-4ae5-b58e-15d256ea77ab"
      },
      "execution_count": 70,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fila con el máximo valor en la columna 'Accuracy_test':\n",
            "lr                 0.000030\n",
            "batch_size        32.000000\n",
            "epochs             5.000000\n",
            "weight_decay       0.100000\n",
            "warmup_ratio       0.080000\n",
            "loss_train         7.641577\n",
            "accuracy_train     0.703571\n",
            "train_f1           0.275332\n",
            "loss_test          2.581861\n",
            "accuracy_test      0.666667\n",
            "test_f1            0.274510\n",
            "Name: 0, dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#identificar los hiperparámetros que dan el máximo F1_Scores\n",
        "F1_max = histórico_resultados.loc[histórico_resultados['test_f1'].idxmax()]\n",
        "\n",
        "print(\"Fila con el máximo valor en la columna 'F1_Score':\")\n",
        "print(F1_max)"
      ],
      "metadata": {
        "id": "shVybsPCsEmo",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "a319b5f6-036b-4924-e062-98ca849f062d"
      },
      "execution_count": 71,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fila con el máximo valor en la columna 'F1_Score':\n",
            "lr                 0.000030\n",
            "batch_size        32.000000\n",
            "epochs             5.000000\n",
            "weight_decay       0.100000\n",
            "warmup_ratio       0.080000\n",
            "loss_train         7.641577\n",
            "accuracy_train     0.703571\n",
            "train_f1           0.275332\n",
            "loss_test          2.581861\n",
            "accuracy_test      0.666667\n",
            "test_f1            0.274510\n",
            "Name: 0, dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "#identificar los hiperparámetros que dan el mínimo en Loss\n",
        "loss_min= histórico_resultados.loc[histórico_resultados['loss_test'].idxmin()]\n",
        "\n",
        "print(\"Fila con el menor valor en la columna 'Loss':\")\n",
        "print(loss_min)"
      ],
      "metadata": {
        "id": "PEb71IXLsYdn",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "a0f7a625-ab90-42bf-e401-c1011301411b"
      },
      "execution_count": 72,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fila con el menor valor en la columna 'Loss':\n",
            "lr                 0.000030\n",
            "batch_size        32.000000\n",
            "epochs             5.000000\n",
            "weight_decay       0.100000\n",
            "warmup_ratio       0.080000\n",
            "loss_train         7.641577\n",
            "accuracy_train     0.703571\n",
            "train_f1           0.275332\n",
            "loss_test          2.581861\n",
            "accuracy_test      0.666667\n",
            "test_f1            0.274510\n",
            "Name: 0, dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Select rows where column 'A' is greater than 2 and column 'B' is 'c'\n",
        "selected_BestParameters = histórico_resultados.loc[(histórico_resultados['accuracy_test'].idxmax()) & (histórico_resultados['test_f1'].idxmax()) & (histórico_resultados['loss_test'].idxmin())]\n",
        "BestParameters=selected_BestParameters[0:5,]\n",
        "print(\"Mejores parámetros:\")\n",
        "print(selected_BestParameters)\n",
        "print(BestParameters)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "IBkOdcQ405We",
        "outputId": "05a88a9b-fb8a-4efe-90ae-1a853adaa59d"
      },
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mejores parámetros:\n",
            "lr                 0.000100\n",
            "batch_size        32.000000\n",
            "epochs             5.000000\n",
            "weight_decay       0.100000\n",
            "warmup_ratio       0.100000\n",
            "loss_train         7.640108\n",
            "accuracy_train     0.703571\n",
            "train_f1           0.275332\n",
            "loss_test          2.581424\n",
            "accuracy_test      0.666667\n",
            "test_f1            0.274510\n",
            "Name: 0, dtype: float64\n",
            "lr               0.0001\n",
            "batch_size      32.0000\n",
            "epochs           5.0000\n",
            "weight_decay     0.1000\n",
            "warmup_ratio     0.1000\n",
            "Name: 0, dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Revisión de métricas\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "uxeuT3eOtNla"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Construir listas de los resultados de accuracy, loss y f1_score para el conjunto de entrenamiento\n",
        "lst_train_acc = []\n",
        "lst_train_loss = []\n",
        "lst_train_f1 = []\n",
        "\n",
        "# Construir listas de los resultados de accuracy, loss y f1_score para el conjunto de prueba\n",
        "lst_test_acc = []\n",
        "lst_test_loss = []\n",
        "lst_test_f1 = []\n",
        "\n",
        "# Loop para construir listas a partir del resultado del entrenamiento del modelo\n",
        "for i in range(epochs):\n",
        "    lst_train_acc.append(train_history['accuracy_train'][i])#.detach().numpy())\n",
        "    lst_train_loss.append(train_history['loss_train'][i])\n",
        "    lst_train_f1.append(train_history['train_f1'][i])\n",
        "\n",
        "    lst_test_acc.append(test_history['accuracy_test'][i])#.detach().numpy())\n",
        "    lst_test_loss.append(test_history['loss_test'][i])#.detach().numpy())\n",
        "    lst_test_f1.append(test_history['test_f1'][i])"
      ],
      "metadata": {
        "id": "OUPJXpyfCUqi"
      },
      "execution_count": 73,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "train_history"
      ],
      "metadata": {
        "id": "JYsYSwmHhL-3",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "06ce7f1c-4ef5-4298-cf14-50d03ce188eb"
      },
      "execution_count": 74,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "defaultdict(list,\n",
              "            {'loss_train': [8.51541155576706,\n",
              "              7.629041016101837,\n",
              "              7.6947683691978455,\n",
              "              7.652109384536743,\n",
              "              7.641577124595642],\n",
              "             'accuracy_train': [0.6357142857142857,\n",
              "              0.7035714285714286,\n",
              "              0.7035714285714286,\n",
              "              0.7035714285714286,\n",
              "              0.7035714285714286],\n",
              "             'train_f1': [0.2753319357092942,\n",
              "              0.2753319357092942,\n",
              "              0.2753319357092942,\n",
              "              0.2753319357092942,\n",
              "              0.2753319357092942]})"
            ]
          },
          "metadata": {},
          "execution_count": 74
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_history"
      ],
      "metadata": {
        "id": "cGUBcuLKhccc",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "2a8cc68c-ce7f-4c03-a8b5-8e4b9056a5ab"
      },
      "execution_count": 75,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "defaultdict(list,\n",
              "            {'loss_test': [2.5864407420158386,\n",
              "              2.582437813282013,\n",
              "              2.581962525844574,\n",
              "              2.581878125667572,\n",
              "              2.581861138343811],\n",
              "             'accuracy_test': [0.6666666666666666,\n",
              "              0.6666666666666666,\n",
              "              0.6666666666666666,\n",
              "              0.6666666666666666,\n",
              "              0.6666666666666666],\n",
              "             'test_f1': [0.2745098039215686,\n",
              "              0.2745098039215686,\n",
              "              0.2745098039215686,\n",
              "              0.2745098039215686,\n",
              "              0.2745098039215686]})"
            ]
          },
          "metadata": {},
          "execution_count": 75
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "lst_train_f1"
      ],
      "metadata": {
        "id": "Itn6H-A5slzQ",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "1a25146d-b4b5-4856-d230-c004dca0b097"
      },
      "execution_count": 76,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[0.2753319357092942,\n",
              " 0.2753319357092942,\n",
              " 0.2753319357092942,\n",
              " 0.2753319357092942,\n",
              " 0.2753319357092942]"
            ]
          },
          "metadata": {},
          "execution_count": 76
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YVKqLQQBM5kL"
      },
      "source": [
        "# Gráfica para revisar el desempeño del modelo"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        " #Construir gráficas para visualizar el desempeño de las métricas\n",
        "\n",
        "fig, ax = plt.subplots(1,2,figsize = (10, 5))\n",
        "colors = ['b','r','g','y','cyan']\n",
        "\n",
        "\n",
        "ax[0].plot(lst_train_acc, 'b',label='train accuracy', marker = 'o')\n",
        "ax[0].plot(lst_test_acc,'r',label = 'test accurracy', marker = 'o')\n",
        "\n",
        "ax[0].set_xlabel(\"Número de épocas\")\n",
        "ax[0].set_ylabel(\"Exactitud\")\n",
        "ax[0].set_ylim([0, 1])\n",
        "ax[0].set_title(\"Exactitud\", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})\n",
        "ax[0].legend(loc = 'lower right')\n",
        "ax[0].grid(axis = 'y', color = 'gray', linestyle = 'dashed')\n",
        "\n",
        "plt.show()"
      ],
      "metadata": {
        "id": "zssciKhKjcd4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 489
        },
        "outputId": "586d1c83-8bc7-4eeb-8cdb-b7a3f996d206"
      },
      "execution_count": 79,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "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7VJcXJz7T+vWrdW3b1/FxcURsK4jN+eP9u3beywvScuXLy9W55vcnlffeOMNvfrqq1q2bJlat25dEKUWuJyOzY033pjp/9F7773XPTtaREREQZafb3LzM3PLLbfowIED7tApSb/++quqVKlSbAKWlLuxuXTpUqYgdfl47pojomQy7fibo2kySri5c+caAQEBxqxZs4zdu3cbTzzxhBEaGmokJCT4urRC78KFC8b27duN7du3G5KMSZMmGdu3bzd+++03X5dWJAwZMsQICQkxVq1aZcTHx7v/XLp0ydelFQmjRo0yVq9ebRw+fNjYuXOnMWrUKMNisRjff/+9r0srsphdMGeud/545JFHjFGjRrmXX79+veHn52e89dZbxp49e4wxY8YY/v7+xq5du3zVhXyR03GZMGGCYbfbjfnz53scCy9cuOCrLuSbnI7N1Yrr7II5HZejR48aZcuWNZ588klj3759xjfffGNUqlTJ+Pe//+2rLuSbnI7NmDFjjLJlyxqfffaZcejQIeP777836tSpYzz44IO+6kK+uN7voKNGjTIeeeQR9/KHDh0ySpUqZfzzn/809uzZY0ydOtWw2WzGsmXLcrRfQlYOTZkyxahRo4Zht9uNtm3bGj/++KOvSyoSVq5caUjK9Kd///6+Lq1I8DZ2koyPP/7Y16UVCY8++qhRs2ZNw263G2FhYUbnzp0JWHlEyMq5a50/OnTokOl4+Pnnnxv16tUz7Ha70ahRI2PJkiUFXHHByMm41KxZ0+uxcMyYMQVfeAHI6c/MlYpryDKMnI/Lhg0bjHbt2hkBAQFG7dq1jddee83IyMgo4KoLRk7GJj093Xj55ZeNOnXqGIGBgUZERIQxdOhQ49y5cwVfeD663u+g/fv3Nzp06JBpnebNmxt2u92oXbt2rn7fshhGCb4eCAAAAAAm45ksAAAAADARIQsAAAAATETIAgAAAAATEbIAAAAAwESELAAAAAAwESELAAAAAExEyAIAAAAAExGyUGIsXLhQn3/+ua/LKJQWLVqkzz77zNdlAAAAFAuELJQImzdv1ogRI3TTTTf5upQ8W7VqlSwWi86fP2/K9n788Uc9/fTTat++vSnbAwAAKOkIWShyBgwYIIvFogkTJni0L1q0SBaLJdPyiYmJeuyxx7Rw4ULVqFGjoMosEv744w8NGjRIixYtUmRkpK/LAQAAKBYIWSiSAgMD9frrr+vcuXPXXTYkJEQ7d+5Uy5YtC6Ay79LS0ny272upUKGCfvnlF5+ODQAAQHFDyEKR1KVLF1WuXFnjx4/PcpmXX35ZzZs392ibPHmyxxWbAQMGqEePHho3bpzCw8MVGhqqV155RRkZGfrnP/+p8uXLq3r16vr44489tnPs2DE9+OCDCg0NVfny5dW9e3cdOXIk03Zfe+01Va1aVfXr15ck7dq1S506dVJQUJAqVKigJ554QhcvXrxmX5cuXap69eopKChIt912m8d+Llu3bp2ioqIUFBSkiIgIPf3000pOTr7mdr/66iu1bNlSgYGBql27tsaOHauMjAz3+xaLRdOmTdNdd92loKAg1a5dW/Pnz/fYRnb6M3PmTDVq1EgBAQGqUqWKnnzySfd7kyZNUpMmTVS6dGlFRERo6NChHuv/9ttv6tatm8qVK6fSpUurUaNGWrp06TX7BQAA4GuELBRJNptN48aN05QpU/T777/naVsrVqzQiRMntGbNGk2aNEljxozRPffco3LlymnTpk0aPHiw/vGPf7j3k56erujoaJUtW1Zr167V+vXrVaZMGd15550eV6xiY2O1b98+LV++XN98842Sk5MVHR2tcuXK6aefftIXX3yhH374wSN0XO3YsWPq2bOnunXrpri4OD322GMaNWqUxzIHDx7UnXfeqfvvv187d+7UvHnztG7dumtud+3aterXr5+GDx+u3bt36z//+Y9mzZql1157zWO5F198Uffff7927Nihvn376qGHHtKePXskKVv9mTZtmoYNG6YnnnhCu3bt0uLFi1W3bl33+1arVe+++65++eUXffLJJ1qxYoWeffZZ9/vDhg1Tamqq1qxZo127dun1119XmTJlrvXPCQAA4HsGUMT079/f6N69u2EYhnHTTTcZjz76qGEYhrFw4ULjyh/pMWPGGM2aNfNY9+233zZq1qzpsa2aNWsaDofD3Va/fn0jKirK/TojI8MoXbq08dlnnxmGYRizZ8826tevbzidTvcyqampRlBQkPHdd9+5txseHm6kpqa6l/nwww+NcuXKGRcvXnS3LVmyxLBarUZCQoLXvo4ePdpo2LChR9tzzz1nSDLOnTtnGIZhDBo0yHjiiSc8llm7dq1htVqNP//80+t2O3fubIwbN86jbfbs2UaVKlXcryUZgwcP9limXbt2xpAhQ7Ldn6pVqxrPP/+81xq8+eKLL4wKFSq4Xzdp0sR4+eWXs70+AABAYeDn44wH5Mnrr7+uTp06aeTIkbneRqNGjWS1/nVRNzw8XI0bN3a/ttlsqlChgk6dOiVJ2rFjhw4cOKCyZct6bCclJUUHDx50v27SpInsdrv79Z49e9SsWTOVLl3a3XbLLbfI6XRq3759Cg8Pz1Tbnj171K5dO4+2q2cB3LFjh3bu3Kk5c+a42wzDkNPp1OHDh9WgQYNM292xY4fWr1/vceXK4XAoJSVFly5dUqlSpbzuq3379oqLi8tWfywWi06cOKHOnTtn2v9lP/zwg8aPH6+9e/cqKSlJGRkZHjU8/fTTGjJkiL7//nt16dJF999/v5o2bZrl9gAAAAoDQhaKtFtvvVXR0dEaPXq0BgwY4PGe1WqVYRgebenp6Zm24e/v7/HaYrF4bXM6nZKkixcvqlWrVh6h5rKwsDD3368MH/np4sWL+sc//qGnn34603tZzaZ48eJFjR07Vj179sz0XmBgoCl1BQUFXfP9I0eO6J577tGQIUP02muvqXz58lq3bp0GDRqktLQ0lSpVSo899piio6O1ZMkSff/99xo/frwmTpyop556ypQaAQAA8gMhC0XehAkT1Lx5c/fkEpeFhYUpISFBhmG4p3a/fBUmL1q2bKl58+apUqVKCg4OzvZ6DRo00KxZs5ScnOwOYOvXr5fVas1U+5XrLF682KPtxx9/zFTP7t27PZ51yk4f9u3bd911fvzxR/Xr18/jdYsWLbLVn7JlyyoyMlKxsbG67bbbMm1769atcjqdmjhxovtKorcvi46IiNDgwYM1ePBgjR49WtOnTydkAQCAQo2JL1DkNWnSRH379tW7777r0d6xY0edPn1ab7zxhg4ePKipU6fq22+/zfP++vbtq4oVK6p79+5au3atDh8+rFWrVunpp5++5iQcffv2VWBgoPr376+ff/5ZK1eu1FNPPaVHHnnE662CkjR48GDt379f//znP7Vv3z59+umnmjVrlscyzz33nDZs2KAnn3xScXFx2r9/v7766qtrTnzx0ksv6b///a/Gjh2rX375RXv27NHcuXP1wgsveCz3xRdfaObMmfr11181ZswYbd682b3d7PTn5Zdf1sSJE/Xuu+9q//792rZtm6ZMmSJJqlu3rtLT0zVlyhQdOnRIs2fP1gcffOCx/xEjRui7777T4cOHtW3bNq1cudLr7Y8AAACFCSELxcIrr7zivp3vsgYNGuj999/X1KlT1axZM23evDlPz25dVqpUKa1Zs0Y1atRQz5491aBBAw0aNEgpKSnXvLJVqlQpfffddzp79qzatGmjBx54QJ07d9Z7772X5To1atTQl19+qUWLFqlZs2b64IMPNG7cOI9lmjZtqtWrV+vXX39VVFSUWrRooZdeeklVq1bNcrvR0dH65ptv9P3336tNmza66aab9Pbbb6tmzZoey40dO1Zz585V06ZN9d///lefffaZGjZsmO3+9O/fX5MnT9b777+vRo0a6Z577tH+/fslSc2aNdOkSZP0+uuvq3HjxpozZ06mKfkdDoeGDRumBg0a6M4771S9evX0/vvvZ9kvAACAwsBiXP3QCgDI9RzawoUL1aNHD1+XAgAAUKRwJQsAAAAATETIAgAAAAATMbsgAK+4kxgAACB3uJIFAAAAACYiZAEAAACAiQhZAAAAAGAiQhYAAAAAmIiQBQAAAAAmImQBAAAAgIkIWQAAAABgIkIWAAAAAJiIkAUAAAAAJvp/pgIKvHE28WMAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "fig, ax = plt.subplots(1,2,figsize = (10, 5))\n",
        "colors = ['b','r','g','y','cyan']\n",
        "ax[1].plot(lst_train_f1,'b',label = 'train loss', marker = 'o')\n",
        "ax[1].plot(lst_test_f1,'r',label = 'test loss', marker = 'o')\n",
        "\n",
        "ax[1].set_xlabel(\"Número de de épocas\")\n",
        "ax[1].set_ylabel(\"Pérdida\")\n",
        "ax[1].set_ylim([0.27, 0.29])\n",
        "ax[1].set_title(\"Pérdida\", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})\n",
        "ax[1].legend(loc = 'lower right')\n",
        "ax[1].grid(axis = 'y', color = 'gray', linestyle = 'dashed')\n",
        "\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 489
        },
        "id": "aD0BbX4hYMFh",
        "outputId": "1a287fca-1757-4684-9215-58b6918719af"
      },
      "execution_count": 82,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "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w8HBAQ0bNsSxY8cwcuRIBAcHIzAwEEBJATRgwABERETA3t4e1tbWGD58OPz9/fHyyy8DAAIDA+Hl5YV+/fohLi4OmZmZ+OKLLxAeHq7zrA0RET2jKvqYth07dggAZT5hYWFCCCHCwsJEly5dyqzTrl07oVQqRePGjcXSpUsrtM2cnBwBQOTk5FQ0XSIiqoKq7n/nzp0rGjZsKJRKpfD19RW///67tKxLly7SsUMIITw8PHQeX6Kjo6U2c+bMEW5ubsLU1FQ0bNhQfPHFF2UeCf3gwQMxdOhQYWdnJywtLcU777wjbty4odXm0qVLolu3bsLCwkLUr19f/Pvf/xZFRUV6j4vHJSIiw9F3HywToobv4KwGubm5sLGxQU5ODq+FJiKqRdz/6sZ5ISIyHH33wTV+jw4REREREVFtY6FDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDREQ1Zv78+fD09IS5uTn8/Pywf//+ctsmJCSgc+fOsLOzg52dHQICAsq0z8vLw7Bhw+Dm5gYLCwt4eXlh4cKF0vJLly5BJpPp/KxevVpqp2t5YmJi9U8AEREZDAsdIiKqEStXrkRERASio6Nx6NAhtG3bFkFBQbh586bO9ikpKejTpw927NiBtLQ0uLu7IzAwENeuXZPaREREICkpCT/++CNOnTqFUaNGYdiwYVi/fj0AwN3dHTdu3ND6TJo0CVZWVujWrZvW9pYuXarVLjg4uMbmgoiIap9MCCEMncST5ObmwsbGBjk5ObC2tjZ0OkREz42q7H/9/Pzw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BsLLywv9+vVDXFwcMjMz8cUXXyA8PLzcvyYSEdGzh4UOERHViN69eyM7OxsTJkxAZmYm2rVrh6SkJOnG/4yMDK2zMwsWLIBKpcL777+v1U90dDQmTpwIAEhMTERUVBRCQkJw+/ZteHh4YOrUqdILQZVKJbZt2yYVVe7u7njvvffwxRdfSP0pFAr8+uuvGDJkCPz9/VGnTh2EhYXhyy+/rOEZISKi2sSHERARUbm4/9WN80JEZDj67oN5jw4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERFRj5s+fD09PT5ibm8PPzw/79+8vt21CQgI6d+4MOzs72NnZISAgoEz7vLw8DBs2DG5ubrCwsICXlxcWLlwoLb99+zaGDx+O5s2bw8LCAg0bNsSIESOQk5Oj1Y9MJivzSUxMrN7BExGRQbHQISKiGrFy5UpEREQgOjoahw4dQtu2bREUFISbN2/qbJ+SkoI+ffpgx44dSEtLg7u7OwIDA3Ht2jWpTUREBJKSkvDjjz/i1KlTGDVqFIYNG4b169cDAK5fv47r169j5syZOH78OL7//nskJSVhwIABZba3dOlS3LhxQ/oEBwfXyDwQEZFhyIQQwtBJPElubi5sbGyQk5MDa2trQ6dDRPTcqMr+18/PDy+99BLmzZsHANBoNHB3d8fw4cMRGRn5xPXVajXs7Owwb948hIaGAgBefPFF9O7dG+PHj5faeXt7o1u3bpgyZYrOflavXo2+ffsiPz8fJiYmAErO6Kxbt67SxQ2PS0RE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YmIiUlJSYG5urrPNkiVLEBISUu7yq1evYsuWLVi1apVWvH79+oiIiJC+v/TSS7h+/TpmzJhRbqETExODSZMmlYnHx8dL22/fvj169uyJzZs34/Dhw1KbLl26oGvXrli1ahXOnz8vxXv06IEOHTpg0aJFyM7OluIhISFo2rQp4uPjtQ7uQ4YMgY2NDWJjY7VyiIyMRE5ODhYsWCDFlEoloqKicOHCBSxfvlyKOzg4YOjQoThy5Ag2bNggxZs0aYK+ffti9+7dSE1NleIcE8fEMXFMT+OYhg4dCn3wHh0iIipXZfe/KpUKlpaWWLNmDYKDg6V4WFgY7t69i19++aXcdWfOnIkpU6Zg27Zt8PHx0dlm165dePXVV5Geno62bdvqbDN58mTMnTsX165de+JDBubPn48pU6aU+9RQXWd03N3dcfPmTWle+Ndajolj4pg4ptoZU0FBAWxtbZ94bOIZHSIiqnYPv2C6tNApfcH0sGHDyl0vLi4OU6dOxZYtW8otcoCSS9K8vb3LLXKEEFi6dClCQ0P1epJaeno6GjRoUO5yMzMzmJmZ6RUvb3tKpbJCcV3bKy8uk8l0xuVyuc64QqGAQqEoEzcxMYGJSdlfDTgmjqm8OMfEMQG1P6ZHC6LysNAhIqIaUZEXTAPA9OnTMWHCBKxYsQKenp7So6StrKxgZWUl9Zubm4vVq1fjq6++Knfb27dvx8WLFzFw4MAyy5YtWwalUon27dsDANauXYslS5Zg0aJF1TZ2IiIyPBY6RERUI3r37o3s7GxMmDABmZmZaNeuXZkXTMvlfz/8c8GCBVCpVHj//fe1+omOjsbEiROl74mJiRBCoE+fPuVue/HixejYsSNatGihc/nkyZNx+fJlmJiYoEWLFli5cmWZ7RIR0bON9+gQEVG5uP/VjfNCRGQ4fI8OERERERE9t1joEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFDRERERERGh4UOEREREREZHRY6RERERERkdFjoEBERERGR0WGhQ0RERERERoeFDhERERERGR0WOkREREREZHRY6BARERERkdFhoUNEREREREaHhQ4RERERERkdFjpERERERGR0WOgQEREREZHRYaFD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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Construir gráficas para visualizar el desempeño de las métricas\n",
        "\n",
        "fig, ax = plt.subplots(1,2,figsize = (10, 5))\n",
        "colors = ['b','r','g','y','cyan']\n",
        "\n",
        "ax[1].plot(lst_train_f1,'b',label = 'train loss', marker = 'o')\n",
        "ax[1].plot(lst_test_f1,'r',label = 'test loss', marker = 'o')\n",
        "\n",
        "ax[1].set_xlabel(\"Número de de épocas\")\n",
        "ax[1].set_ylabel(\"F1_score\")\n",
        "ax[1].set_ylim([0, 1])\n",
        "ax[1].set_title(\"F1_score\", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})\n",
        "ax[1].legend(loc = 'lower right')\n",
        "ax[1].grid(axis = 'y', color = 'gray', linestyle = 'dashed')\n",
        "\n",
        "plt.show()\n",
        "\n"
      ],
      "metadata": {
        "id": "sUqudpoweaGf",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 488
        },
        "outputId": "045ca550-7f48-4588-f185-eb7c3d514da8"
      },
      "execution_count": 87,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "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a6NHj9aAAQPUrl073XTTTZo2bZqysrL00EMPSZL69++v6OhoTZ48WZI0cuRIderUSa+++qq6deum+fPn6/vvv9fbb79duj0BAFyzmJsAAJfyOuj06dNHx44d04QJE5Senq5WrVpp2bJlrps609LS3C5xuOWWW/TBBx/o6aef1t/+9jc1bNhQn3zyiW644YYi7zMgIEAJCQkeL2e7ljEuhWNsPGNcCsfYeFZRxsUXc1NJVJRxvZoxhiXD+JUM41cy5TV+Xn+PDgAAAABc7a7eu0sBAAAAoJgIOgAAAABMh6ADAAAAwHQIOgAAAABM56oJOjNmzFDdunUVGBio9u3ba8OGDZdd/j//+Y+aNGmiwMBAxcbGasmSJeVUafnyZlxmz56tjh07qkqVKqpSpYq6dOlyxXGsyLz9nblg/vz5slgs6tmzZ9kW6CPejsupU6c0YsQIRUVFKSAgQI0aNTLl/5+8HZdp06apcePGCgoKUkxMjB5//HFlZ2eXU7XlZ+XKlerevbtq1qwpi8WiTz755IrrrFixQm3atFFAQIAaNGig9957r8zrNJviHr9QvN9ZnDd58mTdeOONqly5sqpXr66ePXtq586dvi6rwpg5c6ZatGjh+pLLuLg4LV261NdlVVhTpkyRxWLRqFGjymwfV0XQWbBggUaPHq2EhARt3rxZLVu2VNeuXXX06FGPy69du1Z9+/bVoEGDtGXLFvXs2VM9e/bUDz/8UM6Vly1vx2XFihXq27evvvvuO61bt04xMTG666679Msvv5Rz5WXP27G5YP/+/RozZow6duxYTpWWL2/HJTc3V3feeaf279+vhQsXaufOnZo9e7aio6PLufKy5e24fPDBBxo3bpwSEhKUkpKid955RwsWLNDf/va3cq687GVlZally5aaMWNGkZbft2+funXrpttuu03JyckaNWqUBg8erK+++qqMKzWP4h6/cJ63v7P4TVJSkkaMGKH//ve/Wr58ufLy8nTXXXcpKyvL16VVCLVq1dKUKVO0adMmff/997r99tvVo0cP/fjjj74urcLZuHGj3nrrLbVo0aJsd2RcBW666SZjxIgRrtcOh8OoWbOmMXnyZI/L9+7d2+jWrZtbW/v27Y2//OUvZVpnefN2XC6Vn59vVK5c2Xj//ffLqkSfKc7Y5OfnG7fccosxZ84cY8CAAUaPHj3KodLy5e24zJw506hXr56Rm5tbXiX6hLfjMmLECOP22293axs9erTRoUOHMq3T1yQZixcvvuwyTz31lNG8eXO3tj59+hhdu3Ytw8rMpaTHdvymKL+zKNzRo0cNSUZSUpKvS6mwqlSpYsyZM8fXZVQop0+fNho2bGgsX77c6NSpkzFy5Mgy25fPz+jk5uZq06ZN6tKli6vNarWqS5cuWrduncd11q1b57a8JHXt2rXQ5Sui4ozLpc6ePau8vDxVrVq1rMr0ieKOzXPPPafq1atr0KBB5VFmuSvOuHz22WeKi4vTiBEjFBkZqRtuuEGTJk2Sw+Eor7LLXHHG5ZZbbtGmTZtclxOlpqZqyZIluvfee8ul5qvZtXD8LUulcWwHSktGRoYkme7vhPLgcDg0f/58ZWVlKS4uztflVCgjRoxQt27dCswlZcGvzPdwBcePH5fD4XB9e/UFkZGR2rFjh8d10tPTPS6fnp5eZnWWt+KMy6XGjh2rmjVrlssvUnkqztisXr1a77zzjpKTk8uhQt8ozrikpqbq22+/VXx8vJYsWaI9e/Zo+PDhysvLU0JCQnmUXeaKMy4PPPCAjh8/rt/97ncyDEP5+fkaOnSoKS9d81Zhx9/MzEydO3dOQUFBPqqsYiiNYztQGpxOp0aNGqUOHTrohhtu8HU5Fcb27dsVFxen7OxshYSEaPHixWrWrJmvy6ow5s+fr82bN2vjxo3lsj+fn9FB2ZgyZYrmz5+vxYsXKzAw0Nfl+NTp06fVr18/zZ49W9WqVfN1OVcVp9Op6tWr6+2331bbtm3Vp08f/f3vf9esWbN8XZpPrVixQpMmTdKbb76pzZs3a9GiRfryyy/1/PPP+7o0ACgVI0aM0A8//KD58+f7upQKpXHjxkpOTtb69es1bNgwDRgwQD/99JOvy6oQDh48qJEjR2revHnl9repz8/oVKtWTTabTUeOHHFrP3LkiGrUqOFxnRo1ani1fEVUnHG54B//+IemTJmib775puxv8vIBb8dm79692r9/v7p37+5qczqdkiQ/Pz/t3LlT9evXL9uiy0FxfmeioqLk7+8vm83mamvatKnS09OVm5sru91epjWXh+KMyzPPPKN+/fpp8ODBkqTY2FhlZWXpkUce0d///ndZrdfuZ0SFHX9DQ0M5m1MEJTm2A6Xl0Ucf1RdffKGVK1eqVq1avi6nQrHb7WrQoIEkqW3bttq4caOmT5+ut956y8eVXf02bdqko0ePqk2bNq42h8OhlStX6o033lBOTo7b3yOlweeztd1uV9u2bZWYmOhqczqdSkxMLPSax7i4OLflJWn58uWmukayOOMiSS+//LKef/55LVu2TO3atSuPUsudt2PTpEkTbd++XcnJya6f++67z/XUqJiYmPIsv8wU53emQ4cO2rNnjyv4SdKuXbsUFRVlipAjFW9czp49WyDMXDj4GoZRdsVWANfC8bcsFffYDpQGwzD06KOPavHixfr22291/fXX+7qkCs/pdConJ8fXZVQId9xxR4G/x9q1a6f4+HglJyeXesiRdHU8dW3+/PlGQECA8d577xk//fST8cgjjxjh4eFGenq6YRiG0a9fP2PcuHGu5desWWP4+fkZ//jHP4yUlBQjISHB8Pf3N7Zv3+6rLpQJb8dlypQpht1uNxYuXGgcPnzY9XP69GlfdaHMeDs2lzLrU9e8HZe0tDSjcuXKxqOPPmrs3LnT+OKLL4zq1asbL7zwgq+6UCa8HZeEhASjcuXKxocffmikpqYaX3/9tVG/fn2jd+/evupCmTl9+rSxZcsWY8uWLYYkY+rUqcaWLVuMAwcOGIZhGOPGjTP69evnWj41NdUIDg42nnzySSMlJcWYMWOGYbPZjGXLlvmqCxXOlX4fcXlX+p1F4YYNG2aEhYUZK1ascPs74ezZs74urUIYN26ckZSUZOzbt8/Ytm2bMW7cOMNisRhff/21r0ursMr6qWtXRdAxDMN4/fXXjdq1axt2u9246aabjP/+97+u9zp16mQMGDDAbfmPPvrIaNSokWG3243mzZsbX375ZTlXXD68GZc6deoYkgr8JCQklH/h5cDb35mLmTXoGIb347J27Vqjffv2RkBAgFGvXj3jxRdfNPLz88u56rLnzbjk5eUZzz77rFG/fn0jMDDQiImJMYYPH26cPHmy/AsvY999953H48aF8RgwYIDRqVOnAuu0atXKsNvtRr169Yy5c+eWe90V3eV+H3F5V/qdReE8jZsk/j9cRA8//LBRp04dw263GxEREcYdd9xByCmhsg46FsO4xq/DAAAAAGA6Pr9HBwAAAABKG0EHAAAAgOkQdAAAAACYDkEHAAAAgOkQdAAAAACYDkEHAAAAgOkQdAAAAACYDkEHAABc0xYvXqyPPvrI12VcU6ZPn65169b5ugyYHEEHAABcszZs2KBRo0bp5ptv9nUpJbZixQpZLBadOnWqVLf77LPPqlWrVqW2vVdffVWLFi1SmzZtSm2bgCcEHQAAYAoDBw6UxWLRlClT3No/+eQTWSyWAstnZGRo8ODBWrx4sWrXrl1eZV7T1qxZo//7v//Tp59+qoCAAF+XA5Mj6AAAANMIDAzUSy+9pJMnT15x2bCwMG3bts2nZxZyc3N9tm9f6NChg5KTkxUeHu7rUnANIOgAAADT6NKli2rUqKHJkycXuoynS7GmTZumunXrul4PHDhQPXv21KRJkxQZGanw8HA999xzys/P15NPPqmqVauqVq1amjt3rtt2Dh48qN69eys8PFxVq1ZVjx49tH///gLbffHFF1WzZk01btxYkrR9+3bdfvvtCgoK0nXXXadHHnlEZ86cuWxflyxZokaNGikoKEi33Xab234uWL16tTp27KigoCDFxMToscceU1ZW1mW3O2XKFEVGRqpy5coaNGiQsrOzCywzZ84cNW3aVIGBgWrSpInefPPNy27T6XRq8uTJuv766xUUFKSWLVtq4cKFrvcvXHb35ZdfqkWLFgoMDNTNN9+sH374wW07H3/8sZo3b66AgADVrVtXr776qtv7OTk5Gjt2rGJiYhQQEKAGDRronXfekSQ5HA4NGjTIVUPjxo01ffp0t/VXrFihm266SZUqVVJ4eLg6dOigAwcOXLZvuHoRdAAAgGnYbDZNmjRJr7/+un7++ecSbevbb7/VoUOHtHLlSk2dOlUJCQn6/e9/rypVqmj9+vUaOnSo/vKXv7j2k5eXp65du6py5cpatWqV1qxZo5CQEN19991uZ24SExO1c+dOLV++XF988YWysrLUtWtXValSRRs3btR//vMfffPNN3r00UcLre3gwYPq1auXunfvruTkZA0ePFjjxo1zW2bv3r26++67df/992vbtm1asGCBVq9efdntfvTRR3r22Wc1adIkff/994qKiioQYubNm6cJEyboxRdfVEpKiiZNmqRnnnlG77//fqHbnTx5sv71r39p1qxZ+vHHH/X444/rwQcfVFJSkttyTz75pF599VVt3LhRERER6t69u/Ly8iRJmzZtUu/evfXnP/9Z27dv17PPPqtnnnlG7733nmv9/v3768MPP9Rrr72mlJQUvfXWWwoJCZF0PmzVqlVL//nPf/TTTz9pwoQJ+tvf/uZ6EEV+fr569uypTp06adu2bVq3bp0eeeQRj5c9ooIwAAAATGDAgAFGjx49DMMwjJtvvtl4+OGHDcMwjMWLFxsX/8mTkJBgtGzZ0m3df/7zn0adOnXctlWnTh3D4XC42ho3bmx07NjR9To/P9+oVKmS8eGHHxqGYRj/93//ZzRu3NhwOp2uZXJycoygoCDjq6++cm03MjLSyMnJcS3z9ttvG1WqVDHOnDnjavvyyy8Nq9VqpKene+zr+PHjjWbNmrm1jR071pBknDx50jAMwxg0aJDxyCOPuC2zatUqw2q1GufOnfO43bi4OGP48OFube3bt3cbr/r16xsffPCB2zLPP/+8ERcX53Gb2dnZRnBwsLF27Vq39kGDBhl9+/Y1DMMwvvvuO0OSMX/+fNf7v/76qxEUFGQsWLDAMAzDeOCBB4w777zTbRtPPvmkaxx27txpSDKWL1/usQ5PRowYYdx///2u/UkyVqxYUeT1cXXjjA4AADCdl156Se+//75SUlKKvY3mzZvLav3tT6XIyEjFxsa6XttsNl133XU6evSoJGnr1q3as2ePKleurJCQEIWEhKhq1arKzs7W3r17XevFxsbKbre7XqekpKhly5aqVKmSq61Dhw5yOp3auXOnx9pSUlLUvn17t7a4uDi311u3btV7773nqiUkJERdu3aV0+nUvn37irXdrKws7d27V4MGDXLb7gsvvODWx4vt2bNHZ8+e1Z133um2zr/+9a8C61y8r6pVq6px48auf8OUlBR16NDBbfkOHTpo9+7dcjgcSk5Ols1mU6dOnTzWIUkzZsxQ27ZtFRERoZCQEL399ttKS0tz7W/gwIHq2rWrunfvrunTp+vw4cOFbgtXPz9fFwAAAFDabr31VnXt2lXjx4/XwIED3d6zWq0yDMOt7cLlURfz9/d3e22xWDy2OZ1OSdKZM2fUtm1bzZs3r8C2IiIiXP99caApS2fOnNFf/vIXPfbYYwXeK+5T5i7cNzR79uwCgchms112nS+//FLR0dFu75Xmk9eCgoIu+/78+fM1ZswYvfrqq4qLi1PlypX1yiuvaP369a5l5s6dq8cee0zLli3TggUL9PTTT2v58uWmePz4tYigAwAATGnKlClq1aqV64b/CyIiIpSeni7DMFz3XyQnJ5d4f23atNGCBQtUvXp1hYaGFnm9pk2b6r333lNWVpYrBK1Zs0ZWq7VA7Rev89lnn7m1/fe//y1Qz08//aQGDRp4Vcv69evVv39/j9uNjIxUzZo1lZqaqvj4+CJts1mzZgoICFBaWtplz7Zc2NeFEHby5Ent2rVLTZs2ddW2Zs0at+XXrFmjRo0ayWazKTY2Vk6nU0lJSerSpUuBba9Zs0a33HKLhg8f7mrzdBaqdevWat26tcaPH6+4uDh98MEHBJ0KikvXAACAKcXGxio+Pl6vvfaaW3vnzp117Ngxvfzyy9q7d69mzJihpUuXlnh/8fHxqlatmnr06KFVq1Zp3759WrFihR577LHLPhghPj5egYGBGjBggH744Qd99913+utf/6p+/fopMjLS4zpDhw7V7t279eSTT2rnzp364IMP3G7Kl6SxY8dq7dq1evTRR5WcnKzdu3fr008/vezDCEaOHKl3331Xc+fO1a5du5SQkKAff/zRbZmJEydq8uTJeu2117Rr1y5t375dc+fO1dSpUz1us3LlyhozZowef/xxvf/++9q7d682b96s119/vcADDJ577jklJibqhx9+0MCBA1WtWjX17NlTkvTEE08oMTFRzz//vHbt2qX3339fb7zxhsaMGSNJqlu3rgYMGKCHH35Yn3zyiWv8LzxsoGHDhvr+++/11VdfadeuXXrmmWe0ceNG17737dun8ePHa926dTpw4IC+/vpr7d692xW0UAH5+iYhAACA0nDxwwgu2Ldvn2G3241L/+SZOXOmERMTY1SqVMno37+/8eKLLxZ4GMGl2+rUqZMxcuRIt7Y6deoY//znP12vDx8+bPTv39+oVq2aERAQYNSrV88YMmSIkZGRUeh2DcMwtm3bZtx2221GYGCgUbVqVWPIkCHG6dOnL9vfzz//3GjQoIEREBBgdOzY0Xj33XfdHkZgGIaxYcMG48477zRCQkKMSpUqGS1atDBefPHFy273xRdfNKpVq2aEhIQYAwYMMJ566qkCD2+YN2+e0apVK8NutxtVqlQxbr31VmPRokWFbtPpdBrTpk0zGjdubPj7+xsRERFG165djaSkJMMwfnsYweeff240b97csNvtxk033WRs3brVbTsLFy40mjVrZvj7+xu1a9c2XnnlFbf3z507Zzz++ONGVFSUYbfbjQYNGhjvvvuuYRjnH4owcOBAIywszAgPDzeGDRtmjBs3ztW39PR0o2fPnq5169SpY0yYMMHtgRSoWCyGcclFqgAAAEA5WrFihW677TadPHmSLxNFqeHSNQAAAACmQ9ABAAAAYDpcugYAAADAdDijAwAAAMB0CDoAAAAATIegAwAAAMB0CDoAAAAATIegAwAAAMB0CDoAAAAATIegAwAAAMB0CDoAAAAATIegAwAAAMB0/h916Wrc5gB2DgAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "g9UkWUF1DIy7"
      },
      "source": [
        "### Matriz de Confusión para el mejor modelo"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "sAputSpDzKOz"
      },
      "outputs": [],
      "source": [
        "class_names = ['Negativo', 'Neutro', 'Positivo']"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "predictions"
      ],
      "metadata": {
        "id": "_DwrE9MTzbUr"
      },
      "execution_count": 30,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "test_true_labels"
      ],
      "metadata": {
        "id": "71wFJFxeztjj"
      },
      "execution_count": 33,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import confusion_matrix, classification_report\n",
        "from sklearn.metrics import accuracy_score, f1_score"
      ],
      "metadata": {
        "id": "hYDfRYa8RtLV"
      },
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import matthews_corrcoef"
      ],
      "metadata": {
        "id": "faW9E_VzSBCY"
      },
      "execution_count": 15,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 35,
      "metadata": {
        "id": "Uuf9zXEsDII1",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 479
        },
        "outputId": "7d35224c-fc27-47f4-93c4-99665c1447cb"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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rFyxDL38uuP6tatY+dNa2HJIRGfxnNBdD+OuY9XUYVg1dRgA4PDmVVg1dRj+/H2DbJu/z5wAhECjVm++ASMpgRrvM5SZmQl/f3+sWbNG7ndpeno61q1bhx9++AHt27dHs2bNsH79epw5cwZnz55V7PBEad7muZTcv38f1apVk02aLotynqs7AiLSVHsvP1B3CKRhejetotL+yw/cprS+nmxQ7M7gAwYMgI2NDZYsWYIPPvgATZo0QXBwMP7880906NABqampsLKykm1fo0YNjBs3DuPHjy/xPrTiqfV//vknMjMz0ahRIyQkJGDy5MlwcHBA27a8AykREZEmyc3NLXL7GENDwzfOld22bRuioqLeePPixMRESKVSuUQIAOzs7JCYmKhQTBo3TPZf5OfnY9q0aWjQoAF69OiBChUqICwsTDaxmYiIiP47ZU6gftPtZN70FIp79+5h7Nix2LJli2zai6poRWXIx8cHPj4+6g6DiIhIKynzkvjAwEAEBATItb2pKnThwgU8evRI7j6CBQUFOHXqFFasWIEjR44gLy8PaWlpctWhpKQk2NvbKxSTViRDREREpEJKvD3Q24bEXtehQwdcvnxZrm3QoEGoV68epkyZgmrVqsHAwAChoaHw8/MDAFy/fh3x8fHw8PBQKCYmQ0RERKRxzM3N0bBhQ7k2U1NT2NraytoHDx6MgIAA2NjYwMLCAl999RU8PDzg7u6u0L6YDBEREVGxNPXO0UuWLIGenh78/PyQm5sLHx8frFy5UuF+tPLSem3AS+uJ6G14aT29TtWX1tsP3am0vhLXfKK0vpRFK64mIyIiIvqvOExGRERExdLUYTJlYTJERERExdL2ZIjDZERERKTTWBkiIiKi4ml3YYjJEBERERWPw2REREREWoyVISIiIiqWtleGmAwRERFRsZgMERERkW7T7lyIc4aIiIhIt7EyRERERMXiMBkRERHpNG1PhjhMRkRERDqNlSEiIiIqlrZXhpgMERERUbG0PRniMBkRERHpNFaGiIiIqHjaXRhiMkRERETF4zAZERERkRZjZYiIiIiKpe2VISZDREREVCwtz4WYDBEREVHxtL0yxDlDREREpNNYGSIiIqJiaXlhSDnJUFpaGqysrJTRFREREWkYDpO9ZsGCBdi+fbvsda9evWBra4sqVarg0qVLSg2OiIiISNUUToZW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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "def show_confusion_matrix(confusion_matrix):\n",
        "  hmap = sns.heatmap(confusion_matrix, annot=True, fmt=\"d\", cmap=\"Blues\")\n",
        "  hmap.yaxis.set_ticklabels(hmap.yaxis.get_ticklabels(), rotation=0, ha='right')\n",
        "  hmap.xaxis.set_ticklabels(hmap.xaxis.get_ticklabels(), rotation=30, ha='right')\n",
        "  plt.ylabel('Sentimientos verdaderos')\n",
        "  plt.xlabel('Sentimientos predichos');\n",
        "\n",
        "cm = confusion_matrix(test_true_labels, predictions)\n",
        "df_cm = pd.DataFrame(cm, index=class_names, columns=class_names)\n",
        "show_confusion_matrix(df_cm)"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "matthews_corrcoef(test_true_labels, predictions )"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1Hu_uf6HS6yv",
        "outputId": "398f4e96-48b7-43ab-c717-2842d2d052bb"
      },
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0.0"
            ]
          },
          "metadata": {},
          "execution_count": 37
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(classification_report(test_true_labels, predictions, target_names = class_names))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "5piHGkgQgM91",
        "outputId": "08a42c74-61ef-4137-9a25-cd6ee792c6f9"
      },
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "    Negativo       0.00      0.00      0.00        17\n",
            "      Neutro       0.00      0.00      0.00         4\n",
            "    Positivo       0.70      1.00      0.82        49\n",
            "\n",
            "    accuracy                           0.70        70\n",
            "   macro avg       0.23      0.33      0.27        70\n",
            "weighted avg       0.49      0.70      0.58        70\n",
            "\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
            "  _warn_prf(average, modifier, msg_start, len(result))\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
            "  _warn_prf(average, modifier, msg_start, len(result))\n",
            "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
            "  _warn_prf(average, modifier, msg_start, len(result))\n"
          ]
        }
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4",
      "machine_shape": "hm"
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}