{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "gpuType": "T4" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU", "widgets": { "application/vnd.jupyter.widget-state+json": { "f60e3c3cbfa44ddfbb35a20c295a7071": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_c56ea1c6adc845238398f0267ecca203", "IPY_MODEL_d8c2363c5aec4b949c72fa119f4b9314", "IPY_MODEL_22cdf3c7f04d4c81a1de6d159a6e7c23" ], "layout": "IPY_MODEL_0742c322e39b4f7f893b274ce440feef" } }, "c56ea1c6adc845238398f0267ecca203": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_bb25a51f5eae4b049db57954d5d6c539", "placeholder": "​", "style": "IPY_MODEL_2a82e457fae047d6aa1cb45de6ccc65d", "value": "model.safetensors: 100%" } }, "d8c2363c5aec4b949c72fa119f4b9314": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_18776047ab7f4b658f651e5d18056d0d", "max": 267954768, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_c92a110c440e4f6489d43a42bcda95a7", "value": 267954768 } }, "22cdf3c7f04d4c81a1de6d159a6e7c23": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_cc2ab102716741f5937b327fd92367f2", "placeholder": "​", "style": "IPY_MODEL_c5a7ff2101c844bb812ccd02a897ba2f", "value": " 268M/268M [00:02<00:00, 316MB/s]" } }, "0742c322e39b4f7f893b274ce440feef": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "bb25a51f5eae4b049db57954d5d6c539": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2a82e457fae047d6aa1cb45de6ccc65d": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "18776047ab7f4b658f651e5d18056d0d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c92a110c440e4f6489d43a42bcda95a7": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "cc2ab102716741f5937b327fd92367f2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c5a7ff2101c844bb812ccd02a897ba2f": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } } } } }, "cells": [ { "cell_type": "markdown", "source": [ "**https://medium.com/nerd-for-tech/fine-tuning-pretrained-bert-for-sentiment-classification-using-transformers-in-python-931ed142e37t**" ], "metadata": { "id": "DY8CxeND8kUT" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "v2yodoX72lbP", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "8c3ba77f-85d5-4f40-fff1-1e3696dcf256" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.41.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.14.0)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.23.0)\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.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.19.1)\n", "Requirement already satisfied: safetensors>=0.4.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.4.3)\n", "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.66.4)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.23.0->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.23.0->transformers) (4.11.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.7)\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" ] } ], "source": [ "!pip install transformers" ] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import warnings\n", "warnings.filterwarnings('ignore')" ], "metadata": { "id": "3D8GpmYl2_eR" }, "execution_count": 1, "outputs": [] }, { "cell_type": "code", "source": [ "df = pd.read_csv('/content/complaint_data.csv')\n", "df = df.set_index(df.columns[0])\n", "df.head()\n" ], "metadata": { "id": "CMXrn4Q92_bf", "colab": { "base_uri": "https://localhost:8080/", "height": 237 }, "outputId": "599e00f8-5b6f-4ee9-987e-ae5f5d84d0a7" }, "execution_count": 2, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " complaint_what_happened Topic\n", "Unnamed: 0 \n", "1 good morning my name is xxxx xxxx and i apprec... 0\n", "2 i upgraded my xxxx xxxx card in xx xx 2018 and... 1\n", "10 chase card was reported on xx xx 2019 however... 3\n", "11 on xx xx 2018 while trying to book a xxxx xx... 3\n", "14 my grand son give me check for 1600 00 i de... 0" ], "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", "
complaint_what_happenedTopic
Unnamed: 0
1good morning my name is xxxx xxxx and i apprec...0
2i upgraded my xxxx xxxx card in xx xx 2018 and...1
10chase card was reported on xx xx 2019 however...3
11on xx xx 2018 while trying to book a xxxx xx...3
14my grand son give me check for 1600 00 i de...0
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "df", "summary": "{\n \"name\": \"df\",\n \"rows\": 21072,\n \"fields\": [\n {\n \"column\": \"Unnamed: 0\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 23390,\n \"min\": 1,\n \"max\": 78312,\n \"num_unique_values\": 21072,\n \"samples\": [\n 30957,\n 58320,\n 61282\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"complaint_what_happened\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 20928,\n \"samples\": [\n \"this is in regards to a billing dispute that occurred on my chase freedom unlimited card ending in xxxx the billing dispute i will be referencing throughout is with the merchant xxxx xxxx xxxx in the amount of 700 00 posted on xx xx 2018 this charge was disputed because the merchant performed services that xxxx xxxx my dog i took my dog in for xxxx xxxx xxxx with this business after some back and forth the merchant assured me in no uncertain terms that this xxxx would have absolutely no complications for my dog in other words i was guaranteed by the doctor working at this place that my dog will not experience any adverse side effects from xxxx xxxx much less any xxxx xxxx conditions this turned out to be a complete and unequivocal lie after the xxxx my dog xxxx xxxx xxxx and experienced a xxxx xxxx xxxx xxxx xxxx my dog a xxxx pound puppy was xxxx xxxx and howling at xxxx in the morning after the xxxx i immediately rushed over to the nearest emergency room and took my dog in to get checked by a licensed veterinarian i was told that my dog was on the xxxx xxxx xxxx and he very possibly could have xxxx had i gone to the er any later the vet prescribed some temporary medication for my dog and told me to come back later when the hospital would be running with a full staff on hand i later took my dog in to a separate hospital where the vet was able to better diagnose and take care of my dog all in all this fraudulent and evil natured xxxx which nearly took my dog s xxxx costed me an additional 1500 00 in medical expenses this merchant does not deserve a single penny for this xxxx that not only xxxx my dog xxxx xxxx but also costed me an additional 1500 00 in otherwise preventable medical expenses \",\n \"on xx xx xxxx i made a remote deposit to my chase personal checking account with a check for 2800 00 written from my account at xxxx chase indicated that there was a hold on the deposit on xx xx xxxx i called xxxx to get the hold lifted on their end i then called chase and spoke to a representative who put me on hold called xxxx and then told me that the hold on the deposit had been lifted and the funds would be available for me to use immediately \\n\\non xx xx xxxx i logged in to my chase account online and saw that on xx xx xxxx the check had been returned and a 12 00 deposit item returned fee had been assessed i called chase and spoke first with an agent and then with the agent s supervisor who told me that the check had been returned because according to xxxx there was a hold on the check i then called xxxx and they told me that there was no hold as i had been told on xx xx xxxx \\n\\nneither xxxx nor chase will refund the 12 00 xxxx will not refund the fee because they are not the ones who charged it chase will not refund the fee because they claim to have been acting on information provided by xxxx that is to say chase claims that the check was returned on xx xx xxxx because xxxx indicated there was a hold on my xxxx account even though both xxxx and chase told me on xx xx xxxx that the hold had been lifted and xxxx confirmed on xx xx xxxx that there was no hold \",\n \"chase went on my credit reports without written authorization 3 times\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Topic\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 0,\n \"max\": 4,\n \"num_unique_values\": 5,\n \"samples\": [\n 1,\n 4,\n 3\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 2 } ] }, { "cell_type": "code", "source": [ "sentences = df['complaint_what_happened'].tolist()\n", "labels = df['Topic'].tolist()" ], "metadata": { "id": "vF0f0J3v2_WZ" }, "execution_count": 3, "outputs": [] }, { "cell_type": "code", "source": [ "test = pd.DataFrame({\n", " 'complaints': [\n", " \"I can not get from chase who services my mortgage, who owns it and who has original loan docs\",\n", " \"The bill amount of my credit card was debited twice. Please look into the matter and resolve at the earliest.\",\n", " \"I want to open a salary account at your downtown branch. Please provide me the procedure.\",\n", " \"Yesterday, I received a fraudulent email regarding renewal of my services.\",\n", " \"What is the procedure to know my CIBIL score?\",\n", " \"I need to know the number of bank branches and their locations in the city of Dubai\"\n", " ],\n", " 'labels':[2,1,0,4,0,0]\n", "})" ], "metadata": { "id": "0yB8C6g3409H" }, "execution_count": 4, "outputs": [] }, { "cell_type": "code", "source": [ "test" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 237 }, "id": "oIxaiiC772XR", "outputId": "022bfe26-ecf2-450e-da19-599d0d086882" }, "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " complaints labels\n", "0 I can not get from chase who services my mortg... 2\n", "1 The bill amount of my credit card was debited ... 1\n", "2 I want to open a salary account at your downto... 0\n", "3 Yesterday, I received a fraudulent email regar... 4\n", "4 What is the procedure to know my CIBIL score? 0\n", "5 I need to know the number of bank branches and... 0" ], "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", "
complaintslabels
0I can not get from chase who services my mortg...2
1The bill amount of my credit card was debited ...1
2I want to open a salary account at your downto...0
3Yesterday, I received a fraudulent email regar...4
4What is the procedure to know my CIBIL score?0
5I need to know the number of bank branches and...0
\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" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "test", "summary": "{\n \"name\": \"test\",\n \"rows\": 6,\n \"fields\": [\n {\n \"column\": \"complaints\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 6,\n \"samples\": [\n \"I can not get from chase who services my mortgage, who owns it and who has original loan docs\",\n \"The bill amount of my credit card was debited twice. Please look into the matter and resolve at the earliest.\",\n \"I need to know the number of bank branches and their locations in the city of Dubai\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"labels\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 0,\n \"max\": 4,\n \"num_unique_values\": 4,\n \"samples\": [\n 1,\n 4,\n 2\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 5 } ] }, { "cell_type": "code", "source": [ "test_texts = test['complaints'].values.tolist()" ], "metadata": { "id": "O_FLBiXg5BSY" }, "execution_count": 6, "outputs": [] }, { "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split\n", "train_texts, val_texts, train_labels, val_labels = train_test_split(sentences, labels, test_size=.2,random_state=42,stratify=labels)" ], "metadata": { "id": "tw_68jZn3fZO" }, "execution_count": 7, "outputs": [] }, { "cell_type": "code", "source": [ "import torch\n", "from torch.utils.data import Dataset\n", "from transformers import DistilBertTokenizerFast,DistilBertForSequenceClassification\n", "from transformers import Trainer,TrainingArguments" ], "metadata": { "id": "4GWB7N313fWc" }, "execution_count": 8, "outputs": [] }, { "cell_type": "code", "source": [ "model_name = 'distilbert-base-uncased'" ], "metadata": { "id": "yeYlwFYE3fTj" }, "execution_count": 9, "outputs": [] }, { "cell_type": "code", "source": [ "tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased',num_labels=5)" ], "metadata": { "id": "A-Mtpqf43fQt" }, "execution_count": 10, "outputs": [] }, { "cell_type": "code", "source": [ "train_encodings = tokenizer(train_texts, truncation=True, padding=True,return_tensors = 'pt')\n", "val_encodings = tokenizer(val_texts, truncation=True, padding=True,return_tensors = 'pt')\n", "test_encodings = tokenizer(test_texts, truncation=True, padding=True,return_tensors = 'pt')" ], "metadata": { "id": "5MTfiPRR4UC2" }, "execution_count": 11, "outputs": [] }, { "cell_type": "code", "source": [ "class SentimentDataset(torch.utils.data.Dataset):\n", " def __init__(self, encodings, labels):\n", " self.encodings = encodings\n", " self.labels = labels\n", "\n", " def __getitem__(self, idx):\n", " item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}\n", " item['labels'] = torch.tensor(self.labels[idx])\n", " return item\n", "\n", " def __len__(self):\n", " return len(self.labels)\n", "## Test Dataset\n", "class SentimentTestDataset(torch.utils.data.Dataset):\n", " def __init__(self, encodings):\n", " self.encodings = encodings\n", "\n", " def __getitem__(self, idx):\n", " item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}\n", " return item\n", " def __len__(self):\n", " return len(self.encodings)" ], "metadata": { "id": "nyB35Xxs4fg_" }, "execution_count": 12, "outputs": [] }, { "cell_type": "code", "source": [ "train_dataset = SentimentDataset(train_encodings, train_labels)\n", "val_dataset = SentimentDataset(val_encodings, val_labels)\n", "test_dataset = SentimentTestDataset(test_encodings)" ], "metadata": { "id": "iIK86LpH4T_l" }, "execution_count": 13, "outputs": [] }, { "cell_type": "code", "source": [ "from sklearn.metrics import accuracy_score, f1_score\n", "def compute_metrics(p):\n", " pred, labels = p\n", " pred = np.argmax(pred, axis=1)\n", "\n", " accuracy = accuracy_score(y_true=labels, y_pred=pred)\n", " #recall = recall_score(y_true=labels, y_pred=pred)\n", " #precision = precision_score(y_true=labels, y_pred=pred)\n", " f1 = f1_score(labels, pred, average='weighted')\n", "\n", " return {\"accuracy\": accuracy,\"f1_score\":f1}" ], "metadata": { "id": "Cyhy5TIz5Mhr" }, "execution_count": 14, "outputs": [] }, { "cell_type": "code", "source": [ "!pip install accelerate>=0.21.0" ], "metadata": { "id": "BoYNJmFYipDY" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "!pip install transformers[torch]" ], "metadata": { "id": "GR4iBTJ3jI8S", "outputId": "37273942-10c8-4413-b51d-f87225fb72f4", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: transformers[torch] in /usr/local/lib/python3.10/dist-packages (4.41.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (3.14.0)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (0.23.0)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (1.25.2)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (24.0)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (6.0.1)\n", "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (2023.12.25)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (2.31.0)\n", "Requirement already satisfied: tokenizers<0.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (0.19.1)\n", "Requirement already satisfied: safetensors>=0.4.1 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (0.4.3)\n", "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (4.66.4)\n", "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (2.3.0+cu121)\n", "Requirement already satisfied: accelerate>=0.21.0 in /usr/local/lib/python3.10/dist-packages (from transformers[torch]) (0.30.1)\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->transformers[torch]) (5.9.5)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.23.0->transformers[torch]) (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.23.0->transformers[torch]) (4.11.0)\n", "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (1.12)\n", "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (3.3)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (3.1.4)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch->transformers[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->transformers[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->transformers[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->transformers[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->transformers[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->transformers[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->transformers[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->transformers[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->transformers[torch]) (12.1.0.106)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.20.5 in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (2.20.5)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (12.1.105)\n", "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch->transformers[torch]) (2.3.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->transformers[torch]) (12.5.40)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->transformers[torch]) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers[torch]) (3.7)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers[torch]) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers[torch]) (2024.2.2)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->transformers[torch]) (2.1.5)\n", "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->transformers[torch]) (1.3.0)\n" ] } ] }, { "cell_type": "code", "source": [ "training_args = TrainingArguments(\n", " output_dir='./res', # output directory\n", " evaluation_strategy=\"steps\",\n", " num_train_epochs=5, # total number of training epochs\n", " per_device_train_batch_size=32, # batch size per device during training\n", " per_device_eval_batch_size=64, # batch size for evaluation\n", " warmup_steps=500, # number of warmup steps for learning rate scheduler\n", " weight_decay=0.01, # strength of weight decay\n", " logging_dir='./logs4', # directory for storing logs\n", " #logging_steps=10,\n", " load_best_model_at_end=True,\n", ")" ], "metadata": { "id": "sRYXMvKA5McC" }, "execution_count": 15, "outputs": [] }, { "cell_type": "code", "source": [ "model = DistilBertForSequenceClassification.from_pretrained(\"distilbert-base-uncased\",num_labels=5)\n", "\n", "trainer = Trainer(\n", " model=model,# the instantiated 🤗 Transformers model to be trained\n", " args=training_args, # training arguments, defined above\n", " train_dataset=train_dataset,# training dataset\n", " eval_dataset=val_dataset , # evaluation dataset\n", " compute_metrics=compute_metrics,\n", ")\n", "\n", "trainer.train()" ], "metadata": { "id": "bVXIDe_Q5MZh", "colab": { "base_uri": "https://localhost:8080/", "height": 358, "referenced_widgets": [ "f60e3c3cbfa44ddfbb35a20c295a7071", "c56ea1c6adc845238398f0267ecca203", "d8c2363c5aec4b949c72fa119f4b9314", "22cdf3c7f04d4c81a1de6d159a6e7c23", "0742c322e39b4f7f893b274ce440feef", "bb25a51f5eae4b049db57954d5d6c539", "2a82e457fae047d6aa1cb45de6ccc65d", "18776047ab7f4b658f651e5d18056d0d", "c92a110c440e4f6489d43a42bcda95a7", "cc2ab102716741f5937b327fd92367f2", "c5a7ff2101c844bb812ccd02a897ba2f" ] }, "outputId": "55149643-5008-46bb-ca29-eeeced404f45" }, "execution_count": 16, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "model.safetensors: 0%| | 0.00/268M [00:00" ], "text/html": [ "\n", "
\n", " \n", " \n", " [2635/2635 1:10:13, Epoch 5/5]\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", "
StepTraining LossValidation LossAccuracyF1 Score
5000.7069000.2931790.8918150.891679
10000.2612000.2624960.9065240.906258
15000.1630000.3062550.9029660.902720
20000.0974000.2811100.9209960.920973
25000.0473000.3363580.9195730.919342

" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [ "TrainOutput(global_step=2635, training_loss=0.24418509228179758, metrics={'train_runtime': 4216.3449, 'train_samples_per_second': 19.99, 'train_steps_per_second': 0.625, 'total_flos': 1.11656120322816e+16, 'train_loss': 0.24418509228179758, 'epoch': 5.0})" ] }, "metadata": {}, "execution_count": 16 } ] }, { "cell_type": "code", "source": [ "trainer.evaluate()" ], "metadata": { "id": "Cei_CCL14T87", "colab": { "base_uri": "https://localhost:8080/", "height": 166 }, "outputId": "8e5e8393-5874-4daf-cad6-d8c1b2095e3f" }, "execution_count": 17, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "\n", "

\n", " \n", " \n", " [66/66 01:08]\n", "
\n", " " ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [ "{'eval_loss': 0.2624961733818054,\n", " 'eval_accuracy': 0.9065243179122182,\n", " 'eval_f1_score': 0.9062577319683326,\n", " 'eval_runtime': 69.9531,\n", " 'eval_samples_per_second': 60.255,\n", " 'eval_steps_per_second': 0.943,\n", " 'epoch': 5.0}" ] }, "metadata": {}, "execution_count": 17 } ] }, { "cell_type": "code", "source": [ "test_label = test['labels'].values.tolist()" ], "metadata": { "id": "LNrOiydM5cba" }, "execution_count": 18, "outputs": [] }, { "cell_type": "code", "source": [ "test_encodings = tokenizer(test_texts, truncation=True, padding=True,return_tensors = 'pt')\n", "test_dataset = SentimentDataset(test_encodings, test_label)\n", "preds = trainer.predict(test_dataset=test_dataset )" ], "metadata": { "id": "QFTsIEPS5s-T", "colab": { "base_uri": "https://localhost:8080/", "height": 17 }, "outputId": "b375656d-56cd-4dff-f03b-20b0c20c8c5f" }, "execution_count": 22, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "probs = torch.from_numpy(preds[0]).softmax(1)\n", "\n", "predictions = probs.numpy()# convert tensors to numpy array" ], "metadata": { "id": "h3V-eUqj5cO-" }, "execution_count": 23, "outputs": [] }, { "cell_type": "code", "source": [ "newdf = pd.DataFrame(predictions,columns=['Account_Services','Others','Mortgage/Loan','Credit card or prepaid card','Theft/Dispute Reporting'])\n", "newdf.head()" ], "metadata": { "id": "EMHIgJHv52m8", "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "outputId": "7b8f7be6-5a36-4fd2-e0c8-fe55ac01f2bb" }, "execution_count": 24, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Account_Services Others Mortgage/Loan Credit card or prepaid card \\\n", "0 0.000832 0.000475 0.996871 0.000974 \n", "1 0.000758 0.992179 0.000380 0.005469 \n", "2 0.984026 0.003422 0.003329 0.005595 \n", "3 0.029483 0.019977 0.013071 0.022676 \n", "4 0.224001 0.104025 0.205154 0.253695 \n", "\n", " Theft/Dispute Reporting \n", "0 0.000847 \n", "1 0.001214 \n", "2 0.003628 \n", "3 0.914794 \n", "4 0.213125 " ], "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", "
Account_ServicesOthersMortgage/LoanCredit card or prepaid cardTheft/Dispute Reporting
00.0008320.0004750.9968710.0009740.000847
10.0007580.9921790.0003800.0054690.001214
20.9840260.0034220.0033290.0055950.003628
30.0294830.0199770.0130710.0226760.914794
40.2240010.1040250.2051540.2536950.213125
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "newdf", "summary": "{\n \"name\": \"newdf\",\n \"rows\": 6,\n \"fields\": [\n {\n \"column\": \"Account_Services\",\n \"properties\": {\n \"dtype\": \"float32\",\n \"num_unique_values\": 6,\n \"samples\": [\n 0.0008318105828948319,\n 0.0007582061225548387,\n 0.9712517261505127\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Others\",\n \"properties\": {\n \"dtype\": \"float32\",\n \"num_unique_values\": 6,\n \"samples\": [\n 0.00047501950757578015,\n 0.9921789169311523,\n 0.0073503153398633\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Mortgage/Loan\",\n \"properties\": {\n \"dtype\": \"float32\",\n \"num_unique_values\": 6,\n \"samples\": [\n 0.9968714118003845,\n 0.0003799396799877286,\n 0.005817148834466934\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Credit card or prepaid card\",\n \"properties\": {\n \"dtype\": \"float32\",\n \"num_unique_values\": 6,\n \"samples\": [\n 0.0009743589325807989,\n 0.005469117779284716,\n 0.005451070610433817\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Theft/Dispute Reporting\",\n \"properties\": {\n \"dtype\": \"float32\",\n \"num_unique_values\": 6,\n \"samples\": [\n 0.0008474614005535841,\n 0.0012138704769313335,\n 0.010129823349416256\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 24 } ] }, { "cell_type": "code", "source": [ "def labels(x):\n", " if x == 0:\n", " return 'Account Services'\n", " elif x == 1:\n", " return 'Others'\n", " elif x == 2:\n", " return 'Mortgage/Loan'\n", " elif x == 3:\n", " return 'Credit card or prepaid card'\n", " else:\n", " return 'Theft/Dispute Reporting'\n", "\n", "results = np.argmax(predictions,axis=1)\n", "test['complaints'] = results\n", "test['complaints'] = test['complaints'].map(labels)\n", "test" ], "metadata": { "id": "ByDEzFit565T", "colab": { "base_uri": "https://localhost:8080/", "height": 237 }, "outputId": "987077a7-ec4e-48d1-9afc-6d84bfa4a6a1" }, "execution_count": 29, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " complaints labels\n", "0 Mortgage/Loan 2\n", "1 Others 1\n", "2 Account Services 0\n", "3 Theft/Dispute Reporting 4\n", "4 Credit card or prepaid card 0\n", "5 Account Services 0" ], "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", "
complaintslabels
0Mortgage/Loan2
1Others1
2Account Services0
3Theft/Dispute Reporting4
4Credit card or prepaid card0
5Account Services0
\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" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "test", "summary": "{\n \"name\": \"test\",\n \"rows\": 6,\n \"fields\": [\n {\n \"column\": \"complaints\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Others\",\n \"Credit card or prepaid card\",\n \"Account Services\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"labels\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 0,\n \"max\": 4,\n \"num_unique_values\": 4,\n \"samples\": [\n 1,\n 4,\n 2\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 29 } ] }, { "cell_type": "code", "source": [ "import seaborn as sns\n", "sns.countplot(x='complaints',data=test)" ], "metadata": { "id": "cyj4flNd5_DI", "colab": { "base_uri": "https://localhost:8080/", "height": 467 }, "outputId": "1f332090-96ae-425e-81c4-d295f573f517" }, "execution_count": 26, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 26 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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ZGRY03ft2mXuv/9+U716dePt7W1CQ0PN8uXLndoICQkxL774ounfv7/x8fExwcHB5q233ipymVdD586dTc2aNc3vv//uVJ6enm68vLzM448/btq3b19gHxrzxzaKj483DRs2NN7e3iYyMtIcPHjQqa3itn1aWpqRZBYsWGDuvPNO4+7ububMmWP27Nlj7rvvPlOxYkXj5eVlGjdubD7//PNSX//ffvvN+Pj4mO3bt5tevXqZF198sUCdTz75xISGhhp3d3dTpUoV06NHD2vaqVOnzOjRo03NmjWNm5ubqVOnjnnnnXes6YmJiea2224zbm5uJiAgwIwZM8acOXPGmh4SEmImTZrktLwWLVqY2NhYa1ySmTlzpunRo4fx9PQ0devWNR9//LEx5o/td/6Q/369UPfu3U2/fv0uuk2K21+vvfZagf01ZcoUU758eSPJfPXVV6ZVq1bG09PTNGjQwHh5eZns7GyrnxMnTjS33HKLcXd3NzVr1jT16tUzPj4+xsfHx7i7uzutR3h4eJHrlpOTY/7yl78YFxcX4+bmZm666aYCx458ffv2NRUqVDC//PKLMabgezs5Odl06NDB+Pj4mAoVKphbb73VfPvtt051lyxZYurWrWvc3d3NPffcY/bt22fNn38MPd+IESNM+/btrekXrkdaWpoxxpitW7eazp07G1dXV+Pi4mJ69+5tjhw54tTWr7/+av0/f/7OnTsbLy8vExsbaz755BMjydpntWvXNgMGDDBt27Y1Hh4epmbNmuaRRx4xbdq0sY611atXN5JMu3btjJeXlzW+efPmQl9T5cqVK3CMi42NNS1atDBjxoyx9p2bm1uBeUNDQ423t7eRZO655x6za9cua7vGxcUZScbd3d1UqlTJev+fPXvWjBgxwri5uRmHw2E8PDxMkyZNTHBwcIFtfb7//ve/pnHjxsbNzc2EhISYf//7307TQ0JCzPPPP28eeeQRU6FChSLfK+3btzdDhw41Q4cONb6+vqZKlSpm7NixJi8v76JtrV692rRr187a9sOHDzdZWVkF5uvdu7fx8vIyQUFBZurUqU7Lf/31103Tpk2Nl5eXqVmzphkyZIj57bffrOmFfT5NmDDBVK9e3fj4+FifZRd+Dl5o27ZtpmvXrqZChQrGx8fHtGvXzuzatcsYY8yGDRtMRESEqVKlivH19TV33nmn2bRpk9P8ksx//vMf061bN+v1WNK+XIjAVoj8g83EiRPN3XffbZXffffdZtKkSU6B7cknnzRBQUHmiy++MD/88IOJiooylSpVMseOHTPG/BHYmjdvbpYtW2Z27dplDhw4YJ566inTpEkTk56ebtLT083vv/9uzp49axo0aGA6depkkpOTzerVq03r1q0LHHTHjx9v1qxZY9LS0swnn3xi/P39zSuvvGJNf//9942Hh4eZPXu2SU1NNc8995zx9fV1enG8//77JjAw0CxevNj89NNPZvHixaZy5comLi7OqpObm2uqV69u1q5da4wpPrDl5uaali1bmnbt2pmNGzeadevWmVatWlkHaGPOfQjMmDHDbN261ezYscOMHTvWeHh4mL1791p1QkJCTOXKlc20adPMzp07zYQJE4yLi4vZvn375e7GEjl27JhxOBzmpZdeKnT6oEGDTKVKlczRo0dNzZo1zfPPP2/tQ2PObaPy5cubiIgI8+2335pNmzaZRo0amb///e9WGxfb9vkfDrVq1bLqHDx40HTt2tV06tTJbNmyxezevdt8+umnZuXKlaW+DWbNmmVCQ0ONMcZ8+umnpk6dOk4H5c8++8y4urqacePGmR9//NEkJyc7ba8HH3zQBAcHm48++sjs3r3bfPXVV2bBggXGGGMOHDhgvLy8zBNPPGFSUlLMkiVLTNWqVZ3C2KUGtpo1a5p58+aZnTt3mieffNL4+PiYY8eOmbNnz5rFixcbSSY1NdWkp6eb48ePF7qujz32mGnYsKHZs2dPkdvjYvsrP7BduL/uvPNOI8mEhYWZxMRE88MPP5iqVauaatWqGWP+2M8+Pj4mLi7OrFmzxlSoUMF4eXmZwYMHm9TUVDN58mRzxx13mAcffNBMnTrV+Pv7m1GjRhlJ5s033zQVK1Y0//nPf6x+VKhQwXTr1s3s2bPHrF69usjAtnnzZiPJLFy40BhT8L3dpEkT8/DDD5uUlBSzY8cO8+GHH5rk5GSrbvny5U1oaKhZu3at2bhxo2ndurVp06aNNf/FAtvx48dNeHi4GTRokPX+OXv2rPn1119NtWrVzMiRI43D4TDDhg0znTp1Mh07dixy/+SHoKlTp5rdu3ebrVu3moiICCPJTJgwwezevdvExcUZh8NhIiMjzY4dO8zq1auNh4eHCQwMNMnJyWblypVWsHr44YdN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ffro73//uySpRYsWkqRjx47Jy8tLISEhks69nvKPHSdOnFB6erqysrKsY3m5cuUUGhpa7I1gKSkpTp9P0rn3286dO5Wbm2uVXcrnkyTdfvvtTq+Z8PDwi7b1/fffKy4uzun9ExkZqby8PGvb57d1vvDwcKft+tVXX+nuu+9WjRo1VKFCBT3yyCM6duyY0/vkwnXPfw8WtYwLJScn64477lD58uULnX7o0CENGjRI9erVk5+fn3x9fZWVlVXgM+zCbVCSvhSGwHYRAwYMUFxcnN59910NGDCgxO14e3uXSn+SkpL00EMP6d5779Vnn32mzZs361//+tdlXdyZf0H1zJkzlZycbA3btm3TunXrrHqffPKJ08XLV+rpp5/WkiVL9NJLL2n16tVKTk5Ws2bNCvT9wjeLw+FQXl5eqfWjOHXr1pXD4SjygyclJUWVKlVStWrVimyjsP7nf0Be6raXCr5mHn30Uf3000965JFHtHXrVoWGhurNN9+87HUszqxZs3T27FkFBQWpXLlyKleunKZPn67FixfrxIkTks5d3FuU4qZdKhcXlwKBubALd0vzddK0aVM98cQTev/997V8+XItX75cK1euvKL9ld+/JUuWSJLmzZunyMhISXLq5+OPP26F4Pvuu09bt27Vzp07nX77OH/9Z86cqXfeeUfSuYByfj927dql++67Ty+++KJOnjypBx98sMj1zX99165du9Dpzz77rH744Qd17dpVX3/9tRo3bmytx6W41H14oaysLHXr1k2rV6+Ww+HQsGHDlJycrJ07d+rOO+8sdt7atWurQYMGioqKsv7Qy99ftWrV0iOPPKKvvvpKmzdv1qhRo1SjRg3t3LnT6Y+r0nCxmxS6deumX375RU899ZSkczd2SeduGDn/Ne3t7e107LiaSuvzqbC2srKy9Nhjjzm9f77//vvL2vZ79uzRfffdp+bNm2vx4sXatGmTpk2bJql0b2y42PErKipKycnJmjJlitauXavk5GRVqVKlQB9Kc3uej8B2EZ07d9bp06d15swZ62Cbr06dOnJzc9OaNWussjNnzujbb79V48aNi23Xzc3N6a8SSWrQoIH279+vQ4cOWWXffvutU521a9cqJCRE//rXvxQaGqp69epZf/md386F850/7u/vr6CgIP3000+qW7eu05B/AN+5c6f27t2rTp06Fbse+Ro1aqT9+/dr//79VtmPP/6o48ePW9tizZo16tevn/7yl7+oWbNmCggI0J49ey6p/WulSpUq6tSpk/7zn/843SEsnXvEwAcffKBevXrJ4XAUug8v5lK2fXGCg4P1+OOP66OPPtJTTz2lmTNnXtbyi3P27FnNnTtXr7/+eoGDa1BQkObPny/p3Jmt8x+rcL5mzZopLy9PK1euLHR6o0aNlJSU5PQhtGbNGlWoUME6c1GtWjWlp6db0zMzM53+Er8Ubm5uknTZ+0eS9XrNzs6+4v0lnTsz8MMPP+jrr7/WvffeW2D6nj17VLduXbVp00bff/+9dVf2+We2PT09rX7kLze/Xv74xx9/rAceeEC9evXSzJkztXDhQknSb7/9VmCZ+Xe2RkREFNnv+vXr6x//+IeWLVumv/71r5ozZ4417ezZs9q4caM1npqaquPHj6tRo0aSCu5DSQWeZ1bY++fWW2/VDz/8oJYtWyoyMlILFixQYGCg6tat6/QheLFHa4SGhurgwYPaunWr6tatq9tvv10HDx7U3Xffrfr16+vOO+9URkaGvL29rddKTk5OoW3dfPPNkmSFi/PPplx4jJMkDw+PAu+P/HU9duyYUlNTNXbsWLVq1eqS1kWS/Pz8FBgYKB8fH+tYfvbsWW3atKnY+Rs1auT0+SSde7/Vr19frq6uF13uhdavX+80vm7dOtWrV6/Ytm699Vb9+OOPBd4/devWtbZ9flsXtp3/etq0aZPy8vL0+uuv6/bbb1f9+vUvevd6o0aNCu1vcZo3b67Vq1cX+cfFmjVr9OSTT+ree+9VkyZN5O7urqNHjxbbZkn7UhgC20W4uroqJSVFP/74Y4EXpbe3t4YMGaJRo0YpPj5eP/74owYNGqTff/9dAwcOLLbdWrVqKS0tTcnJyTp69KhycnLUqVMn1alTR1FRUdqyZYvWrFnj9DwlSapXr5727dunBQsWaPfu3XrjjTcK/OU7fPhwzZo1S++++6527typF154QVu2bHE6lf3cc89pwoQJeuONN7Rjxw5t3bpVc+bM0cSJEyWdO/hHRETIy8vLqe3c3FynD/Pk5GSlpKQoIiJCzZo100MPPaTvvvtOGzZsUN++fdW+fXvr9HC9evX00UcfWSHg73//+zU7c3Y5pk6dqpycHEVGRmrVqlXav3+/4uPj1alTJ9WoUUMvvviipHP7cNWqVfr5558v6U2b72LbvigjR47Ul19+qbS0NH333XdasWKFdUArDZ999pl+/fVXDRw4UE2bNnUaHnjgAetr0djYWM2fP1+xsbFKSUnR1q1b9corr0g6t02ioqI0YMAALV26VGlpaUpMTNSHH34oSXriiSe0f/9+DR8+XNu3b9fHH3+s2NhYRUdHWwHlrrvu0nvvvafVq1dr69atioqKuuwPl5CQEDkcDn322Wc6cuRIkY/pGDJkiMaPH681a9Zo7969Wrdunfr27atq1apZX1mUdH/l8/f310MPPaTatWurWbNmBaZ//vnneu655xQREaFffvlFbdu21cCBA7Vz50699957Vt/z+/HVV1/J4XBo+vTpmjJliiZMmKDDhw9rw4YNysnJ0fbt27Vjxw4tWrRI0rk/IjMyMrR3714tX75cf/vb3zRv3jxNnz690K/TTp48qWHDhikxMVF79+7VmjVr9O233zq91sqXL6/hw4dr/fr12rRpk/r166fbb7/d+rrurrvu0saNGzV37lzt3LlTsbGx2rZtm9NyatWqpfXr12vPnj06evSo8vLyNHToUP3yyy/q06ePHnvsMZ0+fVqNGzdWx44dtX37dqWkpOiNN9646NdJzz77rM6ePavHH39c27ZtU8+ePbVq1SqFhoYqOTlZISEhCgwMVFhYmL7//nutXr3aCj5LlizRjh07rMee5H91+be//U2S1LNnTyUkJCgxMbHAMS5/f3/77bd64okntGXLFm3fvl2///67vvnmG504cUKVK1fWW2+9ZX1Vnn+Mv5gRI0YoNzdXzz33nKZNm6a///3vysjI0JkzZ4r8avupp55SQkKCxo8frx07dujdd9/V1KlT9fTTT1/SMi+0b98+RUdHKzU1VfPnz9ebb7550UfYjBkzRmvXrnU6W/rxxx9r2LBhTvXWrFmjV199VTt27NC0adO0aNEiq+26devqzJkzevPNN/XTTz/pvffe04wZM4pd7ogRIzR79mzNmTNHO3bsUGxsrH744Ydi5xk2bJgyMzPVu3dvbdy40XoPpqamSjr3Gfbee+8pJSVF69ev10MPPXRJ3yqUpC+Fuqwr3v4kCrtg9nzn3yV68uRJM3z4cFO1atViH+tx4cXPp06dMg888ICpWLFioY/1cHNzMw0bNjSffvqpkWTi4+OteUeNGmWqVKlifHx8TK9evcykSZMK3Azw/PPPm6pVq1q3ED/55JPm9ttvd6rzwQcfmJYtWxo3NzdTqVIlc+edd5qPPvrIGGNMu3btzMyZM53qF/Y4EkmmTp06xpiLP9YjLS3NdOzY0Xh6eprg4GAzderUAhfjXsoF59fCnj17TFRUlPH39zfly5c3wcHBZvjw4ebo0aNWnaSkJNO8eXPr9n1jCr8xY8mSJebCt1px2z7/YufNmzc7zTNs2DBTp04d4+7ubqpVq2YeeeQRp/5cqfvuu8/ce++9hU7Lvwj8+++/N8YYs3jxYqv/VatWNX/961+tuidPnjT/+Mc/TGBgoHFzczN169Y1s2fPtqZf7LEeJ06cML169TK+vr4mODjYxMXFFXrTwYUX0/v5+Tnd/fb888+bgIAA43A4inxUwX//+19z7733Wn0NCgoyDzzwgNmyZYtTveL2V/7F6Bfur/z3/pNPPmkkmXHjxll3Z6alpVn7edq0aaZNmzbWHYC+vr7Gzc3NVKhQwdxxxx0mIiLC6n9+P/IvmJdkOnbsaN555x1Tp04d07JlS+Pt7W18fX3N3Xff7fQ+9fDwMHXq1DFRUVEFHkVw/us2JyfH9O7d2wQHB1vbZNiwYdYF4vl1Fy9ebG6++Wbj7u5uIiIinO72NsaYcePGGX9/f+Pn52f+8Y9/mGHDhjnddJCammpuv/124+np6fRYjx07dpi//OUvpmLFisbDw8NUrFjRVKhQwbi5uVl3TZ5/E0z++l14jH3vvfesx2r4+vqaJk2amEaNGhkfHx/j7e1tGjRoYEJCQoybm5upX7++ddNBmzZtjJeXl6latWqB/RodHW2934t7rEdiYqL1yJCKFSuadu3amdDQUGtd69ata92A8tlnnxlJZvjw4cbPz8/p/X/+sePMmTNm+PDh1t2s7u7upmnTpiYoKMj07t270Ne3MX881qN8+fLmpptusm5ayFfYMbcw7du3N0888YR5/PHHja+vr6lUqZL55z//WeCxHoW1tWHDBtOpUydr2zdv3tzpcUEhISHmueeeMz179jReXl4mICDATJkyxamNiRMnmsDAQOPp6WkiIyPN3LlznfZ7YcfeF1980focjIqKMqNHj77ohf7ff/+9ueeee4yXl5f1Hty9e7cxxpjvvvvOhIaGGg8PD1OvXj2zaNGiAutc2LGppH25kOP/LwA2tWbNGrVr1067du26omstOnXqpICAAL333nsXrXv06FEFBgbqwIED8vf3L/EyAVwb999/v9q1a6fRo0df9WXFxcVp5MiRV/STSnZUq1YtjRw58qK/vmAneXl5atSokR588EGNHz/+qi6rQ4cOatmy5VX5dZfrcduXhZI/whlXxZIlS+Tj46N69epp165dGjFihNq2bXtZYe3333/XjBkzFBkZKVdXV82fP19fffWVdXHrxfzyyy+aOHEiYQ24TrRr1866sxc3rr1792rZsmVq3769cnJyNHXqVKWlpVlf2+LGRmCzmd9++01jxozRvn37VLVqVUVEROj111+/rDYcDoe++OILvfjiizp16pQaNGigxYsXF3uB8fnq16+v+vXrl6T7AMrAtTizhrLn4uKiuLg4Pf300zLGqGnTpvrqq69K9VpW2BdfiQIAANgcd4kCAADYHIENAADA5ghsAAAANkdgAwAAsDkCGwAAgM0R2AD8KSUmJsrhcFzWA2A7dOjAwz0BlAmewwYAl+ijjz5S+fLlL7n+nj17VLt2bW3evFktW7a8eh0DcMMjsAHAJapcuXJZdwHAnxRfiQK46vLy8vTqq6+qbt26cnd310033aQXX3xRkrR161bddddd8vT0VJUqVTR48GBlZWVZ8/br1089evTQSy+9JH9/f1WsWFHPP/+8zp49q1GjRqly5cqqWbOm5syZY82zZ88eORwOLViwQG3atJGHh4eaNm2qlStXFtnHY8eOqU+fPqpRo4a8vLzUrFkzzZ8/36nOhV+J1qpVSy+99JIGDBigChUq6KabbtLbb79tTa9du7Yk6ZZbbpHD4VCHDh0knfs6tnXr1vL29lbFihXVtm1b7d27t8TbF8CNj8AG4KqLiYnRyy+/rGeeeUY//vij5s2bJ39/f2VnZysyMlKVKlXSt99+q0WLFumrr77SsGHDnOb/+uuvdfDgQa1atUoTJ05UbGys7rvvPlWqVEnr16/X448/rscee0wHDhxwmm/UqFF66qmntHnzZoWHh6tbt246duxYoX08deqUWrVqpc8//1zbtm3T4MGD9cgjj2jDhg3Frtvrr7+u0NBQbd68WU888YSGDBmi1NRUSbLm/eqrr5Senq6PPvpIZ8+eVY8ePdS+fXtt2bJFSUlJGjx4sBwOR0k3L4A/AwMAV1FmZqZxd3c3M2fOLDDt7bffNpUqVTJZWVlW2eeff25cXFxMRkaGMcaYqKgoExISYnJzc606DRo0MHfccYc1fvbsWePt7W3mz59vjDEmLS3NSDIvv/yyVefMmTOmZs2a5pVXXjHGGLNixQojyfz6669F9r1r167mqaeessbbt29vRowYYY2HhISYhx9+2BrPy8sz1atXN9OnT3fqx+bNm606x44dM5JMYmJikcsFgAtxhg3AVZWSkqKcnBzdfffdhU5r0aKFvL29rbK2bdsqLy/POkslSU2aNJGLyx+HK39/fzVr1swad3V1VZUqVXT48GGn9sPDw63/lytXTqGhoUpJSSm0n7m5uRo/fryaNWumypUry8fHR19++aX27dtX7Po1b97c+r/D4VBAQECBfpyvcuXK6tevnyIjI9WtWzdNmTJF6enpxS4DAAhsAK4qT0/PK27jwjszHQ5HoWV5eXklXsZrr72mKVOmaMyYMVqxYoWSk5MVGRmp06dPX3bfLtaPOXPmKCkpSW3atNHChQtVv359rVu3rsR9B3DjI7ABuKrq1asnT09PJSQkFJjWqFEjff/998rOzrbK1qxZIxcXFzVo0OCKl31+CDp79qw2bdqkRo0aFVp3zZo16t69ux5++GG1aNFCN998s3bs2HFFy3dzc5N07uzdhW655RbFxMRo7dq1atq0qebNm3dFywJwYyOwAbiqPDw8NGbMGI0ePVpz587V7t27tW7dOs2aNUsPPfSQPDw8FBUVpW3btmnFihUaPny4HnnkEfn7+1/xsqdNm6YlS5Zo+/btGjp0qH799VcNGDCg0Lr16tXT8uXLtXbtWqWkpOixxx7ToUOHrmj51atXl6enp+Lj43Xo0CGdOHFCaWlpiomJUVJSkvbu3atly5Zp586dRQZJAJAIbACugWeeeUZPPfWUxo0bp0aNGqlXr146fPiwvLy89OWXX+qXX37Rbbfdpr/97W+6++67NXXq1FJZ7ssvv6yXX35ZLVq00DfffKNPPvlEVatWLbTu2LFjdeuttyoyMlIdOnRQQECAevTocUXLL1eunN544w299dZbCgoKUvfu3eXl5aXt27frgQceUP369TV48GANHTpUjz322BUtC8CNzWGMMWXdCQAoTfzCAIAbDWfYAAAAbI7ABgAAYHN8JQoAAGBznGEDAACwOQIbAACAzRHYAAAAbI7ABgAAYHMENgAAAJsjsAEAANgcgQ0AAMDmCGwAAAA29/8A4Dmq/wAnAHoAAAAASUVORK5CYII=\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# prompt: i want to save this fine tuned model\n", "\n", "trainer.save_model('distilbert_model')\n" ], "metadata": { "id": "l3cL1GEtoCaD" }, "execution_count": 28, "outputs": [] } ] }