From d32a30b3bf60649a7cb5aa6dd4d530ec237f02f3 Mon Sep 17 00:00:00 2001 From: Demys Cota Date: Fri, 22 May 2026 17:15:19 -0300 Subject: [PATCH] Created using Colab --- Training.ipynb | 789 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 789 insertions(+) create mode 100644 Training.ipynb diff --git a/Training.ipynb b/Training.ipynb new file mode 100644 index 0000000..817368d --- /dev/null +++ b/Training.ipynb @@ -0,0 +1,789 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "authorship_tag": "ABX9TyOObJSHiWrJv56VzTj2D9GH", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 256 + }, + "id": "Iy_tv5lFFXWC", + "outputId": "659e7012-9e2c-4f85-a55a-e91953d41377" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Time V1 V2 V3 V4 V5 V6 V7 \\\n", + "0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 \n", + "1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 \n", + "2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 \n", + "3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 \n", + "4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 \n", + "\n", + " V8 V9 ... V21 V22 V23 V24 V25 \\\n", + "0 0.098698 0.363787 ... -0.018307 0.277838 -0.110474 0.066928 0.128539 \n", + "1 0.085102 -0.255425 ... -0.225775 -0.638672 0.101288 -0.339846 0.167170 \n", + "2 0.247676 -1.514654 ... 0.247998 0.771679 0.909412 -0.689281 -0.327642 \n", + "3 0.377436 -1.387024 ... -0.108300 0.005274 -0.190321 -1.175575 0.647376 \n", + "4 -0.270533 0.817739 ... -0.009431 0.798278 -0.137458 0.141267 -0.206010 \n", + "\n", + " V26 V27 V28 Amount Class \n", + "0 -0.189115 0.133558 -0.021053 149.62 0 \n", + "1 0.125895 -0.008983 0.014724 2.69 0 \n", + "2 -0.139097 -0.055353 -0.059752 378.66 0 \n", + "3 -0.221929 0.062723 0.061458 123.50 0 \n", + "4 0.502292 0.219422 0.215153 69.99 0 \n", + "\n", + "[5 rows x 31 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimeV1V2V3V4V5V6V7V8V9...V21V22V23V24V25V26V27V28AmountClass
00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.363787...-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.021053149.620
10.01.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425...-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.0147242.690
21.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.514654...0.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.059752378.660
31.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024...-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.061458123.500
42.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.817739...-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515369.990
\n", + "

5 rows × 31 columns

\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" + } + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "url = \"https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv\"\n", + "\n", + "df = pd.read_csv(url)\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "id": "Qth-o6O8Fqfa" + } + }, + { + "cell_type": "code", + "source": [ + "df[\"Class\"].value_counts(normalize=True)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 178 + }, + "id": "xF9gWfAyHrFm", + "outputId": "49e83580-aabb-4a62-c9b6-021435466943" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Class\n", + "0 0.998273\n", + "1 0.001727\n", + "Name: proportion, dtype: float64" + ], + "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", + "
proportion
Class
00.998273
10.001727
\n", + "

" + ] + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "df[\"Amount_log\"] = np.log1p(df[\"Amount\"])" + ], + "metadata": { + "id": "7o2bzFFeIY-z" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "df[\"Amount_scaled\"] = scaler.fit_transform(df[[\"Amount\"]])" + ], + "metadata": { + "id": "iLfrsqH1Ikn_" + }, + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "x = df.drop(\"Class\", axis=1)\n", + "y = df[\"Class\"]\n", + "\n", + "x_train, x_test, y_train, y_test = train_test_split(\n", + " x, y, stratify=y, test_size=0.3, random_state=42\n", + ")" + ], + "metadata": { + "id": "uZaeIXRtJiN9" + }, + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "model = LogisticRegression(max_iter=1000)\n", + "\n", + "model.fit(x_train, y_train)\n", + "\n", + "y_pred = model.predict(x_test)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "syp63pudKq5K", + "outputId": "140a0bef-8e53-455f-84c9-9eec75e59501" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/sklearn/linear_model/_logistic.py:465: ConvergenceWarning: lbfgs failed to converge (status=1):\n", + "STOP: TOTAL NO. OF ITERATIONS REACHED LIMIT.\n", + "\n", + "Increase the number of iterations (max_iter) or scale the data as shown in:\n", + " https://scikit-learn.org/stable/modules/preprocessing.html\n", + "Please also refer to the documentation for alternative solver options:\n", + " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", + " n_iter_i = _check_optimize_result(\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics import classification_report\n", + "\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kocPtEDpLnZq", + "outputId": "0d62084c-1a60-47a9-f20a-118303743c26" + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 85295\n", + " 1 0.88 0.66 0.75 148\n", + "\n", + " accuracy 1.00 85443\n", + " macro avg 0.94 0.83 0.88 85443\n", + "weighted avg 1.00 1.00 1.00 85443\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics import roc_curve, roc_auc_score\n", + "import matplotlib.pyplot as plt\n", + "\n", + "y_probs = model.predict_proba(x_test)[:,1]\n", + "\n", + "fpr, tpr,_ = roc_curve(y_test, y_probs)\n", + "\n", + "plt.plot(fpr, tpr)\n", + "plt.title(\"ROC Curve\")\n", + "plt.xlabel(\"False Positive Rate\")\n", + "plt.ylabel(\"True Positive Rate\")\n", + "plt.show()\n", + "\n", + "print(\"AUC:\", roc_auc_score(y_test, y_probs))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 489 + }, + "id": "0MDoxOh-NQAp", + "outputId": "cc358413-8e74-4905-88bb-d582bdfdb8b2" + }, + "execution_count": 20, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Gj58uOt948aNtXPnTh07dszV9v3332vdunVuf39JqlWrluLj47Vo0SItWLBAdru90OxT7969tX79eq1cubLQ+F9//VXnz5/3aJ8ALo47FAMo0YU7FH/77beu01IXLFmyRPfcc49effVVPfroo5J+O7WTkJCgf/3rX7rhhht01113KSQkRGvXrtXbb7+tZs2aKS0trcAdip1Op/r376/58+erTZs2rjsUZ2Zm6sMPP9SGDRv01VdfKTY2ttg6jx07pu7du+v7779Xz5491a1bN1WvXl0//vijFixYoCNHjigvL0/Sb1dXtWjRQq1atdKDDz6oo0ePavbs2YqIiFBubq7rMvf9+/erYcOGmjp1aoFw9HvvvPOO/vrXv6pmzZr685//7Los/YLTp0+rc+fO2rJli/r376+2bdvq1KlT2rp1q5YsWaL9+/cXOI0FwAv8e5sdAOVdcTfxM8YYh8NhGjdubBo3blzgBnwOh8O8+eabplOnTiY0NNQEBwebq6++2kycONGcPHmy2H0tWbLEdO/e3dSpU8dUqVLFREVFmYSEBLN69Wq3aj19+rR54YUXzHXXXWdq1Khh7Ha7ufLKK82QIUPM7t27C/R9++23TaNGjYzdbjetW7c2K1euLPEmfsXJzc01ISEhRpJ5++23i+xz4sQJM2rUKHPFFVcYu91uwsPDTceOHc0LL7xg8vPz3fpuANzHzA0AALAU1twAAABLIdwAAABLIdwAAABLIdwAAABLIdwAAABLIdwAAABLqXTPlnI6nTp8+LBq1qwpm83m73IAAIAbjDE6ceKE6tWrp4CAkudmKl24OXz4sKKjo/1dBgAAKIWDBw+qQYMGJfapdOGmZs2akn47OKGhoX6uBgAAuCM3N1fR0dGu3/GSVLpwc+FUVGhoKOEGAIAKxp0lJSwoBgAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAlkK4AQAAluLXcPPll1+qZ8+eqlevnmw2mz788MOLjlm9erXatGmjoKAgXXHFFUpNTfV5nQAAoOLwa7g5deqUWrVqpVmzZrnVf9++fbr11lvVtWtXpaen629/+5seeughrVy50seVAgCAisKvD868+eabdfPNN7vdf/bs2WrYsKGmTZsmSWrWrJnWrl2rF198UfHx8b4qEwAAnzPG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2NjYIsecPn26UIAJDPxtLYv5/aVJAACg0vLrpeBJSUlKTExUu3bt1L59e82YMUOnTp3SgAEDJEn9+vVT/fr1lZKSIknq2bOnpk+frmuvvVYdOnTQ7t27NW7cOPXs2dMVcsoLshYAAP7h13CTkJCgY8eOafz48crMzFTr1q21YsUK1yLjAwcOFJipGTt2rGw2m8aOHatDhw7psssuU8+ePfXcc8/56ysU6Y+XgQMAgLJjM5XsfE5ubq7CwsKUk5Oj0NBQr2//wrOk2j27StJvl4Eve+J6rpYCAOASePL7zbOlvKioZ0lxGTgAAGWrQl0KXt4V9SypavbytRYIAACrY+bGR3iWFAAA/sHMjY/wLCkAAPyDcAMAACyFcAMAACyFcONFleuiegAAyifCjZdw4z4AAMoHwo2XnDnn0PYjuZJ+u3FfSFUuAQcAwB8INz7AjfsAAPAfwo0PkGsAAPAfwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALCUSwo3Z8+e9VYdAAAAXuFxuHE6nXrmmWdUv3591ahRQ3v37pUkjRs3Tm+88YbXCwQAAPCEx+Hm2WefVWpqqp5//nnZ7XZXe4sWLfT66697tTgAAABPeRxu5s2bp9dee019+/ZVYGCgq71Vq1bauXOnV4sDAADwlMfh5tChQ7riiisKtTudTp07d84rRQEAAJSWx+GmefPmWrNmTaH2JUuW6Nprr/VKUQAAAKVVxdMB48ePV2Jiog4dOiSn06n3339fGRkZmjdvnj7++GNf1AgAAOA2j2du7rjjDv373//WqlWrVL16dY0fP147duzQv//9b910002+qBEAAMBtHs/cSFLnzp316aefersWAACAS+bxzE2jRo303//+t1D7r7/+qkaNGnmlKAAAgNLyONzs379fDoejUHteXp4OHTrklaIAAABKy+3TUkuXLnX9eeXKlQoLC3O9dzgcSktLU0xMjFeLAwAA8JTb4aZXr16SJJvNpsTExAKfVa1aVTExMZo2bZpXiwMAAPCU2+HG6XRKkho2bKhvv/1W4eHhPisKAACgtDy+Wmrfvn2+qAMAAMArSnUp+KlTp/TFF1/owIEDys/PL/DZE0884ZXCAAAASsPjcLN582bdcsstOn36tE6dOqU6deooOztb1apVU926dQk3AADArzy+FHzYsGHq2bOnfvnlF4WEhOjrr7/WTz/9pLZt2+qFF17wRY0AAABu8zjcpKen68knn1RAQIACAwOVl5en6OhoPf/88xo9erQvagQAAHCbx+GmatWqCgj4bVjdunV14MABSVJYWJgOHjzo3eoAAAA85PGam2uvvVbffvutrrzySnXp0kXjx49Xdna25s+frxYtWviiRgAAALd5PHMzefJkRUVFSZKee+451a5dW4899piOHTumf/7zn14vEAAAwBMez9y0a9fO9ee6detqxYoVXi0IAADgUng8c1OcTZs26bbbbvN43KxZsxQTE6Pg4GB16NBBGzZsKLH/r7/+qkGDBikqKkpBQUFq0qSJli9fXtqyAQCAxXgUblauXKnhw4dr9OjR2rt3ryRp586d6tWrl6677jrXIxrctXDhQiUlJSk5OVmbNm1Sq1atFB8fr6NHjxbZPz8/XzfddJP279+vJUuWKCMjQ3PmzFH9+vU92i8AALAut09LvfHGGxo4cKDq1KmjX375Ra+//rqmT5+uIUOGKCEhQdu2bVOzZs082vn06dM1cOBADRgwQJI0e/ZsLVu2THPnztXIkSML9Z87d66OHz+ur776SlWrVpUknkQOAAAKcHvm5qWXXtLf//53ZWdna9GiRcrOztYrr7yirVu3avbs2R4Hm/z8fG3cuFFxcXH/KyYgQHFxcVq/fn2RY5YuXarY2FgNGjRIERERatGihSZPniyHw1HsfvLy8pSbm1vgBQAArMvtcLNnzx7dc889kqQ777xTVapU0dSpU9WgQYNS7Tg7O1sOh0MREREF2iMiIpSZmVnkmL1792rJkiVyOBxavny5xo0bp2nTpunZZ58tdj8pKSkKCwtzvaKjo0tVLwAAqBjcDjdnzpxRtWrVJEk2m01BQUGuS8LLitPpVN26dfXaa6+pbdu2SkhI0JgxYzR79uxix4waNUo5OTmuFzcaBADA2jy6FPz1119XjRo1JEnnz59XamqqwsPDC/Rx98GZ4eHhCgwMVFZWVoH2rKwsRUZGFjkmKipKVatWVWBgoKutWbNmyszMVH5+vux2e6ExQUFBCgoKcqsmAABQ8bkdbi6//HLNmTPH9T4yMlLz588v0Mdms7kdbux2u9q2bau0tDT16tVL0m8zM2lpaRo8eHCRYzp16qR3331XTqfT9QiIXbt2KSoqqshgAwAAKh+3w83+/fu9vvOkpCQlJiaqXbt2at++vWbMmKFTp065rp7q16+f6tevr5SUFEnSY489ppkzZ2ro0KEaMmSIfvzxR02ePNntQAUAAKzP4zsUe1NCQoKOHTum8ePHKzMzU61bt9aKFStci4wPHDjgmqGRpOjoaK1cuVLDhg3TNddco/r162vo0KEaMWKEv74CAAAoZ2zGGOPvIspSbm6uwsLClJOTo9DQUK9t93T+eTUfv1KStH1SvKrZ/ZobAQCwFE9+v732+AUAAIDygHADAAAshXADAAAspVThZs+ePRo7dqzuu+8+10MuP/nkE/3www9eLQ4AAMBTHoebL774Qi1bttQ333yj999/XydPnpQkff/990pOTvZ6gQAAAJ7wONyMHDlSzz77rD799NMCN8678cYb9fXXX3u1OAAAAE95HG62bt2qv/zlL4Xa69atq+zsbK8UBQAAUFoeh5tatWrpyJEjhdo3b96s+vXre6UoAACA0vI43Nx7770aMWKEMjMzZbPZ5HQ6tW7dOg0fPlz9+vXzRY0AAABu8zjcTJ48WVdddZWio6N18uRJNW/eXDfccIM6duyosWPH+qJGAAAAt3n8jAC73a45c+Zo3Lhx2rZtm06ePKlrr71WV155pS/qAwAA8IjH4Wbt2rW6/vrrdfnll+vyyy/3RU0AAACl5vFpqRtvvFENGzbU6NGjtX37dl/UBAAAUGoeh5vDhw/rySef1BdffKEWLVqodevWmjp1qn7++Wdf1AcAAOARj8NNeHi4Bg8erHXr1mnPnj2655579NZbbykmJkY33nijL2oEAABw2yU9OLNhw4YaOXKkpkyZopYtW+qLL77wVl0AAAClUupws27dOj3++OOKiopSnz591KJFCy1btsybtQEAAHjM46ulRo0apQULFujw4cO66aab9NJLL+mOO+5QtWrVfFEfAACARzwON19++aWeeuop9e7dW+Hh4b6oCQAAoNQ8Djfr1q3zRR0AAABe4Va4Wbp0qW6++WZVrVpVS5cuLbHv7bff7pXCAAAASsOtcNOrVy9lZmaqbt266tWrV7H9bDabHA6Ht2oDAADwmFvhxul0FvlnAACA8sbjS8HnzZunvLy8Qu35+fmaN2+eV4oCAAAoLY/DzYABA5STk1Oo/cSJExowYIBXigIAACgtj8ONMUY2m61Q+88//6ywsDCvFAUAAFBabl8Kfu2118pms8lms6lbt26qUuV/Qx0Oh/bt26cePXr4pEgAAAB3uR1uLlwllZ6ervj4eNWoUcP1md1uV0xMjO666y6vFwgAAOAJt8NNcnKyJCkmJkYJCQkKDg72WVEAAACl5fEdihMTE31RBwAAgFe4FW7q1KmjXbt2KTw8XLVr1y5yQfEFx48f91pxAAAAnnIr3Lz44ouqWbOm688lhRsAAAB/civc/P5UVP/+/X1VCwAAwCXz+D43mzZt0tatW13vP/roI/Xq1UujR49Wfn6+V4sDAADwlMfh5pFHHtGuXbskSXv37lVCQoKqVaumxYsX6+mnn/Z6gQAAAJ7wONzs2rVLrVu3liQtXrxYXbp00bvvvqvU1FT961//8nZ9AAAAHinV4xcuPBl81apVuuWWWyRJ0dHRys7O9m51AAAAHvI43LRr107PPvus5s+fry+++EK33nqrJGnfvn2KiIjweoEAAACe8DjczJgxQ5s2bdLgwYM1ZswYXXHFFZKkJUuWqGPHjl4vEAAAwBMe36H4mmuuKXC11AVTp05VYGCgV4oCAAAoLY/DzQUbN27Ujh07JEnNmzdXmzZtvFYUAABAaXkcbo4ePaqEhAR98cUXqlWrliTp119/VdeuXbVgwQJddtll3q4RAADAbR6vuRkyZIhOnjypH374QcePH9fx48e1bds25ebm6oknnvBFjQAAAG7zeOZmxYoVWrVqlZo1a+Zqa968uWbNmqXu3bt7tTgAAABPeTxz43Q6VbVq1ULtVatWdd3/BgAAwF88Djc33nijhg4dqsOHD7vaDh06pGHDhqlbt25eLQ4AAMBTHoebmTNnKjc3VzExMWrcuLEaN26shg0bKjc3Vy+//LIvagQAAHCbx2tuoqOjtWnTJqWlpbkuBW/WrJni4uK8XhwAAICnPAo3Cxcu1NKlS5Wfn69u3bppyJAhvqoLAACgVNwON6+++qoGDRqkK6+8UiEhIXr//fe1Z88eTZ061Zf1AQAAeMTtNTczZ85UcnKyMjIylJ6errfeekuvvPKKL2sDAADwmNvhZu/evUpMTHS979Onj86fP68jR474pDAAAIDScDvc5OXlqXr16v8bGBAgu92uM2fO+KQwAACA0vBoQfG4ceNUrVo11/v8/Hw999xzCgsLc7VNnz7de9UBAAB4yO1wc8MNNygjI6NAW8eOHbV3717Xe5vN5r3KAAAASsHtcLN69WoflgEAAOAdHt+h2BdmzZqlmJgYBQcHq0OHDtqwYYNb4xYsWCCbzaZevXr5tkAAAFBh+D3cLFy4UElJSUpOTtamTZvUqlUrxcfH6+jRoyWO279/v4YPH67OnTuXUaUAAKAi8Hu4mT59ugYOHKgBAwaoefPmmj17tqpVq6a5c+cWO8bhcKhv376aOHGiGjVqVIbVAgCA8s6v4SY/P18bN24s8FyqgIAAxcXFaf369cWOmzRpkurWrasHH3ywLMoEAAAViMcPzvSm7OxsORwORUREFGiPiIjQzp07ixyzdu1avfHGG0pPT3drH3l5ecrLy3O9z83NLXW9AACg/CvVzM2aNWv017/+VbGxsTp06JAkaf78+Vq7dq1Xi/ujEydO6P7779ecOXMUHh7u1piUlBSFhYW5XtHR0T6tEQAA+JfH4eZf//qX4uPjFRISos2bN7tmRXJycjR58mSPthUeHq7AwEBlZWUVaM/KylJkZGSh/nv27NH+/fvVs2dPValSRVWqVNG8efO0dOlSValSRXv27Ck0ZtSoUcrJyXG9Dh486FGNAACgYvE43Dz77LOaPXu25syZo6pVq7raO3XqpE2bNnm0LbvdrrZt2yotLc3V5nQ6lZaWptjY2EL9r7rqKm3dulXp6emu1+23366uXbsqPT29yFmZoKAghYaGFngBAADr8njNTUZGhm644YZC7WFhYfr11189LiApKUmJiYlq166d2rdvrxkzZujUqVMaMGCAJKlfv36qX7++UlJSFBwcrBYtWhQYX6tWLUkq1A4AAConj8NNZGSkdu/erZiYmALta9euLdVl2QkJCTp27JjGjx+vzMxMtW7dWitWrHAtMj5w4IACAvx+xToAAKggPA43AwcO1NChQzV37lzZbDYdPnxY69ev1/DhwzVu3LhSFTF48GANHjy4yM8u9tiH1NTUUu0TAABYk8fhZuTIkXI6nerWrZtOnz6tG264QUFBQRo+fLiGDBniixoBAADc5nG4sdlsGjNmjJ566int3r1bJ0+eVPPmzVWjRg1f1AcAAOCRUt/Ez263q3nz5t6sBQAA4JJ5HG66du0qm81W7OefffbZJRUEAABwKTwON61bty7w/ty5c0pPT9e2bduUmJjorboAAABKxeNw8+KLLxbZPmHCBJ08efKSCwIAALgUXruBzF//+lfNnTvXW5sDAAAoFa+Fm/Xr1ys4ONhbmwMAACgVj09L3XnnnQXeG2N05MgRfffdd6W+iR8AAIC3eBxuwsLCCrwPCAhQ06ZNNWnSJHXv3t1rhQEAAJSGR+HG4XBowIABatmypWrXru2rmgAAAErNozU3gYGB6t69e6me/g0AAFAWPF5Q3KJFC+3du9cXtQAAAFwyj8PNs88+q+HDh+vjjz/WkSNHlJubW+AFAADgT26vuZk0aZKefPJJ3XLLLZKk22+/vcBjGIwxstlscjgc3q8SAADATW6Hm4kTJ+rRRx/V559/7st6AAAALonb4cYYI0nq0qWLz4oBAAC4VB6tuSnpaeAAAADlgUf3uWnSpMlFA87x48cvqSAAAIBL4VG4mThxYqE7FAMAAJQnHoWbe++9V3Xr1vVVLQAAAJfM7TU3rLcBAAAVgdvh5sLVUgAAAOWZ26elnE6nL+sAAADwCo8fvwAAAFCeEW4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAICllItwM2vWLMXExCg4OFgdOnTQhg0biu07Z84cde7cWbVr11bt2rUVFxdXYn8AAFC5+D3cLFy4UElJSUpOTtamTZvUqlUrxcfH6+jRo0X2X716te677z59/vnnWr9+vaKjo9W9e3cdOnSojCsHAADlkc0YY/xZQIcOHXTddddp5syZkiSn06no6GgNGTJEI0eOvOh4h8Oh2rVra+bMmerXr99F++fm5iosLEw5OTkKDQ295PovOJ1/Xs3Hr5QkbZ8Ur2r2Kl7bNgAAlZ0nv99+nbnJz8/Xxo0bFRcX52oLCAhQXFyc1q9f79Y2Tp8+rXPnzqlOnTq+KhMAAFQgfp1eyM7OlsPhUERERIH2iIgI7dy5061tjBgxQvXq1SsQkH4vLy9PeXl5rve5ubmlLxgAAJR7fl9zcymmTJmiBQsW6IMPPlBwcHCRfVJSUhQWFuZ6RUdHl3GVAACgLPk13ISHhyswMFBZWVkF2rOyshQZGVni2BdeeEFTpkzRf/7zH11zzTXF9hs1apRycnJcr4MHD3qldgAAUD75NdzY7Xa1bdtWaWlprjan06m0tDTFxsYWO+7555/XM888oxUrVqhdu3Yl7iMoKEihoaEFXgAAwLr8fklPUlKSEhMT1a5dO7Vv314zZszQqVOnNGDAAElSv379VL9+faWkpEiS/v73v2v8+PF69913FRMTo8zMTElSjRo1VKNGDb99DwAAUD74PdwkJCTo2LFjGj9+vDIzM9W6dWutWLHCtcj4wIEDCgj43wTTq6++qvz8fN19990FtpOcnKwJEyaUZekAAKAc8vt9bsoa97kBAKDiqTD3uQEAAPA2wg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALAUwg0AALCUchFuZs2apZiYGAUHB6tDhw7asGFDif0XL16sq666SsHBwWrZsqWWL19eRpUCAIDyzu/hZuHChUpKSlJycrI2bdqkVq1aKT4+XkePHi2y/1dffaX77rtPDz74oDZv3qxevXqpV69e2rZtWxlXDgAAyiObMcb4s4AOHTrouuuu08yZMyVJTqdT0dHRGjJkiEaOHFmof0JCgk6dOqWPP/7Y1fZ///d/at26tWbPnn3R/eXm5iosLEw5OTkKDQ312vc4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atWqCgwMdLU1a9ZMmZmZys/Pl91u92nNFVFpjvO4ceN0//3366GHHpIktWzZUqdOndLDDz+sMWPGKCCA/+/vDcX9DoaGhvps1kZi5sZtdrtdbdu2VVpamqvN6XQqLS1NsbGxRY6JjY0t0F+SPv3002L7o3THWZKef/55PfPMM1qxYoXatWtXFqVWaJ4e56uuukpbt25Venq663X77bera9euSk9PV3R0dFmWX2GU5t/nTp06affu3a7wKEm7du1SVFQUwaYYpTnOp0+fLhRgLgRKwyMXvcZvv4M+Xa5sMQsWLDBBQUEmNTXVbN++3Tz88MOmVq1aJjMz0xhjzP33329Gjhzp6r9u3TpTpUoV88ILL5gdO3aY5ORkLgV3g6fHecqUKcZut5slS5aYI0eOuF4nTpzw11eoEDw9zn/E1VLu8fQ4HzhwwNSsWdMMHjzYZGRkmI8//tjUrVvXPPvss/76ChWCp8c5OTnZ1KxZ07z33ntm79695j//+Y9p3Lix6d27t7++QoVw4sQJs3nzZrN582YjyUyfPt1s3rzZ/PTTT8YYY0aOHGnuv/9+V/8Ll4I/9dRTZseOHWbWrFlcCl4evfzyy+byyy83drvdtG/f3nz99deuz7p06WISExML9F+0aJFp0qSJsdvt5uqrrzbLli0r44orJk+O85/+9CcjqdArOTm57AuvYDz99/n3CDfu8/Q4f/XVV6ZDhw4mKCjINGrUyDz33HPm/PnzZVx1xePJcT537pyZMGGCady4sQkODjbR0dHm8ccfN7/88kvZF16BfP7550X+fXvh2CYmJpouXboUGtO6dWtjt9tNo0aNzJtvvunzOm3GMP8GAACsgzU3AADAUgg3AADAUgg3AADAUgg3AADAUgg3AADAUgg3AADAUgg3AADAUgg3AApITU1VrVq1/F1GqdlsNn344Ycl9unfv7969epVJvUAKHuEG8CC+vfvL5vNVui1e/duf5em1NRUVz0BAQFq0KCBBgwYoKNHj3pl+0eOHNHNN98sSdq/f79sNpvS09ML9HnppZeUmprqlf0VZ8KECa7vGRgYqOjoaD388MM6fvy4R9shiAGe46nggEX16NFDb775ZoG2yy67zE/VFBQaGqqMjAw5nU59//33GjBggA4fPqyVK1de8rYv9vR4SQoLC7vk/bjj6quv1qpVq+RwOLRjxw498MADysnJ0cKFC8tk/0BlxcwNYFFBQUGKjIws8AoMDNT06dPVsmVLVa9eXdHR0Xr88cd18uTJYrfz/fffq2vXrqpZs6ZCQ0PVtm1bfffdd67P165dq86dOyskJETR0dF64okndOrUqRJrs9lsioyMVL169XTzzTfriSee0KpVq3TmzBk5nU5NmjRJDRo0UFBQkFq3bq0VK1a4xubn52vw4MGKiopScHCw/vSnPyklJaXAti+clmrYsKEk6dprr5XNZtOf//xnSQVnQ1577TXVq1evwFO4JemOO+7QAw884Hr/0UcfqU2bNgoODlajRo00ceJEnT9/vsTvWaVKFUVGRqp+/fqKi4vTPffco08//dT1ucPh0IMPPqiGDRsqJCRETZs21UsvveT6fMKECXrrrbf00UcfuWaBVq9eLUk6ePCgevfurVq1aqlOnTq64447tH///hLrASoLwg1QyQQEBOgf//iHfvjhB7311lv67LPP9PTTTxfbv2/fvmrQoIG+/fZbbdy4USNHjlTVqlUlSXv27FGPHj101113acuWLVq4cKHWrl2rwYMHe1RTSEiInE6nzp8/r5deeknTpk3TCy+8oC1btig+Pl633367fvzxR0nSP/7xDy1dulSLFi1SRkaG3nnnHcXExBS53Q0bNkiSVq1apSNHjuj9998v1Oeee+7Rf//7X33++eeutuPHj2vFihXq27evJGnNmjXq16+fhg4dqu3bt+uf//ynUlNT9dxzz7n9Hffv36+VK1fKbre72pxOpxo0aKDFixdr+/btGj9+vEaPHq1FixZJkoYPH67evXurR48eOnLkiI4cOaKOHTvq3Llzio+PV82aNbVmzRqtW7dONWrUUI8ePZSfn+92TYBl+fzRnADKXGJiogkMDDTVq1d3ve6+++4i+y5evNj8v//3/1zv33zzTRMWFuZ6X7NmTZOamlrk2AcffNA8/PDDBdrWrFljAgICzJkzZ4oc88ft79q1yzRp0sS0a9fOGGNMvXr1zHPPPVdgzHXXXWcef/xxY4wxQ4YMMTfeeKNxOp1Fbl+S+eCDD4wxxuzbt89IMps3by7Q549PNL/jjjvMAw884Hr/z3/+09SrV884HA5jjDHdunUzkydPLrCN+fPnm6ioqCJrMMaY5ORkExAQYKpXr26Cg4NdT0+ePn16sWOMMWbQoEHmrrvuKrbWC/tu2rRpgWOQl5dnQkJCzMqVK0vcPlAZsOYGsKiuXbvq1Vdfdb2vXr26pN9mMVJSUrRz507l5ubq/PnzOnv2rE6fPq1q1aoV2k5SUpIeeughzZ8/33VqpXHjxpJ+O2W1ZcsWvfPOO67+xhg5nU7t27dPzZo1K7K2nJwc1ahRQ06nU2fPntX111+v119/Xbm5uTp8+LA6depUoH+nTp30/fffS/rtlNJNN92kpk2bqkePHrrtttvUvXv3SzpWffv21cCBA/XKK68oKChI77zzju69914FBAS4vue6desKzNQ4HI4Sj5skNW3aVEuXLtXZs2f19ttvKz09XUOGDCnQZ9asWZo7d64OHDigM2fOKD8/X61bty6x3u+//167d+9WzZo1C7SfPXtWe/bsKcURAKyFcANYVPXq1XXFFVcUaNu/f79uu+02PfbYY3ruuedUp04drV27Vg8++KDy8/OL/JGeMGGC+vTpo2XLlumTTz5RcnKyFixYoL/85S86efKkHnnkET3xxBOFxl1++eXF1lazZk1t2rRJAQEBioqKUkhIiCQpNzf3ot+rTZs22rdvnz755BOtWrVKvXv3VlxcnJYsWXLRscXp2bOnjDFatmyZrrvuOq1Zs0Yvvvii6/OTJ09q4sSJuvPOOwuNDQ4OLna7drvd9c9gypQpuvXWWzVx4kQ988wzkqQFCxZo+PDhmjZtmmJjY1WzZk1NnTpV33zzTYn1njx5Um3bti0QKi8oL4vGAX8i3ACVyMaNG+V0OjVt2jTXrMSF9R0ladKkiZo0aaJhw4bpvvvu05tvvqm//OUvatOmjbZv314oRF1MQEBAkWNCQ0NVr149rVu3Tl26dHG1r1u3Tu3bty/QLyEhQQkJCbr77rvVo0cPHT9+XHXq1CmwvQvrWxwOR4n1BAcH684779Q777yj3bt3q2nTpmrTpo3r8zZt2igjI8Pj7/lHY8eO1Y033qjHHnvM9T07duyoxx9/3NXnjzMvdru9UP1t2rTRwoULVbduXYWGhl5STYAVsaAYqESuuOIKnTt3Ti+//LL27t2r+fPna/bs2cX2P3PmjAYPHqzVq1frp59+0rp16/Ttt9+6TjeNGDFCX331lQYPHqz09HT9+OOP+uijjzxeUPx7Tz31lP7+979r4cKFysjI0MiRI5Wenq6hQ4dKkqZPn6733ntPO3fu1K5du7R48WJFRkYWeePBunXrKiQkRCtWrFBWVpZycnKK3W/fvn21bNkyzZ0717WQ+ILx48dr3rx5mjhxon744Qft2LFDCxYs0NixYz36brGxsbrmmms0efJkSdKVV16p7777TitXrtSuXbs0btw4ffvttwXGxMTEaMuWLcrIyFB2drbOnTunvn37Kjw8XHfccYfWrFmjffv2afXq1XriiSf0888/e1QTYEn+XvQDwPuKWoR6wfTp001UVJQJCQkx8fHxZt68eUaS+eWXX4wxBRf85uXlmXvvvddER0cbu91u6tWrZwYPHlxgsfCGDRvMTTfdZGrUqGGqV69urrnmmkILgn/vjwuK/8jhcJgJEyaY+vXrm6pVq5pWrVqZTz75xPX5a6+9Zlq3bm2qV69uQkNDTbdu3cymTZtcn+t3C4qNMWbOnDkmOjraBAQEmC5duhR7fBwOh4mKijKSzJ49ewrVtWLFCtOxY0cTEhJiQkNDTfv27c1rr71W7PdITk42rVq1KtT+3nvvmaCgIHPgwAFz9uxZ079/fxMWFmZq1aplHnvsMTNy5MgC444ePeo6vpLM559/bowx5siRI6Zfv34mPDzcBAUFmUaNGpmBAweanJycYmsCKgubMcb4N14BAAB4D6elAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApfx/tnh/m3ZrVhkAAAAASUVORK5CYII=\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "AUC: 0.935453505560194\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics import precision_recall_curve\n", + "\n", + "precision, recall, _ = precision_recall_curve(y_test, y_probs)\n", + "\n", + "plt.plot(recall, precision)\n", + "plt.title(\"Precision-Recall Curve\")\n", + "plt.xlabel(\"Recall\")\n", + "plt.ylabel(\"Precision\")\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "ZZlNbHE5Otj9", + "outputId": "a7fa5b86-5545-4239-ef86-bae2b7984f06" + }, + "execution_count": 22, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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770HKysrPPLIIzh79iyKioowfPhwo/5lZWXo3bs3ACA+Ph6DBg0yBJu/S09Px6uvvoqDBw/i5s2b0Ol0KCoqQnJycoNvFxE1PoYbImoS7O3t0b59ewDA+vXr0bNnT3z66afo1q0bAGDnzp3w9fU1WkalUgEAbG1t77juiIgIZGVl4f3330fr1q2hUqkQEhKCsrKyBtgSIjI3hhsianLkcjlefvllREZG4sKFC1CpVEhOTkZoaGi1/Xv06IHPPvsM5eXl1Y7eHDlyBKtXr8bo0aMBACkpKcjMzGzQbSAi8+GEYiJqkh577DEoFAp8/PHHeP755zFv3jx89tlnuHz5Mk6ePIkPP/wQn332GQBgzpw50Gg0+Oc//4njx4/j4sWL+Pzzz5GQkAAA6NChAz7//HOcO3cOv/76KyZPnnzX0R4islwcuSGiJsnKygpz5szB22+/jStXrsDDwwPR0dFITEyEi4sL+vTpg5dffhkA0KJFC+zfvx8vvPACQkNDoVAo0KtXLwwYMAAA8Omnn+Lpp59Gnz594OfnhyVLluD555835+YRUQOSCSGEuYsgIiIiqi88LEVERESSwnBDREREksJwQ0RERJLCcENERESSwnBDREREksJwQ0RERJLCcENERESSwnBDREREksJwQ0RERJLCcENERESSwnBDREREksJwQ0RERJLy/0nsTeb6jzY5AAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "fraudes = df[df[\"Class\"] == 1]\n", + "normais = df[df[\"Class\"] == 0].sample(len(fraudes), random_state=42)\n", + "\n", + "df_under = pd.concat([fraudes, normais])" + ], + "metadata": { + "id": "ilHzKXDWO8DE" + }, + "execution_count": 24, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from imblearn.over_sampling import SMOTE\n", + "\n", + "smote = SMOTE()\n", + "\n", + "X_res, Y_res = smote.fit_resample(x, y)" + ], + "metadata": { + "id": "3tIXtusSPw3v" + }, + "execution_count": 25, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "rf = RandomForestClassifier(\n", + " n_estimators=50,\n", + " max_depth=10,\n", + " class_weight=\"balanced\",\n", + " n_jobs=-1,\n", + " random_state=42\n", + ")\n", + "\n", + "rf.fit(x_train, y_train)\n", + "y_pred_rf = rf.predict(x_test)\n", + "\n", + "print(classification_report(y_test, y_pred_rf))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BVSkbjZAQeaR", + "outputId": "7fd6fb30-acb9-4aa9-fe67-d247dd3c8059" + }, + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 85295\n", + " 1 0.83 0.76 0.80 148\n", + "\n", + " accuracy 1.00 85443\n", + " macro avg 0.92 0.88 0.90 85443\n", + "weighted avg 1.00 1.00 1.00 85443\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.pipeline import Pipeline\n", + "\n", + "pipeline = Pipeline([\n", + " (\"scaler\", StandardScaler()),\n", + " (\"model\", LogisticRegression(max_iter=1000))\n", + "])\n", + "\n", + "pipeline.fit(x_train, y_train)\n", + "y_pred = pipeline.predict(x_test)\n", + "\n", + "threshold = 0.3\n", + "\n", + "y_pred_custom = (y_probs > threshold).astype(int)\n", + "\n", + "print(classification_report(y_test, y_pred_custom))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tzMUUbGrRL5-", + "outputId": "1db4bb7d-24a9-4703-f127-f26beeac866c" + }, + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 85295\n", + " 1 0.84 0.70 0.76 148\n", + "\n", + " accuracy 1.00 85443\n", + " macro avg 0.92 0.85 0.88 85443\n", + "weighted avg 1.00 1.00 1.00 85443\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from xgboost import XGBClassifier\n", + "\n", + "xbg = XGBClassifier(\n", + " scale_pos_weight=10,\n", + " use_label_encoder=False,\n", + " eval_metric=\"logloss\"\n", + ")\n", + "\n", + "xbg.fit(x_train, y_train)\n", + "\n", + "y_pred_xbg = xbg.predict(x_test)\n", + "\n", + "\n", + "print(classification_report(y_test, y_pred_xbg))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WhZOPja4SeuW", + "outputId": "edfa4188-6460-4896-8414-37bbf2ab24a0" + }, + "execution_count": 30, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/xgboost/training.py:200: UserWarning: [20:09:59] WARNING: /__w/xgboost/xgboost/src/learner.cc:782: \n", + "Parameters: { \"use_label_encoder\" } are not used.\n", + "\n", + " bst.update(dtrain, iteration=i, fobj=obj)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 85295\n", + " 1 0.93 0.78 0.85 148\n", + "\n", + " accuracy 1.00 85443\n", + " macro avg 0.96 0.89 0.92 85443\n", + "weighted avg 1.00 1.00 1.00 85443\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "id": "SFuZ7NyCTKg0" + } + } + ] +} \ No newline at end of file