{ "cells": [ { "cell_type": "markdown", "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "a6a69339-37e8-4cb6-863a-858e6df8872f", "showTitle": false, "title": "" }, "id": "o5Iixw4vHWG9" }, "source": [ "# Problem Statement" ] }, { "cell_type": "markdown", "metadata": { "id": "daBFxPKyAhrl" }, "source": [ "## Business Context" ] }, { "cell_type": "markdown", "metadata": { "id": "ucRv3UZ6zed-" }, "source": [ "In the competitive landscape of retail banking, customer retention is critical for ensuring sustainable growth and profitability. A prominent retail banking institution in Europe provides a range of financial products, including credit cards, loans, and savings accounts, and has been rapidly expanding its customer base across multiple countries. However, with a growing customer base, it faces an increasingly pressing challenge: customer churn. A significant number of customers are closing their accounts and switching to competitors. This decline in customer retention is impacting revenue and long-term customer relationships\n", "\n", "Understanding the reasons behind customer attrition (or churn) is essential for the bank to devise effective retention strategies to minimize churn and enhance customer loyalty and satisfaction. The Customer Analytics & Retention Department has been diligently collecting and analyzing historical customer data. Despite the valuable insights provided by historical data, the department grapples with several challenges:\n", "\n", "1. **Complex Customer Behavior**: The diverse nature of the bank's offerings and the varying customer preferences across different countries complicate the identification of factors that lead to churn.\n", "2. **Proactive Retention**: The current processes for identifying at-risk customers are reactive rather than proactive, leading to missed opportunities for timely interventions that could prevent churn." ] }, { "cell_type": "markdown", "metadata": { "id": "o7nc6WZUvX3Z" }, "source": [ "## Objective" ] }, { "cell_type": "markdown", "metadata": { "id": "GllLo7aI02Ep" }, "source": [ "The Customer Analytics & Retention Department has successfully developed a machine learning model that identifies patterns indicative of churn risk and predicts the likelihood of customer churn. They recognize the potential of this model to significantly contribute to reducing churn rates by identifying at-risk customers before they decide to leave.\n", "\n", "However, to harness the value of this model, the team seeks to deploy it as a web application to allow for broader use across departments, enabling customer service representatives, marketing teams, and management to access churn predictions in real time. The primary objective is to create an intuitive web app with the ML model under the hood to identify customers at risk of churn. The successful deployment of this web application will facilitate timely interventions, improve customer retention strategies, and ultimately work towards enhancing customer satisfaction and loyalty." ] }, { "cell_type": "markdown", "metadata": { "id": "fgwYhsXzvbnH" }, "source": [ "## Data Dictionary" ] }, { "cell_type": "markdown", "metadata": { "id": "vf5bB5IsveCg" }, "source": [ "- **CustomerId**: Unique identifier for each customer. \n", "- **Surname**: Customer's last name. \n", "- **CreditScore**: Customer's credit score. \n", "- **Geography**: Country where the customer resides. \n", "- **Age**: Customer's age in years. \n", "- **Tenure**: Number of years the customer has been with the bank. \n", "- **Balance**: Customer’s account balance. \n", "- **NumOfProducts**: Number of products the customer has with the bank. \n", "- **HasCrCard**: Indicates if the customer has a credit card (1 = Yes, 0 = No). \n", "- **IsActiveMember**: Indicates if the customer is an active member (1 = Yes, 0 = No). \n", "- **EstimatedSalary**: Customer’s estimated salary. \n", "- **Exited**: Indicates whether the customer churned (1 = Yes, 0 = No). " ] }, { "cell_type": "markdown", "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "f3a9806a-355a-41fe-9b2a-0bda43aedd4e", "showTitle": false, "title": "" }, "id": "niLZjnkCHWG_" }, "source": [ "# Installing and Importing Necessary Libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: Skipping pandas as it is not installed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Collecting pandas==2.2.2\n", " Downloading pandas-2.2.2.tar.gz (4.4 MB)\n", " ---------------------------------------- 0.0/4.4 MB ? eta -:--:--\n", " ------- -------------------------------- 0.8/4.4 MB 4.4 MB/s eta 0:00:01\n", " ---------------- ----------------------- 1.8/4.4 MB 4.8 MB/s eta 0:00:01\n", " -------------------------- ------------- 2.9/4.4 MB 4.7 MB/s eta 0:00:01\n", " ----------------------------------- ---- 3.9/4.4 MB 4.8 MB/s eta 0:00:01\n", " ---------------------------------------- 4.4/4.4 MB 4.9 MB/s eta 0:00:00\n", " Installing build dependencies: started\n", " Installing build dependencies: finished with status 'done'\n", " Getting requirements to build wheel: started\n", " Getting requirements to build wheel: finished with status 'done'\n", " Installing backend dependencies: started\n", " Installing backend dependencies: finished with status 'done'\n", " Preparing metadata (pyproject.toml): started\n", " Preparing metadata (pyproject.toml): still running...\n", " Preparing metadata (pyproject.toml): still running...\n", " Preparing metadata (pyproject.toml): still running...\n", " Preparing metadata (pyproject.toml): still running...\n", " Preparing metadata (pyproject.toml): still running...\n", " Preparing metadata (pyproject.toml): finished with status 'done'\n", "Collecting numpy>=1.26.0 (from pandas==2.2.2)\n", " Downloading numpy-2.3.0-cp313-cp313-win_amd64.whl.metadata (60 kB)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\adity\\miniconda3\\envs\\md\\lib\\site-packages (from pandas==2.2.2) (2.9.0.post0)\n", "Collecting pytz>=2020.1 (from pandas==2.2.2)\n", " Downloading pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)\n", "Collecting tzdata>=2022.7 (from pandas==2.2.2)\n", " Downloading tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB)\n", "Requirement already satisfied: six>=1.5 in c:\\users\\adity\\miniconda3\\envs\\md\\lib\\site-packages (from python-dateutil>=2.8.2->pandas==2.2.2) (1.17.0)\n", "Downloading numpy-2.3.0-cp313-cp313-win_amd64.whl (12.7 MB)\n", " ---------------------------------------- 0.0/12.7 MB ? eta -:--:--\n", " - -------------------------------------- 0.5/12.7 MB 3.6 MB/s eta 0:00:04\n", " ---- ----------------------------------- 1.6/12.7 MB 4.3 MB/s eta 0:00:03\n", " --------- ------------------------------ 2.9/12.7 MB 4.9 MB/s eta 0:00:03\n", " ------------- -------------------------- 4.2/12.7 MB 5.3 MB/s eta 0:00:02\n", " ------------------ --------------------- 5.8/12.7 MB 5.7 MB/s eta 0:00:02\n", " ----------------------- ---------------- 7.6/12.7 MB 6.1 MB/s eta 0:00:01\n", " ----------------------------- ---------- 9.4/12.7 MB 6.5 MB/s eta 0:00:01\n", " ------------------------------------ --- 11.5/12.7 MB 7.0 MB/s eta 0:00:01\n", " ---------------------------------------- 12.7/12.7 MB 7.0 MB/s eta 0:00:00\n", "Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB)\n", "Downloading tzdata-2025.2-py2.py3-none-any.whl (347 kB)\n", "Building wheels for collected packages: pandas\n", " Building wheel for pandas (pyproject.toml): started\n", " Building wheel for pandas (pyproject.toml): finished with status 'done'\n", " Created wheel for pandas: filename=pandas-2.2.2-cp313-cp313-win_amd64.whl size=39042675 sha256=d76901219749142dcbe4f1008b018c888c21ecc93502b56688b43199ada5790c\n", " Stored in directory: C:\\Users\\adity\\AppData\\Local\\Temp\\pip-ephem-wheel-cache-abhz96hy\\wheels\\d3\\d5\\d9\\b9df883b9242aa4091bb9baf55fceac592c4175236b44d0515\n", "Successfully built pandas\n", "Installing collected packages: pytz, tzdata, numpy, pandas\n", "\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------------------------------------- 0/4 [pytz]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " ---------- ----------------------------- 1/4 [tzdata]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " -------------------- ------------------- 2/4 [numpy]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ------------------------------ --------- 3/4 [pandas]\n", " ---------------------------------------- 4/4 [pandas]\n", "\n", "Successfully installed numpy-2.3.0 pandas-2.2.2 pytz-2025.2 tzdata-2025.2\n" ] } ], "source": [ "!pip uninstall -y pandas\n", "!pip install --no-cache-dir pandas==2.2.2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "9JZt3Or8v2dQ" }, "outputs": [], "source": [ "!pip install scikit-learn==1.6.1 xgboost==2.1.4 joblib==1.4.2 streamlit==1.43.2 huggingface_hub==0.29.3 -q" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "69c6950d-190a-4c7d-a5a2-a42164f4833b", "showTitle": false, "title": "" }, "id": "SEBLSdL-HWHA" }, "outputs": [], "source": [ "# for data manipulation\n", "import pandas as pd\n", "\n", "import sklearn\n", "\n", "# for data preprocessing and pipeline creation\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", "from sklearn.compose import make_column_transformer\n", "from sklearn.pipeline import make_pipeline\n", "\n", "# for model training, tuning, and evaluation\n", "import xgboost as xgb\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.metrics import accuracy_score, classification_report, recall_score\n", "\n", "# for model serialization\n", "import joblib\n", "\n", "# for creating a folder\n", "import os\n", "\n", "# for hugging face space authentication to upload files\n", "from huggingface_hub import login, HfApi" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "d006e342-db1e-42d7-95e1-7cfed889cb59", "showTitle": false, "title": "" }, "id": "kzG9kVi4HWHB" }, "outputs": [], "source": [ "# Set scikit-learn's display mode to 'diagram' for better visualization of pipelines and estimators\n", "sklearn.set_config(display='diagram')" ] }, { "cell_type": "markdown", "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "28fdb1c5-213d-4bfc-bf78-c14c60f0f365", "showTitle": false, "title": "" }, "id": "bQrbzi5RHWHC" }, "source": [ "# Data Loading and Overview" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "de73d795-30fe-4891-8a22-2356863aaef3", "showTitle": false, "title": "" }, "id": "h5ZOCZjlHWHC" }, "outputs": [], "source": [ "# Load the dataset from a CSV file into a Pandas DataFrame\n", "bank_churn = pd.read_csv(\"C:\\\\Users\\\\adity\\\\OneDrive\\\\Desktop\\\\GL\\\\Model_deployment\\\\bank_customer_churn.csv\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "auPAKY7ZaMKp" }, "outputs": [], "source": [ "# Create a copy of the dataframe\n", "dataset = bank_churn.copy()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "id": "QrJ4xetpUwlI", "outputId": "2fac47f9-7fe1-4894-8c94-16324a06d90f" }, "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", "
CustomerIdSurnameCreditScoreGeographyAgeTenureBalanceNumOfProductsHasCrCardIsActiveMemberEstimatedSalaryExited
015634602Hargrave619France42.020.0011.01.0101348.881
115647311Hill608Spain41.0183807.8610.01.0112542.580
215619304Onio502France42.08159660.8031.00.0113931.571
315701354Boni699France39.010.0020.00.093826.630
415737888Mitchell850Spain43.02125510.821NaN1.079084.100
\n", "
" ], "text/plain": [ " CustomerId Surname CreditScore Geography Age Tenure Balance \\\n", "0 15634602 Hargrave 619 France 42.0 2 0.00 \n", "1 15647311 Hill 608 Spain 41.0 1 83807.86 \n", "2 15619304 Onio 502 France 42.0 8 159660.80 \n", "3 15701354 Boni 699 France 39.0 1 0.00 \n", "4 15737888 Mitchell 850 Spain 43.0 2 125510.82 \n", "\n", " NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited \n", "0 1 1.0 1.0 101348.88 1 \n", "1 1 0.0 1.0 112542.58 0 \n", "2 3 1.0 0.0 113931.57 1 \n", "3 2 0.0 0.0 93826.63 0 \n", "4 1 NaN 1.0 79084.10 0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the first five rows of the dataset\n", "dataset.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Nz87EbMeUr1F", "outputId": "832d3352-6aa6-4f89-8be0-37cae2159761" }, "outputs": [ { "data": { "text/plain": [ "(10002, 12)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the number of rows and columns in the dataset\n", "dataset.shape" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ICRnFc0EUuFi", "outputId": "5c03468e-9b8d-4aaa-b96e-761585e0d6e1" }, "outputs": [ { "data": { "text/plain": [ "Index(['CustomerId', 'Surname', 'CreditScore', 'Geography', 'Age', 'Tenure',\n", " 'Balance', 'NumOfProducts', 'HasCrCard', 'IsActiveMember',\n", " 'EstimatedSalary', 'Exited'],\n", " dtype='object')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the column names of the dataset\n", "dataset.columns" ] }, { "cell_type": "markdown", "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "c1f6d4b1-8956-4c8c-99c6-f616b6ffbbb7", "showTitle": false, "title": "" }, "id": "iT25LmvoHWHD" }, "source": [ "# EDA" ] }, { "cell_type": "markdown", "metadata": { "id": "1jOAC1TGpXOe" }, "source": [ "Let's start by defining the target and predictor (numerical and categorical) variables.\n", "\n", "- We'll not consider the `CustomerId` and `Surname` attributed as they don't add value to the analysis and consequent modeling.\n", "\n", "- Although the `HasCrCard` and `IsActiveMember` attributes are categorical (binary), we'll consider them as numerical as they're already encoded." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "20762caf-3731-4797-9fd2-8400061aae8a", "showTitle": false, "title": "" }, "id": "Y_tEmVPFHWHD" }, "outputs": [], "source": [ "# Define the target variable for the classification task\n", "target = 'Exited'\n", "\n", "# List of numerical features in the dataset\n", "numeric_features = [\n", " 'CreditScore', # Customer's credit score\n", " 'Age', # Customer's age\n", " 'Tenure', # Number of years the customer has been with the bank\n", " 'Balance', # Customer’s account balance\n", " 'NumOfProducts', # Number of products the customer has with the bank\n", " 'HasCrCard', # Whether the customer has a credit card (binary: 0 or 1)\n", " 'IsActiveMember', # Whether the customer is an active member (binary: 0 or 1)\n", " 'EstimatedSalary' # Customer’s estimated salary\n", "]\n", "\n", "# List of categorical features in the dataset\n", "categorical_features = [\n", " 'Geography', # Country where the customer resides\n", "]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "13f93578-a8e7-4cd1-b599-af01cde98947", "showTitle": false, "title": "" }, "colab": { "base_uri": "https://localhost:8080/", "height": 320 }, "id": "pRTCdlYTHWHD", "outputId": "8f8dd5bf-0027-4929-a249-85ddda622217" }, "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", "
CreditScoreAgeTenureBalanceNumOfProductsHasCrCardIsActiveMemberEstimatedSalary
count10002.00000010001.00000010002.00000010002.00000010002.00000010001.00000010001.00000010002.000000
mean650.55508938.9223115.01249876491.1128751.5301940.7055290.514949100083.331145
std96.66161510.4872002.89197362393.4741440.5816390.4558270.49980157508.117802
min350.00000018.0000000.0000000.0000001.0000000.0000000.00000011.580000
25%584.00000032.0000003.0000000.0000001.0000000.0000000.00000050983.750000
50%652.00000037.0000005.00000097198.5400001.0000001.0000001.000000100185.240000
75%718.00000044.0000007.000000127647.8400002.0000001.0000001.000000149383.652500
max850.00000092.00000010.000000250898.0900004.0000001.0000001.000000199992.480000
\n", "
" ], "text/plain": [ " CreditScore Age Tenure Balance NumOfProducts \\\n", "count 10002.000000 10001.000000 10002.000000 10002.000000 10002.000000 \n", "mean 650.555089 38.922311 5.012498 76491.112875 1.530194 \n", "std 96.661615 10.487200 2.891973 62393.474144 0.581639 \n", "min 350.000000 18.000000 0.000000 0.000000 1.000000 \n", "25% 584.000000 32.000000 3.000000 0.000000 1.000000 \n", "50% 652.000000 37.000000 5.000000 97198.540000 1.000000 \n", "75% 718.000000 44.000000 7.000000 127647.840000 2.000000 \n", "max 850.000000 92.000000 10.000000 250898.090000 4.000000 \n", "\n", " HasCrCard IsActiveMember EstimatedSalary \n", "count 10001.000000 10001.000000 10002.000000 \n", "mean 0.705529 0.514949 100083.331145 \n", "std 0.455827 0.499801 57508.117802 \n", "min 0.000000 0.000000 11.580000 \n", "25% 0.000000 0.000000 50983.750000 \n", "50% 1.000000 1.000000 100185.240000 \n", "75% 1.000000 1.000000 149383.652500 \n", "max 1.000000 1.000000 199992.480000 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Generate summary statistics for numerical features\n", "dataset[numeric_features].describe()" ] }, { "cell_type": "markdown", "metadata": { "id": "tev5Z92d1PIr" }, "source": [ "1. **Balance Distribution:**\n", " - The mean balance is **~76,491**, but the **25th percentile is 0**, indicating that **at least 25% of customers have a balance of zero**.\n", " - Possible explanations:\n", " - Customers may use the account primarily for transactions, withdrawing funds immediately after deposits.\n", " - Some customers might have secondary accounts with zero balance.\n", " - Certain customers may have no savings account but only hold credit cards.\n", "\n", "2. **Age and Credit Score:**\n", " - The average age is **~39 years**, with a max of **92 years**.\n", " - The credit score ranges from **350 to 850**, with an average of **650**.\n", "\n", "3. **Products and Activity:**\n", " - Most customers have **1 or 2 products** (median = 1).\n", " - Around **70% have a credit card**, and **51% are active members**.\n", "\n", "4. **Churn Rate:**\n", " - The **Exited (churn) rate is ~20%**, meaning **1 in 5 customers leave** the bank.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "888a838c-f16c-408c-bcd6-5aa0f13d943c", "showTitle": false, "title": "" }, "colab": { "base_uri": "https://localhost:8080/", "height": 175 }, "id": "phM5W-m2HWHE", "outputId": "391deb19-8407-4b35-8a84-15d2db51d503" }, "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", "
Geography
count10001
unique3
topFrance
freq5014
\n", "
" ], "text/plain": [ " Geography\n", "count 10001\n", "unique 3\n", "top France\n", "freq 5014" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset[categorical_features].describe()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 178 }, "id": "dVRml2osH8Av", "outputId": "2c32a91a-a176-4e30-f75d-f14fcc187878" }, "outputs": [ { "data": { "text/plain": [ "Exited\n", "0 0.796241\n", "1 0.203759\n", "Name: proportion, dtype: float64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Compute the proportion of each class in the target variable\n", "dataset[target].value_counts(normalize=True)" ] }, { "cell_type": "markdown", "metadata": { "id": "Fci59YnNfMF1" }, "source": [ "Dataset contains **10002** total records with the following distribution: \n", "\n", "- **79.6% customers did not churn (No)** \n", "- **20.3% customers churned (Yes)** \n", "\n", "This means the dataset is **imbalanced**" ] }, { "cell_type": "markdown", "metadata": { "id": "B8ebrkKpyfA1" }, "source": [ "### Why does this matter?" ] }, { "cell_type": "markdown", "metadata": { "id": "CcYeiwMYyhYQ" }, "source": [ "- A model trained on this data **may be biased towards predicting \"No\" (non-churn)** because it is the majority class. \n", "- Standard classification models might achieve **high accuracy but low recall for churners**, meaning they fail to detect many actual churn cases." ] }, { "cell_type": "markdown", "metadata": { "id": "azzNAL-HyjFp" }, "source": [ "### What can be done?" ] }, { "cell_type": "markdown", "metadata": { "id": "bIx_6kh4ykvA" }, "source": [ "1. **Resampling techniques**: \n", " - **Oversampling (SMOTE)**: Generate synthetic churn cases to balance the dataset. \n", " - **Undersampling**: Remove some \"No\" cases to balance the dataset. \n", "\n", "2. **Adjust `scale_pos_weight` in XGBoost**: \n", " - Set `scale_pos_weight = 5174 / 1869 ≈ 2.77` to give more importance to the minority class (churn). \n", "\n", "3. **Optimize for recall instead of accuracy**: \n", " - Since churn prediction is a critical business problem, a high recall ensures fewer actual churners are missed." ] }, { "cell_type": "markdown", "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": {}, "inputWidgets": {}, "nuid": "550dfffd-2a1f-44c5-8d31-23a452896bef", "showTitle": false, "title": "" }, "id": "Cl7T7_jFHWHE" }, "source": [ "# Model Training with Hyperparameter Tuning" ] }, { "cell_type": "markdown", "metadata": { "id": "4pbczYKIyQke" }, "source": [ "## Data Preprocessing" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "0c99d9b0-4771-487b-86fd-9d452118b7ab", "showTitle": false, "title": "" }, "id": "YKuRNqVuHWHE" }, "outputs": [], "source": [ "# Define predictor matrix (X) using selected numeric and categorical features\n", "X = dataset[numeric_features + categorical_features]\n", "\n", "# Define target variable\n", "y = dataset[target]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "1e90b308-b374-4f65-81b8-598a0bab1d1d", "showTitle": false, "title": "" }, "id": "tbgt_5ZCHWHF" }, "outputs": [], "source": [ "# Split the dataset into training and test sets\n", "Xtrain, Xtest, ytrain, ytest = train_test_split(\n", " X, y, # Predictors (X) and target variable (y)\n", " test_size=0.2, # 20% of the data is reserved for testing\n", " random_state=42 # Ensures reproducibility by setting a fixed random seed\n", ")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "bffcbcac-0047-4332-b206-9fadb5c78956", "showTitle": false, "title": "" }, "id": "GYnMo95hHWHF" }, "outputs": [], "source": [ "# Create a preprocessing pipeline for numerical and categorical features\n", "preprocessor = make_column_transformer(\n", " (StandardScaler(), numeric_features), # Scale numeric features to have mean equal to 0 and standard deviation equal to 1 (x - mue/sigma)\n", " (OneHotEncoder(handle_unknown='ignore'), categorical_features) # Encode categorical features as one-hot vectors\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "5mttQVhtfgnl" }, "source": [ "- The **`make_column_transformer`** step creates a preprocessing pipeline for your dataset by applying different transformations to numeric and categorical features." ] }, { "cell_type": "markdown", "metadata": { "id": "iUKvlYZBcToC" }, "source": [ "### **Breakdown:**" ] }, { "cell_type": "markdown", "metadata": { "id": "83LsA7cEcVb3" }, "source": [ "1. **`StandardScaler()` for numeric features** \n", " - Scales numerical columns (`tenure`, `MonthlyCharges`, `TotalCharges`, `SeniorCitizen`) to have **zero mean and unit variance**. \n", " - This helps ML models handle features with different scales effectively.\n", "\n", "2. **`OneHotEncoder()` for categorical features** \n", " - Converts categorical columns (`Contract`, `PaperlessBilling`, `PaymentMethod`, etc.) into **one-hot encoded vectors**. " ] }, { "cell_type": "markdown", "metadata": { "id": "gxYjsmiQcXFz" }, "source": [ "### **Why is this important?**" ] }, { "cell_type": "markdown", "metadata": { "id": "D2lsN3ZmcYJJ" }, "source": [ "- **Ensures proper feature scaling** (for better model performance). \n", "- **Encodes categorical variables** into a machine-readable format. \n", "- **Prepares data for ML models** that require numerical inputs." ] }, { "cell_type": "markdown", "metadata": { "id": "FB4FWU8ScbTG" }, "source": [ "## Creating Model Pipeline" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "76a64681-e124-4eef-ada8-75a8511dc783", "showTitle": false, "title": "" }, "id": "D83BGGp3HWHF" }, "outputs": [], "source": [ "# Initialize an XGBoost classifier\n", "model_xgb = xgb.XGBClassifier(random_state=42)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "7e566699-0812-46e2-a48b-cf8a4f83c7b6", "showTitle": false, "title": "" }, "id": "3HkzYXsPHWHF" }, "outputs": [], "source": [ "# Create a machine learning pipeline with preprocessing and model training steps\n", "model_pipeline = make_pipeline(\n", " preprocessor, # Preprocesses numerical and categorical features\n", " model_xgb # XGBoost classifier for model training\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "9ooL7JNHf8w4" }, "source": [ "This creates a pipeline that\n", "\n", "- **first preprocesses the data** (scaling numeric features and encoding categorical ones), and\n", "- **then trains** the XGBoost **model**.\n", "\n", "It ensures that **all transformations are applied automatically before feeding the data into the model**." ] }, { "cell_type": "markdown", "metadata": { "id": "XkZ442UA1M8I" }, "source": [ "## Model Training" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "245034db-84c4-406f-b808-dde8860b9084", "showTitle": false, "title": "" }, "colab": { "base_uri": "https://localhost:8080/", "height": 249 }, "id": "E_ZmCrDnHWHG", "outputId": "ddd96ada-94f2-4eb4-c51c-1dd2d7a31fac" }, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('columntransformer',\n",
       "                 ColumnTransformer(transformers=[('standardscaler',\n",
       "                                                  StandardScaler(),\n",
       "                                                  ['CreditScore', 'Age',\n",
       "                                                   'Tenure', 'Balance',\n",
       "                                                   'NumOfProducts', 'HasCrCard',\n",
       "                                                   'IsActiveMember',\n",
       "                                                   'EstimatedSalary']),\n",
       "                                                 ('onehotencoder',\n",
       "                                                  OneHotEncoder(handle_unknown='ignore'),\n",
       "                                                  ['Geography'])])),\n",
       "                ('xgbclassifier',\n",
       "                 XGBClassifier(base_score=None, booster=None, callbac...\n",
       "                               feature_types=None, gamma=None, grow_policy=None,\n",
       "                               importance_type=None,\n",
       "                               interaction_constraints=None, learning_rate=None,\n",
       "                               max_bin=None, max_cat_threshold=None,\n",
       "                               max_cat_to_onehot=None, max_delta_step=None,\n",
       "                               max_depth=None, max_leaves=None,\n",
       "                               min_child_weight=None, missing=nan,\n",
       "                               monotone_constraints=None, multi_strategy=None,\n",
       "                               n_estimators=None, n_jobs=None,\n",
       "                               num_parallel_tree=None, random_state=42, ...))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('columntransformer',\n", " ColumnTransformer(transformers=[('standardscaler',\n", " StandardScaler(),\n", " ['CreditScore', 'Age',\n", " 'Tenure', 'Balance',\n", " 'NumOfProducts', 'HasCrCard',\n", " 'IsActiveMember',\n", " 'EstimatedSalary']),\n", " ('onehotencoder',\n", " OneHotEncoder(handle_unknown='ignore'),\n", " ['Geography'])])),\n", " ('xgbclassifier',\n", " XGBClassifier(base_score=None, booster=None, callbac...\n", " feature_types=None, gamma=None, grow_policy=None,\n", " importance_type=None,\n", " interaction_constraints=None, learning_rate=None,\n", " max_bin=None, max_cat_threshold=None,\n", " max_cat_to_onehot=None, max_delta_step=None,\n", " max_depth=None, max_leaves=None,\n", " min_child_weight=None, missing=nan,\n", " monotone_constraints=None, multi_strategy=None,\n", " n_estimators=None, n_jobs=None,\n", " num_parallel_tree=None, random_state=42, ...))])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train the model pipeline on the training data\n", "model_pipeline.fit(Xtrain, ytrain)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "id": "brtV1ErPcxCy" }, "outputs": [], "source": [ "# Make predictions on the training data\n", "y_pred_train = model_pipeline.predict(Xtrain)\n", "\n", "# Make predictions on the test data\n", "y_pred_test = model_pipeline.predict(Xtest)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "087eeb21-d77e-4ca1-9f75-414586c18b7d", "showTitle": false, "title": "" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "yquQSa6KHWHH", "outputId": "cd32292c-7d4c-4ed3-cb0a-27b8132b41fb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.95 0.99 0.97 6365\n", " 1 0.97 0.81 0.88 1636\n", "\n", " accuracy 0.96 8001\n", " macro avg 0.96 0.90 0.93 8001\n", "weighted avg 0.96 0.96 0.95 8001\n", "\n" ] } ], "source": [ "# Generate a classification report to evaluate model performance on training set\n", "print(classification_report(ytrain, y_pred_train))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZTwKVOtmHr-M", "outputId": "29a15a9b-3697-4d2f-8df8-c771b9ecdf8a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.89 0.95 0.91 1599\n", " 1 0.71 0.52 0.60 402\n", "\n", " accuracy 0.86 2001\n", " macro avg 0.80 0.73 0.76 2001\n", "weighted avg 0.85 0.86 0.85 2001\n", "\n" ] } ], "source": [ "# Generate a classification report to evaluate model performance on test set\n", "print(classification_report(ytest, y_pred_test))" ] }, { "cell_type": "markdown", "metadata": { "id": "lSAMZzmaduO4" }, "source": [ "- While the model can identify non-churners well, it fails to do the same for customers who will churn.\n", " - Since the number of customers who churn is much lower, the model fails to identify the associated patterns.\n", " - We'll handle this by assigning weights to the different classes using the `scale_pos_weight` parameter of the XGBoost model.\n", "- The model overfits the training data, as the training and test recall for customers who churn differ by 30%.\n", " - We'll handle this via hyperparameter tuning." ] }, { "cell_type": "markdown", "metadata": { "id": "UGqiCLRnRx8i" }, "source": [ "## Hyperparameter Tuning" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "YunmTqQgiwCd", "outputId": "f56e076a-9c14-45fc-ced9-675adaba928f" }, "outputs": [ { "data": { "text/plain": [ "np.float64(3.890586797066015)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Set the clas weight to handle class imbalance\n", "class_weight = ytrain.value_counts()[0] / ytrain.value_counts()[1]\n", "class_weight" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "bffcbcac-0047-4332-b206-9fadb5c78956", "showTitle": false, "title": "" }, "id": "D8BdWyOUR46x" }, "outputs": [], "source": [ "# Define the preprocessing steps\n", "preprocessor = make_column_transformer(\n", " (StandardScaler(), numeric_features),\n", " (OneHotEncoder(handle_unknown='ignore'), categorical_features)\n", ")" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "76a64681-e124-4eef-ada8-75a8511dc783", "showTitle": false, "title": "" }, "id": "creqMx9fR46y" }, "outputs": [], "source": [ "# Define base XGBoost model\n", "xgb_model = xgb.XGBClassifier(scale_pos_weight=class_weight, random_state=42)\n", "\n", "# Define hyperparameter grid\n", "param_grid = {\n", " 'xgbclassifier__n_estimators': [50, 100, 150, 200], # number of tree to build\n", " 'xgbclassifier__max_depth': [2, 3, 4], # maximum depth of each tree\n", " 'xgbclassifier__colsample_bytree': [0.4, 0.5, 0.6], # percentage of attributes to be considered (randomly) for each tree\n", " 'xgbclassifier__colsample_bylevel': [0.4, 0.5, 0.6], # percentage of attributes to be considered (randomly) for each level of a tree\n", " 'xgbclassifier__learning_rate': [0.01, 0.05, 0.1], # learning rate\n", " 'xgbclassifier__reg_lambda': [0.4, 0.5, 0.6], # L2 regularization factor\n", "}" ] }, { "cell_type": "markdown", "metadata": { "id": "WGEoLzkZK2eO" }, "source": [ "The following code, which includes model pipeline creation and hyperparameter tuning using GridSearchCV, will take approximately 10-15 minutes to complete. Please allow sufficient time for execution." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "application/vnd.databricks.v1+cell": { "cellMetadata": { "byteLimit": 2048000, "rowLimit": 10000 }, "inputWidgets": {}, "nuid": "7e566699-0812-46e2-a48b-cf8a4f83c7b6", "showTitle": false, "title": "" }, "colab": { "base_uri": "https://localhost:8080/", "height": 281 }, "id": "bwV3VmWrR46y", "outputId": "ad5701c3-f1b2-45b1-8864-5b5aa619e55d" }, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=5,\n",
       "             estimator=Pipeline(steps=[('columntransformer',\n",
       "                                        ColumnTransformer(transformers=[('standardscaler',\n",
       "                                                                         StandardScaler(),\n",
       "                                                                         ['CreditScore',\n",
       "                                                                          'Age',\n",
       "                                                                          'Tenure',\n",
       "                                                                          'Balance',\n",
       "                                                                          'NumOfProducts',\n",
       "                                                                          'HasCrCard',\n",
       "                                                                          'IsActiveMember',\n",
       "                                                                          'EstimatedSalary']),\n",
       "                                                                        ('onehotencoder',\n",
       "                                                                         OneHotEncoder(handle_unknown='ignore'),\n",
       "                                                                         ['Geography'])])),\n",
       "                                       ('xgbclassifier',\n",
       "                                        XGBClassifier(base_sco...\n",
       "                                                      n_jobs=None,\n",
       "                                                      num_parallel_tree=None,\n",
       "                                                      random_state=42, ...))]),\n",
       "             n_jobs=-1,\n",
       "             param_grid={'xgbclassifier__colsample_bylevel': [0.4, 0.5, 0.6],\n",
       "                         'xgbclassifier__colsample_bytree': [0.4, 0.5, 0.6],\n",
       "                         'xgbclassifier__learning_rate': [0.01, 0.05, 0.1],\n",
       "                         'xgbclassifier__max_depth': [2, 3, 4],\n",
       "                         'xgbclassifier__n_estimators': [50, 100, 150, 200],\n",
       "                         'xgbclassifier__reg_lambda': [0.4, 0.5, 0.6]})
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GridSearchCV(cv=5,\n", " estimator=Pipeline(steps=[('columntransformer',\n", " ColumnTransformer(transformers=[('standardscaler',\n", " StandardScaler(),\n", " ['CreditScore',\n", " 'Age',\n", " 'Tenure',\n", " 'Balance',\n", " 'NumOfProducts',\n", " 'HasCrCard',\n", " 'IsActiveMember',\n", " 'EstimatedSalary']),\n", " ('onehotencoder',\n", " OneHotEncoder(handle_unknown='ignore'),\n", " ['Geography'])])),\n", " ('xgbclassifier',\n", " XGBClassifier(base_sco...\n", " n_jobs=None,\n", " num_parallel_tree=None,\n", " random_state=42, ...))]),\n", " n_jobs=-1,\n", " param_grid={'xgbclassifier__colsample_bylevel': [0.4, 0.5, 0.6],\n", " 'xgbclassifier__colsample_bytree': [0.4, 0.5, 0.6],\n", " 'xgbclassifier__learning_rate': [0.01, 0.05, 0.1],\n", " 'xgbclassifier__max_depth': [2, 3, 4],\n", " 'xgbclassifier__n_estimators': [50, 100, 150, 200],\n", " 'xgbclassifier__reg_lambda': [0.4, 0.5, 0.6]})" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Model pipeline\n", "model_pipeline = make_pipeline(preprocessor, xgb_model)\n", "\n", "# Hyperparameter tuning with GridSearchCV\n", "grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, n_jobs=-1)\n", "grid_search.fit(Xtrain, ytrain)" ] }, { "cell_type": "markdown", "metadata": { "id": "wxu-KzO21Dj7" }, "source": [ "## Selecting the Best Model" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bezveeT9h_Rj", "outputId": "48e28e8e-e937-463d-ce59-dcf3d2c5a1d4" }, "outputs": [ { "data": { "text/plain": [ "{'xgbclassifier__colsample_bylevel': 0.5,\n", " 'xgbclassifier__colsample_bytree': 0.6,\n", " 'xgbclassifier__learning_rate': 0.1,\n", " 'xgbclassifier__max_depth': 4,\n", " 'xgbclassifier__n_estimators': 200,\n", " 'xgbclassifier__reg_lambda': 0.6}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check the parameters of the best model\n", "grid_search.best_params_" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 249 }, "id": "fSNxALuGR6iT", "outputId": "fdfb9cc3-4a1d-4ee8-e298-054368bf6962" }, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('columntransformer',\n",
       "                 ColumnTransformer(transformers=[('standardscaler',\n",
       "                                                  StandardScaler(),\n",
       "                                                  ['CreditScore', 'Age',\n",
       "                                                   'Tenure', 'Balance',\n",
       "                                                   'NumOfProducts', 'HasCrCard',\n",
       "                                                   'IsActiveMember',\n",
       "                                                   'EstimatedSalary']),\n",
       "                                                 ('onehotencoder',\n",
       "                                                  OneHotEncoder(handle_unknown='ignore'),\n",
       "                                                  ['Geography'])])),\n",
       "                ('xgbclassifier',\n",
       "                 XGBClassifier(base_score=None, booster=None, callbac...\n",
       "                               feature_types=None, gamma=None, grow_policy=None,\n",
       "                               importance_type=None,\n",
       "                               interaction_constraints=None, learning_rate=0.1,\n",
       "                               max_bin=None, max_cat_threshold=None,\n",
       "                               max_cat_to_onehot=None, max_delta_step=None,\n",
       "                               max_depth=4, max_leaves=None,\n",
       "                               min_child_weight=None, missing=nan,\n",
       "                               monotone_constraints=None, multi_strategy=None,\n",
       "                               n_estimators=200, n_jobs=None,\n",
       "                               num_parallel_tree=None, random_state=42, ...))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('columntransformer',\n", " ColumnTransformer(transformers=[('standardscaler',\n", " StandardScaler(),\n", " ['CreditScore', 'Age',\n", " 'Tenure', 'Balance',\n", " 'NumOfProducts', 'HasCrCard',\n", " 'IsActiveMember',\n", " 'EstimatedSalary']),\n", " ('onehotencoder',\n", " OneHotEncoder(handle_unknown='ignore'),\n", " ['Geography'])])),\n", " ('xgbclassifier',\n", " XGBClassifier(base_score=None, booster=None, callbac...\n", " feature_types=None, gamma=None, grow_policy=None,\n", " importance_type=None,\n", " interaction_constraints=None, learning_rate=0.1,\n", " max_bin=None, max_cat_threshold=None,\n", " max_cat_to_onehot=None, max_delta_step=None,\n", " max_depth=4, max_leaves=None,\n", " min_child_weight=None, missing=nan,\n", " monotone_constraints=None, multi_strategy=None,\n", " n_estimators=200, n_jobs=None,\n", " num_parallel_tree=None, random_state=42, ...))])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Store the best model\n", "best_model = grid_search.best_estimator_\n", "best_model" ] }, { "cell_type": "markdown", "metadata": { "id": "7K5BB3_M2Bk5" }, "source": [ "The classification threshold is important because it controls precision and recall trade-offs.\n", "- Since customer churn prediction is a retention problem, a higher recall is preferred. We want to correctly identify as many churners as possible, even if it means getting some false positives.\n", "- We'll lower the classification threshold to 0.45 from 0.5 to increase the recall." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "id": "rvYz9c-QhWDx" }, "outputs": [], "source": [ "# Set the classification threshold\n", "classification_threshold = 0.45" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "id": "Fi-WqyVOhecQ" }, "outputs": [], "source": [ "# Make predictions on the training data\n", "y_pred_train_proba = best_model.predict_proba(Xtrain)[:, 1]\n", "y_pred_train = (y_pred_train_proba >= classification_threshold).astype(int)\n", "\n", "# Make predictions on the test data\n", "y_pred_test_proba = best_model.predict_proba(Xtest)[:, 1]\n", "y_pred_test = (y_pred_test_proba >= classification_threshold).astype(int)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DW9AG_ONc7PD", "outputId": "3e5066ae-83d9-48f4-ec0c-91766625ee6c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.96 0.81 0.88 6365\n", " 1 0.54 0.85 0.66 1636\n", "\n", " accuracy 0.82 8001\n", " macro avg 0.75 0.83 0.77 8001\n", "weighted avg 0.87 0.82 0.83 8001\n", "\n" ] } ], "source": [ "# Generate a classification report to evaluate model performance on training set\n", "print(classification_report(ytrain, y_pred_train))" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GlOJwOE2SA4m", "outputId": "e587fba0-2f43-49d8-8acd-eab75c4fecd6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.93 0.79 0.86 1599\n", " 1 0.48 0.78 0.60 402\n", "\n", " accuracy 0.79 2001\n", " macro avg 0.71 0.78 0.73 2001\n", "weighted avg 0.84 0.79 0.80 2001\n", "\n" ] } ], "source": [ "# Generate a classification report to evaluate model performance on test set\n", "print(classification_report(ytest, y_pred_test))" ] }, { "cell_type": "markdown", "metadata": { "id": "ptaeTmSxqEe5" }, "source": [ "- We can see that the **overfitting has significantly reduced**.\n", "- The **test set recall for the class corresponding to churn** has also **significantly improved** (by ~25%) to 78%.\n", "- As expected, while recall has improved, precision has dropped.\n", "\n", "We'll go ahead with this model as our final model." ] }, { "cell_type": "markdown", "metadata": { "id": "lqkUvTHzO3UH" }, "source": [ "# Model Serialization" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "id": "SwIewqGpiRtW" }, "outputs": [], "source": [ "# Create a folder for storing the files needed for web app deployment\n", "os.makedirs(\"deployment_files\", exist_ok=True)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "E5-0ybugEl_5", "outputId": "9815d03e-3894-4015-ab56-eec141e6c468" }, "outputs": [ { "data": { "text/plain": [ "['deployment_files/churn_prediction_model_v1_0.joblib']" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Define the file path to save (serialize) the trained model along with the data preprocessing steps\n", "saved_model_path = \"deployment_files/churn_prediction_model_v1_0.joblib\"\n", "\n", "# Save the trained model pipeline using joblib\n", "joblib.dump(best_model, saved_model_path)" ] }, { "cell_type": "markdown", "metadata": { "id": "qATgOdleEwCg" }, "source": [ "This code is used to save a trained machine learning model pipeline using `joblib`, which is a library for efficient object serialization in Python.\n", "\n", "**Breakdown:** \n", "1. **`saved_model_path = \"churn_prediction_model_v1_0.joblib\"`** \n", " - Defines the file path where the model will be saved. \n", " - The model will be stored as a `.joblib` file, a format optimized for large NumPy arrays and machine learning models. \n", " - The last part of the filename (`v1_0`) specifies a version number, which is a good practice to track changes and maintain multiple model iterations\n", "\n", "2. **`joblib.dump(model_pipeline, saved_model_path)`** \n", " - Saves the trained `model_pipeline` object to the specified path (`model.joblib`). \n", " - `joblib.dump()` is preferred over `pickle.dump()` for saving large models because it is faster and more efficient with numerical data. \n", " - The saved file can be loaded later using `joblib.load(\"model.joblib\")` for inference or further training. \n", "\n", "This approach ensures that the model pipeline, including preprocessing steps and the trained model, is preserved for later use." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "id": "uNR7Dxj2MTM9" }, "outputs": [], "source": [ "# Load the saved model pipeline from the file\n", "saved_model = joblib.load(\"deployment_files/churn_prediction_model_v1_0.joblib\")" ] }, { "cell_type": "markdown", "metadata": { "id": "FwEnJLtfFEw4" }, "source": [ "1. **`joblib.load(\"churn_prediction_model_v1_0.joblib\")`** \n", " - Loads the previously saved machine learning model (or pipeline) from the `model.joblib` file. \n", " - The model retains all trained parameters, including preprocessing steps and learned patterns.\n", "\n", "2. **`saved_model`** \n", " - This variable stores the deserialized model, allowing it to be used for inference, further training, or evaluation.\n", "\n", "This allows you to reuse the trained model **without retraining it.**" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 249 }, "id": "LoPE6PZUM7Uh", "outputId": "cdfe55e4-520a-428a-ab0e-582e4e16b4e7" }, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('columntransformer',\n",
       "                 ColumnTransformer(transformers=[('standardscaler',\n",
       "                                                  StandardScaler(),\n",
       "                                                  ['CreditScore', 'Age',\n",
       "                                                   'Tenure', 'Balance',\n",
       "                                                   'NumOfProducts', 'HasCrCard',\n",
       "                                                   'IsActiveMember',\n",
       "                                                   'EstimatedSalary']),\n",
       "                                                 ('onehotencoder',\n",
       "                                                  OneHotEncoder(handle_unknown='ignore'),\n",
       "                                                  ['Geography'])])),\n",
       "                ('xgbclassifier',\n",
       "                 XGBClassifier(base_score=None, booster=None, callbac...\n",
       "                               feature_types=None, gamma=None, grow_policy=None,\n",
       "                               importance_type=None,\n",
       "                               interaction_constraints=None, learning_rate=0.1,\n",
       "                               max_bin=None, max_cat_threshold=None,\n",
       "                               max_cat_to_onehot=None, max_delta_step=None,\n",
       "                               max_depth=4, max_leaves=None,\n",
       "                               min_child_weight=None, missing=nan,\n",
       "                               monotone_constraints=None, multi_strategy=None,\n",
       "                               n_estimators=200, n_jobs=None,\n",
       "                               num_parallel_tree=None, random_state=42, ...))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('columntransformer',\n", " ColumnTransformer(transformers=[('standardscaler',\n", " StandardScaler(),\n", " ['CreditScore', 'Age',\n", " 'Tenure', 'Balance',\n", " 'NumOfProducts', 'HasCrCard',\n", " 'IsActiveMember',\n", " 'EstimatedSalary']),\n", " ('onehotencoder',\n", " OneHotEncoder(handle_unknown='ignore'),\n", " ['Geography'])])),\n", " ('xgbclassifier',\n", " XGBClassifier(base_score=None, booster=None, callbac...\n", " feature_types=None, gamma=None, grow_policy=None,\n", " importance_type=None,\n", " interaction_constraints=None, learning_rate=0.1,\n", " max_bin=None, max_cat_threshold=None,\n", " max_cat_to_onehot=None, max_delta_step=None,\n", " max_depth=4, max_leaves=None,\n", " min_child_weight=None, missing=nan,\n", " monotone_constraints=None, multi_strategy=None,\n", " n_estimators=200, n_jobs=None,\n", " num_parallel_tree=None, random_state=42, ...))])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "saved_model" ] }, { "cell_type": "markdown", "metadata": { "id": "UJMu1yQztach" }, "source": [ "Let's try making predictions on the test set using the deserialized model.\n", "\n", "- Please ensure that the saved model is loaded before making predictions." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MzpxBjtSM9f-", "outputId": "90db0d65-d3ba-4254-a8dc-af87c90c5484" }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, ..., 0, 0, 1], shape=(2001,))" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "saved_model.predict(Xtest)" ] }, { "cell_type": "markdown", "metadata": { "id": "oxj1WOs1uxt_" }, "source": [ "- As we can see, the model can be directly used for making predictions without any retraining." ] }, { "cell_type": "markdown", "metadata": { "id": "o81KHMBZTwXR" }, "source": [ "# Creating a Web App using Streamlit" ] }, { "cell_type": "markdown", "metadata": { "id": "U3x2eyoA49uL" }, "source": [ "We want to create a web app using Streamlit that can do the following:\n", "1. Create a UI for users to provide their input\n", "2. Load a serialized ML model\n", "3. Take the user input and loaded model to make a prediction\n", "4. Display the prediction from the model to the user" ] }, { "cell_type": "markdown", "metadata": { "id": "Jdck5Mso5R_1" }, "source": [ "For this, we write an **`app.py`** script that'll do all the above steps in one shot." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3oT-EsXmTvbu", "outputId": "197a323b-0a8a-48fa-8188-9545a6512250" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing deployment_files/app.py\n" ] } ], "source": [ "%%writefile deployment_files/app.py\n", "\n", "import streamlit as st\n", "import pandas as pd\n", "import joblib\n", "\n", "# Load the trained model\n", "def load_model():\n", " return joblib.load(\"churn_prediction_model_v1_0.joblib\")\n", "\n", "model = load_model()\n", "\n", "# Streamlit UI for Customer Churn Prediction\n", "st.title(\"Customer Churn Prediction App\")\n", "st.write(\"The Customer Churn Prediction App is an internal tool for bank staff that predicts whether customers are at risk of churning based on their details.\")\n", "st.write(\"Kindly enter the customer details to check whether they are likely to churn.\")\n", "\n", "# Collect user input\n", "CreditScore = st.number_input(\"Credit Score (customer's credit score)\", min_value=300, max_value=900, value=650)\n", "Geography = st.selectbox(\"Geography (country where the customer resides)\", [\"France\", \"Germany\", \"Spain\"])\n", "Age = st.number_input(\"Age (customer's age in years)\", min_value=18, max_value=100, value=30)\n", "Tenure = st.number_input(\"Tenure (number of years the customer has been with the bank)\", value=12)\n", "Balance = st.number_input(\"Account Balance (customer’s account balance)\", min_value=0.0, value=10000.0)\n", "NumOfProducts = st.number_input(\"Number of Products (number of products the customer has with the bank)\", min_value=1, value=1)\n", "HasCrCard = st.selectbox(\"Has Credit Card?\", [\"Yes\", \"No\"])\n", "IsActiveMember = st.selectbox(\"Is Active Member?\", [\"Yes\", \"No\"])\n", "EstimatedSalary = st.number_input(\"Estimated Salary (customer’s estimated salary)\", min_value=0.0, value=50000.0)\n", "\n", "# Convert categorical inputs to match model training\n", "input_data = pd.DataFrame([{\n", " 'CreditScore': CreditScore,\n", " 'Geography': Geography,\n", " 'Age': Age,\n", " 'Tenure': Tenure,\n", " 'Balance': Balance,\n", " 'NumOfProducts': NumOfProducts,\n", " 'HasCrCard': 1 if HasCrCard == \"Yes\" else 0,\n", " 'IsActiveMember': 1 if IsActiveMember == \"Yes\" else 0,\n", " 'EstimatedSalary': EstimatedSalary\n", "}])\n", "\n", "# Set the classification threshold\n", "classification_threshold = 0.45\n", "\n", "# Predict button\n", "if st.button(\"Predict\"):\n", " prediction_proba = model.predict_proba(input_data)[0, 1]\n", " prediction = (prediction_proba >= classification_threshold).astype(int)\n", " result = \"churn\" if prediction == 1 else \"not churn\"\n", " st.write(f\"Based on the information provided, the customer is likely to {result}.\")" ] }, { "cell_type": "markdown", "metadata": { "id": "Dh7JAZWJu9UA" }, "source": [ "- It's important to note that the library import calls have to be mentioned in the script, as it won't automatically happen in the hosting platform." ] }, { "cell_type": "markdown", "metadata": { "id": "luytCgCGXYdb" }, "source": [ "# Creating a Dependencies File" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VllfgdDo4kAA", "outputId": "2a3c247a-3aa4-4624-fa42-68c3d8e0efe4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing deployment_files/requirements.txt\n" ] } ], "source": [ "%%writefile deployment_files/requirements.txt\n", "pandas==2.2.2\n", "numpy==2.0.2\n", "scikit-learn==1.6.1\n", "xgboost==2.1.4\n", "joblib==1.4.2\n", "streamlit==1.43.2" ] }, { "cell_type": "markdown", "metadata": { "id": "Ou9pmcKNRgte" }, "source": [ "A **`requirements.txt`** file is essential for ensuring that your project runs smoothly across different environments. It's like a **blueprint** for setting up your ML project!" ] }, { "cell_type": "markdown", "metadata": { "id": "Vh6L3EqqiDbw" }, "source": [ "# Dockerfile" ] }, { "cell_type": "markdown", "metadata": { "id": "af2KN5Zxibak" }, "source": [ "**Note for Learners**\n", "\n", "In the case study recording on **Introduction to Model Deployment**, we deployed a Streamlit app using the **Hugging Face Spaces template**. At that time, Hugging Face allowed direct deployment using the **Streamlit SDK template**, and a `Dockerfile` was *not required*.\n", "\n", "However, Hugging Face has since updated their platform, and now **Streamlit apps must be deployed using the Docker template**, which requires a valid `Dockerfile`. While the recording does not show the `Dockerfile` creation, we have included the necessary `Dockerfile` code in this notebook for your reference.\n", "\n", "Don't worry — we'll cover the `Dockerfile` structure and containerization **in depth** in the upcoming week on **Containerization**.\n" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "id": "5xgEHj3fiGHq" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing deployment_files/Dockerfile\n" ] } ], "source": [ "%%writefile deployment_files/Dockerfile\n", "# Use a minimal base image with Python 3.9 installed\n", "FROM python:3.9-slim\n", "\n", "# Set the working directory inside the container to /app\n", "WORKDIR /app\n", "\n", "# Copy all files from the current directory on the host to the container's /app directory\n", "COPY . .\n", "\n", "# Install Python dependencies listed in requirements.txt\n", "RUN pip3 install -r requirements.txt\n", "\n", "# Define the command to run the Streamlit app on port 8501 and make it accessible externally\n", "CMD [\"streamlit\", \"run\", \"app.py\", \"--server.port=8501\", \"--server.address=0.0.0.0\", \"--server.enableXsrfProtection=false\"]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C:\\\\Users\\\\adity\\\\Model_Deployment'" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pwd" ] }, { "cell_type": "markdown", "metadata": { "id": "GChQ7KMTXmfa" }, "source": [ "# Uploading Files to Hugging Face Repository" ] }, { "cell_type": "markdown", "metadata": { "id": "FPsXhZQ7YIyc" }, "source": [ "Once create the following files in the notebook, lets upload it in to the hugging face space\n", "- **`churn_prediction_model_v1_0.joblib`**\n", "- **`requirements.txt`**\n", "- **`Dockerfile`**\n", "- **`app.py`**" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "TsW6UmL9GIFL" }, "outputs": [ { "ename": "HTTPError", "evalue": "Invalid user token.", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mHTTPError\u001b[39m Traceback (most recent call last)", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\utils\\_http.py:409\u001b[39m, in \u001b[36mhf_raise_for_status\u001b[39m\u001b[34m(response, endpoint_name)\u001b[39m\n\u001b[32m 408\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m409\u001b[39m response.raise_for_status()\n\u001b[32m 410\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m HTTPError \u001b[38;5;28;01mas\u001b[39;00m e:\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\requests\\models.py:1024\u001b[39m, in \u001b[36mResponse.raise_for_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1023\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m http_error_msg:\n\u001b[32m-> \u001b[39m\u001b[32m1024\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m HTTPError(http_error_msg, response=\u001b[38;5;28mself\u001b[39m)\n", "\u001b[31mHTTPError\u001b[39m: 401 Client Error: Unauthorized for url: https://huggingface.co/api/whoami-v2", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[31mHfHubHTTPError\u001b[39m Traceback (most recent call last)", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\hf_api.py:1664\u001b[39m, in \u001b[36mHfApi.whoami\u001b[39m\u001b[34m(self, token)\u001b[39m\n\u001b[32m 1663\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1664\u001b[39m hf_raise_for_status(r)\n\u001b[32m 1665\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m HTTPError \u001b[38;5;28;01mas\u001b[39;00m e:\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\utils\\_http.py:481\u001b[39m, in \u001b[36mhf_raise_for_status\u001b[39m\u001b[34m(response, endpoint_name)\u001b[39m\n\u001b[32m 479\u001b[39m \u001b[38;5;66;03m# Convert `HTTPError` into a `HfHubHTTPError` to display request information\u001b[39;00m\n\u001b[32m 480\u001b[39m \u001b[38;5;66;03m# as well (request id and/or server error message)\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m481\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m _format(HfHubHTTPError, \u001b[38;5;28mstr\u001b[39m(e), response) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n", "\u001b[31mHfHubHTTPError\u001b[39m: 401 Client Error: Unauthorized for url: https://huggingface.co/api/whoami-v2 (Request ID: Root=1-6847119b-459f1d1f4a27a0e8241704c7;3e4f0b8f-9f77-41a9-8ffe-df042ec507bd)\n\nInvalid credentials in Authorization header", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[31mHTTPError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 2\u001b[39m repo_id = \u001b[33m\"\u001b[39m\u001b[33madityasharma0511/gldeploy\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;66;03m# Your Hugging Face space id\u001b[39;00m\n\u001b[32m 4\u001b[39m \u001b[38;5;66;03m# Login to Hugging Face platform with the access token\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m login(token=access_key)\n\u001b[32m 7\u001b[39m \u001b[38;5;66;03m# Initialize the API\u001b[39;00m\n\u001b[32m 8\u001b[39m api = HfApi()\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\utils\\_deprecation.py:101\u001b[39m, in \u001b[36m_deprecate_arguments.._inner_deprecate_positional_args..inner_f\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 99\u001b[39m message += \u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m + custom_message\n\u001b[32m 100\u001b[39m warnings.warn(message, \u001b[38;5;167;01mFutureWarning\u001b[39;00m)\n\u001b[32m--> \u001b[39m\u001b[32m101\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m f(*args, **kwargs)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\utils\\_deprecation.py:31\u001b[39m, in \u001b[36m_deprecate_positional_args.._inner_deprecate_positional_args..inner_f\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 29\u001b[39m extra_args = \u001b[38;5;28mlen\u001b[39m(args) - \u001b[38;5;28mlen\u001b[39m(all_args)\n\u001b[32m 30\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m extra_args <= \u001b[32m0\u001b[39m:\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m f(*args, **kwargs)\n\u001b[32m 32\u001b[39m \u001b[38;5;66;03m# extra_args > 0\u001b[39;00m\n\u001b[32m 33\u001b[39m args_msg = [\n\u001b[32m 34\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00marg\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(arg, \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;28;01melse\u001b[39;00m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00marg\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 35\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m name, arg \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(kwonly_args[:extra_args], args[-extra_args:])\n\u001b[32m 36\u001b[39m ]\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\_login.py:126\u001b[39m, in \u001b[36mlogin\u001b[39m\u001b[34m(token, add_to_git_credential, new_session, write_permission)\u001b[39m\n\u001b[32m 119\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m add_to_git_credential:\n\u001b[32m 120\u001b[39m logger.info(\n\u001b[32m 121\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mThe token has not been saved to the git credentials helper. Pass \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 122\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m`add_to_git_credential=True` in this function directly or \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 123\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m`--add-to-git-credential` if using via `huggingface-cli` if \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 124\u001b[39m \u001b[33m\"\u001b[39m\u001b[33myou want to set the git credential as well.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 125\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m126\u001b[39m _login(token, add_to_git_credential=add_to_git_credential)\n\u001b[32m 127\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m is_notebook():\n\u001b[32m 128\u001b[39m notebook_login(new_session=new_session)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\_login.py:404\u001b[39m, in \u001b[36m_login\u001b[39m\u001b[34m(token, add_to_git_credential)\u001b[39m\n\u001b[32m 401\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m token.startswith(\u001b[33m\"\u001b[39m\u001b[33mapi_org\u001b[39m\u001b[33m\"\u001b[39m):\n\u001b[32m 402\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mYou must use your personal account token, not an organization token.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m404\u001b[39m token_info = whoami(token)\n\u001b[32m 405\u001b[39m permission = token_info[\u001b[33m\"\u001b[39m\u001b[33mauth\u001b[39m\u001b[33m\"\u001b[39m][\u001b[33m\"\u001b[39m\u001b[33maccessToken\u001b[39m\u001b[33m\"\u001b[39m][\u001b[33m\"\u001b[39m\u001b[33mrole\u001b[39m\u001b[33m\"\u001b[39m]\n\u001b[32m 406\u001b[39m logger.info(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mToken is valid (permission: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpermission\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m).\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\utils\\_validators.py:114\u001b[39m, in \u001b[36mvalidate_hf_hub_args.._inner_fn\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 111\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m check_use_auth_token:\n\u001b[32m 112\u001b[39m kwargs = smoothly_deprecate_use_auth_token(fn_name=fn.\u001b[34m__name__\u001b[39m, has_token=has_token, kwargs=kwargs)\n\u001b[32m--> \u001b[39m\u001b[32m114\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m fn(*args, **kwargs)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\miniconda3\\envs\\md\\Lib\\site-packages\\huggingface_hub\\hf_api.py:1677\u001b[39m, in \u001b[36mHfApi.whoami\u001b[39m\u001b[34m(self, token)\u001b[39m\n\u001b[32m 1675\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m effective_token == _get_token_from_file():\n\u001b[32m 1676\u001b[39m error_message += \u001b[33m\"\u001b[39m\u001b[33m The token stored is invalid. Please run `huggingface-cli login` to update it.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m-> \u001b[39m\u001b[32m1677\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m HTTPError(error_message, request=e.request, response=e.response) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01me\u001b[39;00m\n\u001b[32m 1678\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m r.json()\n", "\u001b[31mHTTPError\u001b[39m: Invalid user token." ] } ], "source": [ "access_key = \"hf_token\" # Your Hugging Face token created from access keys in write mode\n", "repo_id = \"adityasharma0511/gldeploy\" # Your Hugging Face space id\n", "\n", "# Login to Hugging Face platform with the access token\n", "login(token=access_key)\n", "\n", "# Initialize the API\n", "api = HfApi()\n", "\n", "# Upload Streamlit app files stored in the folder called deployment_files\n", "api.upload_folder(\n", " folder_path=\"C:\\\\Users\\\\adity\\\\Model_Deployment\", # Local folder path in azureml\n", " repo_id=repo_id, # Hugging face space id\n", " repo_type=\"space\", # Hugging face repo type \"space\"\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "_i3RxMaYNDtX" }, "source": [ "1. **Define authentication and repository details:** \n", " - `hf_token` stores the Hugging Face API token for authentication. \n", " - `repo_id` specifies the Hugging Face **Space** repository where files will be uploaded. \n", "\n", "2. **Authenticate with Hugging Face:** \n", " - The `login(token=hf_token)` function logs into Hugging Face using the provided API token. \n", "\n", "3. **Initialize Hugging Face API object:** \n", " - `api = HfApi()` creates an instance of `HfApi`, which allows interaction with the Hugging Face Hub. \n", "\n", "4. **Upload files from the local folder to Hugging Face Space:** \n", " - `api.upload_folder()` uploads all files from the `deployment_files` folder to the specified Hugging Face repository. \n", " - `folder_path=\"/content/deployment_files\"` specifies the local directory containing the files. \n", " - `repo_id=repo_id` sets the target Hugging Face **Space** repository. \n", " - `repo_type=\"space\"` ensures that the upload is directed to a **Space** repository, which is used for hosting applications like Streamlit. \n" ] }, { "cell_type": "markdown", "metadata": { "id": "cfrgxVM66grM" }, "source": [ "Here's how the web app looks like." ] }, { "cell_type": "markdown", "metadata": { "id": "98iM0_0w6kPU" }, "source": [ "![image.png](data:image/png;base64,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EZELY8BOREREROTCGLATEREREbkwBuxERERERC6MATsRERERkQtjwE5ERERE5MIYsBMRERERuTAG7ERERERELowBOxERERGRC2PATkRERETkwhiwExERERG5MAbsREREREQujAE7EREREZELY8BOREREROTCGLATEREREbkwBuxERERERC6MATsRERERkQu7/QG7JEGSp/XUV7UoLamFQe3vAcxwpgylZ1rkydTnJNQdLUPFpVturfaZJEim9j/66Tt7w8nHmPPatZPK9EY9KkoqUXdDvqAf3M7vdgaFtiVJVvV1i/vrvLZ161x524jo9nJiwF6L4sw1KD5nm2o8XoCMrCLUSABQjowJ4QjKLLddqadqCrAitQCfq/09gH2+LR0rtskKmZzAgMPr0pFT5qwQFQCakD8/HEHzC9AA9NN39pKTjzHntWsnlamhHDmpG3C4j7N1yO38bmeQt60jaxAUHI6MI5a/b3F/nde2bp0rbxsR3V5ODNgNqCjahYovrZIuFWBRcgHagifDRwMAj2Bq8nQsm/KI1Up3voatC+GXfosXIQqclW//KEdG4ELkX5GnD1w9ry9PjJ8dh4TZQRgmX9RDPf9uctxtbMtH1sBvTvsF3ffEo09hWcxiTH1UvqD/8bgiotvFiQG7jLEcaYs2AMk5yAxxtyS6IyAxBQn+7X8PEDflCX3EWfn2k7aOoR7fE72oL+9pi7Fsmpc8ued68d3kuNvWlm+2yVMGPq0fEtLiEKCVL7gNeFwR0W3SPwG7qR75yak4FpiFdxKtg5EmFC6Jx5LtTVZ/z0XuyVZU5aUjMjgMfsHxWFFUb/UZAF+VIWt+BIL8wxAUk458gw7etmt0ulKERVHpKP7KNrnq7bmYuaZcYfy8hIaSdZgzMQx+/uEInb8Bh691Lq3IjseK3U2d6wRGYE52JYxAx/7Me7cWKFmNyKh4RC4pstwNcyTf+o79nvmu9T7byxe2edtsj4XJqjwDIzAzpQh1XXfcwpzXPH04/PzDEDorHfmnWwEADdtTZd9r3u7I7MqOv42nC7BiVgT8/MMQpE9GVkkTpKMbEBm1GvtRi02L4hEZFY+co5YPXCtHbvJchAaGwW/iXCx6uxxG62Do6AZEppag4UIRVsSEw88/HJEpu1BnAgwHLPus1EauVSM/JR5B/uZ8V2yv76xrS551pwvMecblo872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)" ] }, { "cell_type": "markdown", "metadata": { "id": "LswDabmTHofd" }, "source": [ "Power Ahead!\n", "___" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "application/vnd.databricks.v1+notebook": { "dashboards": [], "language": "python", "notebookMetadata": { "pythonIndentUnit": 4 }, "notebookName": "machine_failure_prediction", "widgets": {} }, "colab": { "collapsed_sections": [ "o5Iixw4vHWG9", "niLZjnkCHWG_", "bQrbzi5RHWHC", "iT25LmvoHWHD", "Cl7T7_jFHWHE", "lqkUvTHzO3UH", "o81KHMBZTwXR", "luytCgCGXYdb", "Vh6L3EqqiDbw", "GChQ7KMTXmfa" ], "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.4" } }, "nbformat": 4, "nbformat_minor": 4 }