diff --git a/.ipynb_checkpoints/7.06_Lab_Handling_data_imbalance-checkpoint.ipynb b/.ipynb_checkpoints/7.06_Lab_Handling_data_imbalance-checkpoint.ipynb new file mode 100644 index 0000000..a2e49b8 --- /dev/null +++ b/.ipynb_checkpoints/7.06_Lab_Handling_data_imbalance-checkpoint.ipynb @@ -0,0 +1,1344 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1c5dff02-eff9-4188-a11a-5c325f99a346", + "metadata": {}, + "source": [ + "# Lab | Handling Data Imbalance in Classification Models" + ] + }, + { + "cell_type": "markdown", + "id": "1ce60032-dfb6-43ea-a21d-17d39527dbdd", + "metadata": {}, + "source": [ + "### Scenario\n", + "\n", + "You are working as an analyst with this internet service provider. You are provided with this historical data about your company's customers and their churn trends. Your task is to build a machine learning model that will help the company identify customers that are more likely to default/churn and thus prevent losses from such customers.\n", + "\n", + "### Instructions\n", + "\n", + "In this lab, we will first take a look at the degree of imbalance in the data and correct it using the techniques we learned on the class." + ] + }, + { + "cell_type": "markdown", + "id": "f0212300-6d58-42b1-851d-047b3df5735b", + "metadata": {}, + "source": [ + "# Solutions\n", + "\n", + "### 1. Libary imports" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "e50167c9-7fb2-47bd-9c22-f7c8ab1c770f", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import math\n", + "import matplotlib as plt\n", + "import seaborn as sns\n", + "from sklearn.preprocessing import Normalizer, StandardScaler\n", + "from imblearn.over_sampling import SMOTE \n", + "from imblearn.under_sampling import TomekLinks\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn import metrics\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import roc_auc_score\n", + "from sklearn.metrics import confusion_matrix\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "pd.set_option('display.max_columns', None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131072f8-de93-4b44-98e9-1ac471566542", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5c934b9b-5d31-4b0c-80f7-950d1650d43f", + "metadata": {}, + "source": [ + "### 2. Data import" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "77e648c8-cfe7-4dff-b664-2aea1ee8c4c6", + "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", + "
genderSeniorCitizenPartnerDependentstenurePhoneServiceOnlineSecurityOnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractMonthlyChargesTotalChargesChurn
0Female0YesNo1NoNoYesNoNoNoNoMonth-to-month29.8529.85No
1Male0NoNo34YesYesNoYesNoNoNoOne year56.951889.5No
2Male0NoNo2YesYesYesNoNoNoNoMonth-to-month53.85108.15Yes
3Male0NoNo45NoYesNoYesYesNoNoOne year42.301840.75No
4Female0NoNo2YesNoNoNoNoNoNoMonth-to-month70.70151.65Yes
\n", + "
" + ], + "text/plain": [ + " gender SeniorCitizen Partner Dependents tenure PhoneService \\\n", + "0 Female 0 Yes No 1 No \n", + "1 Male 0 No No 34 Yes \n", + "2 Male 0 No No 2 Yes \n", + "3 Male 0 No No 45 No \n", + "4 Female 0 No No 2 Yes \n", + "\n", + " OnlineSecurity OnlineBackup DeviceProtection TechSupport StreamingTV \\\n", + "0 No Yes No No No \n", + "1 Yes No Yes No No \n", + "2 Yes Yes No No No \n", + "3 Yes No Yes Yes No \n", + "4 No No No No No \n", + "\n", + " StreamingMovies Contract MonthlyCharges TotalCharges Churn \n", + "0 No Month-to-month 29.85 29.85 No \n", + "1 No One year 56.95 1889.5 No \n", + "2 No Month-to-month 53.85 108.15 Yes \n", + "3 No One year 42.30 1840.75 No \n", + "4 No Month-to-month 70.70 151.65 Yes " + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData = pd.read_csv('files_for_lab/Customer-Churn.csv')\n", + "churnData.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542b8787-7487-46bb-b48b-b5d3a8c5a56c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "63cddfa7-5a91-4be7-b27f-47e9b3ff5e8f", + "metadata": {}, + "source": [ + "### 3. Data overview" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "ee7d0e8d-0f83-44e1-b606-ae0f20be2740", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7043, 16)" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "616f2826-2965-4786-b97b-845a23e06849", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 7043 entries, 0 to 7042\n", + "Data columns (total 16 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 gender 7043 non-null object \n", + " 1 SeniorCitizen 7043 non-null int64 \n", + " 2 Partner 7043 non-null object \n", + " 3 Dependents 7043 non-null object \n", + " 4 tenure 7043 non-null int64 \n", + " 5 PhoneService 7043 non-null object \n", + " 6 OnlineSecurity 7043 non-null object \n", + " 7 OnlineBackup 7043 non-null object \n", + " 8 DeviceProtection 7043 non-null object \n", + " 9 TechSupport 7043 non-null object \n", + " 10 StreamingTV 7043 non-null object \n", + " 11 StreamingMovies 7043 non-null object \n", + " 12 Contract 7043 non-null object \n", + " 13 MonthlyCharges 7043 non-null float64\n", + " 14 TotalCharges 7043 non-null object \n", + " 15 Churn 7043 non-null object \n", + "dtypes: float64(1), int64(2), object(13)\n", + "memory usage: 880.5+ KB\n" + ] + } + ], + "source": [ + "churnData.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "4e76a60f-a529-4317-ab7c-52c95fee17bb", + "metadata": {}, + "outputs": [], + "source": [ + "# convert 'TotalCharges' to numerical column\n", + "churnData['TotalCharges'] = pd.to_numeric(churnData['TotalCharges'], errors='coerce')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40eba303-3187-4566-92e3-340f69669a4d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "513718db-350f-4159-8b7d-49a44a1ef9a3", + "metadata": {}, + "source": [ + "### 4. Null values" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "a4b18c23-8d83-46ca-bb28-4b5dee2f8dc0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gender 0\n", + "SeniorCitizen 0\n", + "Partner 0\n", + "Dependents 0\n", + "tenure 0\n", + "PhoneService 0\n", + "OnlineSecurity 0\n", + "OnlineBackup 0\n", + "DeviceProtection 0\n", + "TechSupport 0\n", + "StreamingTV 0\n", + "StreamingMovies 0\n", + "Contract 0\n", + "MonthlyCharges 0\n", + "TotalCharges 11\n", + "Churn 0\n", + "dtype: int64" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "18892cf2-39a9-47eb-a487-7aade3b878d3", + "metadata": {}, + "outputs": [], + "source": [ + "churnData['TotalCharges'] = churnData['TotalCharges'].fillna(churnData['TotalCharges'].median())" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "f35107a1-d903-4f39-afdc-d75bb8e6e366", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gender 0\n", + "SeniorCitizen 0\n", + "Partner 0\n", + "Dependents 0\n", + "tenure 0\n", + "PhoneService 0\n", + "OnlineSecurity 0\n", + "OnlineBackup 0\n", + "DeviceProtection 0\n", + "TechSupport 0\n", + "StreamingTV 0\n", + "StreamingMovies 0\n", + "Contract 0\n", + "MonthlyCharges 0\n", + "TotalCharges 0\n", + "Churn 0\n", + "dtype: int64" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bb5c90a-b372-41ab-9915-8a6e5f32cae2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3f0bf1eb-095d-4618-adcd-388345ece01f", + "metadata": {}, + "source": [ + "### 5. Data preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "067758b7-47f7-44df-92b1-2ffe50bcf40a", + "metadata": {}, + "outputs": [], + "source": [ + "# feature selection / x-y-split\n", + "X = churnData[['tenure', 'SeniorCitizen', 'MonthlyCharges', 'TotalCharges']]\n", + "y = churnData['Churn']\n", + "\n", + "# train-test-split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=99)\n", + "\n", + "y_train = pd.DataFrame(y_train).reset_index()\n", + "y_test = pd.DataFrame(y_test).reset_index()\n", + "y_train = y_train.drop(['index'], axis=1)\n", + "y_test = y_test.drop(['index'], axis=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "03d9fb0b-b8d5-4df1-abd3-96641969dca6", + "metadata": {}, + "outputs": [], + "source": [ + "# data scaling\n", + "normalizer = Normalizer().fit(X_train)\n", + "\n", + "X_train = normalizer.transform(X_train)\n", + "X_test = normalizer.transform(X_test)\n", + "\n", + "X_train = pd.DataFrame(X_train)\n", + "X_test = pd.DataFrame(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed452999-5309-48ae-ab7a-9062a5feb112", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "bb88436d-3243-4108-aec2-89caee370905", + "metadata": {}, + "source": [ + "### 6. Modeling" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "b6a23ce4-9a73-4e9b-a982-914c16f76921", + "metadata": {}, + "outputs": [], + "source": [ + "# evaluation function for binary classifications\n", + "# inputs: training and test data, model after fit\n", + "# outputs: report df\n", + "def clf_evaluation(trainX, trainY, testX, testY, model):\n", + " # predictions and report\n", + " predictions = model.predict(testX)\n", + " report = pd.DataFrame(metrics.classification_report(testY, predictions, output_dict=True)).transpose()\n", + " report = round(report, 3)\n", + " \n", + " # AUC score\n", + " auc = roc_auc_score(testY, model.predict_proba(testX)[:, 1])\n", + " # adding AUC to report\n", + " report['AUC'] = [auc, np.NaN, report['precision'].iloc[2], np.NaN, np.NaN]\n", + " report['AUC'] = round(report['AUC'], 3)\n", + " report['AUC'] = report['AUC'].fillna('-')\n", + " report = report[['precision', 'recall', 'f1-score', 'AUC', 'support']]\n", + " \n", + " # identify maj and min class\n", + " target_col = list(trainY.columns.values)[0]\n", + " values_sorted = trainY[target_col].value_counts()\n", + " \n", + " # confusion matrix plot\n", + " cf_matrix = confusion_matrix(testY, predictions, normalize='all')\n", + " group_names = ['True ' + values_sorted.index[0], 'False ' + values_sorted.index[0],\n", + " 'False ' + values_sorted.index[1], 'True ' + values_sorted.index[1]]\n", + " group_counts = [\"{0:0.0f}\".format(value) for value in cf_matrix.flatten()]\n", + " group_percentages = [\"{0:.2%}\".format(value) for value in cf_matrix.flatten()/np.sum(cf_matrix)]\n", + " labels = [f\"{v1}\\n{v2}\\n{v3}\" for v1, v2, v3 in zip(group_names,group_counts,group_percentages)]\n", + " labels = np.asarray(labels).reshape(2,2)\n", + " sns.heatmap(cf_matrix, annot=labels, fmt='', cmap='Blues')\n", + " return report" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "0851a9c5-d55f-45c6-990f-ffe120b5fffd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(max_iter=1000, random_state=51)" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train, y_train)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "f83967f3-012c-4c95-8fc1-192a841ef110", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# model evaluation\n", + "clf_report = clf_evaluation(X_train, y_train, X_test, y_test, classification)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "7f6548d2-7cfa-452b-bf75-87e38956cba6", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7730.9400.8480.7751023.000
Yes0.6280.2670.375-386.000
accuracy0.7560.7560.7560.7560.756
macro avg0.7000.6040.611-1409.000
weighted avg0.7330.7560.719-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.773 0.940 0.848 0.775 1023.000\n", + "Yes 0.628 0.267 0.375 - 386.000\n", + "accuracy 0.756 0.756 0.756 0.756 0.756\n", + "macro avg 0.700 0.604 0.611 - 1409.000\n", + "weighted avg 0.733 0.756 0.719 - 1409.000" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf7ed66d-4921-4ec1-ab4d-a5d32a98b8f7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6908448c-9de0-4088-b4f2-5eabdec86f28", + "metadata": {}, + "source": [ + "### 7. Handling data imbalance" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "9ed6b328-8740-4a39-98cd-e722fc881a0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 1483\n", + "dtype: int64" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "c9a7de94-9616-4f65-91cb-2b7d420a8ead", + "metadata": {}, + "outputs": [], + "source": [ + "# function to deal with class imbalances in binary classification\n", + "# inputs: dfs for training set x, y, sampling method identification string, targeted ratio for maj./min. class for up-/down-/mix-sampling\n", + "# outputs: balanced training set x, y \n", + "\n", + "def class_balancing(imb_X, imb_Y, method='down', ratio=1.5): \n", + " # values to navigate target variable\n", + " target_col = list(imb_Y.columns.values)[0]\n", + " values_sorted = imb_Y[target_col].value_counts()\n", + " train_imbalanced = pd.concat([imb_X, imb_Y], axis=1) \n", + " # SMOTE\n", + " if method == 'smo':\n", + " smote = SMOTE()\n", + " bal_X, bal_Y = smote.fit_resample(imb_X, imb_Y) \n", + " #TomekLinks\n", + " elif method == 'tl':\n", + " undersample = TomekLinks()\n", + " bal_X, bal_Y = undersample.fit_resample(imb_X, imb_Y)\n", + " else: \n", + " # Downsampling\n", + " if method == 'down':\n", + " sample_size = values_sorted[1]\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(round(sample_size*ratio))\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(sample_size)\n", + " # Upsampling \n", + " elif method == 'up':\n", + " sample_size = values_sorted[0]\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(sample_size)\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(round(sample_size/ratio), replace=True)\n", + " # Mix Up-/Downsampling\n", + " elif method == 'mix':\n", + " sample_size = values_sorted[1]\n", + " imbalance_factor = math.floor(values_sorted[0]/values_sorted[1])\n", + " sample_factor = math.floor(imbalance_factor/3)\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(round(sample_size*sample_factor*ratio))\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(round(sample_size*sample_factor), replace=True)\n", + " \n", + " train_sampled = pd.concat([maj_class, min_class]).sample(frac=1)\n", + " # creating dfs of balanced classes to return\n", + " bal_X = train_sampled.drop([target_col], axis=1)\n", + " bal_Y = pd.DataFrame(train_sampled[target_col])\n", + " return bal_X, bal_Y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2d1cb03-3e48-482f-b3a4-2f198e43f111", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "ea68cd2d-4f46-447c-8875-43603326ab6c", + "metadata": {}, + "source": [ + "**Model with downsampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "0d86b465-22c0-4cd3-a798-f4ed131482c9", + "metadata": {}, + "outputs": [], + "source": [ + "# downsampling\n", + "X_train_ds, y_train_ds = class_balancing(X_train, y_train, method='down')" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "32c90170-88ec-48f5-ad45-a52206941e03", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 2224\n", + "Yes 1483\n", + "dtype: int64" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_ds.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "dd8a012c-f5a3-4a83-928f-1dd2d8ac2ce9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_ds, y_train_ds)\n", + "\n", + "# model evaluation\n", + "clf_ds_report = clf_evaluation(X_train_ds, y_train_ds, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "2e00c057-ded0-4663-8b22-3633c8e28b19", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7890.8940.8380.7711023.000
Yes0.5660.3650.444-386.000
accuracy0.7490.7490.7490.7490.749
macro avg0.6780.6300.641-1409.000
weighted avg0.7280.7490.730-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.789 0.894 0.838 0.771 1023.000\n", + "Yes 0.566 0.365 0.444 - 386.000\n", + "accuracy 0.749 0.749 0.749 0.749 0.749\n", + "macro avg 0.678 0.630 0.641 - 1409.000\n", + "weighted avg 0.728 0.749 0.730 - 1409.000" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_ds_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff9f7d69-3cd8-407d-a497-f42108a868c8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "7dd13c26-da9a-4278-9cfd-801e22a7e60a", + "metadata": {}, + "source": [ + "**Model with upsampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "68f15888-fe21-4824-8b0c-605ca54aab54", + "metadata": {}, + "outputs": [], + "source": [ + "# upsampling\n", + "X_train_us, y_train_us = class_balancing(X_train, y_train, method='up')" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "b54bcb9a-ec24-4ae4-af0b-523b80310404", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 2767\n", + "dtype: int64" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_us.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "095e97d9-d667-4037-9b43-c82d391a2e3f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_us, y_train_us)\n", + "\n", + "# model evaluation\n", + "clf_us_report = clf_evaluation(X_train_us, y_train_us, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "a068ff76-7227-4579-bea2-bf449929a350", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7920.8830.8350.781023.000
Yes0.5540.3860.455-386.000
accuracy0.7470.7470.7470.7470.747
macro avg0.6730.6340.645-1409.000
weighted avg0.7270.7470.731-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.792 0.883 0.835 0.78 1023.000\n", + "Yes 0.554 0.386 0.455 - 386.000\n", + "accuracy 0.747 0.747 0.747 0.747 0.747\n", + "macro avg 0.673 0.634 0.645 - 1409.000\n", + "weighted avg 0.727 0.747 0.731 - 1409.000" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_us_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f0d2fb5-199a-4505-b229-4cc992873b27", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5baafcb8-7660-4e4c-98ab-ab86b5bf2130", + "metadata": {}, + "source": [ + "**Model with SMOTE sampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "24e574f5-8f44-4d53-bde8-4980f71b609f", + "metadata": {}, + "outputs": [], + "source": [ + "# SOMTE sampling\n", + "X_train_smo, y_train_smo = class_balancing(X_train, y_train, method='up')" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "2f183b7f-3431-418c-a167-e777533cfe27", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 2767\n", + "dtype: int64" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_smo.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "0f7ace01-a2b2-4634-bb8d-00dbd9836d45", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_smo, y_train_smo)\n", + "\n", + "# model evaluation\n", + "clf_smo_report = clf_evaluation(X_train_smo, y_train_smo, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "6c8892f0-e95b-4632-bc6e-9503622e503d", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7910.8910.8380.7821023.000
Yes0.5640.3760.451-386.000
accuracy0.7490.7490.7490.7490.749
macro avg0.6780.6330.644-1409.000
weighted avg0.7290.7490.732-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.791 0.891 0.838 0.782 1023.000\n", + "Yes 0.564 0.376 0.451 - 386.000\n", + "accuracy 0.749 0.749 0.749 0.749 0.749\n", + "macro avg 0.678 0.633 0.644 - 1409.000\n", + "weighted avg 0.729 0.749 0.732 - 1409.000" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_smo_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc6bc454-b671-4502-9fff-f19d4cfab9dc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python3Brew", + "language": "python", + "name": "python3brew" + }, + "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.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/7.06_Lab_Handling_data_imbalance.ipynb b/7.06_Lab_Handling_data_imbalance.ipynb new file mode 100644 index 0000000..a2e49b8 --- /dev/null +++ b/7.06_Lab_Handling_data_imbalance.ipynb @@ -0,0 +1,1344 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1c5dff02-eff9-4188-a11a-5c325f99a346", + "metadata": {}, + "source": [ + "# Lab | Handling Data Imbalance in Classification Models" + ] + }, + { + "cell_type": "markdown", + "id": "1ce60032-dfb6-43ea-a21d-17d39527dbdd", + "metadata": {}, + "source": [ + "### Scenario\n", + "\n", + "You are working as an analyst with this internet service provider. You are provided with this historical data about your company's customers and their churn trends. Your task is to build a machine learning model that will help the company identify customers that are more likely to default/churn and thus prevent losses from such customers.\n", + "\n", + "### Instructions\n", + "\n", + "In this lab, we will first take a look at the degree of imbalance in the data and correct it using the techniques we learned on the class." + ] + }, + { + "cell_type": "markdown", + "id": "f0212300-6d58-42b1-851d-047b3df5735b", + "metadata": {}, + "source": [ + "# Solutions\n", + "\n", + "### 1. Libary imports" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "e50167c9-7fb2-47bd-9c22-f7c8ab1c770f", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import math\n", + "import matplotlib as plt\n", + "import seaborn as sns\n", + "from sklearn.preprocessing import Normalizer, StandardScaler\n", + "from imblearn.over_sampling import SMOTE \n", + "from imblearn.under_sampling import TomekLinks\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn import metrics\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import roc_auc_score\n", + "from sklearn.metrics import confusion_matrix\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "pd.set_option('display.max_columns', None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131072f8-de93-4b44-98e9-1ac471566542", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5c934b9b-5d31-4b0c-80f7-950d1650d43f", + "metadata": {}, + "source": [ + "### 2. Data import" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "77e648c8-cfe7-4dff-b664-2aea1ee8c4c6", + "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", + "
genderSeniorCitizenPartnerDependentstenurePhoneServiceOnlineSecurityOnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractMonthlyChargesTotalChargesChurn
0Female0YesNo1NoNoYesNoNoNoNoMonth-to-month29.8529.85No
1Male0NoNo34YesYesNoYesNoNoNoOne year56.951889.5No
2Male0NoNo2YesYesYesNoNoNoNoMonth-to-month53.85108.15Yes
3Male0NoNo45NoYesNoYesYesNoNoOne year42.301840.75No
4Female0NoNo2YesNoNoNoNoNoNoMonth-to-month70.70151.65Yes
\n", + "
" + ], + "text/plain": [ + " gender SeniorCitizen Partner Dependents tenure PhoneService \\\n", + "0 Female 0 Yes No 1 No \n", + "1 Male 0 No No 34 Yes \n", + "2 Male 0 No No 2 Yes \n", + "3 Male 0 No No 45 No \n", + "4 Female 0 No No 2 Yes \n", + "\n", + " OnlineSecurity OnlineBackup DeviceProtection TechSupport StreamingTV \\\n", + "0 No Yes No No No \n", + "1 Yes No Yes No No \n", + "2 Yes Yes No No No \n", + "3 Yes No Yes Yes No \n", + "4 No No No No No \n", + "\n", + " StreamingMovies Contract MonthlyCharges TotalCharges Churn \n", + "0 No Month-to-month 29.85 29.85 No \n", + "1 No One year 56.95 1889.5 No \n", + "2 No Month-to-month 53.85 108.15 Yes \n", + "3 No One year 42.30 1840.75 No \n", + "4 No Month-to-month 70.70 151.65 Yes " + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData = pd.read_csv('files_for_lab/Customer-Churn.csv')\n", + "churnData.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542b8787-7487-46bb-b48b-b5d3a8c5a56c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "63cddfa7-5a91-4be7-b27f-47e9b3ff5e8f", + "metadata": {}, + "source": [ + "### 3. Data overview" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "ee7d0e8d-0f83-44e1-b606-ae0f20be2740", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7043, 16)" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "616f2826-2965-4786-b97b-845a23e06849", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 7043 entries, 0 to 7042\n", + "Data columns (total 16 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 gender 7043 non-null object \n", + " 1 SeniorCitizen 7043 non-null int64 \n", + " 2 Partner 7043 non-null object \n", + " 3 Dependents 7043 non-null object \n", + " 4 tenure 7043 non-null int64 \n", + " 5 PhoneService 7043 non-null object \n", + " 6 OnlineSecurity 7043 non-null object \n", + " 7 OnlineBackup 7043 non-null object \n", + " 8 DeviceProtection 7043 non-null object \n", + " 9 TechSupport 7043 non-null object \n", + " 10 StreamingTV 7043 non-null object \n", + " 11 StreamingMovies 7043 non-null object \n", + " 12 Contract 7043 non-null object \n", + " 13 MonthlyCharges 7043 non-null float64\n", + " 14 TotalCharges 7043 non-null object \n", + " 15 Churn 7043 non-null object \n", + "dtypes: float64(1), int64(2), object(13)\n", + "memory usage: 880.5+ KB\n" + ] + } + ], + "source": [ + "churnData.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "4e76a60f-a529-4317-ab7c-52c95fee17bb", + "metadata": {}, + "outputs": [], + "source": [ + "# convert 'TotalCharges' to numerical column\n", + "churnData['TotalCharges'] = pd.to_numeric(churnData['TotalCharges'], errors='coerce')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40eba303-3187-4566-92e3-340f69669a4d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "513718db-350f-4159-8b7d-49a44a1ef9a3", + "metadata": {}, + "source": [ + "### 4. Null values" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "a4b18c23-8d83-46ca-bb28-4b5dee2f8dc0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gender 0\n", + "SeniorCitizen 0\n", + "Partner 0\n", + "Dependents 0\n", + "tenure 0\n", + "PhoneService 0\n", + "OnlineSecurity 0\n", + "OnlineBackup 0\n", + "DeviceProtection 0\n", + "TechSupport 0\n", + "StreamingTV 0\n", + "StreamingMovies 0\n", + "Contract 0\n", + "MonthlyCharges 0\n", + "TotalCharges 11\n", + "Churn 0\n", + "dtype: int64" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "18892cf2-39a9-47eb-a487-7aade3b878d3", + "metadata": {}, + "outputs": [], + "source": [ + "churnData['TotalCharges'] = churnData['TotalCharges'].fillna(churnData['TotalCharges'].median())" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "f35107a1-d903-4f39-afdc-d75bb8e6e366", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gender 0\n", + "SeniorCitizen 0\n", + "Partner 0\n", + "Dependents 0\n", + "tenure 0\n", + "PhoneService 0\n", + "OnlineSecurity 0\n", + "OnlineBackup 0\n", + "DeviceProtection 0\n", + "TechSupport 0\n", + "StreamingTV 0\n", + "StreamingMovies 0\n", + "Contract 0\n", + "MonthlyCharges 0\n", + "TotalCharges 0\n", + "Churn 0\n", + "dtype: int64" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "churnData.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bb5c90a-b372-41ab-9915-8a6e5f32cae2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3f0bf1eb-095d-4618-adcd-388345ece01f", + "metadata": {}, + "source": [ + "### 5. Data preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "067758b7-47f7-44df-92b1-2ffe50bcf40a", + "metadata": {}, + "outputs": [], + "source": [ + "# feature selection / x-y-split\n", + "X = churnData[['tenure', 'SeniorCitizen', 'MonthlyCharges', 'TotalCharges']]\n", + "y = churnData['Churn']\n", + "\n", + "# train-test-split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=99)\n", + "\n", + "y_train = pd.DataFrame(y_train).reset_index()\n", + "y_test = pd.DataFrame(y_test).reset_index()\n", + "y_train = y_train.drop(['index'], axis=1)\n", + "y_test = y_test.drop(['index'], axis=1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "03d9fb0b-b8d5-4df1-abd3-96641969dca6", + "metadata": {}, + "outputs": [], + "source": [ + "# data scaling\n", + "normalizer = Normalizer().fit(X_train)\n", + "\n", + "X_train = normalizer.transform(X_train)\n", + "X_test = normalizer.transform(X_test)\n", + "\n", + "X_train = pd.DataFrame(X_train)\n", + "X_test = pd.DataFrame(X_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed452999-5309-48ae-ab7a-9062a5feb112", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "bb88436d-3243-4108-aec2-89caee370905", + "metadata": {}, + "source": [ + "### 6. Modeling" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "b6a23ce4-9a73-4e9b-a982-914c16f76921", + "metadata": {}, + "outputs": [], + "source": [ + "# evaluation function for binary classifications\n", + "# inputs: training and test data, model after fit\n", + "# outputs: report df\n", + "def clf_evaluation(trainX, trainY, testX, testY, model):\n", + " # predictions and report\n", + " predictions = model.predict(testX)\n", + " report = pd.DataFrame(metrics.classification_report(testY, predictions, output_dict=True)).transpose()\n", + " report = round(report, 3)\n", + " \n", + " # AUC score\n", + " auc = roc_auc_score(testY, model.predict_proba(testX)[:, 1])\n", + " # adding AUC to report\n", + " report['AUC'] = [auc, np.NaN, report['precision'].iloc[2], np.NaN, np.NaN]\n", + " report['AUC'] = round(report['AUC'], 3)\n", + " report['AUC'] = report['AUC'].fillna('-')\n", + " report = report[['precision', 'recall', 'f1-score', 'AUC', 'support']]\n", + " \n", + " # identify maj and min class\n", + " target_col = list(trainY.columns.values)[0]\n", + " values_sorted = trainY[target_col].value_counts()\n", + " \n", + " # confusion matrix plot\n", + " cf_matrix = confusion_matrix(testY, predictions, normalize='all')\n", + " group_names = ['True ' + values_sorted.index[0], 'False ' + values_sorted.index[0],\n", + " 'False ' + values_sorted.index[1], 'True ' + values_sorted.index[1]]\n", + " group_counts = [\"{0:0.0f}\".format(value) for value in cf_matrix.flatten()]\n", + " group_percentages = [\"{0:.2%}\".format(value) for value in cf_matrix.flatten()/np.sum(cf_matrix)]\n", + " labels = [f\"{v1}\\n{v2}\\n{v3}\" for v1, v2, v3 in zip(group_names,group_counts,group_percentages)]\n", + " labels = np.asarray(labels).reshape(2,2)\n", + " sns.heatmap(cf_matrix, annot=labels, fmt='', cmap='Blues')\n", + " return report" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "0851a9c5-d55f-45c6-990f-ffe120b5fffd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(max_iter=1000, random_state=51)" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train, y_train)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "f83967f3-012c-4c95-8fc1-192a841ef110", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# model evaluation\n", + "clf_report = clf_evaluation(X_train, y_train, X_test, y_test, classification)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "7f6548d2-7cfa-452b-bf75-87e38956cba6", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7730.9400.8480.7751023.000
Yes0.6280.2670.375-386.000
accuracy0.7560.7560.7560.7560.756
macro avg0.7000.6040.611-1409.000
weighted avg0.7330.7560.719-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.773 0.940 0.848 0.775 1023.000\n", + "Yes 0.628 0.267 0.375 - 386.000\n", + "accuracy 0.756 0.756 0.756 0.756 0.756\n", + "macro avg 0.700 0.604 0.611 - 1409.000\n", + "weighted avg 0.733 0.756 0.719 - 1409.000" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf7ed66d-4921-4ec1-ab4d-a5d32a98b8f7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6908448c-9de0-4088-b4f2-5eabdec86f28", + "metadata": {}, + "source": [ + "### 7. Handling data imbalance" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "9ed6b328-8740-4a39-98cd-e722fc881a0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 1483\n", + "dtype: int64" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "c9a7de94-9616-4f65-91cb-2b7d420a8ead", + "metadata": {}, + "outputs": [], + "source": [ + "# function to deal with class imbalances in binary classification\n", + "# inputs: dfs for training set x, y, sampling method identification string, targeted ratio for maj./min. class for up-/down-/mix-sampling\n", + "# outputs: balanced training set x, y \n", + "\n", + "def class_balancing(imb_X, imb_Y, method='down', ratio=1.5): \n", + " # values to navigate target variable\n", + " target_col = list(imb_Y.columns.values)[0]\n", + " values_sorted = imb_Y[target_col].value_counts()\n", + " train_imbalanced = pd.concat([imb_X, imb_Y], axis=1) \n", + " # SMOTE\n", + " if method == 'smo':\n", + " smote = SMOTE()\n", + " bal_X, bal_Y = smote.fit_resample(imb_X, imb_Y) \n", + " #TomekLinks\n", + " elif method == 'tl':\n", + " undersample = TomekLinks()\n", + " bal_X, bal_Y = undersample.fit_resample(imb_X, imb_Y)\n", + " else: \n", + " # Downsampling\n", + " if method == 'down':\n", + " sample_size = values_sorted[1]\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(round(sample_size*ratio))\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(sample_size)\n", + " # Upsampling \n", + " elif method == 'up':\n", + " sample_size = values_sorted[0]\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(sample_size)\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(round(sample_size/ratio), replace=True)\n", + " # Mix Up-/Downsampling\n", + " elif method == 'mix':\n", + " sample_size = values_sorted[1]\n", + " imbalance_factor = math.floor(values_sorted[0]/values_sorted[1])\n", + " sample_factor = math.floor(imbalance_factor/3)\n", + " maj_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[0]].sample(round(sample_size*sample_factor*ratio))\n", + " min_class = train_imbalanced[train_imbalanced[target_col] == values_sorted.index[1]].sample(round(sample_size*sample_factor), replace=True)\n", + " \n", + " train_sampled = pd.concat([maj_class, min_class]).sample(frac=1)\n", + " # creating dfs of balanced classes to return\n", + " bal_X = train_sampled.drop([target_col], axis=1)\n", + " bal_Y = pd.DataFrame(train_sampled[target_col])\n", + " return bal_X, bal_Y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2d1cb03-3e48-482f-b3a4-2f198e43f111", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "ea68cd2d-4f46-447c-8875-43603326ab6c", + "metadata": {}, + "source": [ + "**Model with downsampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "0d86b465-22c0-4cd3-a798-f4ed131482c9", + "metadata": {}, + "outputs": [], + "source": [ + "# downsampling\n", + "X_train_ds, y_train_ds = class_balancing(X_train, y_train, method='down')" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "32c90170-88ec-48f5-ad45-a52206941e03", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 2224\n", + "Yes 1483\n", + "dtype: int64" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_ds.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "dd8a012c-f5a3-4a83-928f-1dd2d8ac2ce9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_ds, y_train_ds)\n", + "\n", + "# model evaluation\n", + "clf_ds_report = clf_evaluation(X_train_ds, y_train_ds, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "2e00c057-ded0-4663-8b22-3633c8e28b19", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7890.8940.8380.7711023.000
Yes0.5660.3650.444-386.000
accuracy0.7490.7490.7490.7490.749
macro avg0.6780.6300.641-1409.000
weighted avg0.7280.7490.730-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.789 0.894 0.838 0.771 1023.000\n", + "Yes 0.566 0.365 0.444 - 386.000\n", + "accuracy 0.749 0.749 0.749 0.749 0.749\n", + "macro avg 0.678 0.630 0.641 - 1409.000\n", + "weighted avg 0.728 0.749 0.730 - 1409.000" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_ds_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff9f7d69-3cd8-407d-a497-f42108a868c8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "7dd13c26-da9a-4278-9cfd-801e22a7e60a", + "metadata": {}, + "source": [ + "**Model with upsampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "68f15888-fe21-4824-8b0c-605ca54aab54", + "metadata": {}, + "outputs": [], + "source": [ + "# upsampling\n", + "X_train_us, y_train_us = class_balancing(X_train, y_train, method='up')" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "b54bcb9a-ec24-4ae4-af0b-523b80310404", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 2767\n", + "dtype: int64" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_us.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "095e97d9-d667-4037-9b43-c82d391a2e3f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_us, y_train_us)\n", + "\n", + "# model evaluation\n", + "clf_us_report = clf_evaluation(X_train_us, y_train_us, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "a068ff76-7227-4579-bea2-bf449929a350", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7920.8830.8350.781023.000
Yes0.5540.3860.455-386.000
accuracy0.7470.7470.7470.7470.747
macro avg0.6730.6340.645-1409.000
weighted avg0.7270.7470.731-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.792 0.883 0.835 0.78 1023.000\n", + "Yes 0.554 0.386 0.455 - 386.000\n", + "accuracy 0.747 0.747 0.747 0.747 0.747\n", + "macro avg 0.673 0.634 0.645 - 1409.000\n", + "weighted avg 0.727 0.747 0.731 - 1409.000" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_us_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f0d2fb5-199a-4505-b229-4cc992873b27", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5baafcb8-7660-4e4c-98ab-ab86b5bf2130", + "metadata": {}, + "source": [ + "**Model with SMOTE sampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "24e574f5-8f44-4d53-bde8-4980f71b609f", + "metadata": {}, + "outputs": [], + "source": [ + "# SOMTE sampling\n", + "X_train_smo, y_train_smo = class_balancing(X_train, y_train, method='up')" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "2f183b7f-3431-418c-a167-e777533cfe27", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Churn\n", + "No 4151\n", + "Yes 2767\n", + "dtype: int64" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train_smo.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "0f7ace01-a2b2-4634-bb8d-00dbd9836d45", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Building model\n", + "classification = LogisticRegression(random_state=51, max_iter=1000) \n", + "classification.fit(X_train_smo, y_train_smo)\n", + "\n", + "# model evaluation\n", + "clf_smo_report = clf_evaluation(X_train_smo, y_train_smo, X_test, y_test, classification)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "6c8892f0-e95b-4632-bc6e-9503622e503d", + "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", + "
precisionrecallf1-scoreAUCsupport
No0.7910.8910.8380.7821023.000
Yes0.5640.3760.451-386.000
accuracy0.7490.7490.7490.7490.749
macro avg0.6780.6330.644-1409.000
weighted avg0.7290.7490.732-1409.000
\n", + "
" + ], + "text/plain": [ + " precision recall f1-score AUC support\n", + "No 0.791 0.891 0.838 0.782 1023.000\n", + "Yes 0.564 0.376 0.451 - 386.000\n", + "accuracy 0.749 0.749 0.749 0.749 0.749\n", + "macro avg 0.678 0.633 0.644 - 1409.000\n", + "weighted avg 0.729 0.749 0.732 - 1409.000" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clf_smo_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc6bc454-b671-4502-9fff-f19d4cfab9dc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python3Brew", + "language": "python", + "name": "python3brew" + }, + "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.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}