{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "N3shQZoZPScM", "outputId": "63642e05-bd32-4fd9-f029-8f50148a1e8a" }, "outputs": [], "source": [ "!pip install -U sentence_transformers --q" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rcBH0FzwVOk6", "outputId": "f5b4b762-9b30-4474-d1d0-7ba3ab68a2ef" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip3 install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install datasets --q" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "y-pDMu97XyVd", "outputId": "737160a3-2c34-4293-a129-bb053cd91117" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting sentence-transformers\n", " Using cached sentence_transformers-3.4.1-py3-none-any.whl.metadata (10 kB)\n", "Requirement already satisfied: scikit-learn in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.4.1.post1)\n", "Requirement already satisfied: pandas in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (2.2.1)\n", "Collecting torch\n", " Downloading torch-2.6.0-cp312-none-macosx_11_0_arm64.whl.metadata (28 kB)\n", "Collecting transformers<5.0.0,>=4.41.0 (from sentence-transformers)\n", " Downloading transformers-4.48.3-py3-none-any.whl.metadata (44 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.4/44.4 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: tqdm in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (4.67.1)\n", "Requirement already satisfied: scipy in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (1.12.0)\n", "Requirement already satisfied: huggingface-hub>=0.20.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (0.28.1)\n", "Requirement already satisfied: Pillow in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (10.2.0)\n", "Requirement already satisfied: numpy<2.0,>=1.19.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (1.26.4)\n", "Requirement already satisfied: joblib>=1.2.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (1.3.2)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (3.3.0)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from pandas) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas) (2024.1)\n", "Requirement already satisfied: filelock in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (3.16.0)\n", "Requirement already satisfied: typing-extensions>=4.10.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (4.10.0)\n", "Collecting networkx (from torch)\n", " Using cached networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n", "Requirement already satisfied: jinja2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (3.1.3)\n", "Requirement already satisfied: fsspec in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (2024.2.0)\n", "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (69.1.1)\n", "Collecting sympy==1.13.1 (from torch)\n", " Using cached sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n", "Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch)\n", " Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", "Requirement already satisfied: packaging>=20.9 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (24.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (6.0.1)\n", "Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2.32.3)\n", "Requirement already satisfied: six>=1.5 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n", "Collecting regex!=2019.12.17 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n", " Using cached regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl.metadata (40 kB)\n", "Collecting tokenizers<0.22,>=0.21 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n", " Downloading tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl.metadata (6.7 kB)\n", "Collecting safetensors>=0.4.1 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n", " Downloading safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl.metadata (3.8 kB)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from jinja2->torch) (2.1.5)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2024.2.2)\n", "Using cached sentence_transformers-3.4.1-py3-none-any.whl (275 kB)\n", "Downloading torch-2.6.0-cp312-none-macosx_11_0_arm64.whl (66.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.5/66.5 MB\u001b[0m \u001b[31m24.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hUsing cached sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", "Downloading transformers-4.48.3-py3-none-any.whl (9.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.7/9.7 MB\u001b[0m \u001b[31m35.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hUsing cached networkx-3.4.2-py3-none-any.whl (1.7 MB)\n", "Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)\n", "Using cached regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl (284 kB)\n", "Downloading safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl (408 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m408.9/408.9 kB\u001b[0m \u001b[31m27.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl (2.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m36.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hInstalling collected packages: mpmath, sympy, safetensors, regex, networkx, torch, tokenizers, transformers, sentence-transformers\n", "Successfully installed mpmath-1.3.0 networkx-3.4.2 regex-2024.11.6 safetensors-0.5.2 sentence-transformers-3.4.1 sympy-1.13.1 tokenizers-0.21.0 torch-2.6.0 transformers-4.48.3\n", "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip3 install --upgrade pip\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install sentence-transformers scikit-learn pandas torch\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "m-tmgXuldd3C" }, "outputs": [], "source": [ "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "1Z0mgYZEgjC4" }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "aBmXLbZ4cc1U" }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "LXkXdIWgUcWI" }, "outputs": [], "source": [ "from datasets import load_dataset, Dataset\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "AFkI23ySgtkV" }, "outputs": [], "source": [ "from sklearn.metrics import accuracy_score" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ehvh1BJZWa_1", "outputId": "212a5f82-885d-4e61-a73f-94dcf12a3a39" }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ab0344420d964f64a16c911f17aae057", "version_major": 2, "version_minor": 0 }, "text/plain": [ "README.md: 0%| | 0.00/515 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
answersystem_promptuser_prompttask_type
0neutralYou are a financial sentiment analysis expert....According to Gran , the company has no plans t...sentiment_analysis
1neutralYou are a financial sentiment analysis expert....Technopolis plans to develop in stages an area...sentiment_analysis
2negativeYou are a financial sentiment analysis expert....The international electronic industry company ...sentiment_analysis
3positiveYou are a financial sentiment analysis expert....With the new production plant the company woul...sentiment_analysis
4positiveYou are a financial sentiment analysis expert....According to the company 's updated strategy f...sentiment_analysis
\n", "" ], "text/plain": [ " answer system_prompt \\\n", "0 neutral You are a financial sentiment analysis expert.... \n", "1 neutral You are a financial sentiment analysis expert.... \n", "2 negative You are a financial sentiment analysis expert.... \n", "3 positive You are a financial sentiment analysis expert.... \n", "4 positive You are a financial sentiment analysis expert.... \n", "\n", " user_prompt task_type \n", "0 According to Gran , the company has no plans t... sentiment_analysis \n", "1 Technopolis plans to develop in stages an area... sentiment_analysis \n", "2 The international electronic industry company ... sentiment_analysis \n", "3 With the new production plant the company woul... sentiment_analysis \n", "4 According to the company 's updated strategy f... sentiment_analysis " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "cQ3tjGFTW5kE" }, "outputs": [], "source": [ "df.drop(['system_prompt', 'task_type'], axis=1, inplace=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "Va5867ATXAxD", "outputId": "c258f546-d8af-4ba5-8228-3a07f2283baf" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
answeruser_prompt
0neutralAccording to Gran , the company has no plans t...
1neutralTechnopolis plans to develop in stages an area...
2negativeThe international electronic industry company ...
3positiveWith the new production plant the company woul...
4positiveAccording to the company 's updated strategy f...
.........
61194Treasuries | Corporate DebtKfW credit line for Uniper could be raised to ...
61195Treasuries | Corporate DebtKfW credit line for Uniper could be raised to ...
61196Treasuries | Corporate DebtRussian https://t.co/R0iPhyo5p7 sells 1 bln r...
61197Treasuries | Corporate DebtGlobal ESG bond issuance posts H1 dip as supra...
61198Treasuries | Corporate DebtBrazil's Petrobras says it signed a $1.25 bill...
\n", "

61199 rows × 2 columns

\n", "
" ], "text/plain": [ " answer \\\n", "0 neutral \n", "1 neutral \n", "2 negative \n", "3 positive \n", "4 positive \n", "... ... \n", "61194 Treasuries | Corporate Debt \n", "61195 Treasuries | Corporate Debt \n", "61196 Treasuries | Corporate Debt \n", "61197 Treasuries | Corporate Debt \n", "61198 Treasuries | Corporate Debt \n", "\n", " user_prompt \n", "0 According to Gran , the company has no plans t... \n", "1 Technopolis plans to develop in stages an area... \n", "2 The international electronic industry company ... \n", "3 With the new production plant the company woul... \n", "4 According to the company 's updated strategy f... \n", "... ... \n", "61194 KfW credit line for Uniper could be raised to ... \n", "61195 KfW credit line for Uniper could be raised to ... \n", "61196 Russian https://t.co/R0iPhyo5p7 sells 1 bln r... \n", "61197 Global ESG bond issuance posts H1 dip as supra... \n", "61198 Brazil's Petrobras says it signed a $1.25 bill... \n", "\n", "[61199 rows x 2 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "a2PtcHIfeM5t", "outputId": "2214b201-c68d-4112-d224-855bd7103213" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(39641, 2)\n" ] } ], "source": [ "# only want to keep rows where 'answer' is 'neutral', 'positive', or 'negative'\n", "df_filtered = df[df[\"answer\"].isin([\"neutral\", \"positive\", \"negative\"])]\n", "\n", "# Showing the shape of the new DataFrame\n", "print(df_filtered.shape)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OzmsDZ-tZuGA", "outputId": "cb743649-521b-45da-8c9a-182fff7584bd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(5946, 2)\n" ] } ], "source": [ "df_sampled = df_filtered.sample(frac=0.15, random_state=42) # 15% sample\n", "print(df_sampled.shape) # Checking new size\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 466 }, "id": "kkaxAfyQdcgZ", "outputId": "1fa73eb8-c4ea-4b0b-8288-7dcb3c517798" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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AACA8QhEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACAADGIxABAADjEYgAAIDxCEQAAMB4BCIAAGA8AhEAADAegQgAABiPQAQAAIzn1kCUkpKinj17qnHjxgoODtbw4cOVl5fnUhMVFSWbzeayjB8/3qWmoKBAsbGxatiwoYKDgzVt2jRduHDBpSYzM1Pdu3eXr6+v2rdvr9TU1Os9PQAAcINwayDKyspSYmKiNm/erPT0dJ0/f16DBg3SqVOnXOrGjRunI0eOWMvcuXOtscrKSsXGxurcuXPatGmTFi1apNTUVM2cOdOqyc/PV2xsrO6//37l5uZq8uTJGjt2rFatWlVncwUAAJ6rnjsPvnLlSpf11NRUBQcHKycnR3379rW2N2zYUKGhoZfcx+rVq7V371599dVXCgkJ0R133KEXXnhBM2bM0OzZs+Xj46OFCxeqbdu2mjdvniQpIiJCGzZs0Ouvv67o6OiL9llRUaGKigprvaysrDamCwAAPJRHPUNUWloqSWratKnL9iVLlqh58+a6/fbblZycrNOnT1tj2dnZ6tKli0JCQqxt0dHRKisr0549e6yagQMHuuwzOjpa2dnZl+wjJSVFAQEB1hIeHl4r8wMAAJ7JrVeIfqiqqkqTJ0/Wvffeq9tvv93a/sgjj6h169YKCwvTzp07NWPGDOXl5enjjz+WJBUWFrqEIUnWemFh4WVrysrKdObMGfn5+bmMJScnKykpyVovKysjFAEAcBPzmECUmJio3bt3a8OGDS7bn3rqKevrLl26qEWLFhowYIAOHDigW2+99br04uvrK19f3+uybwAA4Hk84pbZhAkTtGLFCq1du1YtW7a8bG2vXr0kSd9++60kKTQ0VEVFRS411evVzx39VI3dbr/o6hAAADCPWwOR0+nUhAkT9Mknn2jNmjVq27btz74mNzdXktSiRQtJksPh0K5du1RcXGzVpKeny263KzIy0qrJyMhw2U96erocDkctzQQAANzI3BqIEhMT9b//+79aunSpGjdurMLCQhUWFurMmTOSpAMHDuiFF15QTk6ODh48qM8//1zx8fHq27evunbtKkkaNGiQIiMj9dhjj2nHjh1atWqVnnvuOSUmJlq3vcaPH6//+7//0/Tp0/XNN9/orbfe0kcffaQpU6a4be4AAMBzuDUQvf322yotLVVUVJRa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rl16+eWXL3nl8Z577tEbb7whu91u/aycOnXqRXVxcXFavny5ysvLrW2rVq3S6dOn9Ytf/EKSlJKSosWLF2vhwoXas2ePpkyZokcffVRZWVnX49tzY3ICP9KvXz/nfffd57KtZ8+ezhkzZjjXr1/vtNvtzrNnz7qM33rrrc4//elPTqfT6RwzZoxz2LBhLuPPPPOMs1+/fi7HeOaZZ1xq1q5d65Tk/PTTT3+2x86dOzsXLFhgrbdu3dr5+uuv//zk4PGu9fzr1auXMzEx0WX83nvvdXbr1u0nj1lZWels3Lixc/ny5dY2Sc5PPvnEpW7WrFku+3nmmWec/fv3t9ZXrVrl9PX1dZ44ccLpdDqdCQkJzqeeesplH+vXr3d6eXk5z5w585P9wLP169fPGRER4ayqqrK2zZgxwxkREeH817/+5ZTk3LhxozX23XffOf38/JwfffSR0+l0Ort06eKcPXv2Jfdd/XOw+hz64IMPnAEBARfV/fBn3vnz553Nmzd3Ll682BofPXq0c+TIkU6n0+k8e/ass2HDhs5Nmza57CMhIcE5evToq57/zYorRLikrl27uqy3aNFCxcXF2rFjh8rLy9WsWTPreQp/f3/l5+frwIEDtXLsu+66y2W9vLxcU6dOVUREhAIDA+Xv7699+/Zxhegmdi3nX15enu6++26X1/94vaioSOPGjdNtt92mgIAA2e12lZeXX/U5FRcXp8zMTB0+fFjS91enYmNjrYdgd+zYodTUVJdeo6OjVVVVpfz8/Ks6FjxL7969ZbPZrHWHw6H9+/dr7969qlevnnr16mWNNWvWTB07dtS+ffskSZMmTdKLL76oe++9V7NmzdLOnTuvqZd69erpV7/6lZYsWSJJOnXqlD777DPrSuW3336r06dP64EHHnA5FxcvXlxrP7dvBjytikuqX7++y7rNZlNVVZXKy8vVokULZWZmXvSa6l8CXl5e1r30atWXiq9Eo0aNXNanTp2q9PR0vfrqq2rfvr38/Pz00EMP6dy5c1e8T9xYruX8uxJjxozRsWPHNH/+fLVu3Vq+vr5yOBxXfU717NlTt956qz788EM9/fTT+uSTT5SammqNl5eX67//+781adKki17bqlWrqzoWbh5jx45VdHS00tLStHr1aqWkpGjevHmaOHFijfcZFxenfv36qbi4WOnp6fLz81NMTIwkWbfS0tLSdMstt7i8jr+V9v8QiHBVunfvrsLCQtWrV8960PTHgoKCtHv3bpdtubm5Lr/kfHx8VFlZeUXH3Lhxox5//HHrXnh5ebkOHjxYo/5xY7uS869jx47atm2b4uPjrW0/fgZo48aNeuuttzRkyBBJ0qFDh/Tdd9+51NSvX/+KztG4uDgtWbJELVu2lJeXl2JjY1363bt3r9q3b3+lU8QNYsuWLS7r1c+iRUZG6sKFC9qyZYvuueceSdKxY8eUl5enyMhIqz48PFzjx4/X+PHjlZycrHffffeSgehKf1bec889Cg8P17Jly/Tll1/q4Ycftn7mRkZGytfXVwUFBerXr9+1TPumxi0zXJWBAwfK4XBo+PDhWr16tQ4ePKhNmzbpN7/5jbZv3y5J6t+/v7Zv367Fixdr//79mjVr1kUBqU2bNtqyZYsOHjyo7777TlVVVT95zNtuu00ff/yxcnNztWPHDj3yyCOXrcfN60rOv4kTJ+rPf/6zFi1apP379+vFF1/Uzp07XW5v3HbbbfrLX/6iffv2acuWLYqLi5Ofn5/Lsdq0aaOMjAwVFhbqxIkTP9lTXFycvv76a7300kt66KGHXP7HPWPGDG3atEkTJkxQbm6u9u/fr88++4yHqm8CBQUFSkpKUl5env76179qwYIFeuaZZ3Tbbbdp2LBhGjdunDZs2KAdO3bo0Ucf1S233KJhw4ZJ+v5dt6tWrVJ+fr6+/vprrV27VhEREZc8Tps2bVReXq6MjAx99913On369E/29Mgjj2jhwoVKT0+3bpdJUuPGjTV16lRNmTJFixYt0oEDB/T1119rwYIFWrRoUe1+Y25gBCJcFZvNpi+++EJ9+/bVE088oQ4dOmjUqFH697//rZCQEElSdHS0nn/+eU2fPl09e/bUyZMnXf63Ln1/G8zb21uRkZEKCgq67LMbr732mpo0aaJ77rlHQ4cOVXR0tLp3735d5wnPdCXnX1xcnJKTkzV16lR1795d+fn5evzxx9WgQQNrP3/+85914sQJde/eXY899pgmTZqk4OBgl2PNmzdP6enpCg8P15133vmTPbVv31533323du7c6fJLSPr+WaisrCz961//Up8+fXTnnXdq5syZCgsLq8XvCtwhPj5eZ86c0d13363ExEQ988wz1gclfvDBB+rRo4cefPBBORwOOZ1OffHFF9YVm8rKSiUmJioiIkIxMTHq0KGD3nrrrUse55577tH48eM1cuRIBQUFae7cuT/ZU1xcnPbu3atbbrlF9957r8vYCy+8oOeff14pKSnWcdPS0tS2bdta+o7c+GzOHz/sAQA3mQceeEChoaH6y1/+4u5WcBOIiorSHXfcwZ/OuMnwDBGAm8rp06e1cOFCRUdHy9vbW3/961/11VdfWZ9jBACXQiACcFOpvq320ksv6ezZs+rYsaP+8Y9/aODAge5uDYAH45YZAAAwHg9VAwAA4xGIAACA8QhEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACgOussrKSP0gMeDgCEYAbwsqVK3XfffcpMDBQzZo104MPPqgDBw5Ikg4ePCibzaaPP/5Y999/vxo2bKhu3bopOzvbev2///1vDR06VE2aNFGjRo3UuXNnffHFF5Kku+66S6+++qpVO3z4cNWvX1/l5eWSpP/85z+y2Wz69ttvJUkVFRWaOnWqbrnlFjVq1Ei9evVSZmam9frU1FQFBgbq888/V2RkpHx9fS/7B4wBuB+BCMAN4dSpU0pKStL27duVkZEhLy8v/eIXv3C58vKb3/xGU6dOVW5urjp06KDRo0frwoULkqTExERVVFRo3bp12rVrl15++WX5+/tLkvr162cFGqfTqfXr1yswMFAbNmyQJGVlZemWW25R+/btJUkTJkxQdna2PvzwQ+3cuVMPP/ywYmJitH//fquX06dP6+WXX9Z7772nPXv2KDg4uC6+TQBqiD/dAeCG9N133ykoKEi7du2Sv7+/2rZtq/fee08JCQmSpL1796pz587at2+fOnXqpK5du2rEiBGaNWvWRftavny5HnvsMR07dky7d+9WTEyMRo4cqQYNGuj3v/+9xo0bp9OnT2vJkiUqKChQu3btVFBQoLCwMGsfAwcO1N13363f/e53Sk1N1RNPPKHc3Fx169atzr4nAGqOK0QAbgj79+/X6NGj1a5dO9ntdrVp00aSXG5Fde3a1fq6RYsWkqTi4mJJ0qRJk/Tiiy/q3nvv1axZs7Rz506rtk+fPjp58qT++c9/KisrS/369VNUVJR11SgrK0tRUVGSpF27dqmyslIdOnSQv7+/tWRlZVm38CTJx8fHpR8Ano2/dg/ghjB06FC1bt1a7777rsLCwlRVVaXbb79d586ds2rq169vfW2z2STJuqU2duxYRUdHKy0tTatXr1ZKSormzZuniRMnKjAwUN26dVNmZqays7P1wAMPqG/fvho5cqT+9a9/af/+/erXr58kqby8XN7e3srJyZG3t7dLj9W34CTJz8/P6gGA5+MKEQCPd+zYMeXl5em5557TgAEDFBERoRMnTlz1fsLDwzV+/Hh9/PHHevbZZ/Xuu+9aY/369dPatWu1bt06RUVFqWnTpoqIiNBLL72kFi1aqEOHDpKkO++8U5WVlSouLlb79u1dltDQ0FqbM4C6RSAC4PGaNGmiZs2a6Z133tG3336rNWvWKCkp6ar2MXnyZK1atUr5+fn6+uuvtXbtWkVERFjjUVFRWrVqlerVq6dOnTpZ25YsWWJdHZKkDh06KC4uTvHx8fr444+Vn5+vrVu3KiUlRWlpabUzYQB1jkAEwON5eXnpww8/VE5Ojm6//XZNmTJFr7zyylXto7KyUomJiYqIiFBMTIw6dOigt956yxrv06ePqqqqXMJPVFSUKisrreeHqn3wwQeKj4/Xs88+q44dO2r48OHatm2bWrVqdU3zBOA+vMsMAAAYjytEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACAADGIxABAADjEYgAAIDxCEQAAMB4BCIAAGA8AhEAADDe/weCiimbenEpXAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.countplot(x=df_sampled[\"answer\"])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e2DP6ekqfNbe", "outputId": "3aacbc50-8554-40eb-9cdb-c949c30d634e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "answer\n", "negative 1236\n", "neutral 1236\n", "positive 1236\n", "Name: count, dtype: int64\n", "(3708, 2)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/xc/v1l81vkx6fjc9wpqc0tsnl400000gn/T/ipykernel_11468/1830774783.py:5: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", " df_balanced = df_sampled.groupby(\"answer\").apply(lambda x: x.sample(min_class_count, random_state=42)).reset_index(drop=True)\n" ] } ], "source": [ "# Undersampling each class to match the class with the smallest number of samples\n", "min_class_count = df_sampled[\"answer\"].value_counts().min()\n", "\n", "# Sampling an equal number of rows from each class\n", "df_balanced = df_sampled.groupby(\"answer\").apply(lambda x: x.sample(min_class_count, random_state=42)).reset_index(drop=True)\n", "\n", "# Showing the new class distribution\n", "print(df_balanced[\"answer\"].value_counts())\n", "print(df_balanced.shape)\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "id": "dJosNJACYDCc" }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "593c0e8a5f6b4b9495ff422cc2382975", "version_major": 2, "version_minor": 0 }, "text/plain": [ "modules.json: 0%| | 0.00/349 [00:00#sk-container-id-1 {\n", " /* Definition of color scheme common for light and dark mode */\n", " --sklearn-color-text: black;\n", " --sklearn-color-line: gray;\n", " /* Definition of color scheme for unfitted estimators */\n", " --sklearn-color-unfitted-level-0: #fff5e6;\n", " --sklearn-color-unfitted-level-1: #f6e4d2;\n", " --sklearn-color-unfitted-level-2: #ffe0b3;\n", " --sklearn-color-unfitted-level-3: chocolate;\n", " /* Definition of color scheme for fitted estimators */\n", " --sklearn-color-fitted-level-0: #f0f8ff;\n", " --sklearn-color-fitted-level-1: #d4ebff;\n", " --sklearn-color-fitted-level-2: #b3dbfd;\n", " --sklearn-color-fitted-level-3: cornflowerblue;\n", "\n", " /* Specific color for light theme */\n", " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n", " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n", " --sklearn-color-icon: #696969;\n", "\n", " @media (prefers-color-scheme: dark) {\n", " /* Redefinition of color scheme for dark theme */\n", " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n", " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n", " --sklearn-color-icon: #878787;\n", " }\n", "}\n", "\n", "#sk-container-id-1 {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", "#sk-container-id-1 pre {\n", " padding: 0;\n", "}\n", "\n", "#sk-container-id-1 input.sk-hidden--visually {\n", " border: 0;\n", " clip: rect(1px 1px 1px 1px);\n", " clip: rect(1px, 1px, 1px, 1px);\n", " height: 1px;\n", " margin: -1px;\n", " overflow: hidden;\n", " padding: 0;\n", " position: absolute;\n", " width: 1px;\n", "}\n", "\n", "#sk-container-id-1 div.sk-dashed-wrapped {\n", " border: 1px dashed var(--sklearn-color-line);\n", " margin: 0 0.4em 0.5em 0.4em;\n", " box-sizing: border-box;\n", " padding-bottom: 0.4em;\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", "#sk-container-id-1 div.sk-container {\n", " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", " so we also need the `!important` here to be able to override the\n", " default hidden behavior on the sphinx rendered scikit-learn.org.\n", " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", " display: inline-block !important;\n", " position: relative;\n", "}\n", "\n", "#sk-container-id-1 div.sk-text-repr-fallback {\n", " display: none;\n", "}\n", "\n", "div.sk-parallel-item,\n", "div.sk-serial,\n", "div.sk-item {\n", " /* draw centered vertical line to link estimators */\n", " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", " background-size: 2px 100%;\n", " background-repeat: no-repeat;\n", " background-position: center center;\n", "}\n", "\n", "/* Parallel-specific style estimator block */\n", "\n", "#sk-container-id-1 div.sk-parallel-item::after {\n", " content: \"\";\n", " width: 100%;\n", " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", " flex-grow: 1;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel {\n", " display: flex;\n", " align-items: stretch;\n", " justify-content: center;\n", " background-color: var(--sklearn-color-background);\n", " position: relative;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item {\n", " display: flex;\n", " flex-direction: column;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n", " align-self: flex-end;\n", " width: 50%;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n", " align-self: flex-start;\n", " width: 50%;\n", "}\n", "\n", "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n", " width: 0;\n", "}\n", "\n", "/* Serial-specific style estimator block */\n", "\n", "#sk-container-id-1 div.sk-serial {\n", " display: flex;\n", " flex-direction: column;\n", " align-items: center;\n", " background-color: var(--sklearn-color-background);\n", " padding-right: 1em;\n", " padding-left: 1em;\n", "}\n", "\n", "\n", "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", "clickable and can be expanded/collapsed.\n", "- Pipeline and ColumnTransformer use this feature and define the default style\n", "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", "*/\n", "\n", "/* Pipeline and ColumnTransformer style (default) */\n", "\n", "#sk-container-id-1 div.sk-toggleable {\n", " /* Default theme specific background. It is overwritten whether we have a\n", " specific estimator or a Pipeline/ColumnTransformer */\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", "/* Toggleable label */\n", "#sk-container-id-1 label.sk-toggleable__label {\n", " cursor: pointer;\n", " display: block;\n", " width: 100%;\n", " margin-bottom: 0;\n", " padding: 0.5em;\n", " box-sizing: border-box;\n", " text-align: center;\n", "}\n", "\n", "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n", " /* Arrow on the left of the label */\n", " content: \"▸\";\n", " float: left;\n", " margin-right: 0.25em;\n", " color: var(--sklearn-color-icon);\n", "}\n", "\n", "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", "/* Toggleable content - dropdown */\n", "\n", "#sk-container-id-1 div.sk-toggleable__content {\n", " max-height: 0;\n", " max-width: 0;\n", " overflow: hidden;\n", " text-align: left;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content pre {\n", " margin: 0.2em;\n", " border-radius: 0.25em;\n", " color: var(--sklearn-color-text);\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", " /* Expand drop-down */\n", " max-height: 200px;\n", " max-width: 100%;\n", " overflow: auto;\n", "}\n", "\n", "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", " content: \"▾\";\n", "}\n", "\n", "/* Pipeline/ColumnTransformer-specific style */\n", "\n", "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator-specific style */\n", "\n", "/* Colorize estimator box */\n", "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n", "#sk-container-id-1 div.sk-label label {\n", " /* The background is the default theme color */\n", " color: var(--sklearn-color-text-on-default-background);\n", "}\n", "\n", "/* On hover, darken the color of the background */\n", "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "/* Label box, darken color on hover, fitted */\n", "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator label */\n", "\n", "#sk-container-id-1 div.sk-label label {\n", " font-family: monospace;\n", " font-weight: bold;\n", " display: inline-block;\n", " line-height: 1.2em;\n", "}\n", "\n", "#sk-container-id-1 div.sk-label-container {\n", " text-align: center;\n", "}\n", "\n", "/* Estimator-specific */\n", "#sk-container-id-1 div.sk-estimator {\n", " font-family: monospace;\n", " border: 1px dotted var(--sklearn-color-border-box);\n", " border-radius: 0.25em;\n", " box-sizing: border-box;\n", " margin-bottom: 0.5em;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "/* on hover */\n", "#sk-container-id-1 div.sk-estimator:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "#sk-container-id-1 div.sk-estimator.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", "\n", "/* Common style for \"i\" and \"?\" */\n", "\n", ".sk-estimator-doc-link,\n", "a:link.sk-estimator-doc-link,\n", "a:visited.sk-estimator-doc-link {\n", " float: right;\n", " font-size: smaller;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-background);\n", " border-radius: 1em;\n", " height: 1em;\n", " width: 1em;\n", " text-decoration: none !important;\n", " margin-left: 1ex;\n", " /* unfitted */\n", " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-unfitted-level-1);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted,\n", "a:link.sk-estimator-doc-link.fitted,\n", "a:visited.sk-estimator-doc-link.fitted {\n", " /* fitted */\n", " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-1);\n", "}\n", "\n", "/* On hover */\n", "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "/* Span, style for the box shown on hovering the info icon */\n", ".sk-estimator-doc-link span {\n", " display: none;\n", " z-index: 9999;\n", " position: relative;\n", " font-weight: normal;\n", " right: .2ex;\n", " padding: .5ex;\n", " margin: .5ex;\n", " width: min-content;\n", " min-width: 20ex;\n", " max-width: 50ex;\n", " color: var(--sklearn-color-text);\n", " box-shadow: 2pt 2pt 4pt #999;\n", " /* unfitted */\n", " background: var(--sklearn-color-unfitted-level-0);\n", " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted span {\n", " /* fitted */\n", " background: var(--sklearn-color-fitted-level-0);\n", " border: var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link:hover span {\n", " display: block;\n", "}\n", "\n", "/* \"?\"-specific style due to the `` HTML tag */\n", "\n", "#sk-container-id-1 a.estimator_doc_link {\n", " float: right;\n", " font-size: 1rem;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-background);\n", " border-radius: 1rem;\n", " height: 1rem;\n", " width: 1rem;\n", " text-decoration: none;\n", " /* unfitted */\n", " color: var(--sklearn-color-unfitted-level-1);\n", " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", "}\n", "\n", "#sk-container-id-1 a.estimator_doc_link.fitted {\n", " /* fitted */\n", " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-1);\n", "}\n", "\n", "/* On hover */\n", "#sk-container-id-1 a.estimator_doc_link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", "}\n", "" ], "text/plain": [ "RandomForestClassifier(random_state=42)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf = RandomForestClassifier(n_estimators=100, random_state=42)\n", "clf.fit(X_train, y_train)\n" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.66 0.52 0.58 277\n", " 1 0.62 0.80 0.70 237\n", " 2 0.55 0.52 0.54 228\n", "\n", " accuracy 0.61 742\n", " macro avg 0.61 0.61 0.61 742\n", "weighted avg 0.61 0.61 0.60 742\n", "\n" ] } ], "source": [ "from sentence_transformers import SentenceTransformer\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import LabelEncoder\n", "from sklearn.metrics import classification_report\n", "\n", "# Load model (already done)\n", "model = SentenceTransformer(\"all-MiniLM-L6-v2\")\n", "\n", "# Converting text to embeddings\n", "X = model.encode(df_balanced[\"user_prompt\"].tolist(), convert_to_numpy=True)\n", "\n", "# Encode labels (already done)\n", "label_encoder = LabelEncoder()\n", "y = label_encoder.fit_transform(df_balanced[\"answer\"])\n", "\n", "# Train-test split (already done)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "# Initialize and train RandomForestClassifier\n", "clf = RandomForestClassifier(n_estimators=100, random_state=42)\n", "clf.fit(X_train, y_train)\n", "\n", "# Make predictions on the test set\n", "y_pred = clf.predict(X_test)\n", "\n", "# Print classification report to evaluate performance\n", "print(classification_report(y_test, y_pred))\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Best Parameters: {'max_depth': 20, 'min_samples_split': 5, 'n_estimators': 200}\n" ] } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "\n", "param_grid = {\n", " 'n_estimators': [50, 100, 200],\n", " 'max_depth': [10, 20, 30],\n", " 'min_samples_split': [2, 5, 10]\n", "}\n", "\n", "grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=3, n_jobs=-1)\n", "grid_search.fit(X_train, y_train)\n", "print(\"Best Parameters:\", grid_search.best_params_)\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random Forest Hyperparameters:\n", "Number of Estimators (n_estimators): 200\n", "Max Depth (max_depth): 20\n", "Min Samples Split (min_samples_split): 5\n", "Min Samples Leaf (min_samples_leaf): 1\n", "Random State (random_state): 42\n", "Max Features (max_features): sqrt\n" ] } ], "source": [ "# Print the hyperparameters of the trained model\n", "print(\"Random Forest Hyperparameters:\")\n", "print(f\"Number of Estimators (n_estimators): {clf.n_estimators}\")\n", "print(f\"Max Depth (max_depth): {clf.max_depth}\")\n", "print(f\"Min Samples Split (min_samples_split): {clf.min_samples_split}\")\n", "print(f\"Min Samples Leaf (min_samples_leaf): {clf.min_samples_leaf}\")\n", "print(f\"Random State (random_state): {clf.random_state}\")\n", "print(f\"Max Features (max_features): {clf.max_features}\")\n", "\n" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomForestClassifier(max_depth=20, min_samples_split=5, n_estimators=200,\n",
              "                       random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "RandomForestClassifier(max_depth=20, min_samples_split=5, n_estimators=200,\n", " random_state=42)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "\n", "# Updated parameters based on your best values\n", "clf = RandomForestClassifier(\n", " n_estimators=200, # Set number of trees to 200\n", " max_depth=20, # Set max depth to 20\n", " min_samples_split=5, # Set min samples split to 5\n", " random_state=42, # Keep random state for reproducibility\n", " max_features='sqrt', # Default 'sqrt' for Random Forest (best practice)\n", " min_samples_leaf=1 # Default value is 1, change if needed\n", ")\n", "\n", "# Train the model with the new parameters\n", "clf.fit(X_train, y_train)\n", "\n", "# You can now use clf for prediction and evaluation as usual\n" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.66 0.52 0.58 277\n", " 1 0.62 0.80 0.70 237\n", " 2 0.55 0.52 0.54 228\n", "\n", " accuracy 0.61 742\n", " macro avg 0.61 0.61 0.61 742\n", "weighted avg 0.61 0.61 0.60 742\n", "\n" ] } ], "source": [ "print(classification_report(y_test, y_pred))\n" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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pejUqRPmz5+vVhxqJ4kdO3ZUeS4IAmJjY3HhwgWMHz9e3e4AAJmZmahfv36+XktERET0JWnSpAkEQXjvdolEgqCgIAQFBb13HysrK+W0vfxSewmcdy/htrKyQpMmTXDgwAFMnDgxX0H069fvk98IERERUX7p0m35dIValcTs7Gz07t0blStXRrFixQosiPT0dCxduhR///03qlSpAiMjI5Xts2fPLrBjEREREdHHqZUkGhgYoEWLFoiIiCjQJPHatWvKK3Ru3Lihso0XsRAREZGmMd0QU3tOYqVKlXD//n24uLgUWBDHjh0rsL6IiIiI6NOpPSdx6tSpGD16NPbt24fY2FjRvQiJiIiIChupRHOPwirPlcSgoCD88MMP8PX1BfDmfstvDwULggCJRILs7OyCj5KIiIiIPqs8J4mTJ0/GoEGDODRMREREXxwJCnHJT0PynCTmrNfj5eWlsWCIiIiItKEwDwtrilpzEnmlMREREZF+UOvq5nLlyn00UUxISPikgIiIiIg+N1YSxdRKEidPngy5XK6pWIiIiIhIR6iVJHbt2hV2dnaaioWIiIhIKzilTizPcxJ58oiIiIj0h9pXNxMRERF9aTgnUSzPSaJCodBkHERERESkQ9S+dzMRERHRl4az6sSYJBIREZHekzJLFFFrMW0iIiIi0g+sJBIREZHe44UrYqwkEhEREZEIK4lERESk9zglUYyVRCIiIiISYSWRiIiI9J4ULCW+i5VEIiIiIhJhJZGIiIj0HuckijFJJCIiIr3HJXDEONxMRERERCKsJBIREZHe4235xFhJJCIiIiIRVhKJiIhI77GQKMZKIhERERGJsJJIREREeo9zEsVYSSQiIiIiEVYSiYiISO+xkCjGJJGIiIj0HodWxXhOiIiIiEiElUQiIiLSexKON4uwkkhEREREIqwkEhERkd5jHVGMlUQiIiIiEmElkYiIiPQeF9MWYyWRiIiIiERYSSQiIiK9xzqiGCuJREREpPckEs091JGdnY3x48fDxcUFpqamcHV1xZQpUyAIgnIfQRAwYcIEODo6wtTUFN7e3oiKiirgM8IkkYiIiEhn/Pbbb1i8eDH++OMPRERE4LfffsOMGTOwYMEC5T4zZszA/PnzERISgvDwcJiZmcHHxwfp6ekFGguHm4mIiEjv6cpi2mfOnEG7du3QunVrAEDp0qXx559/4ty5cwDeVBHnzp2LX375Be3atQMArF27Fvb29ti1axe6du1aYLGwkkhERESkQRkZGUhKSlJ5ZGRk5Lpv/fr1ERoaijt37gAArl69ilOnTqFVq1YAgOjoaMTFxcHb21v5Grlcjrp16yIsLKxA42aSSERERHpPqsFHcHAw5HK5yiM4ODjXOH766Sd07doVFSpUgJGREapXr46RI0fCz88PABAXFwcAsLe3V3mdvb29cltB4XAzERERkQYFBgYiICBApU0mk+W675YtW7BhwwZs3LgRFStWxJUrVzBy5Eg4OTnB39//c4SrxCSRiIiI9J4m5yTKZLL3JoXvGjNmjLKaCACVK1fGw4cPERwcDH9/fzg4OAAA4uPj4ejoqHxdfHw8qlWrVqBxc7iZiIiISEekpqZCKlVNzwwMDKBQKAAALi4ucHBwQGhoqHJ7UlISwsPD4enpWaCxsJJIREREek83rm0G2rRpg2nTpqFUqVKoWLEiLl++jNmzZ6NPnz4A3lQ8R44cialTp8LNzQ0uLi4YP348nJyc0L59+wKNhUkiERERkY5YsGABxo8fj++//x5PnjyBk5MTBg4ciAkTJij3+fHHH5GSkoIBAwYgMTERDRs2xMGDB2FiYlKgsUiEt5fw/kKkv9Z2BERixWoP1XYIRCqenJ2v7RCIVBSVaW8W3LarsRrr+5uqjh/fSQd9kZXER8/TtB0CkcjpXdO1HQKRim9WnNd2CEQqDn1fV2vH5kUaYjwnRERERCTyRVYSiYiIiNShK7fl0yWsJBIRERGRCCuJREREpPdYRxRjJZGIiIiIRFhJJCIiIr3HKYlirCQSERERkQgriURERKT3pJyVKMIkkYiIiPQeh5vFONxMRERERCKsJBIREZHek3C4WYSVRCIiIiISYSWRiIiI9B7nJIqxkkhEREREIqwkEhERkd7jEjhirCQSERERkQgriURERKT3OCdRjEkiERER6T0miWIcbiYiIiIiEVYSiYiISO9xMW0xVhKJiIiISISVRCIiItJ7UhYSRVhJJCIiIiIRVhKJiIhI73FOohgriUREREQkwkoiERER6T2ukyjGJJGIiIj0HoebxTjcTEREREQirCQSERGR3uMSOGKsJBIRERGRCCuJREREpPc4J1GMlUQiIiIiEmElkYiIiPQel8ARYyWRiIiIiERYSSQiIiK9x0Ki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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "from sklearn.metrics import confusion_matrix\n", "\n", "# Generate predictions on the test data\n", "y_pred = clf.predict(X_test)\n", "\n", "# Create the confusion matrix\n", "cm = confusion_matrix(y_test, y_pred)\n", "\n", "# Plot the confusion matrix\n", "plt.figure(figsize=(8, 6))\n", "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\", xticklabels=label_encoder.classes_, yticklabels=label_encoder.classes_)\n", "plt.title(\"Confusion Matrix for Financial Sentiment Classifier\")\n", "plt.xlabel(\"Predicted Label\")\n", "plt.ylabel(\"True Label\")\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "v8DE8aAzg4jQ", "outputId": "5ce78149-c53b-45f3-994f-5f6c7d21b819" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Label: neutral\n" ] } ], "source": [ "new_texts = [\"The company is doing OK\"]\n", "new_embeddings = model.encode(new_texts, convert_to_numpy=True)\n", "predicted_label = clf.predict(new_embeddings)\n", "\n", "# Convert back to original label names\n", "decoded_label = label_encoder.inverse_transform(predicted_label)\n", "print(\"Predicted Label:\", decoded_label[0])\n" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['random_forest_classifier.pkl']" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Save SBERT model\n", "\n", "\n", "# Save RandomForest model\n", "import joblib\n", "joblib.dump(clf, \"random_forest_classifier.pkl\") # Save the trained classifier model\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: transformers in /opt/anaconda3/lib/python3.12/site-packages (4.45.2)\n", "Requirement already satisfied: datasets in /opt/anaconda3/lib/python3.12/site-packages (3.1.0)\n", "Requirement already satisfied: huggingface_hub in /opt/anaconda3/lib/python3.12/site-packages (0.26.2)\n", "Requirement already satisfied: filelock in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (3.13.1)\n", "Requirement already satisfied: numpy>=1.17 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2.0.2)\n", "Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (24.2)\n", "Requirement already satisfied: pyyaml>=5.1 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (6.0.1)\n", "Requirement already satisfied: regex!=2019.12.17 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2023.10.3)\n", "Requirement already satisfied: requests in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2.32.3)\n", "Requirement already satisfied: safetensors>=0.4.1 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (0.4.5)\n", "Requirement already satisfied: tokenizers<0.21,>=0.20 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (0.20.3)\n", "Requirement already satisfied: tqdm>=4.27 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (4.66.4)\n", "Requirement already satisfied: pyarrow>=15.0.0 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (17.0.0)\n", "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (0.3.8)\n", "Requirement already satisfied: pandas in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (2.2.3)\n", "Requirement already satisfied: xxhash in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (3.5.0)\n", "Requirement already satisfied: multiprocess<0.70.17 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (0.70.16)\n", "Requirement already satisfied: fsspec<=2024.9.0,>=2023.1.0 in /opt/anaconda3/lib/python3.12/site-packages (from fsspec[http]<=2024.9.0,>=2023.1.0->datasets) (2024.3.1)\n", "Requirement already satisfied: aiohttp in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (3.9.5)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/anaconda3/lib/python3.12/site-packages (from huggingface_hub) (4.12.2)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.2.0)\n", "Requirement already satisfied: attrs>=17.3.0 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (23.1.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.4.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (6.0.4)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.9.3)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2.0.4)\n", "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (3.7)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2.2.2)\n", "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2024.8.30)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2023.3)\n", "Requirement already satisfied: six>=1.5 in /opt/anaconda3/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0)\n" ] } ], "source": [ "!pip install transformers datasets huggingface_hub\n", "\n", "\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 0 }