From eea21201e9c131eeeb4d9246d9f63b020b42c3f5 Mon Sep 17 00:00:00 2001 From: ajoubrel-ensae Date: Mon, 12 Feb 2024 22:49:13 +0000 Subject: [PATCH] =?UTF-8?q?Ajout=20r=C3=A9gression=20logistique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0_Cleaning_and_merge.ipynb | 449 +++++----------------------------- 0_KPI_functions.py | 2 + 2_Regression_logistique.ipynb | 326 +++++++++++++++++++++++- 3 files changed, 383 insertions(+), 394 deletions(-) diff --git a/0_Cleaning_and_merge.ipynb b/0_Cleaning_and_merge.ipynb index e77968c..3211835 100644 --- a/0_Cleaning_and_merge.ipynb +++ b/0_Cleaning_and_merge.ipynb @@ -1710,7 +1710,7 @@ "def tickets_kpi_function(tickets_information = None):\n", "\n", " tickets_information_copy = tickets_information.copy()\n", - "\n", + " \n", " # Dummy : Canal de vente en ligne\n", " liste_mots = ['en ligne', 'internet', 'web', 'net', 'vad', 'online'] # vad = vente à distance\n", " tickets_information_copy['vente_internet'] = tickets_information_copy['supplier_name'].str.contains('|'.join(liste_mots), case=False).astype(int)\n", @@ -2457,24 +2457,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "id": "a89fad43-ee68-4081-9384-3e9f08ec6a59", "metadata": {}, "outputs": [], "source": [ - "df1_customer_product = pd.merge(df1_customer, nb_tickets, on = 'customer_id', how = 'left')\n", - "print(\"shape : \", df1_customer_product.shape)\n", - "df1_customer_product.head()" + "# df1_customer_product = pd.merge(df1_customer, nb_tickets, on = 'customer_id', how = 'left')\n", + "# print(\"shape : \", df1_customer_product.shape)\n", + "# df1_customer_product.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "a19fec00-4ece-400c-937c-ce5cd8daccfd", "metadata": {}, "outputs": [], "source": [ - "df1_customer_product.to_csv(\"customer_product.csv\", index = False)" + "# df1_customer_product.to_csv(\"customer_product.csv\", index = False)" ] }, { @@ -2487,7 +2487,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "id": "46de1912-4a66-46e5-8b9e-7768b2d2723b", "metadata": {}, "outputs": [], @@ -2501,7 +2501,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "id": "d53825e4-6453-45bc-94f2-7b2504ec4afb", "metadata": {}, "outputs": [ @@ -2707,7 +2707,7 @@ "[5 rows x 28 columns]" ] }, - "execution_count": 39, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -2718,7 +2718,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "id": "1e42a790-b215-4107-a969-85005da06ebd", "metadata": {}, "outputs": [], @@ -2732,405 +2732,68 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "id": "d950f24d-a5d1-4f1e-aeaa-ca826470365f", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
customer_idevent_type_idnb_ticketsnb_purchasestotal_amountnb_suppliersvente_internet_maxpurchase_date_minpurchase_date_maxtime_between_purchase...average_ticket_baskettotal_pricepurchase_countfirst_buying_datecountryagetenant_idnb_campaignsnb_campaigns_openedtime_to_open
012.0384226.0194790.02686540.57.01.03262.1908684.1793063258.011562...1.9560878821221.5641472.02013-06-10 10:37:58+00:00frNaN1311.00.00.0NaT
114.0453242.0228945.03248965.56.01.03698.1982295.2218403692.976389...1.9560878821221.5641472.02013-06-10 10:37:58+00:00frNaN1311.00.00.0NaT
215.0201750.0107110.01459190.06.01.03803.3697920.1463313803.223461...1.9560878821221.5641472.02013-06-10 10:37:58+00:00frNaN1311.00.00.0NaT
316.0217356.0111786.01435871.55.01.02502.7155091408.7155321093.999977...1.9560878821221.5641472.02013-06-10 10:37:58+00:00frNaN1311.00.00.0NaT
422.0143.0143.00.01.00.02041.2745491340.308160700.966389...1.0000000.0307.02018-04-07 12:55:07+00:00frNaN1311.04.00.0NaT
..................................................................
15629112561335.03.01.033.01.01.00.1105210.1105210.000000...NaNNaNNaNNaTNaNNaNNaNNaNNaNNaT
15629212561345.04.01.044.01.01.00.0920950.0920950.000000...NaNNaNNaNNaTNaNNaNNaNNaNNaNNaT
15629312561355.01.01.011.01.01.00.0878940.0878940.000000...NaNNaNNaNNaTNaNNaNNaNNaNNaNNaT
15629412561365.02.01.022.01.01.00.0403940.0403940.000000...NaNNaNNaNNaTNaNNaNNaNNaNNaNNaT
15629512561375.02.01.022.01.01.00.0000000.0000000.000000...NaNNaNNaNNaTNaNNaNNaNNaNNaNNaT
\n", - "

