Spaces:
Sleeping
Sleeping
File size: 33,774 Bytes
b83e315 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/timo/rep/TextClassifier/venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n"
]
}
],
"source": [
"import os\n",
"os.chdir('..')\n",
"\n",
"from src.load_model import model\n",
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>хорошо пошло!</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>посмотрела, как будто дома побывала. как река ...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>отдам котят 1,5 месяца в добрые руки.</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0,5литровая баночка 200р стоит в таганроге. та...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>речь шла о радужных зонтиках над верандой.</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24824</th>\n",
" <td>и ты будь здоров</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24825</th>\n",
" <td>не дорога а прям стекло но правда битое (h)</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24826</th>\n",
" <td>спасибо большое. буду ждать хороших новостей. ...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24827</th>\n",
" <td>активирую установку 🌈🌈🌈👍😎🔥🔥🔥</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24828</th>\n",
" <td>а вы курс российского рубля видели, кошмар!!!</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>24829 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" text label\n",
"0 хорошо пошло! 0\n",
"1 посмотрела, как будто дома побывала. как река ... 0\n",
"2 отдам котят 1,5 месяца в добрые руки. 0\n",
"3 0,5литровая баночка 200р стоит в таганроге. та... 0\n",
"4 речь шла о радужных зонтиках над верандой. 0\n",
"... ... ...\n",
"24824 и ты будь здоров 0\n",
"24825 не дорога а прям стекло но правда битое (h) 0\n",
"24826 спасибо большое. буду ждать хороших новостей. ... 0\n",
"24827 активирую установку 🌈🌈🌈👍😎🔥🔥🔥 0\n",
"24828 а вы курс российского рубля видели, кошмар!!! 0\n",
"\n",
"[24829 rows x 2 columns]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"splits = {'train': 'train.jsonl', 'test': 'test.jsonl'}\n",
"test = pd.read_json(\"hf://datasets/AlexSham/Toxic_Russian_Comments/\" + splits[\"test\"], lines=True)\n",
"test"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 97/97 [00:39<00:00, 2.44it/s]\n"
]
}
],
"source": [
"from tqdm import tqdm\n",
"\n",
"# Размер батча\n",
"batch_size = 256\n",
"\n",
"test['pred'] = [\n",
" model(text).item()\n",
" for batch in tqdm(range(0, len(test), batch_size))\n",
" for text in test['text'][batch:batch + batch_size]\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" non-toxic 0.99 0.98 0.98 20369\n",
" toxic 0.92 0.94 0.93 4460\n",
"\n",
" accuracy 0.98 24829\n",
" macro avg 0.96 0.96 0.96 24829\n",
"weighted avg 0.98 0.98 0.98 24829\n",
"\n"
]
}
],
"source": [
"from sklearn.metrics import classification_report\n",
"\n",
"threshold = 0.5\n",
"\n",
"pred = test['pred'].apply(lambda x: 1 if x >= threshold else 0)\n",
"\n",
"# Вычисление основных метрик\n",
"class_report = classification_report(test['label'], pred, target_names=['non-toxic', 'toxic'])\n",
"\n",
"print(\"\\nClassification Report:\")\n",
"print(class_report)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARLRJREFUeJzt3XlclOX+//H3sA0oIJqCiiQuqbkXpl81M4tcs5+dU3nUFC3LUr/HJE9pG1m5tbhUpuVJrfO1tGzzpGkuaWp2KreTZe5bKqgpoiiDwP37424GRkABh7lhfD0fDx73Pfdc9z2fuTR5d133YjMMwxAAAICP8LO6AAAAAE8i3AAAAJ9CuAEAAD6FcAMAAHwK4QYAAPgUwg0AAPAphBsAAOBTCDcAAMCnEG4AAIBPIdwAV6GBAwcqNja2WPusXr1aNptNq1evLpWayrtbb71Vt956q+v1/v37ZbPZNHfuXMtqAq5WhBvAC+bOnSubzeb6CQ4OVoMGDTR8+HClpKRYXV6Z5wwKzh8/Pz9VqVJF3bp104YNG6wuzyNSUlI0atQoNWrUSBUqVFDFihUVFxenl156SampqVaXB5QrAVYXAFxNXnjhBdWpU0cZGRlat26dZsyYoSVLlmjbtm2qUKGC1+qYNWuWcnJyirXPLbfcovPnzysoKKiUqrq8Pn36qHv37srOztbOnTv11ltvqVOnTvrxxx/VrFkzy+q6Uj/++KO6d++us2fP6v7771dcXJwk6aefftLEiRP17bff6uuvv7a4SqD8INwAXtStWze1atVKkjR48GBdc801mjx5sr744gv16dOnwH3S09NVsWJFj9YRGBhY7H38/PwUHBzs0TqK68Ybb9T999/vet2hQwd169ZNM2bM0FtvvWVhZSWXmpqqu+++W/7+/tq8ebMaNWrk9v64ceM0a9Ysj3xWafxdAsoipqUAC912222SpH379kkyz4UJDQ3Vnj171L17d4WFhalfv36SpJycHE2dOlVNmjRRcHCwoqKiNGTIEJ06dSrfcb/66it17NhRYWFhCg8P10033aQPPvjA9X5B59zMnz9fcXFxrn2aNWumadOmud4v7Jybjz/+WHFxcQoJCVHVqlV1//336/Dhw25tnN/r8OHD6tWrl0JDQ1WtWjWNGjVK2dnZJe6/Dh06SJL27Nnjtj01NVWPPfaYYmJiZLfbVb9+fU2aNCnfaFVOTo6mTZumZs2aKTg4WNWqVVPXrl31008/udrMmTNHt912myIjI2W329W4cWPNmDGjxDVf7O2339bhw4c1efLkfMFGkqKiovTMM8+4XttsNj3//PP52sXGxmrgwIGu186p0DVr1mjo0KGKjIxUrVq1tHDhQtf2gmqx2Wzatm2ba9tvv/2me+65R1WqVFFwcLBatWqlRYsWXdmXBkoZIzeAhZy/lK+55hrXtqysLHXp0kU333yzXn31Vdd01ZAhQzR37lwNGjRIf//737Vv3z69+eab2rx5s9avX+8ajZk7d64eeOABNWnSRGPGjFFERIQ2b96spUuXqm/fvgXWsXz5cvXp00e33367Jk2aJEnavn271q9frxEjRhRav7Oem266SRMmTFBKSoqmTZum9evXa/PmzYqIiHC1zc7OVpcuXdSmTRu9+uqrWrFihV577TXVq1dPjz76aIn6b//+/ZKkypUru7adO3dOHTt21OHDhzVkyBBde+21+u677zRmzBgdPXpUU6dOdbV98MEHNXfuXHXr1k2DBw9WVlaW1q5dq++//941wjZjxgw1adJEd911lwICAvTvf/9bQ4cOVU5OjoYNG1aiuvNatGiRQkJCdM8991zxsQoydOhQVatWTc8995zS09PVo0cPhYaG6qOPPlLHjh3d2i5YsEBNmjRR06ZNJUm//PKL2rdvr+joaI0ePVoVK1bURx99pF69eumTTz7R3XffXSo1A1fMAFDq5syZY0gyVqxYYRw/ftw4dOiQMX/+fOOaa64xQkJCjN9//90wDMNISEgwJBmjR49223/t2rWGJGPevHlu25cuXeq2PTU11QgLCzPatGljnD9/3q1tTk6Oaz0hIcGoXbu26/WIESOM8PBwIysrq9Dv8M033xiSjG+++cYwDMPIzMw0IiMjjaZNm7p91pdffmlIMp577jm3z5NkvPDCC27HvOGGG4y4uLhCP9Np3759hiRj7NixxvHjx43k5GRj7dq1xk033WRIMj7++GNX2xdffNGoWLGisXPnTrdjjB492vD39zcOHjxoGIZhrFq1ypBk/P3vf8/3eXn76ty5c/ne79Kli1G3bl23bR07djQ6duyYr+Y5c+Zc8rtVrlzZaNGixSXb5CXJSEpKyre9du3aRkJCguu18+/czTffnO/PtU+fPkZkZKTb9qNHjxp+fn5uf0a333670axZMyMjI8O1LScnx2jXrp1x3XXXFblmwNuYlgK8KD4+XtWqVVNMTIz+9re/KTQ0VJ999pmio6Pd2l08kvHxxx+rUqVKuuOOO3TixAnXT1xcnEJDQ/XNN99IMkdgzpw5o9GjR+c7P8ZmsxVaV0REhNLT07V8+fIif5effvpJx44d09ChQ90+q0ePHmrUqJEWL16cb59HHnnE7XWHDh20d+/eIn9mUlKSqlWrpurVq6tDhw7avn27XnvtNbdRj48//lgdOnRQ5cqV3foqPj5e2dnZ+vbbbyVJn3zyiWw2m5KSkvJ9Tt6+CgkJca2fPn1aJ06cUMeOHbV3716dPn26yLUXJi0tTWFhYVd8nMI89NBD8vf3d9vWu3dvHTt2zG2KceHChcrJyVHv3r0lSSdPntSqVat033336cyZM65+/OOPP9SlSxft2rUr3/QjUFYwLQV40fTp09WgQQMFBAQoKipKDRs2lJ+f+/9jBAQEqFatWm7bdu3apdOnTysyMrLA4x47dkxS7jSXc1qhqIYOHaqPPvpI3bp1U3R0tDp37qz77rtPXbt2LXSfAwcOSJIaNmyY771GjRpp3bp1btuc57TkVblyZbdzho4fP+52Dk5oaKhCQ0Ndrx9++GHde++9ysjI0KpVq/T666/nO2dn165d+u9//5vvs5zy9lXNmjVVpUqVQr+jJK1fv15JSUnasGGDzp075/be6dOnValSpUvufznh4eE6c+bMFR3jUurUqZNvW9euXVWpUiUtWLBAt99+uyRzSqply5Zq0KCBJGn37t0yDEPPPvusnn322QKPfezYsXzBHCgLCDeAF7Vu3dp1Lkdh7HZ7vsCTk5OjyMhIzZs3r8B9CvtFXlSRkZHasmWLli1bpq+++kpfffWV5syZowEDBui99967omM7XTx6UJCbbrrJFZokc6Qm78mz1113neLj4yVJd955p/z9/TV69Gh16tTJ1a85OTm644479MQTTxT4Gc5f3kWxZ88e3X777WrUqJEmT56smJgYBQUFacmSJZoyZUqxL6cvSKNGjbRlyxZlZmZe0WX2hZ2YnXfkyclut6tXr1767LPP9NZbbyklJUXr16/X+PHjXW2c323UqFHq0qVLgceuX79+iesFShPhBigH6tWrpxUrVqh9+/YF/rLK206Stm3bVuxfPEFBQerZ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BXO5YIG1dRSEcAMAAIpt/35zycgNAADwCcOGmcuAAGvrKAjhBgAAFFtoqLksizfyI9wAAIBic47YEG4AAIBPcIabsniXYsINAAAoNuddirdutbaOghBuAABAsaWmmktu4gcAAHxCw4bmskoVa+soCOEGAAAUW0SEueScGwAA4BPyPhm8rCHcAACAYnOGm7Nnra2jICW6r2B2drbmzp2rlStX6tixY8rJyXF7f9WqVR4pDgAAlE3+/uZy2zZr6yhIicLNiBEjNHfuXPXo0UNNmzaVzWbzdF0AAKAMq17dXDrvVFyWlCjczJ8/Xx999JG6d+/u6XoAAEA5ULmyuczMtLaOgpTonJugoCDVr1/f07UAAIByIjjYXGZmlr1HMJQo3Dz++OOaNm2aDMPwdD0AAKAcqFQpd/3rr62royAlmpZat26dvvnmG3311Vdq0qSJAp2nTP/p008/9UhxAACgbLLbc9fPnLGujoKUKNxERETo7rvv9nQtAACgHOnYUVqzRiprEzklCjdz5szxdB0AAKCccU7cZGdbW8fFShRunI4fP64dO3ZIkho2bKhq1ap5pCgAAFD2BfyZIspauCnRCcXp6el64IEHVKNGDd1yyy265ZZbVLNmTT344IM6VxYfDwoAADzOeSM/n7haKjExUWvWrNG///1vpaamKjU1VV988YXWrFmjxx9/3NM1AgCAMsgZbsrayE2JpqU++eQTLVy4ULfeeqtrW/fu3RUSEqL77rtPM2bM8FR9AACgjPKpaalz584pKioq3/bIyEimpQAAuEr4/Zki1q61to6LlSjctG3bVklJScrIyHBtO3/+vMaOHau2bdt6rDgAAFB27d1rLmvVsraOi5VoWmratGnq0qWLatWqpRYtWkiStm7dquDgYC1btsyjBQIAgLLpjjukTZvK3gnFJQo3TZs21a5duzRv3jz99ttvkqQ+ffqoX79+CgkJ8WiBAACgbHKec+MT4UaSKlSooIceesiTtQAAgHKk3IebRYsWqVu3bgoMDNSiRYsu2fauu+664sIAAEDZVu7DTa9evZScnKzIyEj16tWr0HY2m03ZxbgmbPr06XrllVeUnJysFi1a6I033lDr1q0LbZ+amqqnn35an376qU6ePKnatWtr6tSp6t69e5E/EwAAXDlnuNm82do6LlbkcJOTk1Pg+pVYsGCBEhMTNXPm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b8rhcGj8+PFasWKF2rZtK0mqW7eu1q1bp7ffflsdO3bU9OnTValSJc2fP1+BgYGSpAYNGriOfdttt7l91jvvvKOIiAitWbNGd955p/e+JACvINwAKBM6deqkGTNmKD09XVOmTFFAQID++te/6pdfftG5c+d0xx13uLXPzMzUDTfcIEnasmWLOnTo4Ao2F0tJSdEzzzyj1atX69ixY8rOzta5c+d08ODBUv9eALyPcAOgTKhYsaLq168vSZo9e7ZatGihd999V02bNpUkLV68WNHR0W772O12SVJISMglj52QkKA//vhD06ZNU+3atWW329W2bVtlZmaWwjcBYDXCDYAyx8/PT0899ZQSExO1c+dO2e12HTx4UB07diywffPmzfXee+/pwoULBY7erF+/Xm+99Za6d+8uSTp06JBOnDhRqt8BgHU4oRhAmXTvvffK399fb7/9tkaNGqWRI0fqvffe0549e7Rp0ya98cYbeu+99yRJw4cPV1pamv72t7/pp59+0q5du/Svf/1LO3bskCRdd911+te//qXt27frP//5j/r163fZ0R4A5RcjNwDKpICAAA0fPlwvv/yy9u3bp2rVqmnChAnau3evIiIidOONN+qpp56SJF1zzTVatWqV/vGPf6hjx47y9/dXy5Yt1b59e0nSu+++q4cfflg33nijYmJiNH78eI0aNcrKrwegFNkMwzCsLgIAAMBTmJYCAAA+hXADAAB8CuEGAAD4FMINAADwKYQbAADgUwg3AADApxBuAACATyHcAAAAn0K4AQAAPoVwAwAAfArhBgAA+BTCDQAA8Cn/H/xsqri4J5o/AAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import precision_recall_curve\n",
"\n",
"# Предсказания модели: вероятности для положительного класса\n",
"y_probs = test['pred']\n",
"\n",
"# Истинные метки\n",
"y_true = test['label']\n",
"\n",
"# Вычисление Precision-Recall кривой для разных порогов\n",
"precision, recall, thresholds = precision_recall_curve(y_true, y_probs)\n",
"\n",
"# Построение Precision-Recall кривой\n",
"plt.plot(recall, precision, \n",
" color='blue',)\n",
"plt.grid(\n",
" color='gray',\n",
")\n",
"plt.xlabel('Recall')\n",
"plt.ylabel('Precision')\n",
"plt.title('Precision-Recall Curve')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7482494115829468"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_thresholds(thresholds_precision):\n",
" return thresholds[np.where(precision>=thresholds_precision)[0][0]].item()\n",
"\n",
"get_thresholds(0.95)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" non-toxic 0.98 0.99 0.99 20369\n",
" toxic 0.95 0.91 0.93 4460\n",
"\n",
" accuracy 0.98 24829\n",
" macro avg 0.97 0.95 0.96 24829\n",
"weighted avg 0.98 0.98 0.98 24829\n",
"\n"
]
}
],
"source": [
"threshold = 0.75\n",
"\n",
"pred = test['pred'].apply(lambda x: 1 if x >= threshold else 0)\n",
"\n",
"# Вычисление основных метрик\n",
"class_report = classification_report(test['label'], pred, target_names=['non-toxic', 'toxic'])\n",
"\n",
"print(\"\\nClassification Report:\")\n",
"print(class_report)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
|