156296 rows × 40 columns

\n", - "
" - ], "text/plain": [ - " customer_id event_type_id nb_tickets nb_purchases total_amount \\\n", - "0 1 2.0 384226.0 194790.0 2686540.5 \n", - "1 1 4.0 453242.0 228945.0 3248965.5 \n", - "2 1 5.0 201750.0 107110.0 1459190.0 \n", - "3 1 6.0 217356.0 111786.0 1435871.5 \n", - "4 2 2.0 143.0 143.0 0.0 \n", - "... ... ... ... ... ... \n", - "156291 1256133 5.0 3.0 1.0 33.0 \n", - "156292 1256134 5.0 4.0 1.0 44.0 \n", - "156293 1256135 5.0 1.0 1.0 11.0 \n", - "156294 1256136 5.0 2.0 1.0 22.0 \n", - "156295 1256137 5.0 2.0 1.0 22.0 \n", - "\n", - " nb_suppliers vente_internet_max purchase_date_min \\\n", - "0 7.0 1.0 3262.190868 \n", - "1 6.0 1.0 3698.198229 \n", - "2 6.0 1.0 3803.369792 \n", - "3 5.0 1.0 2502.715509 \n", - "4 1.0 0.0 2041.274549 \n", - "... ... ... ... \n", - "156291 1.0 1.0 0.110521 \n", - "156292 1.0 1.0 0.092095 \n", - "156293 1.0 1.0 0.087894 \n", - "156294 1.0 1.0 0.040394 \n", - "156295 1.0 1.0 0.000000 \n", - "\n", - " purchase_date_max time_between_purchase ... average_ticket_basket \\\n", - "0 4.179306 3258.011562 ... 1.956087 \n", - "1 5.221840 3692.976389 ... 1.956087 \n", - "2 0.146331 3803.223461 ... 1.956087 \n", - "3 1408.715532 1093.999977 ... 1.956087 \n", - "4 1340.308160 700.966389 ... 1.000000 \n", - "... ... ... ... ... \n", - "156291 0.110521 0.000000 ... NaN \n", - "156292 0.092095 0.000000 ... NaN \n", - "156293 0.087894 0.000000 ... NaN \n", - "156294 0.040394 0.000000 ... NaN \n", - "156295 0.000000 0.000000 ... NaN \n", - "\n", - " total_price purchase_count first_buying_date country age \\\n", - "0 8821221.5 641472.0 2013-06-10 10:37:58+00:00 fr NaN \n", - "1 8821221.5 641472.0 2013-06-10 10:37:58+00:00 fr NaN \n", - "2 8821221.5 641472.0 2013-06-10 10:37:58+00:00 fr NaN \n", - "3 8821221.5 641472.0 2013-06-10 10:37:58+00:00 fr NaN \n", - "4 0.0 307.0 2018-04-07 12:55:07+00:00 fr NaN \n", - "... ... ... ... ... .. \n", - "156291 NaN NaN NaT NaN NaN \n", - "156292 NaN NaN NaT NaN NaN \n", - "156293 NaN NaN NaT NaN NaN \n", - "156294 NaN NaN NaT NaN NaN \n", - "156295 NaN NaN NaT NaN NaN \n", - "\n", - " tenant_id nb_campaigns nb_campaigns_opened time_to_open \n", - "0 1311.0 0.0 0.0 NaT \n", - "1 1311.0 0.0 0.0 NaT \n", - "2 1311.0 0.0 0.0 NaT \n", - "3 1311.0 0.0 0.0 NaT \n", - "4 1311.0 4.0 0.0 NaT \n", - "... ... ... ... ... \n", - "156291 NaN NaN NaN NaT \n", - "156292 NaN NaN NaN NaT \n", - "156293 NaN NaN NaN NaT \n", - "156294 NaN NaN NaN NaT \n", - "156295 NaN NaN NaN NaT \n", - "\n", - "[156296 rows x 40 columns]" + "customer_id 0\n", + "event_type_id 78355\n", + "nb_tickets 0\n", + "nb_purchases 0\n", + "total_amount 0\n", + "nb_suppliers 0\n", + "vente_internet_max 0\n", + "purchase_date_min 78355\n", + "purchase_date_max 78355\n", + "time_between_purchase 78355\n", + "nb_tickets_internet 0\n", + "name_event_types 78355\n", + "avg_amount 78355\n", + "birthdate 149382\n", + "street_id 7\n", + "is_partner 7\n", + "gender 7\n", + "is_email_true 7\n", + "opt_in 7\n", + "structure_id 136874\n", + "profession 150011\n", + "language 155191\n", + "mcp_contact_id 53526\n", + "last_buying_date 78452\n", + "max_price 78452\n", + "ticket_sum 7\n", + "average_price 13127\n", + "fidelity 7\n", + "average_purchase_delay 78452\n", + "average_price_basket 78452\n", + "average_ticket_basket 78452\n", + "total_price 65332\n", + "purchase_count 7\n", + "first_buying_date 78452\n", + "country 8311\n", + "age 149382\n", + "tenant_id 7\n", + "nb_campaigns 7\n", + "nb_campaigns_opened 7\n", + "time_to_open 69024\n", + "dtype: int64" ] }, - "execution_count": 41, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df1_customer_product" + "df1_customer_product.isna().sum()" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "id": "ebf6d843-dcc0-4e83-b063-94806c0bac17", "metadata": {}, "outputs": [], diff --git a/0_KPI_functions.py b/0_KPI_functions.py index 69a5294..59e1b07 100644 --- a/0_KPI_functions.py +++ b/0_KPI_functions.py @@ -79,4 +79,6 @@ def tickets_kpi_function(tickets_information = None): tickets_kpi = tickets_kpi.merge(avg_amount, how='left', on= 'event_type_id') return tickets_kpi + + \ No newline at end of file diff --git a/2_Regression_logistique.ipynb b/2_Regression_logistique.ipynb index 2cbcba7..9cb53d2 100644 --- a/2_Regression_logistique.ipynb +++ b/2_Regression_logistique.ipynb @@ -7,6 +7,330 @@ "source": [ "# Segmentation des clients par régression logistique" ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bca785be-39f7-4583-9bd8-67c1134ae275", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "import s3fs\n", + "import re\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", + "from sklearn.preprocessing import StandardScaler\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "59ce5096-4e2c-45c1-be78-43e14db4142c", + "metadata": {}, + "outputs": [], + "source": [ + "# # modification des variables categorielles\n", + " \n", + "# ### variable gender\n", + "# df1_customer_product[\"gender_label\"] = df1_customer_product[\"gender\"].map({\n", + "# 0: 'female',\n", + "# 1: 'male',\n", + "# 2: 'other'\n", + "# })\n", + " \n", + "# ### variable country -> on indique si le pays est france\n", + "# df1_customer_product[\"country_fr\"] = df1_customer_product[\"country\"].apply(lambda x : int(x==\"fr\") if pd.notna(x) else np.nan)\n", + "\n", + "# # Création des indicatrices de gender\n", + "# gender_dummies = pd.get_dummies(df1_customer_product[\"gender_label\"], prefix='gender').astype(int)\n", + " \n", + "# # Concaténation des indicatrices avec le dataframe d'origine\n", + "# df1_customer_product = pd.concat([df1_customer_product, gender_dummies], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3bf57816-b023-4e84-9450-095620bddebc", + "metadata": {}, + "outputs": [], + "source": [ + "# Create filesystem object\n", + "S3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n", + "fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL})" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "27002f2f-a78a-414c-8e4f-b15bf6dd9e40", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_7388/1677066092.py:7: DtypeWarning: Columns (21,39) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " dataset_train = pd.read_csv(file_in, sep=\",\")\n", + "/tmp/ipykernel_7388/1677066092.py:12: DtypeWarning: Columns (21,39) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " dataset_test = pd.read_csv(file_in, sep=\",\")\n" + ] + } + ], + "source": [ + "# Importation des données\n", + "BUCKET = \"projet-bdc2324-team1/1_Output/Logistique Regression databases - First approach\"\n", + "\n", + "FILE_PATH_S3 = BUCKET + \"/\" + \"dataset_train.csv\"\n", + "\n", + "with fs.open(FILE_PATH_S3, mode=\"rb\") as file_in:\n", + " dataset_train = pd.read_csv(file_in, sep=\",\")\n", + "\n", + "FILE_PATH_S3 = BUCKET + \"/\" + \"dataset_test.csv\"\n", + "\n", + "with fs.open(FILE_PATH_S3, mode=\"rb\") as file_in:\n", + " dataset_test = pd.read_csv(file_in, sep=\",\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3928b55-8821-46da-b3b5-a036efd6d2cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_type_idname_event_types
02.0offre muséale individuel
14.0spectacle vivant
25.0offre muséale groupe
3NaNNaN
\n", + "
" + ], + "text/plain": [ + " event_type_id name_event_types\n", + "0 2.0 offre muséale individuel\n", + "1 4.0 spectacle vivant\n", + "2 5.0 offre muséale groupe\n", + "3 NaN NaN" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[['event_type_id', 'name_event_types']].drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7e8a9d4d-7e55-4173-a7f4-8b8baa9610d2", + "metadata": {}, + "outputs": [], + "source": [ + "#Choose type of event \n", + "type_event_choosed = 5\n", + "\n", + "dataset_test = dataset_test[(dataset_test['event_type_id'] == type_event_choosed) | np.isnan(dataset_test['event_type_id'])]\n", + "dataset_test['y_has_purchased'] = dataset_test['y_has_purchased'].fillna(0)\n", + "dataset_train = dataset_train[(dataset_train['event_type_id'] == type_event_choosed) | np.isnan(dataset_train['event_type_id'])]\n", + "dataset_train['y_has_purchased'] = dataset_train['y_has_purchased'].fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e20ced8f-df1c-43bb-8d15-79f414c8225c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "customer_id 0.000000\n", + "event_type_id 0.984075\n", + "nb_tickets 0.000000\n", + "nb_purchases 0.000000\n", + "total_amount 0.000000\n", + "nb_suppliers 0.000000\n", + "vente_internet_max 0.000000\n", + "purchase_date_min 0.984075\n", + "purchase_date_max 0.984075\n", + "time_between_purchase 0.984075\n", + "nb_tickets_internet 0.000000\n", + "name_event_types 0.984075\n", + "avg_amount 0.984075\n", + "birthdate 0.961026\n", + "street_id 0.000000\n", + "is_partner 0.000000\n", + "gender 0.000000\n", + "is_email_true 0.000000\n", + "opt_in 0.000000\n", + "structure_id 0.869302\n", + "profession 0.950730\n", + "language 0.991512\n", + "mcp_contact_id 0.276103\n", + "last_buying_date 0.633303\n", + "max_price 0.633303\n", + "ticket_sum 0.000000\n", + "average_price 0.105825\n", + "fidelity 0.000000\n", + "average_purchase_delay 0.633303\n", + "average_price_basket 0.633303\n", + "average_ticket_basket 0.633303\n", + "total_price 0.527478\n", + "purchase_count 0.000000\n", + "first_buying_date 0.633303\n", + "country 0.065583\n", + "age 0.961026\n", + "tenant_id 0.000000\n", + "nb_campaigns 0.000000\n", + "nb_campaigns_opened 0.000000\n", + "time_to_open 0.536466\n", + "y_has_purchased 0.000000\n", + "dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train.isna().sum()/len(dataset_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "34bae3f7-d579-4f80-a38d-a83eb5ea8a7b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.9999434695179565\n", + "Confusion Matrix:\n", + " [[123819 0]\n", + " [ 7 1]]\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0.0 1.00 1.00 1.00 123819\n", + " 1.0 1.00 0.12 0.22 8\n", + "\n", + " accuracy 1.00 123827\n", + " macro avg 1.00 0.56 0.61 123827\n", + "weighted avg 1.00 1.00 1.00 123827\n", + "\n" + ] + } + ], + "source": [ + "\n", + "reg_columns = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'nb_tickets_internet', 'opt_in', 'fidelity', 'nb_campaigns', 'nb_campaigns_opened']\n", + "\n", + "X_train = dataset_train[reg_columns]\n", + "y_train = dataset_train['y_has_purchased']\n", + "X_test = dataset_test[reg_columns]\n", + "y_test = dataset_test['y_has_purchased']\n", + "\n", + "# Fit and transform the scaler on the training data\n", + "scaler = StandardScaler()\n", + "\n", + "# Transform the test data using the same scaler\n", + "X_train_scaled = scaler.fit_transform(X_train)\n", + "X_test_scaled = scaler.fit_transform(X_test)\n", + "\n", + "# Create and fit the linear regression model\n", + "logit_model = LogisticRegression(penalty='l1', solver='liblinear', C=1.0)\n", + "logit_model.fit(X_train_scaled, y_train)\n", + "\n", + "y_pred = logit_model.predict(X_test_scaled)\n", + "\n", + "#Evaluation du modèle \n", + "accuracy = accuracy_score(y_test, y_pred)\n", + "conf_matrix = confusion_matrix(y_test, y_pred)\n", + "class_report = classification_report(y_test, y_pred)\n", + "\n", + "print(\"Accuracy:\", accuracy)\n", + "print(\"Confusion Matrix:\\n\", conf_matrix)\n", + "print(\"Classification Report:\\n\", class_report)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ccc78c36-3287-46e6-89ac-7494c1a7106a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Class 0', 'Class 1'], yticklabels=['Class 0', 'Class 1'])\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('Actual')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] } ], "metadata": { @@ -25,7 +349,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.6" } }, "nbformat": 4,