diff --git a/Customer Churn Analysis.ipynb b/Customer Churn Analysis.ipynb
index 7650a1f..2d332bb 100644
--- a/Customer Churn Analysis.ipynb
+++ b/Customer Churn Analysis.ipynb
@@ -1,41737 +1 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "a9ee639c",
- "metadata": {},
- "outputs": [],
- "source": [
- "#importing libraries to retrieve data and read csv and to perform EDa tasks\n",
- "import pandas as pd\n",
- "import numpy as np\n",
- "#importing for visualisation\n",
- "import seaborn as sns\n",
- "#sklearn for converting catagorical values to Numeric data"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "902edb01",
- "metadata": {},
- "source": [
- "# Real time use case\n",
- "\n",
- "Customer churn analysis helps businesses understand \n",
- "why customers don't return for repeat business. Churn rate tells you\n",
- "what portion of your customers leave over a period of time\n",
- "\n",
- "A company's churn rate, or employee churn rate, refers to both the attrition rate and the turnover rate. All of these terms refer to the number of employees who leave the organization during a specified period of time, generally a year. (Note that the term 'churn' used generically can also apply to customers.)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "56002c49",
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "\n",
- "#import dataset\n",
- "data = pd.read_csv(\"C://Users//Lenovo//Downloads//Customer_Churn-1.csv\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "a48f5f33",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " OnlineSecurity | \n",
- " ... | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 7590-VHVEG | \n",
- " Female | \n",
- " 0 | \n",
- " Yes | \n",
- " No | \n",
- " 1 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " No | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 29.85 | \n",
- " 29.85 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 5575-GNVDE | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 34 | \n",
- " Yes | \n",
- " No | \n",
- " DSL | \n",
- " Yes | \n",
- " ... | \n",
- " Yes | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " One year | \n",
- " No | \n",
- " Mailed check | \n",
- " 56.95 | \n",
- " 1889.5 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 3668-QPYBK | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 2 | \n",
- " Yes | \n",
- " No | \n",
- " DSL | \n",
- " Yes | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Mailed check | \n",
- " 53.85 | \n",
- " 108.15 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 7795-CFOCW | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 45 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " Yes | \n",
- " ... | \n",
- " Yes | \n",
- " Yes | \n",
- " No | \n",
- " No | \n",
- " One year | \n",
- " No | \n",
- " Bank transfer (automatic) | \n",
- " 42.30 | \n",
- " 1840.75 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 9237-HQITU | \n",
- " Female | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 2 | \n",
- " Yes | \n",
- " No | \n",
- " Fiber optic | \n",
- " No | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 70.70 | \n",
- " 151.65 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 9305-CDSKC | \n",
- " Female | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 8 | \n",
- " Yes | \n",
- " Yes | \n",
- " Fiber optic | \n",
- " No | \n",
- " ... | \n",
- " Yes | \n",
- " No | \n",
- " Yes | \n",
- " Yes | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 99.65 | \n",
- " 820.5 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 1452-KIOVK | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " Yes | \n",
- " 22 | \n",
- " Yes | \n",
- " Yes | \n",
- " Fiber optic | \n",
- " No | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " Yes | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Credit card (automatic) | \n",
- " 89.10 | \n",
- " 1949.4 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 6713-OKOMC | \n",
- " Female | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 10 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " Yes | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " No | \n",
- " Mailed check | \n",
- " 29.75 | \n",
- " 301.9 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 7892-POOKP | \n",
- " Female | \n",
- " 0 | \n",
- " Yes | \n",
- " No | \n",
- " 28 | \n",
- " Yes | \n",
- " Yes | \n",
- " Fiber optic | \n",
- " No | \n",
- " ... | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 104.80 | \n",
- " 3046.05 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 6388-TABGU | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " Yes | \n",
- " 62 | \n",
- " Yes | \n",
- " No | \n",
- " DSL | \n",
- " Yes | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " One year | \n",
- " No | \n",
- " Bank transfer (automatic) | \n",
- " 56.15 | \n",
- " 3487.95 | \n",
- " No | \n",
- "
\n",
- " \n",
- "
\n",
- "
10 rows × 21 columns
\n",
- "
"
- ],
- "text/plain": [
- " customerID gender SeniorCitizen Partner Dependents tenure PhoneService \\\n",
- "0 7590-VHVEG Female 0 Yes No 1 No \n",
- "1 5575-GNVDE Male 0 No No 34 Yes \n",
- "2 3668-QPYBK Male 0 No No 2 Yes \n",
- "3 7795-CFOCW Male 0 No No 45 No \n",
- "4 9237-HQITU Female 0 No No 2 Yes \n",
- "5 9305-CDSKC Female 0 No No 8 Yes \n",
- "6 1452-KIOVK Male 0 No Yes 22 Yes \n",
- "7 6713-OKOMC Female 0 No No 10 No \n",
- "8 7892-POOKP Female 0 Yes No 28 Yes \n",
- "9 6388-TABGU Male 0 No Yes 62 Yes \n",
- "\n",
- " MultipleLines InternetService OnlineSecurity ... DeviceProtection \\\n",
- "0 No phone service DSL No ... No \n",
- "1 No DSL Yes ... Yes \n",
- "2 No DSL Yes ... No \n",
- "3 No phone service DSL Yes ... Yes \n",
- "4 No Fiber optic No ... No \n",
- "5 Yes Fiber optic No ... Yes \n",
- "6 Yes Fiber optic No ... No \n",
- "7 No phone service DSL Yes ... No \n",
- "8 Yes Fiber optic No ... Yes \n",
- "9 No DSL Yes ... No \n",
- "\n",
- " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n",
- "0 No No No Month-to-month Yes \n",
- "1 No No No One year No \n",
- "2 No No No Month-to-month Yes \n",
- "3 Yes No No One year No \n",
- "4 No No No Month-to-month Yes \n",
- "5 No Yes Yes Month-to-month Yes \n",
- "6 No Yes No Month-to-month Yes \n",
- "7 No No No Month-to-month No \n",
- "8 Yes Yes Yes Month-to-month Yes \n",
- "9 No No No One year No \n",
- "\n",
- " PaymentMethod MonthlyCharges TotalCharges Churn \n",
- "0 Electronic check 29.85 29.85 No \n",
- "1 Mailed check 56.95 1889.5 No \n",
- "2 Mailed check 53.85 108.15 Yes \n",
- "3 Bank transfer (automatic) 42.30 1840.75 No \n",
- "4 Electronic check 70.70 151.65 Yes \n",
- "5 Electronic check 99.65 820.5 Yes \n",
- "6 Credit card (automatic) 89.10 1949.4 No \n",
- "7 Mailed check 29.75 301.9 No \n",
- "8 Electronic check 104.80 3046.05 Yes \n",
- "9 Bank transfer (automatic) 56.15 3487.95 No \n",
- "\n",
- "[10 rows x 21 columns]"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# After importing : Immediate step is to get the friendship with the data.\n",
- "\n",
- "#Top 10 recordings\n",
- "data.head(10)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "12cdffa9",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " count | \n",
- " mean | \n",
- " std | \n",
- " min | \n",
- " 25% | \n",
- " 50% | \n",
- " 75% | \n",
- " max | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | SeniorCitizen | \n",
- " 7043.0 | \n",
- " 0.162147 | \n",
- " 0.368612 | \n",
- " 0.00 | \n",
- " 0.0 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 1.00 | \n",
- "
\n",
- " \n",
- " | tenure | \n",
- " 7043.0 | \n",
- " 32.371149 | \n",
- " 24.559481 | \n",
- " 0.00 | \n",
- " 9.0 | \n",
- " 29.00 | \n",
- " 55.00 | \n",
- " 72.00 | \n",
- "
\n",
- " \n",
- " | MonthlyCharges | \n",
- " 7043.0 | \n",
- " 64.761692 | \n",
- " 30.090047 | \n",
- " 18.25 | \n",
- " 35.5 | \n",
- " 70.35 | \n",
- " 89.85 | \n",
- " 118.75 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " count mean std min 25% 50% 75% \\\n",
- "SeniorCitizen 7043.0 0.162147 0.368612 0.00 0.0 0.00 0.00 \n",
- "tenure 7043.0 32.371149 24.559481 0.00 9.0 29.00 55.00 \n",
- "MonthlyCharges 7043.0 64.761692 30.090047 18.25 35.5 70.35 89.85 \n",
- "\n",
- " max \n",
- "SeniorCitizen 1.00 \n",
- "tenure 72.00 \n",
- "MonthlyCharges 118.75 "
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#descriptive stats for numeric columns\n",
- "data.describe().T"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "id": "512a42bb",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "customerID 0\n",
- "gender 0\n",
- "SeniorCitizen 0\n",
- "Partner 0\n",
- "Dependents 0\n",
- "tenure 0\n",
- "PhoneService 0\n",
- "MultipleLines 0\n",
- "InternetService 0\n",
- "OnlineSecurity 0\n",
- "OnlineBackup 0\n",
- "DeviceProtection 0\n",
- "TechSupport 0\n",
- "StreamingTV 0\n",
- "StreamingMovies 0\n",
- "Contract 0\n",
- "PaperlessBilling 0\n",
- "PaymentMethod 0\n",
- "MonthlyCharges 0\n",
- "TotalCharges 0\n",
- "Churn 0\n",
- "dtype: int64"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#$checking null Values in the data\n",
- "data.isnull().sum()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "3182c4a4",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "RangeIndex: 7043 entries, 0 to 7042\n",
- "Data columns (total 21 columns):\n",
- " # Column Non-Null Count Dtype \n",
- "--- ------ -------------- ----- \n",
- " 0 customerID 7043 non-null object \n",
- " 1 gender 7043 non-null object \n",
- " 2 SeniorCitizen 7043 non-null int64 \n",
- " 3 Partner 7043 non-null object \n",
- " 4 Dependents 7043 non-null object \n",
- " 5 tenure 7043 non-null int64 \n",
- " 6 PhoneService 7043 non-null object \n",
- " 7 MultipleLines 7043 non-null object \n",
- " 8 InternetService 7043 non-null object \n",
- " 9 OnlineSecurity 7043 non-null object \n",
- " 10 OnlineBackup 7043 non-null object \n",
- " 11 DeviceProtection 7043 non-null object \n",
- " 12 TechSupport 7043 non-null object \n",
- " 13 StreamingTV 7043 non-null object \n",
- " 14 StreamingMovies 7043 non-null object \n",
- " 15 Contract 7043 non-null object \n",
- " 16 PaperlessBilling 7043 non-null object \n",
- " 17 PaymentMethod 7043 non-null object \n",
- " 18 MonthlyCharges 7043 non-null float64\n",
- " 19 TotalCharges 7043 non-null object \n",
- " 20 Churn 7043 non-null object \n",
- "dtypes: float64(1), int64(2), object(18)\n",
- "memory usage: 1.1+ MB\n"
- ]
- }
- ],
- "source": [
- "data.info()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "id": "12040083",
- "metadata": {},
- "outputs": [],
- "source": [
- "#changing total charges to numeric as it is continuos variable\n",
- "data['TotalCharges'] = pd.to_numeric(data['TotalCharges'], errors = 'coerce')\n",
- "\n",
- "#errors = 'coerce' : It will ignore all non-numeric values.It will replace all non-numeric values with NaN."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "f31e0524",
- "metadata": {},
- "outputs": [],
- "source": [
- "#drop nan values\n",
- "data = data.dropna(how='any', axis = 0)\n",
- "\n",
- "# axis=0 will be removing rows from dataset.\n",
- "# axis=1 will be removing columns"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "7a25184d",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "Int64Index: 7032 entries, 0 to 7042\n",
- "Data columns (total 21 columns):\n",
- " # Column Non-Null Count Dtype \n",
- "--- ------ -------------- ----- \n",
- " 0 customerID 7032 non-null object \n",
- " 1 gender 7032 non-null object \n",
- " 2 SeniorCitizen 7032 non-null int64 \n",
- " 3 Partner 7032 non-null object \n",
- " 4 Dependents 7032 non-null object \n",
- " 5 tenure 7032 non-null int64 \n",
- " 6 PhoneService 7032 non-null object \n",
- " 7 MultipleLines 7032 non-null object \n",
- " 8 InternetService 7032 non-null object \n",
- " 9 OnlineSecurity 7032 non-null object \n",
- " 10 OnlineBackup 7032 non-null object \n",
- " 11 DeviceProtection 7032 non-null object \n",
- " 12 TechSupport 7032 non-null object \n",
- " 13 StreamingTV 7032 non-null object \n",
- " 14 StreamingMovies 7032 non-null object \n",
- " 15 Contract 7032 non-null object \n",
- " 16 PaperlessBilling 7032 non-null object \n",
- " 17 PaymentMethod 7032 non-null object \n",
- " 18 MonthlyCharges 7032 non-null float64\n",
- " 19 TotalCharges 7032 non-null float64\n",
- " 20 Churn 7032 non-null object \n",
- "dtypes: float64(2), int64(2), object(17)\n",
- "memory usage: 1.2+ MB\n"
- ]
- }
- ],
- "source": [
- "data.info()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "7fbf471f",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " index | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " ... | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- " 7590-VHVEG | \n",
- " Female | \n",
- " 0 | \n",
- " Yes | \n",
- " No | \n",
- " 1 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 29.85 | \n",
- " 29.85 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 1 | \n",
- " 5575-GNVDE | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 34 | \n",
- " Yes | \n",
- " No | \n",
- " DSL | \n",
- " ... | \n",
- " Yes | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " One year | \n",
- " No | \n",
- " Mailed check | \n",
- " 56.95 | \n",
- " 1889.50 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 2 | \n",
- " 3668-QPYBK | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 2 | \n",
- " Yes | \n",
- " No | \n",
- " DSL | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Mailed check | \n",
- " 53.85 | \n",
- " 108.15 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 3 | \n",
- " 7795-CFOCW | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 45 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " ... | \n",
- " Yes | \n",
- " Yes | \n",
- " No | \n",
- " No | \n",
- " One year | \n",
- " No | \n",
- " Bank transfer (automatic) | \n",
- " 42.30 | \n",
- " 1840.75 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 4 | \n",
- " 9237-HQITU | \n",
- " Female | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 2 | \n",
- " Yes | \n",
- " No | \n",
- " Fiber optic | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 70.70 | \n",
- " 151.65 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " | 7027 | \n",
- " 7038 | \n",
- " 6840-RESVB | \n",
- " Male | \n",
- " 0 | \n",
- " Yes | \n",
- " Yes | \n",
- " 24 | \n",
- " Yes | \n",
- " Yes | \n",
- " DSL | \n",
- " ... | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " One year | \n",
- " Yes | \n",
- " Mailed check | \n",
- " 84.80 | \n",
- " 1990.50 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 7028 | \n",
- " 7039 | \n",
- " 2234-XADUH | \n",
- " Female | \n",
- " 0 | \n",
- " Yes | \n",
- " Yes | \n",
- " 72 | \n",
- " Yes | \n",
- " Yes | \n",
- " Fiber optic | \n",
- " ... | \n",
- " Yes | \n",
- " No | \n",
- " Yes | \n",
- " Yes | \n",
- " One year | \n",
- " Yes | \n",
- " Credit card (automatic) | \n",
- " 103.20 | \n",
- " 7362.90 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 7029 | \n",
- " 7040 | \n",
- " 4801-JZAZL | \n",
- " Female | \n",
- " 0 | \n",
- " Yes | \n",
- " Yes | \n",
- " 11 | \n",
- " No | \n",
- " No phone service | \n",
- " DSL | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Electronic check | \n",
- " 29.60 | \n",
- " 346.45 | \n",
- " No | \n",
- "
\n",
- " \n",
- " | 7030 | \n",
- " 7041 | \n",
- " 8361-LTMKD | \n",
- " Male | \n",
- " 1 | \n",
- " Yes | \n",
- " No | \n",
- " 4 | \n",
- " Yes | \n",
- " Yes | \n",
- " Fiber optic | \n",
- " ... | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " No | \n",
- " Month-to-month | \n",
- " Yes | \n",
- " Mailed check | \n",
- " 74.40 | \n",
- " 306.60 | \n",
- " Yes | \n",
- "
\n",
- " \n",
- " | 7031 | \n",
- " 7042 | \n",
- " 3186-AJIEK | \n",
- " Male | \n",
- " 0 | \n",
- " No | \n",
- " No | \n",
- " 66 | \n",
- " Yes | \n",
- " No | \n",
- " Fiber optic | \n",
- " ... | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " Yes | \n",
- " Two year | \n",
- " Yes | \n",
- " Bank transfer (automatic) | \n",
- " 105.65 | \n",
- " 6844.50 | \n",
- " No | \n",
- "
\n",
- " \n",
- "
\n",
- "
7032 rows × 22 columns
\n",
- "
"
- ],
- "text/plain": [
- " index customerID gender SeniorCitizen Partner Dependents tenure \\\n",
- "0 0 7590-VHVEG Female 0 Yes No 1 \n",
- "1 1 5575-GNVDE Male 0 No No 34 \n",
- "2 2 3668-QPYBK Male 0 No No 2 \n",
- "3 3 7795-CFOCW Male 0 No No 45 \n",
- "4 4 9237-HQITU Female 0 No No 2 \n",
- "... ... ... ... ... ... ... ... \n",
- "7027 7038 6840-RESVB Male 0 Yes Yes 24 \n",
- "7028 7039 2234-XADUH Female 0 Yes Yes 72 \n",
- "7029 7040 4801-JZAZL Female 0 Yes Yes 11 \n",
- "7030 7041 8361-LTMKD Male 1 Yes No 4 \n",
- "7031 7042 3186-AJIEK Male 0 No No 66 \n",
- "\n",
- " PhoneService MultipleLines InternetService ... DeviceProtection \\\n",
- "0 No No phone service DSL ... No \n",
- "1 Yes No DSL ... Yes \n",
- "2 Yes No DSL ... No \n",
- "3 No No phone service DSL ... Yes \n",
- "4 Yes No Fiber optic ... No \n",
- "... ... ... ... ... ... \n",
- "7027 Yes Yes DSL ... Yes \n",
- "7028 Yes Yes Fiber optic ... Yes \n",
- "7029 No No phone service DSL ... No \n",
- "7030 Yes Yes Fiber optic ... No \n",
- "7031 Yes No Fiber optic ... Yes \n",
- "\n",
- " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n",
- "0 No No No Month-to-month Yes \n",
- "1 No No No One year No \n",
- "2 No No No Month-to-month Yes \n",
- "3 Yes No No One year No \n",
- "4 No No No Month-to-month Yes \n",
- "... ... ... ... ... ... \n",
- "7027 Yes Yes Yes One year Yes \n",
- "7028 No Yes Yes One year Yes \n",
- "7029 No No No Month-to-month Yes \n",
- "7030 No No No Month-to-month Yes \n",
- "7031 Yes Yes Yes Two year Yes \n",
- "\n",
- " PaymentMethod MonthlyCharges TotalCharges Churn \n",
- "0 Electronic check 29.85 29.85 No \n",
- "1 Mailed check 56.95 1889.50 No \n",
- "2 Mailed check 53.85 108.15 Yes \n",
- "3 Bank transfer (automatic) 42.30 1840.75 No \n",
- "4 Electronic check 70.70 151.65 Yes \n",
- "... ... ... ... ... \n",
- "7027 Mailed check 84.80 1990.50 No \n",
- "7028 Credit card (automatic) 103.20 7362.90 No \n",
- "7029 Electronic check 29.60 346.45 No \n",
- "7030 Mailed check 74.40 306.60 Yes \n",
- "7031 Bank transfer (automatic) 105.65 6844.50 No \n",
- "\n",
- "[7032 rows x 22 columns]"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "data = data.reset_index()\n",
- "data\n",
- "\n",
- "#Pandas reset_index() is a method to reset index of a Data Frame. \n",
- "#reset_index() method sets a list of integer ranging from 0 to length of data as index."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "id": "8b145d67",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Index(['customerID', 'gender', 'Partner', 'Dependents', 'PhoneService',\n",
- " 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup',\n",
- " 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies',\n",
- " 'Contract', 'PaperlessBilling', 'PaymentMethod', 'Churn'],\n",
- " dtype='object')"
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#extratcing columns names with \"object\" Datatype\n",
- "cols = data.select_dtypes(include=['object']).columns\n",
- "cols\n",
- "# 17 object data types are present"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "id": "f0b567d6",
- "metadata": {},
- "outputs": [],
- "source": [
- "#copying datset\n",
- "data2 = data.copy()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "id": "b6e27dc6",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "RangeIndex: 7032 entries, 0 to 7031\n",
- "Data columns (total 22 columns):\n",
- " # Column Non-Null Count Dtype \n",
- "--- ------ -------------- ----- \n",
- " 0 index 7032 non-null int64 \n",
- " 1 customerID 7032 non-null int32 \n",
- " 2 gender 7032 non-null int32 \n",
- " 3 SeniorCitizen 7032 non-null int64 \n",
- " 4 Partner 7032 non-null int32 \n",
- " 5 Dependents 7032 non-null int32 \n",
- " 6 tenure 7032 non-null int64 \n",
- " 7 PhoneService 7032 non-null int32 \n",
- " 8 MultipleLines 7032 non-null int32 \n",
- " 9 InternetService 7032 non-null int32 \n",
- " 10 OnlineSecurity 7032 non-null int32 \n",
- " 11 OnlineBackup 7032 non-null int32 \n",
- " 12 DeviceProtection 7032 non-null int32 \n",
- " 13 TechSupport 7032 non-null int32 \n",
- " 14 StreamingTV 7032 non-null int32 \n",
- " 15 StreamingMovies 7032 non-null int32 \n",
- " 16 Contract 7032 non-null int32 \n",
- " 17 PaperlessBilling 7032 non-null int32 \n",
- " 18 PaymentMethod 7032 non-null int32 \n",
- " 19 MonthlyCharges 7032 non-null float64\n",
- " 20 TotalCharges 7032 non-null float64\n",
- " 21 Churn 7032 non-null int32 \n",
- "dtypes: float64(2), int32(17), int64(3)\n",
- "memory usage: 741.8 KB\n",
- "None\n"
- ]
- }
- ],
- "source": [
- "#import the LabelEncoder class from the sklearn library,\n",
- "from sklearn.preprocessing import LabelEncoder\n",
- "\n",
- "#making instance of labelnecoder\n",
- "le = LabelEncoder()\n",
- "\n",
- "\n",
- "#Label Encoding is a popular encoding technique for handling categorical variables.\n",
- "#In this technique, each label is assigned a unique integer based on alphabetical ordering\n",
- "#It can also be used to transform non-numerical labels to numerical labels.\n",
- "\n",
- "\n",
- "for i in cols:\n",
- " data2[i] = le.fit_transform(data2[i])\n",
- " \n",
- "#fit and transform the object data, and then replace the existing text data with the new encoded data.\n",
- "\n",
- "# checking the datatypes chnges or not\n",
- "print (data2.info())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "id": "2051b0f0",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " index | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " ... | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- " 5365 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 29.85 | \n",
- " 29.85 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 1 | \n",
- " 3953 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 34 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 3 | \n",
- " 56.95 | \n",
- " 1889.50 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 2 | \n",
- " 2558 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 3 | \n",
- " 53.85 | \n",
- " 108.15 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 3 | \n",
- " 5524 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 45 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 42.30 | \n",
- " 1840.75 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 4 | \n",
- " 6500 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 70.70 | \n",
- " 151.65 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 22 columns
\n",
- "
"
- ],
- "text/plain": [
- " index customerID gender SeniorCitizen Partner Dependents tenure \\\n",
- "0 0 5365 0 0 1 0 1 \n",
- "1 1 3953 1 0 0 0 34 \n",
- "2 2 2558 1 0 0 0 2 \n",
- "3 3 5524 1 0 0 0 45 \n",
- "4 4 6500 0 0 0 0 2 \n",
- "\n",
- " PhoneService MultipleLines InternetService ... DeviceProtection \\\n",
- "0 0 1 0 ... 0 \n",
- "1 1 0 0 ... 2 \n",
- "2 1 0 0 ... 0 \n",
- "3 0 1 0 ... 2 \n",
- "4 1 0 1 ... 0 \n",
- "\n",
- " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n",
- "0 0 0 0 0 1 \n",
- "1 0 0 0 1 0 \n",
- "2 0 0 0 0 1 \n",
- "3 2 0 0 1 0 \n",
- "4 0 0 0 0 1 \n",
- "\n",
- " PaymentMethod MonthlyCharges TotalCharges Churn \n",
- "0 2 29.85 29.85 0 \n",
- "1 3 56.95 1889.50 0 \n",
- "2 3 53.85 108.15 1 \n",
- "3 0 42.30 1840.75 0 \n",
- "4 2 70.70 151.65 1 \n",
- "\n",
- "[5 rows x 22 columns]"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "data2.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "id": "694b1ab5",
- "metadata": {},
- "outputs": [],
- "source": [
- "#Pandas profiling is an open source Python module with which we can quickly do an\n",
- "#exploratory data analysis with just a few lines of code.\n",
- "\n",
- "\n",
- "import pandas_profiling\n",
- "\n",
- "# SweetViz\n",
- "# Pandas-Profiling\n",
- "# Sweetviz\n",
- "# Autoviz\n",
- "# D-Tale"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "id": "8f03c4a7",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ed2a3f58d6234b028179f208a2d34cae",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Summarize dataset: 0%| | 0/35 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2648303893ec4ec4b23255473fb1959d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Generate report structure: 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4b7c6cf2b70d4c5d9eb7acd4cced03cd",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Render HTML: 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- ""
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": []
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "pandas_profiling.ProfileReport(data2)\n",
- "\n",
- "#The main disadvantage of pandas profiling is its use with large datasets.\n",
- "#With the increase in the size of the data the time to generate the report also increases a lot."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "id": "c12ed8cf",
- "metadata": {},
- "outputs": [],
- "source": [
- "def var_summary(x):\n",
- " uc = x.mean()+(2*x.std())\n",
- " lc = x.mean()-(2*x.std())\n",
- " \n",
- " for i in x:\n",
- " if iuc:\n",
- " count = 1\n",
- " else:\n",
- " count = 0\n",
- " outlier_flag = count\n",
- " return pd.Series([x.count(), x.isnull().sum(), x.sum(), x.mean(), x.median(), x.std(), x.var(), x.min(), x.quantile(0.01), x.quantile(0.05),x.quantile(0.10),x.quantile(0.25),x.quantile(0.50),x.quantile(0.75), x.quantile(0.90),x.quantile(0.95), x.quantile(0.99),x.max() , lc , uc,outlier_flag],\n",
- " index=['N', 'NMISS', 'SUM', 'MEAN','MEDIAN', 'STD', 'VAR', 'MIN', 'P1' , 'P5' ,'P10' ,'P25' ,'P50' ,'P75' ,'P90' ,'P95' ,'P99' ,'MAX','LC','UC','outlier_flag'])\n",
- "\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "id": "eb5ff419",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " N | \n",
- " NMISS | \n",
- " SUM | \n",
- " MEAN | \n",
- " MEDIAN | \n",
- " STD | \n",
- " VAR | \n",
- " MIN | \n",
- " P1 | \n",
- " P5 | \n",
- " ... | \n",
- " P25 | \n",
- " P50 | \n",
- " P75 | \n",
- " P90 | \n",
- " P95 | \n",
- " P99 | \n",
- " MAX | \n",
- " LC | \n",
- " UC | \n",
- " outlier_flag | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | df_index | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 24763625.0 | \n",
- " 3521.562144 | \n",
- " 3521.500 | \n",
- " 2032.832448 | \n",
- " 4.132408e+06 | \n",
- " 0.00 | \n",
- " 70.31 | \n",
- " 351.550 | \n",
- " ... | \n",
- " 1762.7500 | \n",
- " 3521.500 | \n",
- " 5282.2500 | \n",
- " 6336.900 | \n",
- " 6689.4500 | \n",
- " 6971.6900 | \n",
- " 7042.00 | \n",
- " -544.102752 | \n",
- " 7587.227041 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | customerID | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 24720996.0 | \n",
- " 3515.500000 | \n",
- " 3515.500 | \n",
- " 2030.107879 | \n",
- " 4.121338e+06 | \n",
- " 0.00 | \n",
- " 70.31 | \n",
- " 351.550 | \n",
- " ... | \n",
- " 1757.7500 | \n",
- " 3515.500 | \n",
- " 5273.2500 | \n",
- " 6327.900 | \n",
- " 6679.4500 | \n",
- " 6960.6900 | \n",
- " 7031.00 | \n",
- " -544.715758 | \n",
- " 7575.715758 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | gender | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 3549.0 | \n",
- " 0.504693 | \n",
- " 1.000 | \n",
- " 0.500014 | \n",
- " 2.500135e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.495334 | \n",
- " 1.504720 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | SeniorCitizen | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 1142.0 | \n",
- " 0.162400 | \n",
- " 0.000 | \n",
- " 0.368844 | \n",
- " 1.360459e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 0.000 | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.575288 | \n",
- " 0.900088 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | Partner | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 3393.0 | \n",
- " 0.482509 | \n",
- " 0.000 | \n",
- " 0.499729 | \n",
- " 2.497296e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 0.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.516950 | \n",
- " 1.481968 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | Dependents | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 2099.0 | \n",
- " 0.298493 | \n",
- " 0.000 | \n",
- " 0.457629 | \n",
- " 2.094246e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 0.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.616766 | \n",
- " 1.213751 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | tenure | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 227990.0 | \n",
- " 32.421786 | \n",
- " 29.000 | \n",
- " 24.545260 | \n",
- " 6.024698e+02 | \n",
- " 1.00 | \n",
- " 1.00 | \n",
- " 1.000 | \n",
- " ... | \n",
- " 9.0000 | \n",
- " 29.000 | \n",
- " 55.0000 | \n",
- " 69.000 | \n",
- " 72.0000 | \n",
- " 72.0000 | \n",
- " 72.00 | \n",
- " -16.668733 | \n",
- " 81.512306 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | PhoneService | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6352.0 | \n",
- " 0.903299 | \n",
- " 1.000 | \n",
- " 0.295571 | \n",
- " 8.736218e-02 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " 0.312157 | \n",
- " 1.494441 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | MultipleLines | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6614.0 | \n",
- " 0.940557 | \n",
- " 1.000 | \n",
- " 0.948627 | \n",
- " 8.998938e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.956697 | \n",
- " 2.837812 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | InternetService | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6136.0 | \n",
- " 0.872582 | \n",
- " 1.000 | \n",
- " 0.737271 | \n",
- " 5.435690e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.601960 | \n",
- " 2.347125 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | OnlineSecurity | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 5550.0 | \n",
- " 0.789249 | \n",
- " 1.000 | \n",
- " 0.859962 | \n",
- " 7.395345e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.930675 | \n",
- " 2.509173 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | OnlineBackup | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6370.0 | \n",
- " 0.905859 | \n",
- " 1.000 | \n",
- " 0.880394 | \n",
- " 7.750930e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.854928 | \n",
- " 2.666646 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | DeviceProtection | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6356.0 | \n",
- " 0.903868 | \n",
- " 1.000 | \n",
- " 0.880178 | \n",
- " 7.747141e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.856489 | \n",
- " 2.664225 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | TechSupport | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 5600.0 | \n",
- " 0.796359 | \n",
- " 1.000 | \n",
- " 0.861674 | \n",
- " 7.424814e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.926988 | \n",
- " 2.519707 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | StreamingTV | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6926.0 | \n",
- " 0.984926 | \n",
- " 1.000 | \n",
- " 0.885285 | \n",
- " 7.837295e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.785644 | \n",
- " 2.755496 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | StreamingMovies | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 6982.0 | \n",
- " 0.992890 | \n",
- " 1.000 | \n",
- " 0.885385 | \n",
- " 7.839062e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 2.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.777880 | \n",
- " 2.763659 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | Contract | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 4842.0 | \n",
- " 0.688567 | \n",
- " 0.000 | \n",
- " 0.832934 | \n",
- " 6.937791e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 0.000 | \n",
- " 1.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 2.0000 | \n",
- " 2.00 | \n",
- " -0.977301 | \n",
- " 2.354435 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | PaperlessBilling | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 4168.0 | \n",
- " 0.592719 | \n",
- " 1.000 | \n",
- " 0.491363 | \n",
- " 2.414375e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.390007 | \n",
- " 1.575445 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | PaymentMethod | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 11063.0 | \n",
- " 1.573237 | \n",
- " 2.000 | \n",
- " 1.067504 | \n",
- " 1.139565e+00 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 1.0000 | \n",
- " 2.000 | \n",
- " 2.0000 | \n",
- " 3.000 | \n",
- " 3.0000 | \n",
- " 3.0000 | \n",
- " 3.00 | \n",
- " -0.561772 | \n",
- " 3.708245 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | MonthlyCharges | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 455661.0 | \n",
- " 64.798208 | \n",
- " 70.350 | \n",
- " 30.085974 | \n",
- " 9.051658e+02 | \n",
- " 18.25 | \n",
- " 19.20 | \n",
- " 19.650 | \n",
- " ... | \n",
- " 35.5875 | \n",
- " 70.350 | \n",
- " 89.8625 | \n",
- " 102.645 | \n",
- " 107.4225 | \n",
- " 114.7345 | \n",
- " 118.75 | \n",
- " 4.626260 | \n",
- " 124.970156 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " | TotalCharges | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 16056168.7 | \n",
- " 2283.300441 | \n",
- " 1397.475 | \n",
- " 2266.771362 | \n",
- " 5.138252e+06 | \n",
- " 18.80 | \n",
- " 19.90 | \n",
- " 49.605 | \n",
- " ... | \n",
- " 401.4500 | \n",
- " 1397.475 | \n",
- " 3794.7375 | \n",
- " 5976.640 | \n",
- " 6923.5900 | \n",
- " 8039.8830 | \n",
- " 8684.80 | \n",
- " -2250.242283 | \n",
- " 6816.843165 | \n",
- " 1.0 | \n",
- "
\n",
- " \n",
- " | Churn | \n",
- " 7032.0 | \n",
- " 0.0 | \n",
- " 1869.0 | \n",
- " 0.265785 | \n",
- " 0.000 | \n",
- " 0.441782 | \n",
- " 1.951711e-01 | \n",
- " 0.00 | \n",
- " 0.00 | \n",
- " 0.000 | \n",
- " ... | \n",
- " 0.0000 | \n",
- " 0.000 | \n",
- " 1.0000 | \n",
- " 1.000 | \n",
- " 1.0000 | \n",
- " 1.0000 | \n",
- " 1.00 | \n",
- " -0.617778 | \n",
- " 1.149348 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
22 rows × 21 columns
\n",
- "
"
- ],
- "text/plain": [
- " N NMISS SUM MEAN MEDIAN \\\n",
- "df_index 7032.0 0.0 24763625.0 3521.562144 3521.500 \n",
- "customerID 7032.0 0.0 24720996.0 3515.500000 3515.500 \n",
- "gender 7032.0 0.0 3549.0 0.504693 1.000 \n",
- "SeniorCitizen 7032.0 0.0 1142.0 0.162400 0.000 \n",
- "Partner 7032.0 0.0 3393.0 0.482509 0.000 \n",
- "Dependents 7032.0 0.0 2099.0 0.298493 0.000 \n",
- "tenure 7032.0 0.0 227990.0 32.421786 29.000 \n",
- "PhoneService 7032.0 0.0 6352.0 0.903299 1.000 \n",
- "MultipleLines 7032.0 0.0 6614.0 0.940557 1.000 \n",
- "InternetService 7032.0 0.0 6136.0 0.872582 1.000 \n",
- "OnlineSecurity 7032.0 0.0 5550.0 0.789249 1.000 \n",
- "OnlineBackup 7032.0 0.0 6370.0 0.905859 1.000 \n",
- "DeviceProtection 7032.0 0.0 6356.0 0.903868 1.000 \n",
- "TechSupport 7032.0 0.0 5600.0 0.796359 1.000 \n",
- "StreamingTV 7032.0 0.0 6926.0 0.984926 1.000 \n",
- "StreamingMovies 7032.0 0.0 6982.0 0.992890 1.000 \n",
- "Contract 7032.0 0.0 4842.0 0.688567 0.000 \n",
- "PaperlessBilling 7032.0 0.0 4168.0 0.592719 1.000 \n",
- "PaymentMethod 7032.0 0.0 11063.0 1.573237 2.000 \n",
- "MonthlyCharges 7032.0 0.0 455661.0 64.798208 70.350 \n",
- "TotalCharges 7032.0 0.0 16056168.7 2283.300441 1397.475 \n",
- "Churn 7032.0 0.0 1869.0 0.265785 0.000 \n",
- "\n",
- " STD VAR MIN P1 P5 ... \\\n",
- "df_index 2032.832448 4.132408e+06 0.00 70.31 351.550 ... \n",
- "customerID 2030.107879 4.121338e+06 0.00 70.31 351.550 ... \n",
- "gender 0.500014 2.500135e-01 0.00 0.00 0.000 ... \n",
- "SeniorCitizen 0.368844 1.360459e-01 0.00 0.00 0.000 ... \n",
- "Partner 0.499729 2.497296e-01 0.00 0.00 0.000 ... \n",
- "Dependents 0.457629 2.094246e-01 0.00 0.00 0.000 ... \n",
- "tenure 24.545260 6.024698e+02 1.00 1.00 1.000 ... \n",
- "PhoneService 0.295571 8.736218e-02 0.00 0.00 0.000 ... \n",
- "MultipleLines 0.948627 8.998938e-01 0.00 0.00 0.000 ... \n",
- "InternetService 0.737271 5.435690e-01 0.00 0.00 0.000 ... \n",
- "OnlineSecurity 0.859962 7.395345e-01 0.00 0.00 0.000 ... \n",
- "OnlineBackup 0.880394 7.750930e-01 0.00 0.00 0.000 ... \n",
- "DeviceProtection 0.880178 7.747141e-01 0.00 0.00 0.000 ... \n",
- "TechSupport 0.861674 7.424814e-01 0.00 0.00 0.000 ... \n",
- "StreamingTV 0.885285 7.837295e-01 0.00 0.00 0.000 ... \n",
- "StreamingMovies 0.885385 7.839062e-01 0.00 0.00 0.000 ... \n",
- "Contract 0.832934 6.937791e-01 0.00 0.00 0.000 ... \n",
- "PaperlessBilling 0.491363 2.414375e-01 0.00 0.00 0.000 ... \n",
- "PaymentMethod 1.067504 1.139565e+00 0.00 0.00 0.000 ... \n",
- "MonthlyCharges 30.085974 9.051658e+02 18.25 19.20 19.650 ... \n",
- "TotalCharges 2266.771362 5.138252e+06 18.80 19.90 49.605 ... \n",
- "Churn 0.441782 1.951711e-01 0.00 0.00 0.000 ... \n",
- "\n",
- " P25 P50 P75 P90 P95 \\\n",
- "df_index 1762.7500 3521.500 5282.2500 6336.900 6689.4500 \n",
- "customerID 1757.7500 3515.500 5273.2500 6327.900 6679.4500 \n",
- "gender 0.0000 1.000 1.0000 1.000 1.0000 \n",
- "SeniorCitizen 0.0000 0.000 0.0000 1.000 1.0000 \n",
- "Partner 0.0000 0.000 1.0000 1.000 1.0000 \n",
- "Dependents 0.0000 0.000 1.0000 1.000 1.0000 \n",
- "tenure 9.0000 29.000 55.0000 69.000 72.0000 \n",
- "PhoneService 1.0000 1.000 1.0000 1.000 1.0000 \n",
- "MultipleLines 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "InternetService 0.0000 1.000 1.0000 2.000 2.0000 \n",
- "OnlineSecurity 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "OnlineBackup 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "DeviceProtection 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "TechSupport 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "StreamingTV 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "StreamingMovies 0.0000 1.000 2.0000 2.000 2.0000 \n",
- "Contract 0.0000 0.000 1.0000 2.000 2.0000 \n",
- "PaperlessBilling 0.0000 1.000 1.0000 1.000 1.0000 \n",
- "PaymentMethod 1.0000 2.000 2.0000 3.000 3.0000 \n",
- "MonthlyCharges 35.5875 70.350 89.8625 102.645 107.4225 \n",
- "TotalCharges 401.4500 1397.475 3794.7375 5976.640 6923.5900 \n",
- "Churn 0.0000 0.000 1.0000 1.000 1.0000 \n",
- "\n",
- " P99 MAX LC UC outlier_flag \n",
- "df_index 6971.6900 7042.00 -544.102752 7587.227041 0.0 \n",
- "customerID 6960.6900 7031.00 -544.715758 7575.715758 0.0 \n",
- "gender 1.0000 1.00 -0.495334 1.504720 0.0 \n",
- "SeniorCitizen 1.0000 1.00 -0.575288 0.900088 0.0 \n",
- "Partner 1.0000 1.00 -0.516950 1.481968 0.0 \n",
- "Dependents 1.0000 1.00 -0.616766 1.213751 0.0 \n",
- "tenure 72.0000 72.00 -16.668733 81.512306 0.0 \n",
- "PhoneService 1.0000 1.00 0.312157 1.494441 0.0 \n",
- "MultipleLines 2.0000 2.00 -0.956697 2.837812 0.0 \n",
- "InternetService 2.0000 2.00 -0.601960 2.347125 0.0 \n",
- "OnlineSecurity 2.0000 2.00 -0.930675 2.509173 0.0 \n",
- "OnlineBackup 2.0000 2.00 -0.854928 2.666646 0.0 \n",
- "DeviceProtection 2.0000 2.00 -0.856489 2.664225 0.0 \n",
- "TechSupport 2.0000 2.00 -0.926988 2.519707 0.0 \n",
- "StreamingTV 2.0000 2.00 -0.785644 2.755496 0.0 \n",
- "StreamingMovies 2.0000 2.00 -0.777880 2.763659 0.0 \n",
- "Contract 2.0000 2.00 -0.977301 2.354435 0.0 \n",
- "PaperlessBilling 1.0000 1.00 -0.390007 1.575445 0.0 \n",
- "PaymentMethod 3.0000 3.00 -0.561772 3.708245 0.0 \n",
- "MonthlyCharges 114.7345 118.75 4.626260 124.970156 0.0 \n",
- "TotalCharges 8039.8830 8684.80 -2250.242283 6816.843165 1.0 \n",
- "Churn 1.0000 1.00 -0.617778 1.149348 0.0 \n",
- "\n",
- "[22 rows x 21 columns]"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "data2.apply(lambda x: var_summary(x)).T"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ac7d7dec",
- "metadata": {},
- "source": [
- "# Linear Regression"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "21f26774",
- "metadata": {},
- "source": [
- "\n",
- "> Linear regression is an approach for modeling the relationship between a scalar dependent variable y and one or more explanatory variables (or independent variables) denoted X. The case of one explanatory variable is called simple linear regression. For more than one explanatory variable, the process is called multiple linear regression
\n",
- "> A simple linear regression model is given by Y=mX+b
\n",
- "> where m is the slope and b is the y-intercept. Y is the dependent variable and X is the explanatory variable.
\n",
- "> Very briefly and simplistically, Linear Regression is a class of techniques for fitting a straight line to a set of data points.\n",
- "Linear Regression has dependent variables that have continuous values"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a6f253da",
- "metadata": {},
- "source": [
- "A linear regression line has an equation of the form Y = a + bX, where X is the explanatory variable and Y is the dependent variable. The slope of the line is b, and a is the intercept (the value of y when x = 0)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "7a0c5ae7",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "id": "96840e52",
- "metadata": {},
- "outputs": [],
- "source": [
- "X_1 = data2.drop('TotalCharges', axis = 1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "id": "519b7e27",
- "metadata": {},
- "outputs": [],
- "source": [
- "y_1 = data2['TotalCharges']"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "id": "5d6fde32",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " df_index | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " ... | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | df_index | \n",
- " 1.000000 | \n",
- " -0.006309 | \n",
- " -0.008463 | \n",
- " 0.008057 | \n",
- " 0.000162 | \n",
- " -0.004762 | \n",
- " 0.006801 | \n",
- " -0.028257 | \n",
- " -0.006518 | \n",
- " -0.007689 | \n",
- " ... | \n",
- " -0.006353 | \n",
- " 0.008621 | \n",
- " -0.000675 | \n",
- " -0.017201 | \n",
- " 0.003949 | \n",
- " 0.002143 | \n",
- " 0.021046 | \n",
- " -0.012938 | \n",
- " 0.001820 | \n",
- " 0.010133 | \n",
- "
\n",
- " \n",
- " | customerID | \n",
- " -0.006309 | \n",
- " 1.000000 | \n",
- " 0.006235 | \n",
- " -0.002368 | \n",
- " -0.026509 | \n",
- " -0.011871 | \n",
- " 0.007209 | \n",
- " -0.006987 | \n",
- " 0.004497 | \n",
- " -0.012335 | \n",
- " ... | \n",
- " -0.006726 | \n",
- " 0.001763 | \n",
- " -0.007650 | \n",
- " -0.017207 | \n",
- " 0.015949 | \n",
- " -0.002225 | \n",
- " 0.011754 | \n",
- " -0.004445 | \n",
- " -0.000263 | \n",
- " -0.017858 | \n",
- "
\n",
- " \n",
- " | gender | \n",
- " -0.008463 | \n",
- " 0.006235 | \n",
- " 1.000000 | \n",
- " -0.001819 | \n",
- " -0.001379 | \n",
- " 0.010349 | \n",
- " 0.005285 | \n",
- " -0.007515 | \n",
- " -0.006908 | \n",
- " -0.002236 | \n",
- " ... | \n",
- " 0.001348 | \n",
- " -0.006695 | \n",
- " -0.005624 | \n",
- " -0.008920 | \n",
- " 0.000095 | \n",
- " -0.011902 | \n",
- " 0.016942 | \n",
- " -0.013779 | \n",
- " 0.000048 | \n",
- " -0.008545 | \n",
- "
\n",
- " \n",
- " | SeniorCitizen | \n",
- " 0.008057 | \n",
- " -0.002368 | \n",
- " -0.001819 | \n",
- " 1.000000 | \n",
- " 0.016957 | \n",
- " -0.210550 | \n",
- " 0.015683 | \n",
- " 0.008392 | \n",
- " 0.146287 | \n",
- " -0.032160 | \n",
- " ... | \n",
- " -0.021124 | \n",
- " -0.151007 | \n",
- " 0.031019 | \n",
- " 0.047088 | \n",
- " -0.141820 | \n",
- " 0.156258 | \n",
- " -0.038158 | \n",
- " 0.219874 | \n",
- " 0.102411 | \n",
- " 0.150541 | \n",
- "
\n",
- " \n",
- " | Partner | \n",
- " 0.000162 | \n",
- " -0.026509 | \n",
- " -0.001379 | \n",
- " 0.016957 | \n",
- " 1.000000 | \n",
- " 0.452269 | \n",
- " 0.381912 | \n",
- " 0.018397 | \n",
- " 0.142717 | \n",
- " 0.000513 | \n",
- " ... | \n",
- " 0.165614 | \n",
- " 0.126488 | \n",
- " 0.136679 | \n",
- " 0.129907 | \n",
- " 0.294094 | \n",
- " -0.013957 | \n",
- " -0.156232 | \n",
- " 0.097825 | \n",
- " 0.319072 | \n",
- " -0.149982 | \n",
- "
\n",
- " \n",
- " | Dependents | \n",
- " -0.004762 | \n",
- " -0.011871 | \n",
- " 0.010349 | \n",
- " -0.210550 | \n",
- " 0.452269 | \n",
- " 1.000000 | \n",
- " 0.163386 | \n",
- " -0.001078 | \n",
- " -0.024975 | \n",
- " 0.044030 | \n",
- " ... | \n",
- " 0.079723 | \n",
- " 0.132530 | \n",
- " 0.046214 | \n",
- " 0.022088 | \n",
- " 0.240556 | \n",
- " -0.110131 | \n",
- " -0.041989 | \n",
- " -0.112343 | \n",
- " 0.064653 | \n",
- " -0.163128 | \n",
- "
\n",
- " \n",
- " | tenure | \n",
- " 0.006801 | \n",
- " 0.007209 | \n",
- " 0.005285 | \n",
- " 0.015683 | \n",
- " 0.381912 | \n",
- " 0.163386 | \n",
- " 1.000000 | \n",
- " 0.007877 | \n",
- " 0.343673 | \n",
- " -0.029835 | \n",
- " ... | \n",
- " 0.372669 | \n",
- " 0.324729 | \n",
- " 0.290572 | \n",
- " 0.296785 | \n",
- " 0.676734 | \n",
- " 0.004823 | \n",
- " -0.370087 | \n",
- " 0.246862 | \n",
- " 0.825880 | \n",
- " -0.354049 | \n",
- "
\n",
- " \n",
- " | PhoneService | \n",
- " -0.028257 | \n",
- " -0.006987 | \n",
- " -0.007515 | \n",
- " 0.008392 | \n",
- " 0.018397 | \n",
- " -0.001078 | \n",
- " 0.007877 | \n",
- " 1.000000 | \n",
- " -0.020504 | \n",
- " 0.387266 | \n",
- " ... | \n",
- " 0.004718 | \n",
- " -0.018136 | \n",
- " 0.056393 | \n",
- " 0.043025 | \n",
- " 0.003019 | \n",
- " 0.016696 | \n",
- " -0.005499 | \n",
- " 0.248033 | \n",
- " 0.113008 | \n",
- " 0.011691 | \n",
- "
\n",
- " \n",
- " | MultipleLines | \n",
- " -0.006518 | \n",
- " 0.004497 | \n",
- " -0.006908 | \n",
- " 0.146287 | \n",
- " 0.142717 | \n",
- " -0.024975 | \n",
- " 0.343673 | \n",
- " -0.020504 | \n",
- " 1.000000 | \n",
- " -0.108849 | \n",
- " ... | \n",
- " 0.122614 | \n",
- " 0.010941 | \n",
- " 0.175403 | \n",
- " 0.181705 | \n",
- " 0.111029 | \n",
- " 0.165306 | \n",
- " -0.176598 | \n",
- " 0.433905 | \n",
- " 0.453202 | \n",
- " 0.038043 | \n",
- "
\n",
- " \n",
- " | InternetService | \n",
- " -0.007689 | \n",
- " -0.012335 | \n",
- " -0.002236 | \n",
- " -0.032160 | \n",
- " 0.000513 | \n",
- " 0.044030 | \n",
- " -0.029835 | \n",
- " 0.387266 | \n",
- " -0.108849 | \n",
- " 1.000000 | \n",
- " ... | \n",
- " 0.045558 | \n",
- " -0.025626 | \n",
- " 0.108190 | \n",
- " 0.097967 | \n",
- " 0.099579 | \n",
- " -0.138166 | \n",
- " 0.084504 | \n",
- " -0.322173 | \n",
- " -0.175691 | \n",
- " -0.047097 | \n",
- "
\n",
- " \n",
- " | OnlineSecurity | \n",
- " -0.001053 | \n",
- " 0.013740 | \n",
- " -0.014899 | \n",
- " -0.127937 | \n",
- " 0.150610 | \n",
- " 0.151198 | \n",
- " 0.327283 | \n",
- " -0.014163 | \n",
- " 0.007306 | \n",
- " -0.028003 | \n",
- " ... | \n",
- " 0.175789 | \n",
- " 0.284875 | \n",
- " 0.044399 | \n",
- " 0.056313 | \n",
- " 0.373980 | \n",
- " -0.157723 | \n",
- " -0.096593 | \n",
- " -0.053576 | \n",
- " 0.254473 | \n",
- " -0.289050 | \n",
- "
\n",
- " \n",
- " | OnlineBackup | \n",
- " 0.004099 | \n",
- " -0.002960 | \n",
- " -0.011920 | \n",
- " -0.013355 | \n",
- " 0.153045 | \n",
- " 0.090231 | \n",
- " 0.372434 | \n",
- " 0.024040 | \n",
- " 0.117276 | \n",
- " 0.036735 | \n",
- " ... | \n",
- " 0.187646 | \n",
- " 0.195581 | \n",
- " 0.147085 | \n",
- " 0.137083 | \n",
- " 0.280617 | \n",
- " -0.012697 | \n",
- " -0.125534 | \n",
- " 0.119943 | \n",
- " 0.375556 | \n",
- " -0.195290 | \n",
- "
\n",
- " \n",
- " | DeviceProtection | \n",
- " -0.006353 | \n",
- " -0.006726 | \n",
- " 0.001348 | \n",
- " -0.021124 | \n",
- " 0.165614 | \n",
- " 0.079723 | \n",
- " 0.372669 | \n",
- " 0.004718 | \n",
- " 0.122614 | \n",
- " 0.045558 | \n",
- " ... | \n",
- " 1.000000 | \n",
- " 0.240476 | \n",
- " 0.275947 | \n",
- " 0.289309 | \n",
- " 0.350067 | \n",
- " -0.037596 | \n",
- " -0.136460 | \n",
- " 0.163984 | \n",
- " 0.389066 | \n",
- " -0.177883 | \n",
- "
\n",
- " \n",
- " | TechSupport | \n",
- " 0.008621 | \n",
- " 0.001763 | \n",
- " -0.006695 | \n",
- " -0.151007 | \n",
- " 0.126488 | \n",
- " 0.132530 | \n",
- " 0.324729 | \n",
- " -0.018136 | \n",
- " 0.010941 | \n",
- " -0.025626 | \n",
- " ... | \n",
- " 0.240476 | \n",
- " 1.000000 | \n",
- " 0.161168 | \n",
- " 0.162530 | \n",
- " 0.425072 | \n",
- " -0.113617 | \n",
- " -0.104544 | \n",
- " -0.008237 | \n",
- " 0.276890 | \n",
- " -0.282232 | \n",
- "
\n",
- " \n",
- " | StreamingTV | \n",
- " -0.000675 | \n",
- " -0.007650 | \n",
- " -0.005624 | \n",
- " 0.031019 | \n",
- " 0.136679 | \n",
- " 0.046214 | \n",
- " 0.290572 | \n",
- " 0.056393 | \n",
- " 0.175403 | \n",
- " 0.108190 | \n",
- " ... | \n",
- " 0.275947 | \n",
- " 0.161168 | \n",
- " 1.000000 | \n",
- " 0.435354 | \n",
- " 0.226826 | \n",
- " 0.097379 | \n",
- " -0.104782 | \n",
- " 0.337156 | \n",
- " 0.392472 | \n",
- " -0.036303 | \n",
- "
\n",
- " \n",
- " | StreamingMovies | \n",
- " -0.017201 | \n",
- " -0.017207 | \n",
- " -0.008920 | \n",
- " 0.047088 | \n",
- " 0.129907 | \n",
- " 0.022088 | \n",
- " 0.296785 | \n",
- " 0.043025 | \n",
- " 0.181705 | \n",
- " 0.097967 | \n",
- " ... | \n",
- " 0.289309 | \n",
- " 0.162530 | \n",
- " 0.435354 | \n",
- " 1.000000 | \n",
- " 0.232478 | \n",
- " 0.083901 | \n",
- " -0.112009 | \n",
- " 0.335761 | \n",
- " 0.398088 | \n",
- " -0.038802 | \n",
- "
\n",
- " \n",
- " | Contract | \n",
- " 0.003949 | \n",
- " 0.015949 | \n",
- " 0.000095 | \n",
- " -0.141820 | \n",
- " 0.294094 | \n",
- " 0.240556 | \n",
- " 0.676734 | \n",
- " 0.003019 | \n",
- " 0.111029 | \n",
- " 0.099579 | \n",
- " ... | \n",
- " 0.350067 | \n",
- " 0.425072 | \n",
- " 0.226826 | \n",
- " 0.232478 | \n",
- " 1.000000 | \n",
- " -0.175475 | \n",
- " -0.229636 | \n",
- " -0.072739 | \n",
- " 0.450306 | \n",
- " -0.396150 | \n",
- "
\n",
- " \n",
- " | PaperlessBilling | \n",
- " 0.002143 | \n",
- " -0.002225 | \n",
- " -0.011902 | \n",
- " 0.156258 | \n",
- " -0.013957 | \n",
- " -0.110131 | \n",
- " 0.004823 | \n",
- " 0.016696 | \n",
- " 0.165306 | \n",
- " -0.138166 | \n",
- " ... | \n",
- " -0.037596 | \n",
- " -0.113617 | \n",
- " 0.097379 | \n",
- " 0.083901 | \n",
- " -0.175475 | \n",
- " 1.000000 | \n",
- " -0.061348 | \n",
- " 0.351930 | \n",
- " 0.157830 | \n",
- " 0.191454 | \n",
- "
\n",
- " \n",
- " | PaymentMethod | \n",
- " 0.021046 | \n",
- " 0.011754 | \n",
- " 0.016942 | \n",
- " -0.038158 | \n",
- " -0.156232 | \n",
- " -0.041989 | \n",
- " -0.370087 | \n",
- " -0.005499 | \n",
- " -0.176598 | \n",
- " 0.084504 | \n",
- " ... | \n",
- " -0.136460 | \n",
- " -0.104544 | \n",
- " -0.104782 | \n",
- " -0.112009 | \n",
- " -0.229636 | \n",
- " -0.061348 | \n",
- " 1.000000 | \n",
- " -0.192500 | \n",
- " -0.330594 | \n",
- " 0.107852 | \n",
- "
\n",
- " \n",
- " | MonthlyCharges | \n",
- " -0.012938 | \n",
- " -0.004445 | \n",
- " -0.013779 | \n",
- " 0.219874 | \n",
- " 0.097825 | \n",
- " -0.112343 | \n",
- " 0.246862 | \n",
- " 0.248033 | \n",
- " 0.433905 | \n",
- " -0.322173 | \n",
- " ... | \n",
- " 0.163984 | \n",
- " -0.008237 | \n",
- " 0.337156 | \n",
- " 0.335761 | \n",
- " -0.072739 | \n",
- " 0.351930 | \n",
- " -0.192500 | \n",
- " 1.000000 | \n",
- " 0.651065 | \n",
- " 0.192858 | \n",
- "
\n",
- " \n",
- " | TotalCharges | \n",
- " 0.001820 | \n",
- " -0.000263 | \n",
- " 0.000048 | \n",
- " 0.102411 | \n",
- " 0.319072 | \n",
- " 0.064653 | \n",
- " 0.825880 | \n",
- " 0.113008 | \n",
- " 0.453202 | \n",
- " -0.175691 | \n",
- " ... | \n",
- " 0.389066 | \n",
- " 0.276890 | \n",
- " 0.392472 | \n",
- " 0.398088 | \n",
- " 0.450306 | \n",
- " 0.157830 | \n",
- " -0.330594 | \n",
- " 0.651065 | \n",
- " 1.000000 | \n",
- " -0.199484 | \n",
- "
\n",
- " \n",
- " | Churn | \n",
- " 0.010133 | \n",
- " -0.017858 | \n",
- " -0.008545 | \n",
- " 0.150541 | \n",
- " -0.149982 | \n",
- " -0.163128 | \n",
- " -0.354049 | \n",
- " 0.011691 | \n",
- " 0.038043 | \n",
- " -0.047097 | \n",
- " ... | \n",
- " -0.177883 | \n",
- " -0.282232 | \n",
- " -0.036303 | \n",
- " -0.038802 | \n",
- " -0.396150 | \n",
- " 0.191454 | \n",
- " 0.107852 | \n",
- " 0.192858 | \n",
- " -0.199484 | \n",
- " 1.000000 | \n",
- "
\n",
- " \n",
- "
\n",
- "
22 rows × 22 columns
\n",
- "
"
- ],
- "text/plain": [
- " df_index customerID gender SeniorCitizen Partner \\\n",
- "df_index 1.000000 -0.006309 -0.008463 0.008057 0.000162 \n",
- "customerID -0.006309 1.000000 0.006235 -0.002368 -0.026509 \n",
- "gender -0.008463 0.006235 1.000000 -0.001819 -0.001379 \n",
- "SeniorCitizen 0.008057 -0.002368 -0.001819 1.000000 0.016957 \n",
- "Partner 0.000162 -0.026509 -0.001379 0.016957 1.000000 \n",
- "Dependents -0.004762 -0.011871 0.010349 -0.210550 0.452269 \n",
- "tenure 0.006801 0.007209 0.005285 0.015683 0.381912 \n",
- "PhoneService -0.028257 -0.006987 -0.007515 0.008392 0.018397 \n",
- "MultipleLines -0.006518 0.004497 -0.006908 0.146287 0.142717 \n",
- "InternetService -0.007689 -0.012335 -0.002236 -0.032160 0.000513 \n",
- "OnlineSecurity -0.001053 0.013740 -0.014899 -0.127937 0.150610 \n",
- "OnlineBackup 0.004099 -0.002960 -0.011920 -0.013355 0.153045 \n",
- "DeviceProtection -0.006353 -0.006726 0.001348 -0.021124 0.165614 \n",
- "TechSupport 0.008621 0.001763 -0.006695 -0.151007 0.126488 \n",
- "StreamingTV -0.000675 -0.007650 -0.005624 0.031019 0.136679 \n",
- "StreamingMovies -0.017201 -0.017207 -0.008920 0.047088 0.129907 \n",
- "Contract 0.003949 0.015949 0.000095 -0.141820 0.294094 \n",
- "PaperlessBilling 0.002143 -0.002225 -0.011902 0.156258 -0.013957 \n",
- "PaymentMethod 0.021046 0.011754 0.016942 -0.038158 -0.156232 \n",
- "MonthlyCharges -0.012938 -0.004445 -0.013779 0.219874 0.097825 \n",
- "TotalCharges 0.001820 -0.000263 0.000048 0.102411 0.319072 \n",
- "Churn 0.010133 -0.017858 -0.008545 0.150541 -0.149982 \n",
- "\n",
- " Dependents tenure PhoneService MultipleLines \\\n",
- "df_index -0.004762 0.006801 -0.028257 -0.006518 \n",
- "customerID -0.011871 0.007209 -0.006987 0.004497 \n",
- "gender 0.010349 0.005285 -0.007515 -0.006908 \n",
- "SeniorCitizen -0.210550 0.015683 0.008392 0.146287 \n",
- "Partner 0.452269 0.381912 0.018397 0.142717 \n",
- "Dependents 1.000000 0.163386 -0.001078 -0.024975 \n",
- "tenure 0.163386 1.000000 0.007877 0.343673 \n",
- "PhoneService -0.001078 0.007877 1.000000 -0.020504 \n",
- "MultipleLines -0.024975 0.343673 -0.020504 1.000000 \n",
- "InternetService 0.044030 -0.029835 0.387266 -0.108849 \n",
- "OnlineSecurity 0.151198 0.327283 -0.014163 0.007306 \n",
- "OnlineBackup 0.090231 0.372434 0.024040 0.117276 \n",
- "DeviceProtection 0.079723 0.372669 0.004718 0.122614 \n",
- "TechSupport 0.132530 0.324729 -0.018136 0.010941 \n",
- "StreamingTV 0.046214 0.290572 0.056393 0.175403 \n",
- "StreamingMovies 0.022088 0.296785 0.043025 0.181705 \n",
- "Contract 0.240556 0.676734 0.003019 0.111029 \n",
- "PaperlessBilling -0.110131 0.004823 0.016696 0.165306 \n",
- "PaymentMethod -0.041989 -0.370087 -0.005499 -0.176598 \n",
- "MonthlyCharges -0.112343 0.246862 0.248033 0.433905 \n",
- "TotalCharges 0.064653 0.825880 0.113008 0.453202 \n",
- "Churn -0.163128 -0.354049 0.011691 0.038043 \n",
- "\n",
- " InternetService ... DeviceProtection TechSupport \\\n",
- "df_index -0.007689 ... -0.006353 0.008621 \n",
- "customerID -0.012335 ... -0.006726 0.001763 \n",
- "gender -0.002236 ... 0.001348 -0.006695 \n",
- "SeniorCitizen -0.032160 ... -0.021124 -0.151007 \n",
- "Partner 0.000513 ... 0.165614 0.126488 \n",
- "Dependents 0.044030 ... 0.079723 0.132530 \n",
- "tenure -0.029835 ... 0.372669 0.324729 \n",
- "PhoneService 0.387266 ... 0.004718 -0.018136 \n",
- "MultipleLines -0.108849 ... 0.122614 0.010941 \n",
- "InternetService 1.000000 ... 0.045558 -0.025626 \n",
- "OnlineSecurity -0.028003 ... 0.175789 0.284875 \n",
- "OnlineBackup 0.036735 ... 0.187646 0.195581 \n",
- "DeviceProtection 0.045558 ... 1.000000 0.240476 \n",
- "TechSupport -0.025626 ... 0.240476 1.000000 \n",
- "StreamingTV 0.108190 ... 0.275947 0.161168 \n",
- "StreamingMovies 0.097967 ... 0.289309 0.162530 \n",
- "Contract 0.099579 ... 0.350067 0.425072 \n",
- "PaperlessBilling -0.138166 ... -0.037596 -0.113617 \n",
- "PaymentMethod 0.084504 ... -0.136460 -0.104544 \n",
- "MonthlyCharges -0.322173 ... 0.163984 -0.008237 \n",
- "TotalCharges -0.175691 ... 0.389066 0.276890 \n",
- "Churn -0.047097 ... -0.177883 -0.282232 \n",
- "\n",
- " StreamingTV StreamingMovies Contract PaperlessBilling \\\n",
- "df_index -0.000675 -0.017201 0.003949 0.002143 \n",
- "customerID -0.007650 -0.017207 0.015949 -0.002225 \n",
- "gender -0.005624 -0.008920 0.000095 -0.011902 \n",
- "SeniorCitizen 0.031019 0.047088 -0.141820 0.156258 \n",
- "Partner 0.136679 0.129907 0.294094 -0.013957 \n",
- "Dependents 0.046214 0.022088 0.240556 -0.110131 \n",
- "tenure 0.290572 0.296785 0.676734 0.004823 \n",
- "PhoneService 0.056393 0.043025 0.003019 0.016696 \n",
- "MultipleLines 0.175403 0.181705 0.111029 0.165306 \n",
- "InternetService 0.108190 0.097967 0.099579 -0.138166 \n",
- "OnlineSecurity 0.044399 0.056313 0.373980 -0.157723 \n",
- "OnlineBackup 0.147085 0.137083 0.280617 -0.012697 \n",
- "DeviceProtection 0.275947 0.289309 0.350067 -0.037596 \n",
- "TechSupport 0.161168 0.162530 0.425072 -0.113617 \n",
- "StreamingTV 1.000000 0.435354 0.226826 0.097379 \n",
- "StreamingMovies 0.435354 1.000000 0.232478 0.083901 \n",
- "Contract 0.226826 0.232478 1.000000 -0.175475 \n",
- "PaperlessBilling 0.097379 0.083901 -0.175475 1.000000 \n",
- "PaymentMethod -0.104782 -0.112009 -0.229636 -0.061348 \n",
- "MonthlyCharges 0.337156 0.335761 -0.072739 0.351930 \n",
- "TotalCharges 0.392472 0.398088 0.450306 0.157830 \n",
- "Churn -0.036303 -0.038802 -0.396150 0.191454 \n",
- "\n",
- " PaymentMethod MonthlyCharges TotalCharges Churn \n",
- "df_index 0.021046 -0.012938 0.001820 0.010133 \n",
- "customerID 0.011754 -0.004445 -0.000263 -0.017858 \n",
- "gender 0.016942 -0.013779 0.000048 -0.008545 \n",
- "SeniorCitizen -0.038158 0.219874 0.102411 0.150541 \n",
- "Partner -0.156232 0.097825 0.319072 -0.149982 \n",
- "Dependents -0.041989 -0.112343 0.064653 -0.163128 \n",
- "tenure -0.370087 0.246862 0.825880 -0.354049 \n",
- "PhoneService -0.005499 0.248033 0.113008 0.011691 \n",
- "MultipleLines -0.176598 0.433905 0.453202 0.038043 \n",
- "InternetService 0.084504 -0.322173 -0.175691 -0.047097 \n",
- "OnlineSecurity -0.096593 -0.053576 0.254473 -0.289050 \n",
- "OnlineBackup -0.125534 0.119943 0.375556 -0.195290 \n",
- "DeviceProtection -0.136460 0.163984 0.389066 -0.177883 \n",
- "TechSupport -0.104544 -0.008237 0.276890 -0.282232 \n",
- "StreamingTV -0.104782 0.337156 0.392472 -0.036303 \n",
- "StreamingMovies -0.112009 0.335761 0.398088 -0.038802 \n",
- "Contract -0.229636 -0.072739 0.450306 -0.396150 \n",
- "PaperlessBilling -0.061348 0.351930 0.157830 0.191454 \n",
- "PaymentMethod 1.000000 -0.192500 -0.330594 0.107852 \n",
- "MonthlyCharges -0.192500 1.000000 0.651065 0.192858 \n",
- "TotalCharges -0.330594 0.651065 1.000000 -0.199484 \n",
- "Churn 0.107852 0.192858 -0.199484 1.000000 \n",
- "\n",
- "[22 rows x 22 columns]"
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "data2.corr()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "id": "0cc6ad35",
- "metadata": {},
- "outputs": [],
- "source": [
- "# improting library for splitting the data for training and testing\n",
- "from sklearn.model_selection import train_test_split\n",
- "X_train_1, X_test_1, y_train_1, y_test_1 = train_test_split(X_1, y_1, test_size = 0.25, random_state = 1111)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "id": "5605adb1",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(5274, 21)\n",
- "(1758, 21)\n",
- "(5274,)\n",
- "(1758,)\n"
- ]
- }
- ],
- "source": [
- "#checking the shape of training and testing data\n",
- "print(X_train_1.shape)\n",
- "print(X_test_1.shape)\n",
- "print(y_train_1.shape)\n",
- "print(y_test_1.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "id": "bdd8c777",
- "metadata": {},
- "outputs": [],
- "source": [
- "# * Feature Scaling | Scaling the variables | standardizign the variable | Z - score | Mean = 0 and STD = 1\n",
- "# To get all the variables on same scale [towards ZERO]\n",
- "from sklearn.preprocessing import StandardScaler\n",
- "sc = StandardScaler()\n",
- "\n",
- "\n",
- "\n",
- "#The fit method is calculating the mean and variance of each of the features present in our train data.\n",
- "#The transform method is transforming all the features using the respective mean and variance. \n",
- "\n",
- "X_train_1 = sc.fit_transform(X_train_1)# you are finding the MEan and STD{with the fit()\n",
- "# }on training data and aslo transforming that\n",
- "\n",
- "X_test_1= sc.transform(X_test_1) # Only tranforming now\n",
- "\n",
- "\n",
- "#transform method we can use the same mean and variance as it is calculated from our training data to transform our test data."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "id": "76616edb",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression()"
- ]
- },
- "execution_count": 25,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.linear_model import LinearRegression\n",
- "lm = LinearRegression() \n",
- "lm.fit(X_train_1, y_train_1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "id": "3aca06f9",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2277.7827645051198\n"
- ]
- }
- ],
- "source": [
- "print(lm.intercept_)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "id": "6ffbfadc",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Coefficients [ 1.67435056e+00 -1.21592576e+00 9.36384978e+00 7.47791487e-01\n",
- " 8.75532709e+00 -1.64395198e+01 1.49795207e+03 -1.32435809e+01\n",
- " 3.52073262e+01 -1.32013722e+01 9.14191335e+01 1.14980710e+02\n",
- " 8.41858741e+01 8.09522416e+01 4.15371148e+01 4.78567718e+01\n",
- " -8.67741524e+01 -8.33581430e+00 5.43558008e+01 1.04663509e+03\n",
- " -8.03192908e+01]\n"
- ]
- }
- ],
- "source": [
- "# The coefficients\n",
- "print('Coefficients', lm.coef_)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "id": "0e5f32ff",
- "metadata": {},
- "outputs": [],
- "source": [
- "#Testing\n",
- "y_pred = lm.predict(X_test_1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "id": "feb5edc3",
- "metadata": {},
- "outputs": [],
- "source": [
- "y_pred = pd.DataFrame(y_pred, columns=['Predicted'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "id": "b0bd8cad",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Predicted | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 3305.856021 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " -1200.141076 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 2628.853682 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 3062.706854 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 2994.841653 | \n",
- "
\n",
- " \n",
- " | ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " | 1753 | \n",
- " 2052.786703 | \n",
- "
\n",
- " \n",
- " | 1754 | \n",
- " 5089.259245 | \n",
- "
\n",
- " \n",
- " | 1755 | \n",
- " 1658.150121 | \n",
- "
\n",
- " \n",
- " | 1756 | \n",
- " 3140.118481 | \n",
- "
\n",
- " \n",
- " | 1757 | \n",
- " 3199.745140 | \n",
- "
\n",
- " \n",
- "
\n",
- "
1758 rows × 1 columns
\n",
- "
"
- ],
- "text/plain": [
- " Predicted\n",
- "0 3305.856021\n",
- "1 -1200.141076\n",
- "2 2628.853682\n",
- "3 3062.706854\n",
- "4 2994.841653\n",
- "... ...\n",
- "1753 2052.786703\n",
- "1754 5089.259245\n",
- "1755 1658.150121\n",
- "1756 3140.118481\n",
- "1757 3199.745140\n",
- "\n",
- "[1758 rows x 1 columns]"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_pred"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "id": "6403ce1b",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "3906 1874.30\n",
- "5978 20.35\n",
- "5738 2333.05\n",
- "5743 1796.55\n",
- "5271 2531.40\n",
- " ... \n",
- "1826 1381.80\n",
- "2785 5551.15\n",
- "1766 1201.15\n",
- "5872 2727.30\n",
- "1382 1643.25\n",
- "Name: TotalCharges, Length: 1758, dtype: float64"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_test_1"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2431f6e6",
- "metadata": {},
- "source": [
- "### Calculating mean square error ... RMSE\n",
- "> RMSE calculate the difference between the actual value and predicted value of the response(dependant) variable
\n",
- "> The square root of the mean/average of the square of all of the error.
\n",
- "> Compared to the similar Mean Absolute Error, RMSE amplifies and severely punishes large errors.
\n",
- "> The lesser the RMSE value, the better is the model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "id": "1fee6c37",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Mean Absolute Error: 555.1405460192393\n",
- "Mean Squared Error: 478817.97456224787\n",
- "Root Mean Squared Error: 691.9667438267882\n"
- ]
- }
- ],
- "source": [
- "from sklearn import metrics \n",
- "import numpy as np\n",
- "\n",
- "#Absolute Error is the amount of error in your measurements.\n",
- "print('Mean Absolute Error:', metrics.mean_absolute_error(y_test_1, y_pred)) \n",
- "print('Mean Squared Error:', metrics.mean_squared_error(y_test_1, y_pred)) \n",
- "print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test_1, y_pred)))"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "bf2dfe8d",
- "metadata": {},
- "source": [
- "### Evaluating Model Accuracy\n",
- "> R-squared is a statistical measure of how close the data are to the fitted regression line.
\n",
- "> R-square signifies percentage of variations in the reponse variable that can be explained by the model.
\n",
- "> R-squared = Explained variation / Total variation
\n",
- "> Total variation is variation of response variable around it's mean.
\n",
- "> R-squared value varies between 0 and 100%. 0% signifies that the model explains none of the variability,
\n",
- "> while 100% signifies that the model explains all the variability of the response.
\n",
- "> The closer the r-square to 100%, the better is the model.
"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "id": "c87d1815",
- "metadata": {},
- "outputs": [],
- "source": [
- "#finding R-squared value\n",
- "from sklearn.metrics import r2_score\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "id": "33f16e28",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0.9067679081449613\n"
- ]
- }
- ],
- "source": [
- "print(r2_score(y_test_1, y_pred))"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "68e0476f",
- "metadata": {},
- "source": [
- "# Logistic Regression\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "5ea47ebf",
- "metadata": {},
- "source": [
- "Logistic Regression is used when the dependent variable(target) is categorical. logistic regression is a predictive analysis.\n",
- "Logistic regression is used to describe data and to explain the relationship between one dependent binary variable and one or more independent variables."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "id": "e2cad95c",
- "metadata": {},
- "outputs": [],
- "source": [
- "#dividing independent and dependent variables\n",
- "X = data2.iloc[:,:21]\n",
- "y = data2.iloc[:,21:]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "id": "ed78c027",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " df_index | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " ... | \n",
- " OnlineBackup | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- " 5365 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 29.85 | \n",
- " 29.85 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 1 | \n",
- " 3953 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 34 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 3 | \n",
- " 56.95 | \n",
- " 1889.50 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 2 | \n",
- " 2558 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 3 | \n",
- " 53.85 | \n",
- " 108.15 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 3 | \n",
- " 5524 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 45 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 42.30 | \n",
- " 1840.75 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 4 | \n",
- " 6500 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 70.70 | \n",
- " 151.65 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 21 columns
\n",
- "
"
- ],
- "text/plain": [
- " df_index customerID gender SeniorCitizen Partner Dependents tenure \\\n",
- "0 0 5365 0 0 1 0 1 \n",
- "1 1 3953 1 0 0 0 34 \n",
- "2 2 2558 1 0 0 0 2 \n",
- "3 3 5524 1 0 0 0 45 \n",
- "4 4 6500 0 0 0 0 2 \n",
- "\n",
- " PhoneService MultipleLines InternetService ... OnlineBackup \\\n",
- "0 0 1 0 ... 2 \n",
- "1 1 0 0 ... 0 \n",
- "2 1 0 0 ... 2 \n",
- "3 0 1 0 ... 0 \n",
- "4 1 0 1 ... 0 \n",
- "\n",
- " DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n",
- "0 0 0 0 0 0 \n",
- "1 2 0 0 0 1 \n",
- "2 0 0 0 0 0 \n",
- "3 2 2 0 0 1 \n",
- "4 0 0 0 0 0 \n",
- "\n",
- " PaperlessBilling PaymentMethod MonthlyCharges TotalCharges \n",
- "0 1 2 29.85 29.85 \n",
- "1 0 3 56.95 1889.50 \n",
- "2 1 3 53.85 108.15 \n",
- "3 0 0 42.30 1840.75 \n",
- "4 1 2 70.70 151.65 \n",
- "\n",
- "[5 rows x 21 columns]"
- ]
- },
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "id": "a65e377e",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Churn\n",
- "0 0\n",
- "1 0\n",
- "2 1\n",
- "3 0\n",
- "4 1"
- ]
- },
- "execution_count": 37,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "id": "233ff9e9",
- "metadata": {},
- "outputs": [],
- "source": [
- "# improting library for splitting the data for training and testing\n",
- "from sklearn.model_selection import train_test_split\n",
- "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 1111)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "id": "a850482e",
- "metadata": {},
- "outputs": [],
- "source": [
- "#importing lib for data to be align in standard scaling manner\n",
- "from sklearn.preprocessing import StandardScaler\n",
- "sc = StandardScaler()\n",
- "\n",
- "X_train = sc.fit_transform(X_train)\n",
- "X_test = sc.transform(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "id": "806e70da",
- "metadata": {},
- "outputs": [],
- "source": [
- "#importing library for logistic regression\n",
- "from sklearn.linear_model import LogisticRegression "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "id": "e95406b8",
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
- " return f(*args, **kwargs)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "LogisticRegression()"
- ]
- },
- "execution_count": 41,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#Creating intsnce of logistic regression and then fitting the data\n",
- "logistic_reg= LogisticRegression()\n",
- "logistic_reg.fit(X_train,y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "id": "c58ac14e",
- "metadata": {},
- "outputs": [],
- "source": [
- "#predicting the test data.....\n",
- "y_pred=logistic_reg.predict(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 43,
- "id": "271ab74f",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([0, 0, 0, ..., 1, 0, 0])"
- ]
- },
- "execution_count": 43,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_pred"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 44,
- "id": "7ae64f67",
- "metadata": {},
- "outputs": [],
- "source": [
- "#predcition on train data\n",
- "y_pred_train = logistic_reg.predict(X_train)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "afb9a422",
- "metadata": {},
- "source": [
- "# Confusion matrix\n",
- "A Confusion matrix is an N x N matrix used for evaluating the performance of a classification model, where N is the number of target classes. The matrix compares the actual target values with those predicted by the machine learning model. This gives us a holistic view of how well our classification model is performing and what kinds of errors it is making."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ffc7557b",
- "metadata": {},
- "source": [
- "Sklearn has two great functions: confusion_matrix() and classification_report().\n",
- "\n",
- "Sklearn confusion_matrix() returns the values of the Confusion matrix.\n",
- "The output is, however, slightly different from what we have studied so far.\n",
- "It takes the rows as Actual values and the columns as Predicted values. \n",
- "The rest of the concept remains the same.\n",
- "Sklearn classification_report() outputs precision, recall and f1-score for each target class. \n",
- "In addition to this, it also has some extra values: micro avg, macro avg, and weighted avg"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 45,
- "id": "f95277b8",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1165, 138],\n",
- " [ 206, 249]], dtype=int64)"
- ]
- },
- "execution_count": 45,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#importing library for confusion matrix\n",
- "from sklearn import metrics\n",
- "cnf_matrix = metrics.confusion_matrix(y_test, y_pred)\n",
- "cnf_matrix"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 46,
- "id": "aca39196",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Accuracy: 0.8043230944254836\n"
- ]
- }
- ],
- "source": [
- "#finding accuracy of model\n",
- "log_acc = metrics.accuracy_score(y_test, y_pred)\n",
- "print('Accuracy: ',log_acc)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 47,
- "id": "734ff962",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 47,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWcAAAD4CAYAAAAw/yevAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAaZ0lEQVR4nO3deXwV1fnH8c+TkKjshDUhqFhRC6VuaKk/qRUXUJCwCEVFUbBUxa21C6i14oZSRUFFREU2BaNAWVQWWYpUBXGhCohsCoGQALK5FMnN+f2RKb2Y7WYjJ+P37WteuTlzZs6MXh8enjkzY845RETEL3GVfQAiIpKfgrOIiIcUnEVEPKTgLCLiIQVnEREPVavoAQ7u3KjpIJLPMSntKvsQxEM532+1su6jJDEnocEJZR6voihzFhHxUIVnziIiR1RupLKPoFwoOItIuERyKvsIyoWCs4iEinO5lX0I5ULBWUTCJVfBWUTEP8qcRUQ8pAuCIiIeUuYsIuIfp9kaIiIe0gVBEREPqawhIuIhXRAUEfGQMmcREQ/pgqCIiId0QVBExD/OqeYsIuIf1ZxFRDyksoaIiIeUOYuIeChysLKPoFwoOItIuKisISLiIZU1REQ8pMxZRMRDCs4iIv5xuiAoIuIh1ZxFRDyksoaIiIeUOYuIeEiZs4iIh5Q5i4h4KCccD9uPq+wDEBEpVy439qUYZjbWzLLN7NOotiQzm29m64Kf9aLWDTaz9Wa21sw6RLWfaWafBOtGmpkVN7aCs4iES25u7EvxxgEdf9A2CFjgnGsBLAh+x8xaAr2BVsE2o8wsPtjmGWAA0CJYfrjPfBScRSRcyjFzds4tAb76QXMaMD74PB7oGtU+xTl3wDm3CVgPnG1myUBt59y7zjkHTIjaplAKziISLiXInM1sgJmtiFoGxDBCY+dcJkDws1HQ3hTYEtUvI2hrGnz+YXuRdEFQRMKlBLM1nHNjgDHlNHJBdWRXRHuRFJxFJFwqfrZGlpklO+cyg5JFdtCeATSL6pcKbAvaUwtoL5LKGiISLs7FvpTOTKBv8LkvMCOqvbeZHWVmzcm78Lc8KH3sN7O2wSyNa6K2KZQyZxEJl3K8Q9DMJgO/BhqYWQbwN+BhIN3M+gObgZ4AzrlVZpYOrAZygIHOuUiwqxvJm/lxDPBmsBRJwVlEwqUcg7Nz7opCVl1QSP8HgQcLaF8B/KwkYys4i0i46PZtEREPRSLF96kCFJxFJFz0VDoREQ8pOIuIeEg1ZxER/7jcUs9f9oqCs4iEi8oaIiIe0mwNEREPKXMWEfFQSIKzHnxUhLsfGs6vOvWma58bClw/e+5Cul1zI92uuZGrfvcHPlu3scxjfv/999zx16Fc0qsfV/z2drZmZgGwbXsWvfrdQo++A0m76ne8Mv31Mo8lpfPcmMfYlrGSjz9aUGS/NmeeyoHvNtO9e6cyj5mYmMjLLz3DZ6uX8s7SWRx3XN5Dzk49tRVLl8xk5ccL+fCD+fTs2aXMY1V5Ff/goyNCwbkIXS+9iNHDHyh0fdOUJox7ahjTJzzDDddewZBhI2Pe99bMLK69+c/52qfNnkftWjV5M30sV/+mK8NHjQWgYf0kJo1+jKnjn2byc0/wwqR0snfsKvlJSZlNmJBOp85XFdknLi6OoQ/dxbx5i0u07+OOS2XB/Ffztfe77gp2797LKS3P5YmRzzH0obsA+Pbb77i2322celp7OnXuw/BH76VOndolGjN0yvc1VZWm2OBsZqeY2V+ClxKOCD7/9EgcXGVrc1pr6tSuVej601u3PLT+561OISt756F1s+YupPf1t9Gj70CGDBtJJMaLFAvffpe0Sy8E4OJft2PZBx/jnCMhIYHExEQAvj94kFzP/9QPs7eXLuOr3XuK7HPzwH5Mm/56vj9Ar7yyO+/+azYr3p/HqKcfIS4utvyoy2UXM3FiXtCeOvV12p9/LgDr1m1k/fpNAGRmZpG9YxcNG9Yv4RmFTK6LffFYkd8MM/sLMIW8J/kvB94PPk82s0EVf3hVx7TZczm3bRsANnyxmTkL/snEINONi4tj9rxFMe0ne8cumjRqAEC1avHUrFGdPXv3AZCZtYNu19zIhd2uof9VPWn0Y/+f0FMpKU3omtaRZ8dMPKz9lFNOpFfPLrQ7ryttzrqYSCTClVd2j22fTZuwJSPv+eyRSIS9e/dRv369w/qc1eY0EhMT2LDhi3I5jyorEol98VhxFwT7A62ccwejG81sOLCKvOea5hO8h2sAwKjHHuD6awp76l44LP9gJdNmz2PiM48CsGzFx6z+bD29+98GwIEDB0iqVxeAWwffx9ZtWRzMOUhm1g569B0IQJ9eaXTrdDGugIz4v29RT27ckOkTniF7xy5uHXwfF51/Lg2S6uXrL5Vr+GNDGHznQ+T+4K/N7c8/lzNOb817774BwDHHHM2OHXl/23rt1ec5/vhjSUxM4NhmTVnx/jwAnnzyecZPSD/0HYgW/VVp0qQR48aNpF+/2wv8Dv2YOM/LFbEqLjjnAinAlz9oTw7WFSj6vVwHd24M9Tdl7fpN3PPwE4x+7H7qBrU+5xxdLrmQ3994Xb7+I4feA+TVnO968DHGPTXssPWNGzVge/ZOmjRqSE5OhK+/+TZfaaVRw/qc2Pw4Plz5KRef366CzkxK68wzfs5Lk0YB0KBBEpd0bE9OTg5mxsRJr3LX3flzmst7Xg/k1ZzHPv84F1zU87D1WzMyaZaawtatmcTHx1OnTm2++mo3ALVq1WTmjAnc87dhLFv+YQWfXRXgebkiVsUVvG4HFpjZm2Y2JljmAAuA2yr86DyXuT2b2++8n6H3/Injj/3fK8LatjmN+YuXsiuoS+7dt59t27Ni2uf557ZlxhtvATBv8dv84sxTMTO2Z+/gPwcOHNrfR5+sPmxM8UeLk3/JiSe15cST2jJ12uvcfOudzJw5l4WLltK9W+dDNeF69epy7LHFvoQZgFmz53H11XkBu0ePTixa/C8AEhISmPrqC0ya9BpTp86umBOqalxu7IvHisycnXNzzOwk4GzyXuVt5L2s8P2o16+E1p/+9jDvf/Rv9uzZxwVd+3BT/6vJCV4e+ZtunXjmxZfZu28/Dzz6NADx8fGkjx3JT5ofxy2/vYYBt99FrssloVo17vrDTaQ0aVzsmN07d2Dw/X/nkl79qFO7Fn8fklfa3/jFFv7+1HOYGc45rr2iOyf9pHnFnbwUatLEpznvV7+kQYMkvti4giH3PUpCQgIAY56bWOh2a9as4557h/HmG5OJizMOHszh1lvvYvPmrcWOOfbFKYwfN5LPVi9l9+49XNnnJgB69ryMdu1+QVL9elxzTS8A+l//e1auXFUOZ1pFhSRztoquT4W9rCGlc0yKyjGSX873W/MX10vom3t6xxxzatw3pczjVRTdISgi4eJ5uSJWCs4iEi4hKWsoOItIqPxYptKJiFQtypxFRDyk4Cwi4iHPb8uOlYKziISK3iEoIuIjBWcREQ9ptoaIiIeUOYuIeEjBWUTEPy6isoaIiH+UOYuI+CcsU+n09m0RCZdyfMGrmf3ezFaZ2admNtnMjjazJDObb2brgp/1ovoPNrP1ZrbWzDqU5TQUnEUkXHJLsBTBzJoCtwJtnHM/A+KB3sAgYIFzrgV5b4UaFPRvGaxvBXQERplZfGlPQ8FZRELF5eTGvMSgGnCMmVUDqgPbgDRgfLB+PNA1+JwGTHHOHXDObQLWk/cWqVJRcBaRcCmnzNk5txV4FNgMZAJ7nXPzgMbOucygTybQKNikKbAlahcZQVupKDiLSKi4XBfzYmYDzGxF1DLgv/sJaslpQHMgBahhZn2KGLqgV16V+uqkZmuISLiUYJqzc24MMKaQ1RcCm5xzOwDMbBpwDpBlZsnOuUwzSwayg/4ZQLOo7VPJK4OUijJnEQmVkmTOxdgMtDWz6mZmwAXAGmAm0Dfo0xeYEXyeCfQ2s6PMrDnQAlhe2vNQ5iwi4VJONwg655aZ2WvAh0AO8BF5WXZNIN3M+pMXwHsG/VeZWTqwOug/0DlX6odLm3MVO2H74M6N4ZgRLuXqmJR2lX0I4qGc77cWVLctkV2dzos55tR//Z9lHq+iKHMWkVBx4Xi0hoKziISMgrOIiH+UOYuIeEjBWUTEQy7i7TW+ElFwFpFQUeYsIuIhl6vMWUTEO8qcRUQ85JwyZxER7yhzFhHxUK5ma4iI+EcXBEVEPKTgLCLioQp+0OYRo+AsIqGizFlExEOaSici4qGIZmuIiPhHmbOIiIdUcxYR8ZBma4iIeEiZs4iIhyK5cZV9COVCwVlEQkVlDRERD+VqtoaIiH80lU5ExEMqa8To2BM7V/QQUgW1qNu0sg9BQkplDRERD2m2hoiIh0JS1VBwFpFwUVlDRMRDmq0hIuKhkLx8W8FZRMLFocxZRMQ7OSEpa4RjzomISMBhMS/FMbO6ZvaamX1mZmvM7JdmlmRm881sXfCzXlT/wWa23szWmlmHspyHgrOIhEpuCZYYjADmOOdOAU4F1gCDgAXOuRbAguB3zKwl0BtoBXQERplZfGnPQ8FZREKlvDJnM6sN/Ap4AcA5971zbg+QBowPuo0Hugaf04ApzrkDzrlNwHrg7NKeh4KziIRKSTJnMxtgZiuilgFRuzoB2AG8aGYfmdnzZlYDaOycywQIfjYK+jcFtkRtnxG0lYouCIpIqERKMFvDOTcGGFPI6mrAGcAtzrllZjaCoIRRiIIGLvUNi8qcRSRUci32pRgZQIZzblnw+2vkBessM0sGCH5mR/VvFrV9KrCttOeh4CwioZKLxbwUxTm3HdhiZicHTRcAq4GZQN+grS8wI/g8E+htZkeZWXOgBbC8tOehsoaIhEo5P/joFuAlM0sENgLXkZfUpptZf2Az0BPAObfKzNLJC+A5wEDnXKS0Ays4i0iolOft2865j4E2Bay6oJD+DwIPlsfYCs4iEiq5Fo47BBWcRSRUSl1H8IyCs4iESgyzMKoEBWcRCZXiZmFUFQrOIhIqek2ViIiHVNYQEfGQ3oQiIuKhiDJnERH/KHMWEfGQgrOIiIdC8gpBBWcRCRdlziIiHtLt2yIiHtI8ZxERD6msISLiIQVnEREP6dkaIiIeUs1ZRMRDmq0hIuKh3JAUNhScRSRUdEFQRMRD4cibFZxFJGSUOYuIeCjHwpE7KziLSKiEIzQrOItIyKisISLiIU2lExHxUDhCs4KziISMyhoiIh6KhCR3VnAWkVBR5iwi4iGnzFlExD9hyZzjKvsAfJXStAmvzXqRJctmsfjdmVx/Q598fU5s0ZxZ817mi6yPueHm68pl3MTEBEaPfYx3PpzD629NIfXYFABatT6FWfNeZvG7M1nwr+l06daxXMaTkmmS0ohx00Yxe+krzFoyhat/+5t8fc465wyWr1/ItIWTmLZwEjfd0b/M4yYkJjB8zIPMWTaVKW+OJaVZMgCn/KwFk994gVlLpvCPxS9xSdqFZR6rqsvFxbzEwszizewjM5sd/J5kZvPNbF3ws15U38Fmtt7M1ppZh7KchzLnQuTk5DDk7mF8snINNWpWZ+7i11iy6F0+X7vhUJ/du/dy918e4pJOF5R4/6nHpjBi1EP06HztYe1XXN2DvXv2cc4ZHUnrfgl333sHN/S7g+++/Y5bbxjMpo1f0rhJQ+Yufo3FC//Fvr37y3qqUgKRnAjD/jaC1Z+spXqN6kx9awLv/HM5Gz7fdFi/D977mBv7/KHE+09plszQkffQt9uNh7VfflUX9u7dT8df9ODSrhfxx7/ezB8G3MV/vj3AoIH38uWmLTRs3ICpb01g6aL32L/v6zKdZ1VWAUWN24A1QO3g90HAAufcw2Y2KPj9L2bWEugNtAJSgLfM7CTnXKkeMa3MuRDZWTv5ZOUaAL75+lvWfb6RJsmNDuuza+dXrPzoUw7m5OTbvkevy3hjwRTmvz2NYY/fS1xcbP+qO17anvTJ/wBg9ox5tDuvLQAbN3zJpo1fApC1fQc7d+6ifv2k0p6elNKO7F2s/mQtAN9+8y0bPt9E4+SGMW9/2eUdeWXOi0xbOIl7Hx0U8/eifcfzmPHK6wDMnbWQtu3OAuCLjZv5ctOWvGPL2smunbtJql+v0P38GOTgYl6KY2apQCfg+ajmNGB88Hk80DWqfYpz7oBzbhOwHji7tOeh4ByD1GNTaN36p3z4wb9j6t/ipBPo0r0jXTr04aJ23YlEIvTo1TmmbZskN2bb1u0ARCIR9u3bT1JS3cP6nHZGaxITEvhi0+YSnYeUr5Rmyfy09cms/GBVvnWntWnN9EUv8ezkJzjx5BMAOKHF8VySdhFXdb6e7u37kBvJ5bLLYytPNW7SkMytWUDe92L//q+pm1TnsD6tT29JQkI1Nn+RUcYzq9pcCf4xswFmtiJqGfCD3T0B/JnDS9mNnXOZAMHP/2ZtTYEtUf0ygrZSKXVZw8yuc869WMi6AcAAgNrHNKF6YtX9k7x6jeq8MGEE99w5lK/3fxPTNuee15afn9qKNxelA3D00Uexc+dXAIydNJJmx6WSmJBA09Rk5r89DYDnR0/klZemY5b/BWjO/e9P+EaNG/Dksw9z242DD2uXI6t6jWMYOfZhHv7rcL75+vDvxep/r+WCM7vw7Tff8asLzuGp8cPo2PZy2rY7i1annkL6vLyk6+ijj2LXzt0APDluGE2PTSEhoRrJqU2YtnASABPHTGH6lNkFfi+iE7+GjerzyNNDGHzLkB/996IkFwSdc2OAMQWtM7POQLZz7gMz+3UMuyvo7YWl/o9RlprzEKDA4Bx9wsl1W1bZb0q1atV4YcITTHt1Nm/Meivm7cyMVyfP4KH7Hs+3rl+fW4HCa86Z27aT0rQJmduyiI+Pp3btWuzevReAmrVqMCl9NI88MJIPV8SWxUv5q1YtnhFjH2HW1LnMf31xvvXRwXrJgne455E/UzepDmbGP155nccfHJVvm1uu/TNQeM15e2Y2yU0bk5WZTXx8PLVq1WRP8L2oUbMGo19+nBFDR7Pyg0/L8UyrpnKcSvd/QBczuxQ4GqhtZpOALDNLds5lmlkykB30zwCaRW2fCmwr7eBFljXM7N+FLJ8AjUs7aFUx/Kn7Wff5Rp59enzxnaMs/ed7dEq7mPoN8mrCdevWIbVZSkzbzn1zEb2u6ApA57SLWbpkGQAJCQmMnfQkr06ZwewZc0t0PFK+Hnjir2z8fBPjR79c4PoGjeof+tz69JZYXBx7vtrLe2+/T4fL2pPUIO9vknXq1iYltUlMYy6au4S033QCoMNl7Xlv6QoAEhKq8eS4YcxIf4O5sxaU5bRCI7cES1Gcc4Odc6nOuePJu9C30DnXB5gJ9A269QVmBJ9nAr3N7Cgzaw60AJaX9jyKy5wbAx2A3T9oN+Cd0g5aFZzd9gx69k5j9aq1h0oPQ+97gtTUvClME158hYaNGjBnUTq1atUk1+Xy2xuv5ry2l/H52g088sAIpkx/nrg4I+dgDoP/eD8ZW4r/Q3TyxKk8+ewjvPPhHPbs3sMN/f4IQJduHWl7zpnUS6pLryu7AXD7TXey6pPPKujfgBTkjF+cSlqvS1m7et2h0sMTD44iOQiyr4yfxsWd23PFtT3IiUQ48N1/uON3dwGw4fNNjBg6mufTnzz0vbh/0N/ZlrG92HFfe2kmjzw9hDnLprJ3975D++yYdiFtfnk6dZPq0LV33nWNO28dwmefrquI068SIhVf1nkYSDez/sBmoCeAc26VmaUDq4EcYGBpZ2oAWFH1KTN7AXjRObe0gHUvO+euLG6AqlzWkIpTN7FmZR+CeGhN9vKC6rYlcuVx3WKOOS9/Ob3M41WUIjNn51yhs+djCcwiIkeabt8WEfFQWG7fVnAWkVDRm1BERDyksoaIiIeOwGyNI0LBWURCRWUNEREP6YKgiIiHVHMWEfGQyhoiIh4Ky1P5FJxFJFQiypxFRPyjsoaIiIdU1hAR8ZAyZxERD2kqnYiIh3T7toiIh1TWEBHxkIKziIiHNFtDRMRDypxFRDyk2RoiIh6KuHA8NFTBWURCRTVnEREPqeYsIuIh1ZxFRDyUq7KGiIh/lDmLiHhIszVERDyksoaIiIdU1hAR8ZAyZxERDylzFhHxUMRFKvsQyoWCs4iESlhu346r7AMQESlPubiYl6KYWTMzW2Rma8xslZndFrQnmdl8M1sX/KwXtc1gM1tvZmvNrENZzkPBWURCxTkX81KMHOAO59xPgbbAQDNrCQwCFjjnWgALgt8J1vUGWgEdgVFmFl/a81BwFpFQyXUu5qUozrlM59yHwef9wBqgKZAGjA+6jQe6Bp/TgCnOuQPOuU3AeuDs0p6HgrOIhIorwT9mNsDMVkQtAwrap5kdD5wOLAMaO+cyIS+AA42Cbk2BLVGbZQRtpaILgiISKiW5fds5NwYYU1QfM6sJTAVud87tM7NCuxY0RMwH8wMKziISKuU5W8PMEsgLzC8556YFzVlmluycyzSzZCA7aM8AmkVtngpsK+3YKmuISKiUV83Z8lLkF4A1zrnhUatmAn2Dz32BGVHtvc3sKDNrDrQAlpf2PJQ5i0iolGPm/H/A1cAnZvZx0HYn8DCQbmb9gc1Az2DcVWaWDqwmb6bHQOdKf0eMVfSE7eS6LcMxI1zKVd3EmpV9COKhNdnLCy3oxqpOzZ/EHHP2fr2hzONVFGXOIhIqYblDUMFZREJFD9sXEfGQHhkqIuIhlTVERDyk5zmLiHhImbOIiIfCUnOu8HnO8j9mNiC4l1/kEH0vpCC6ffvIKvCJV/Kjp++F5KPgLCLiIQVnEREPKTgfWaorSkH0vZB8dEFQRMRDypxFRDyk4Cwi4iEF5yPEzDqa2VozW29mgyr7eKTymdlYM8s2s08r+1jEPwrOR4CZxQNPA5cALYErzKxl5R6VeGAc0LGyD0L8pOB8ZJwNrHfObXTOfQ9MAdIq+ZikkjnnlgBfVfZxiJ8UnI+MpsCWqN8zgjYRkQIpOB8ZBb2nTHMYRaRQCs5HRgbQLOr3VGBbJR2LiFQBCs5HxvtACzNrbmaJQG9gZiUfk4h4TMH5CHDO5QA3A3OBNUC6c25V5R6VVDYzmwy8C5xsZhlm1r+yj0n8odu3RUQ8pMxZRMRDCs4iIh5ScBYR8ZCCs4iIhxScRUQ8pOAsIuIhBWcREQ/9PyJD35LpBGc1AAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.heatmap(cnf_matrix, annot=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 48,
- "id": "4831e0e1",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " precision recall f1-score support\n",
- "\n",
- " 0 0.85 0.89 0.87 1303\n",
- " 1 0.64 0.55 0.59 455\n",
- "\n",
- " accuracy 0.80 1758\n",
- " macro avg 0.75 0.72 0.73 1758\n",
- "weighted avg 0.80 0.80 0.80 1758\n",
- "\n"
- ]
- }
- ],
- "source": [
- "#importing library for classification_report and finding report\n",
- "from sklearn.metrics import classification_report\n",
- "print(classification_report(y_test,y_pred))"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "8f60be40",
- "metadata": {},
- "source": [
- "# Desicion Tree"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2b6101db",
- "metadata": {},
- "source": [
- "A decision tree is a tree-like graph with nodes representing the place where we pick an attribute and ask a question; edges represent the answers the to the question; and the leaves represent the actual output or class label. They are used in non-linear decision making with simple linear decision surface."
- ]
- },
- {
- "cell_type": "markdown",
- "id": "adac44fc",
- "metadata": {},
- "source": [
- "**Advantages of decision trees:**\n",
- "\n",
- "- Can be used for regression or classification\n",
- "- Can be displayed graphically\n",
- "- Highly interpretable\n",
- "- Can be specified as a series of rules, and more closely approximate human decision-making than other models\n",
- "- Prediction is fast\n",
- "- Features don't need scaling\n",
- "- Automatically learns feature interactions\n",
- "- Tends to ignore irrelevant features\n",
- "- Non-parametric (will outperform linear models if relationship between features and response is highly non-linear)\n",
- "- Robust to the outliers\n",
- "- Impact of Missing values is Minimal"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 49,
- "id": "4aa06922",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Decision Tree Classification\n",
- "\n",
- "# Importing the libraries\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "import pandas as pd"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 50,
- "id": "a4136018",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Spliting the overall data into X and Y [this is what required in ML]\n",
- "\n",
- "X = data2.iloc[:, :21]\n",
- "\n",
- "y = data2.iloc[:, 21:]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 51,
- "id": "c2b22324",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " df_index | \n",
- " customerID | \n",
- " gender | \n",
- " SeniorCitizen | \n",
- " Partner | \n",
- " Dependents | \n",
- " tenure | \n",
- " PhoneService | \n",
- " MultipleLines | \n",
- " InternetService | \n",
- " ... | \n",
- " OnlineBackup | \n",
- " DeviceProtection | \n",
- " TechSupport | \n",
- " StreamingTV | \n",
- " StreamingMovies | \n",
- " Contract | \n",
- " PaperlessBilling | \n",
- " PaymentMethod | \n",
- " MonthlyCharges | \n",
- " TotalCharges | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- " 5365 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 29.85 | \n",
- " 29.85 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 1 | \n",
- " 3953 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 34 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 3 | \n",
- " 56.95 | \n",
- " 1889.50 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 2 | \n",
- " 2558 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 3 | \n",
- " 53.85 | \n",
- " 108.15 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 3 | \n",
- " 5524 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 45 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 2 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 42.30 | \n",
- " 1840.75 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 4 | \n",
- " 6500 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 70.70 | \n",
- " 151.65 | \n",
- "
\n",
- " \n",
- " | ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " | 7027 | \n",
- " 7038 | \n",
- " 4843 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 24 | \n",
- " 1 | \n",
- " 2 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 2 | \n",
- " 2 | \n",
- " 2 | \n",
- " 1 | \n",
- " 1 | \n",
- " 3 | \n",
- " 84.80 | \n",
- " 1990.50 | \n",
- "
\n",
- " \n",
- " | 7028 | \n",
- " 7039 | \n",
- " 1524 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 72 | \n",
- " 1 | \n",
- " 2 | \n",
- " 1 | \n",
- " ... | \n",
- " 2 | \n",
- " 2 | \n",
- " 0 | \n",
- " 2 | \n",
- " 2 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- " 103.20 | \n",
- " 7362.90 | \n",
- "
\n",
- " \n",
- " | 7029 | \n",
- " 7040 | \n",
- " 3358 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 11 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- " 29.60 | \n",
- " 346.45 | \n",
- "
\n",
- " \n",
- " | 7030 | \n",
- " 7041 | \n",
- " 5923 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 4 | \n",
- " 1 | \n",
- " 2 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 3 | \n",
- " 74.40 | \n",
- " 306.60 | \n",
- "
\n",
- " \n",
- " | 7031 | \n",
- " 7042 | \n",
- " 2221 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 66 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 2 | \n",
- " 2 | \n",
- " 2 | \n",
- " 2 | \n",
- " 2 | \n",
- " 1 | \n",
- " 0 | \n",
- " 105.65 | \n",
- " 6844.50 | \n",
- "
\n",
- " \n",
- "
\n",
- "
7032 rows × 21 columns
\n",
- "
"
- ],
- "text/plain": [
- " df_index customerID gender SeniorCitizen Partner Dependents \\\n",
- "0 0 5365 0 0 1 0 \n",
- "1 1 3953 1 0 0 0 \n",
- "2 2 2558 1 0 0 0 \n",
- "3 3 5524 1 0 0 0 \n",
- "4 4 6500 0 0 0 0 \n",
- "... ... ... ... ... ... ... \n",
- "7027 7038 4843 1 0 1 1 \n",
- "7028 7039 1524 0 0 1 1 \n",
- "7029 7040 3358 0 0 1 1 \n",
- "7030 7041 5923 1 1 1 0 \n",
- "7031 7042 2221 1 0 0 0 \n",
- "\n",
- " tenure PhoneService MultipleLines InternetService ... OnlineBackup \\\n",
- "0 1 0 1 0 ... 2 \n",
- "1 34 1 0 0 ... 0 \n",
- "2 2 1 0 0 ... 2 \n",
- "3 45 0 1 0 ... 0 \n",
- "4 2 1 0 1 ... 0 \n",
- "... ... ... ... ... ... ... \n",
- "7027 24 1 2 0 ... 0 \n",
- "7028 72 1 2 1 ... 2 \n",
- "7029 11 0 1 0 ... 0 \n",
- "7030 4 1 2 1 ... 0 \n",
- "7031 66 1 0 1 ... 0 \n",
- "\n",
- " DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n",
- "0 0 0 0 0 0 \n",
- "1 2 0 0 0 1 \n",
- "2 0 0 0 0 0 \n",
- "3 2 2 0 0 1 \n",
- "4 0 0 0 0 0 \n",
- "... ... ... ... ... ... \n",
- "7027 2 2 2 2 1 \n",
- "7028 2 0 2 2 1 \n",
- "7029 0 0 0 0 0 \n",
- "7030 0 0 0 0 0 \n",
- "7031 2 2 2 2 2 \n",
- "\n",
- " PaperlessBilling PaymentMethod MonthlyCharges TotalCharges \n",
- "0 1 2 29.85 29.85 \n",
- "1 0 3 56.95 1889.50 \n",
- "2 1 3 53.85 108.15 \n",
- "3 0 0 42.30 1840.75 \n",
- "4 1 2 70.70 151.65 \n",
- "... ... ... ... ... \n",
- "7027 1 3 84.80 1990.50 \n",
- "7028 1 1 103.20 7362.90 \n",
- "7029 1 2 29.60 346.45 \n",
- "7030 1 3 74.40 306.60 \n",
- "7031 1 0 105.65 6844.50 \n",
- "\n",
- "[7032 rows x 21 columns]"
- ]
- },
- "execution_count": 51,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "id": "b75e77b9",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Churn | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " | 7027 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 7028 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 7029 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 7030 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 7031 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
7032 rows × 1 columns
\n",
- "
"
- ],
- "text/plain": [
- " Churn\n",
- "0 0\n",
- "1 0\n",
- "2 1\n",
- "3 0\n",
- "4 1\n",
- "... ...\n",
- "7027 0\n",
- "7028 0\n",
- "7029 0\n",
- "7030 1\n",
- "7031 0\n",
- "\n",
- "[7032 rows x 1 columns]"
- ]
- },
- "execution_count": 52,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "id": "801d9d1f",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Splitting the dataset into the Training set and Test set\n",
- "from sklearn.model_selection import train_test_split\n",
- "\n",
- "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 1111)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "id": "335e2530",
- "metadata": {},
- "outputs": [],
- "source": [
- "from sklearn.tree import DecisionTreeClassifier\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "id": "94c8f8ba",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "DecisionTreeClassifier(max_depth=2, min_samples_leaf=10, min_samples_split=20,\n",
- " random_state=0)"
- ]
- },
- "execution_count": 55,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#importing library for Descision Tree and we have two criterion for DT 'gini' and 'Entropy'\n",
- "# you can use gini when there is binary classification otherwise use entropy\n",
- "\n",
- "from sklearn.tree import DecisionTreeClassifier\n",
- "\n",
- "#max_depth - the maximum height upto which the trees inside the forest can grow(to avoid overfitting)\n",
- "#min_samples_split- minimum amount of samples an internal node must hold in order to split into further nodes(default value -2.)\n",
- "#min_samples_leaf - minimum amount of samples that a node must hold after getting split(default value -1.)\n",
- "\n",
- "#making instance of DT\n",
- "classifier = DecisionTreeClassifier(criterion = 'gini', random_state = 0,\n",
- " max_depth = 2, min_samples_leaf = 10, min_samples_split = 20\n",
- " )\n",
- "#fitting the training data\n",
- "classifier.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 56,
- "id": "6189a89b",
- "metadata": {},
- "outputs": [],
- "source": [
- "#prediction using 'testing' data\n",
- "y_pred = classifier.predict(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 57,
- "id": "9af2cc14",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([0, 0, 0, ..., 1, 0, 0])"
- ]
- },
- "execution_count": 57,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y_pred"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 58,
- "id": "419ee81f",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.7468714448236633"
- ]
- },
- "execution_count": 58,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#checking score via importing library\n",
- "from sklearn.metrics import accuracy_score\n",
- "DT_acc = accuracy_score(y_pred,y_test)\n",
- "DT_acc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 59,
- "id": "4a5dad9a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[985, 318],\n",
- " [127, 328]], dtype=int64)"
- ]
- },
- "execution_count": 59,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "\n",
- "from sklearn.metrics import confusion_matrix\n",
- "\n",
- "cm = confusion_matrix(y_test, y_pred)\n",
- "cm"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 60,
- "id": "de8d0b01",
- "metadata": {},
- "outputs": [],
- "source": [
- "#checking Auc_Roc_Score via importing library\n",
- "from sklearn.metrics import roc_auc_score"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 61,
- "id": "c1ee3c9e",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.7384134668094761"
- ]
- },
- "execution_count": 61,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "roc_auc_score(y_test,y_pred)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "fd76fbed",
- "metadata": {},
- "source": [
- "# Hypertuning\n",
- " \n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "710cfaff",
- "metadata": {},
- "source": [
- "it is used to increases the performance of a model via providing best parameters"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "id": "aeadf4e2",
- "metadata": {},
- "outputs": [],
- "source": [
- "#importing library for hypertuning\n",
- "from sklearn.model_selection import GridSearchCV"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "id": "f42a1258",
- "metadata": {},
- "outputs": [],
- "source": [
- "pGrid = {'max_depth': range(2, 10), # 8\n",
- " 'min_samples_leaf': range(10, 51, 10), # 5\n",
- " 'min_samples_split': range(20, 81, 20)} # 4\n",
- "#intance of GScv\n",
- "gscv = GridSearchCV(estimator = DecisionTreeClassifier(), param_grid = pGrid, cv = 5,\n",
- " scoring = 'recall', n_jobs = -1, verbose = True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 64,
- "id": "92c9ddce",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Fitting 5 folds for each of 160 candidates, totalling 800 fits\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(), n_jobs=-1,\n",
- " param_grid={'max_depth': range(2, 10),\n",
- " 'min_samples_leaf': range(10, 51, 10),\n",
- " 'min_samples_split': range(20, 81, 20)},\n",
- " scoring='recall', verbose=True)"
- ]
- },
- "execution_count": 64,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#fitiing the data\n",
- "gscv.fit(X,y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 65,
- "id": "da422896",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'max_depth': 2, 'min_samples_leaf': 10, 'min_samples_split': 20}"
- ]
- },
- "execution_count": 65,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#finding best params for model\n",
- "gscv.best_params_"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "7d584d80",
- "metadata": {},
- "source": [
- "**Disadvantages of decision trees:**\n",
- " \n",
- "- Performance is (generally) not competitive with the best supervised learning methods\n",
- " - Use Ensembles \n",
- "- Can easily overfit the training data (tuning is required / PRUNING standard concept )\n",
- "\n",
- "- Small variations in the data can result in a completely different tree (high variance)\n",
- " - Use Ensembles to reduce the variance\n",
- " \n",
- "- Recursive binary splitting makes \"locally optimal\" decisions that may not result in a globally optimal tree\n",
- "- Doesn't tend to work well if the classes are highly unbalanced\n",
- "- Doesn't tend to work well with very small datasets"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "0fc68484",
- "metadata": {},
- "source": [
- "# RANDOM FOREST"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "008226d8",
- "metadata": {},
- "source": [
- "Random forests or random decision forests are an ensemble learning method for classification, regression and other tasks that operate by constructing a multitude of decision trees at training time and outputting the class that is the mode of the classes or mean/average prediction of the individual trees. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 66,
- "id": "cd472afa",
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- ":4: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
- " classifier2.fit(X_train, y_train)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "RandomForestClassifier(n_estimators=70, random_state=0)"
- ]
- },
- "execution_count": 66,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.ensemble import RandomForestClassifier\n",
- "\n",
- "classifier2 = RandomForestClassifier(n_estimators = 70, criterion = 'gini', random_state = 0)\n",
- "classifier2.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "id": "576a4b1d",
- "metadata": {},
- "outputs": [],
- "source": [
- "y_pred = classifier2.predict(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 68,
- "id": "74301722",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.8037542662116041"
- ]
- },
- "execution_count": 68,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.metrics import accuracy_score\n",
- "RF_acc = accuracy_score(y_test,y_pred)\n",
- "RF_acc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 69,
- "id": "c4942c23",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.7052693277558972"
- ]
- },
- "execution_count": 69,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.metrics import roc_auc_score\n",
- "roc_auc_score(y_test,y_pred)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 70,
- "id": "b314ec0b",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1185, 118],\n",
- " [ 227, 228]], dtype=int64)"
- ]
- },
- "execution_count": 70,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.metrics import confusion_matrix\n",
- "cm = confusion_matrix(y_test, y_pred)\n",
- "cm"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 71,
- "id": "9db435c7",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Fitting 5 folds for each of 25 candidates, totalling 125 fits\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:918: UserWarning: One or more of the test scores are non-finite: [0.79209177 0.79337159 0.79237576 0.7928022 0.78995826 0.79066919\n",
- " 0.78313331 0.78711502 0.78967457 0.78981591 0.7807154 0.78099858\n",
- " 0.78555 0.78554929 0.78839465 0.78199432 0.78270576 0.78412904\n",
- " 0.78597694 0.7825627 nan nan nan nan\n",
- " nan]\n",
- " warnings.warn(\n",
- "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:880: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
- " self.best_estimator_.fit(X, y, **fit_params)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "GridSearchCV(cv=5, estimator=RandomForestClassifier(), n_jobs=-1,\n",
- " param_grid={'max_features': [5, 10, 15, 20, 25],\n",
- " 'n_estimators': [70, 80, 90, 100, 120]},\n",
- " verbose=True)"
- ]
- },
- "execution_count": 71,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#n_estimators :- int, default=100\n",
- "#The number of trees in the forest- the n_estimator parameter controls the number of trees inside the classifier.\n",
- "#max_features helps to find the number of features to take into account in order to make the best split\n",
- "\n",
- "\n",
- "pargrid_rf = {'n_estimators': [70, 80, 90, 100, 120],\n",
- " 'max_features': [5,10,15,20,25]}\n",
- "\n",
- "gscv_rf = GridSearchCV(estimator = RandomForestClassifier(), \n",
- " param_grid = pargrid_rf, \n",
- " cv = 5,\n",
- " verbose = True, \n",
- " n_jobs = -1)\n",
- "\n",
- "gscv_rf.fit(X, y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 72,
- "id": "6e4b32fb",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'max_features': 5, 'n_estimators': 80}"
- ]
- },
- "execution_count": 72,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "gscv_rf.best_params_"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "dd76d339",
- "metadata": {},
- "source": [
- "Importing libraries to draw tree structre"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 73,
- "id": "ebd9cc40",
- "metadata": {},
- "outputs": [],
- "source": [
- "from matplotlib import pyplot as plt\n",
- "from sklearn import tree"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 74,
- "id": "cf12c14e",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[Text(418.5, 453.0, 'X[16] <= 0.5\\ngini = 0.392\\nsamples = 5274\\nvalue = [3860, 1414]'),\n",
- " Text(209.25, 271.8, 'X[10] <= 0.5\\ngini = 0.49\\nsamples = 2931\\nvalue = [1669, 1262]'),\n",
- " Text(104.625, 90.59999999999997, 'gini = 0.5\\nsamples = 1985\\nvalue = [970, 1015]'),\n",
- " Text(313.875, 90.59999999999997, 'gini = 0.386\\nsamples = 946\\nvalue = [699, 247]'),\n",
- " Text(627.75, 271.8, 'X[19] <= 99.85\\ngini = 0.121\\nsamples = 2343\\nvalue = [2191, 152]'),\n",
- " Text(523.125, 90.59999999999997, 'gini = 0.077\\nsamples = 1912\\nvalue = [1835, 77]'),\n",
- " Text(732.375, 90.59999999999997, 'gini = 0.287\\nsamples = 431\\nvalue = [356, 75]')]"
- ]
- },
- "execution_count": 74,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAAIuCAYAAABac1I3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzddXxV9R/H8ddZB+tgDAaju7tbUhQREAERQVQM7PopdreoYGCBICDd3Q3S3QzYqHXX+f2xMbxssGDjEu/n47GH2/d87/d8zpXHPfdzvmWYpomIiIiIiIjkj421AxAREREREbkVKZkSEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSAEqmRERERERECkDJlIiIiIiISAEomRIRERERESkAJVMiIiIiIiIFoGRKRERERESkAJRMiYiIiIiIFICSKRERERERkQJQMiUiIiIiIlIASqZEREREREQKQMmUiIiIiIhIASiZEhERERERKQAlUyIiIiIiIgWgZEpERERERKQAlEyJiIiIiIgUgJIpERERERGRAlAyJSIiIiIiUgBKpkRERERERApAyZSIiIiIiEgBKJkSEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSAEqmRERERERECkDJlIiIiIiISAEomRIRERERESkAJVMiIiIiIiIFoGRKRERERESkAJRMiYiIiIiIFICSKRERERERkQJQMiUiIiIiIlIASqZEREREREQKQMmUiIiIiIhIASiZEhERERERKQAlUyIiIiIiIgWgZEpERERERKQAlEyJiIiIiIgUgJIpERERERGRAlAyJSIiIiIiUgBKpkRERERERApAyZSIiIiIiEgB2Fk7ABERa3J2tA9LTE4tbu04RG5VTg52ZxOSUgKsHYeIiDUYpmlaOwYREasxDMOMmP6utcMQuWV59RyJaZqGteMQEbEGDfMTEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSANpnSkTkDuHVc2TW782rBzPn/UduyHm7v/Era/ccz/pbS9GLiMjtQsmUiMgt6L3xS/hy6io+G9adoV0aZTs+6NO/mb1hHzPeHkSrWuWy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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.figure(figsize = (15,10))\n",
- "tree.plot_tree(classifier, filled = True)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "d9452db6",
- "metadata": {},
- "source": [
- "# KNN"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f16bc237",
- "metadata": {},
- "source": [
- "1.Supervised Learning technique.\n",
- "2.K-NN algorithm can be used for Regression & Classification - mostly Classification problems.\n",
- "3.K-NN is a non-parametric algoritham- which means it does not make any assumption on underlying data.\n",
- "4.It is also called a lazy learner algorithm because it does not learn from the training set immediately instead it stores the dataset.\n",
- "5.At the time of classification, it performs an action on the dataset.\n",
- "6.Example: Suppose, we have an image of a creature that looks similar to cat and dog, but we want to know either it is a cat or dog. So for this identification, we can use the KNN algorithm,"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "a6f49184",
- "metadata": {},
- "source": [
- "Step-1: Select the number K of the neighbors\n",
- "Step-2: Calculate the Euclidean distance of K number of neighbors\n",
- "Step-3: Take the K nearest neighbors as per the calculated Euclidean distance.\n",
- "Step-4: Among these k neighbors, count the number of the data points in each category.\n",
- "Step-5: Assign the new data points to that category for which the number of the neighbor is maximum.\n",
- "Step-6: Our model is ready."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 75,
- "id": "240ea111",
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\neighbors\\_classification.py:179: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
- " return self._fit(X, y)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "KNeighborsClassifier(n_neighbors=11)"
- ]
- },
- "execution_count": 75,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Fitting K-NN to the Training set\n",
- "from sklearn.neighbors import KNeighborsClassifier\n",
- "classifier = KNeighborsClassifier(n_neighbors = 11, metric = 'minkowski', p = 2)\n",
- "classifier.fit(X_train, y_train)\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "#p : integer, optional (default = 2)\n",
- "#Power parameter for the Minkowski metric. \n",
- "#When p = 1, this is equivalent to using manhattan_distance (l1), \n",
- "# and euclidean_distance (l2) for p = 2.\n",
- "\n",
- "#metric : string or callable, default ‘minkowski’\n",
- "\n",
- "#The Minkowski distance is a metric in a normed vector space which can be considered as a \n",
- "# generalization of both the Euclidean distance and the Manhattan distance.\n",
- "\n",
- "#the distance metric to use for the tree. The default metric is minkowski, \n",
- "#and with p=2 is equivalent to the standard Euclidean metric."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 76,
- "id": "669eae48",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Predicting the Test set results\n",
- "y_pred = classifier.predict(X_test)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 77,
- "id": "5122b9e8",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1215, 88],\n",
- " [ 392, 63]], dtype=int64)"
- ]
- },
- "execution_count": 77,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "\n",
- "# Making the Confusion Matrix\n",
- "from sklearn.metrics import confusion_matrix\n",
- "cm = confusion_matrix(y_test, y_pred)\n",
- "cm"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 78,
- "id": "4c6f892a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.726962457337884"
- ]
- },
- "execution_count": 78,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.metrics import accuracy_score\n",
- "KNN_acc = accuracy_score(y_pred,y_test)\n",
- "KNN_acc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 79,
- "id": "d0df133e",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.5866428745101111"
- ]
- },
- "execution_count": 79,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.metrics import roc_auc_score\n",
- "roc_auc_score(y_pred,y_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 80,
- "id": "9dd24d51",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 80,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWcAAAD6CAYAAAB9N4akAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAZnElEQVR4nO3deXhV1bnH8e+bBDEMYRBBJhUpqKC1XinFqq2oFZwK1tLGaotKm1sBq9YJtNUqUqkI16GC5hYUqkKpE1RxKtartgpYlSpQNIpCSEgARVQwJDnv/SNbe4AMJyHhrGx/H5/9ZJ+11zlrbZ/w8vLutfcxd0dERMKSke4JiIjIrhScRUQCpOAsIhIgBWcRkQApOIuIBEjBWUQkQArOIiI1MLOZZlZqZm8mtU02s3+b2b/M7BEza590bLyZFZjZKjMbktR+lJm9ER273cyszrGbep1z+cZ3tZBadpHTc3C6pyAB2rbt/TqDVl3qE3NadDqo1vHM7FvAJ8Bsdz8sajsZeNbdK8zsdwDufpWZ9QPmAAOBbsBfgb7uXmlmS4CLgZeBhcDt7v5EbWMrcxYRqYG7Pw98sFPb0+5eEb18GegR7Q8D5rp7mbuvBgqAgWbWFchx95e8KhueDQyva+ysRjoHEZEwJCr35GgXAH+K9rtTFaw/Vxi1lUf7O7fXSsFZROKlsqLuPhEzywPykpry3T0/xfdeA1QA93/eVE03r6W9VgrOIhIr7ol69PV8IKVgnMzMRgKnAyf6fy7cFQI9k7r1AIqi9h7VtNdKNWcRiZdEIvWtAcxsKHAV8F1335p0aAGQa2YtzawX0AdY4u7FwMdmNihapfETYH5d4yhzFpF4qUfmXBczmwMcD3Qys0LgOmA80BJ4JloR97K7/9zdl5vZPGAFVeWOMe7+eQH8QuBeIBt4ItpqH1tL6SQdtJROqtMYS+m2v/9qyjFnrwP+a7fHayrKnEUkXhoxc04nBWcRiRWvx2qNkCk4i0i8NPBCX2gUnEUkXlTWEBEJ0J69Q7DJKDiLSLwocxYRCZAuCIqIBEgXBEVEwvOfm/KaNwVnEYkX1ZxFRAKksoaISICUOYuIBKiyPN0zaBQKziISLypriIgESGUNEZEAKXMWEQmQgrOISHhcFwRFRAKkmrOISIBU1hARCZAyZxGRAClzFhEJkDJnEZEAVehh+yIi4VHmLCISINWcRUQCpMxZRCRAypxFRAIUk8w5I90TEBFpVBUVqW91MLOZZlZqZm8mtXU0s2fM7O3oZ4ekY+PNrMDMVpnZkKT2o8zsjejY7WZmdY2t4Cwi8eKe+la3e4GhO7WNAxa5ex9gUfQaM+sH5AL9o/dMM7PM6D3TgTygT7Tt/Jm7UHAWkXhJJFLf6uDuzwMf7NQ8DJgV7c8Chie1z3X3MndfDRQAA82sK5Dj7i+5uwOzk95TI9WcRSRemv6CYBd3LwZw92Iz6xy1dwdeTupXGLWVR/s7t9dKmbOIxIsnUt7MLM/MXkna8nZj5OrqyF5Le62UOYtIvFRWptzV3fOB/HqOUGJmXaOsuStQGrUXAj2T+vUAiqL2HtW010qZs4jESyPWnGuwABgZ7Y8E5ie155pZSzPrRdWFvyVRCeRjMxsUrdL4SdJ7aqTMWUTipRFrzmY2Bzge6GRmhcB1wCRgnpmNAtYAIwDcfbmZzQNWABXAGHf/PI2/kKqVH9nAE9FWKwVnEYmXRrwJxd3PruHQiTX0nwhMrKb9FeCw+oyt4CwiseKJlNYvB0/BWUTiRc/WEBEJUD1Wa4RMwVlE4kWZc/z96rdTef7vS+jYoT2P3nfXLscfe+pZZtz/ZwBaZWfz68vHckifg3ZrzO3btzN+whRWrHqb9u1yuOWG8XTv2oWi9SVccvWNVFYmqKio4Eff/y4/PPO03RpL9ryLLhrFeefl4u4sX/5v8vKu4OCDe3PHHRNp2bIlFRWVXHLJr3jllWXpnmrzFZPgrHXOtRh+6ne4a+qNNR7v3m0/7v39zTwyezo/P+9srr/59pQ/e11xCeeNvXKX9ocfe5qctm14Yt5MfvzD4UydNhOAfffpyH13TeGhWXcy539vZcZ98yjdsKn+JyVp061bF0aPPp9jjjmdAQNOJjMzkxEjzmDixPFMnHgbgwadyoQJU5k4cXy6p9q8Ne6Dj9KmzszZzA6h6oEe3am65bAIWODuK5t4bmk34GuHs664pMbjRx7e74v9r/Y/hJLSjV+8/stTz3L/n+dTXl7BV/sfzK8uG0NmZmZ1H7ODZ194idGjzgXg5OOP47dTp+PutGjR4os+28vLSQT+iyXVy8rKJDt7b8rLK8jOzqa4uAR3JyenDQDt2rWluLi0jk+RWsUkc641OJvZVcDZwFxgSdTcA5hjZnPdfVITz6/ZePixpzh20AAA3nlvDU8u+j/+eNcUWmRlMeGW3/PY039j2Ckn1fk5pRs2sV/nTkDVH+Q2rVux+aMtdGjfjuKSDYy+4lrWFhZz2ZhRdN53nyY9J2lcRUUl3HprPm+99RLbtn3GokUvsGjRCxQWFvOXv8zmppuuISMjg8GDv5fuqTZvX5KldKOA/u5entxoZlOB5VTdKfOlt+Sfy3j4saf54/RbAFj8yuus+HcBuaMuBqCsrIyOHdoD8IvxN7CuqITyinKKSzZw1sgxAJz7g2GcedrJeDUZ8efP5e7aZV8emT2d0g2b+MX4G/jO4GPp1LHDLv0lTO3b53D66Sdz6KHHsnnzFh54YBq5uWfy9a8fwZVXTuDRR5/grLNOY/r0mznttHPSPd3m60uyWiMBdAPe36m9a3SsWtGTnfIApk25kZ/+pKabbJq/VQWruXbSrdw1ZQLt2+UA4O5895STuPTC83fpf/tN1wJVNedrJk7h3t/fvMPxLp07sb50I/t13peKiko++XQr7XLa7tCn87778JVeB/Dqsjc5efBxTXRm0thOOOFY3ntvLRs3Vj0e+NFHn2TQoKPIzR3GZZf9BoCHHnqcadN+l8ZZNn8ek7JGXRcELwEWmdkTZpYfbU9S9fT/i2t6k7vnu/sAdx8Q58BcvL6US66ewE3XXsGB+//noVODBnyNZ557kU0fbgbgoy0fU7S+5tp1ssHHDmL+wr8C8PRzL/CNo47AzFhfuoHPysq++LzX3lixw5gSvrVrixg48Eiys/cGYPDgY1i1qoDi4lKOO24QAMcffwwFBe+lcZYxkPDUt4DVmjm7+5Nm1hcYSNUFQaPq8XdLkx7oEVtXXDeJpa/9i82bt3Di8HMZPerHVETfO/bDM09j+j0P8NGWj7nxljsByMzMZN7M2+nd6wAu+tlPyLvkGhKeoEVWFtf8cjTd9utS55jfO30I4ydM5pQfXEC7nLZMvn4cAO++t5bJv/9fzAx357yzv0ff3r2a7uSl0S1d+jqPPLKQl156nIqKSpYtW86MGQ+wbNmbTJ78G7KyMikrK2Ps2HHpnmrzFpMveLXqapyNqXzju2H/9SRpkdNzcLqnIAHatu39Or/4tC6f3nBOyjGn9bX37/Z4TUU3oYhIvFTE4x/1Cs4iEi8xKWsoOItIvAR+oS9VCs4iEitxWUqn4Cwi8aLMWUQkQArOIiIB+pLcvi0i0qzoOwRFREKk4CwiEiCt1hARCZAyZxGRACk4i4iExytV1hARCY8yZxGR8GgpnYhIiGISnOv6mioRkeYlUY+tDmZ2qZktN7M3zWyOme1tZh3N7Bkzezv62SGp/3gzKzCzVWY2ZHdOQ8FZRGLFKxIpb7Uxs+7AL4AB7n4YkAnkAuOARe7eh6rvUx0X9e8XHe8PDAWmmVlmQ89DwVlE4qURM2eqSr/ZZpYFtAKKgGHArOj4LGB4tD8MmOvuZe6+Giig6vtXG0TBWURixROe8lbr57ivA24B1gDFwEfu/jTQxd2Loz7FQOfoLd2BtUkfURi1NYiCs4jESz0yZzPLM7NXkra8zz8mqiUPA3oB3YDWZnZuLSNX92WxDb46qdUaIhIr9VlK5+75QH4Nh08CVrv7BgAzexj4JlBiZl3dvdjMugKlUf9CoGfS+3tQVQZpEGXOIhIvjVdzXgMMMrNWZmbAicBKYAEwMuozEpgf7S8Acs2spZn1AvoASxp6GsqcRSRWvKKRPsd9sZk9CLwKVACvUZVltwHmmdkoqgL4iKj/cjObB6yI+o9x9wY/+d/cm3bBdvnGd+OxIlwaVU7PwemeggRo27b3q6vb1svGU76dcszp9MT/7fZ4TUWZs4jESzyee6TgLCLx4grOIiLhUXAWEQmQVwZbRq4XBWcRiRVlziIiAfKEMmcRkeAocxYRCZC7MmcRkeAocxYRCVBCqzVERMKjC4IiIgFScBYRCVATP8ttj1FwFpFYUeYsIhIgLaUTEQlQpVZriIiER5mziEiAVHMWEQmQVmuIiARImbOISIAqExnpnkKjUHAWkVhRWUNEJEAJrdYQEQmPltKJiARIZY0UXTng6qYeQpqh8sqKdE9BYkplDRGRAGm1hohIgGJS1SAef8WIiEQSbilvdTGz9mb2oJn928xWmtnRZtbRzJ4xs7ejnx2S+o83swIzW2VmQ3bnPBScRSRW3C3lLQW3AU+6+yHAEcBKYBywyN37AIui15hZPyAX6A8MBaaZWWZDz0PBWURiJVGPrTZmlgN8C5gB4O7b3X0zMAyYFXWbBQyP9ocBc929zN1XAwXAwIaeh4KziMSKYylvdTgI2ADcY2avmdkfzKw10MXdiwGin52j/t2BtUnvL4zaGkTBWURipcIt5c3M8szslaQtL+mjsoD/Aqa7+5HAp0QljBpUF+0bfH1SqzVEJFZSyIj/09c9H8iv4XAhUOjui6PXD1IVnEvMrKu7F5tZV6A0qX/PpPf3AIrqM/dkypxFJFYaq+bs7uuBtWZ2cNR0IrACWACMjNpGAvOj/QVArpm1NLNeQB9gSUPPQ5mziMRKfTLnFFwE3G9mewHvAudTldTOM7NRwBpgBIC7LzezeVQF8ApgjLtXNnRgBWcRiZW6MuL6cPfXgQHVHDqxhv4TgYmNMbaCs4jESmXjZs5po+AsIrESk2+pUnAWkXhJKHMWEQlPXB58pOAsIrHSmBcE00nBWURiJWEqa4iIBKfBC4sDo+AsIrGi1RoiIgHSag0RkQBptYaISIBU1hARCZCW0omIBKhSmbOISHiUOYuIBEjBWUQkQK6yhohIeJQ5i4gESLdvi4gESOucRUQCpLKGiEiAFJxFRAKkZ2uIiARINWcRkQBptYaISIASMSlsKDiLSKzogqCISIDikTcrOItIzChzFhEJUIXFI3fOSPcEREQak9djS4WZZZrZa2b2WPS6o5k9Y2ZvRz87JPUdb2YFZrbKzIbsznkoOItIrCTqsaXoYmBl0utxwCJ37wMsil5jZv2AXKA/MBSYZmaZDT0PBWcRiZUEnvJWFzPrAZwG/CGpeRgwK9qfBQxPap/r7mXuvhooAAY29DwUnEUkVhq5rHErcCU7Jtpd3L0YIPrZOWrvDqxN6lcYtTWIgrOIxEp9yhpmlmdmryRteZ9/jpmdDpS6+z9THLq6G8cbfHVSqzVEJFYq6xEP3T0fyK/h8DHAd83sVGBvIMfM7gNKzKyruxebWVegNOpfCPRMen8PoKi+8/+cMmcRiZXGuiDo7uPdvYe7H0jVhb5n3f1cYAEwMuo2Epgf7S8Acs2spZn1AvoASxp6HsqcRSRWvOnvEZwEzDOzUcAaYASAuy83s3nACqACGOPuDX4Ok4JzDbJatmDsn64jq2ULMjMzWPbEYp78nwd36JOd05rcyf9Np/27UF5Wztwr72L9W4W7NW7mXlmcM3UMPQ7rxdbNnzBr7G18WLiBbv0OYMSNo9i7TTaJygTP3Pkorz/20m6NJXteu3Y55N99C/37H4y787OfXcYpp5zAGWecTCLhbCjdyAU/vZTi4pJ0T7XZaoo7BN39OeC5aH8TcGIN/SYCExtjTHNv2r9lLj0wt9nerrNXq5Zs31pGRlYmv3jweh65/l7ef63gi+NnjD+H7Vs/46nbHqJz726cdcMFTD/nxpQ+u0OPffnRLRdyZ+4NO7Qfc+536Hbo/vz5mhkcecbRHD5kILPH3sa+vbri7mx8bz05nTtw2WO/5aaTLuOzLVsb9Zz3lDuKXkj3FNJi5oxbefHFxcy8Zw4tWrSgVatsEokEH3/8CQBjx1zAoYf2ZczYcWmeaXpUbF+3209jHn3gD1KOOdPemxfs059Vc67F9q1lAGRmZZKZlcnOf4/t16c7b/39TQBK3ymiY499adOpHQBHDT+WSx69kcsXTmLEb3+KZaT2O3DYyQNY8tDzACxbuJg+3+wPwIbVxWx8bz0AW0o/5ONNW2jTMWe3z1H2nLZt23Dcsd9g5j1zACgvL+ejj7Z8EZgBWrduRVMnTHHX2HcIpouCcy0sw7h84SQm/DOfVS++wZrXC3Y4vm7lGr46tGqN+f5H9KZD9060368jnXt348jTj+b271/HLaeOI1GZ4Kjhx6Y0ZrsuHdlctAmARGWCzz7eRusObXfos/8RvclqkcWm9/VP3+bkoIMOYOPGTcz4w/+wdMlT3H3XZFq1ygZgwg1XsfqdpZx99pn85vrJaZ5p81aBp7yFrMHB2czOb8yJhMgTzi2njuM3R49m/yN6s1/fHjscXzR9PtntWnP5wkkcN3Io65a/R6Kykr7HHE6Pw3vxywUTuXzhJPp+8zD22b8LAOff/UsuXziJvHuuoufhB3H5wklcvnASA0d8GwCrJsFOzqRy9m3POVPHMOeK6cqwmpmszEyOPPJw7r57Nl8fOIRPP93KVVeOBeDX1/6OXr2/zpw5jzBmdOz/aDUpr8d/IdudC4LXA/dUdyBayJ0HcGLHARzetvduDJN+n23Zyjsvr+CQb39thwt+ZZ9sY+4Vd33x+tcv3sGmtRvoPfBQlj70PI/fPHeXz7rnv6cCNdecN6//gPbd9uGj9R+QkZnB3m2z2bq56p+9Ldtk87N7rmLhlD/tUPuW5qFwXTGFhcUsWfoaAA8//DhXXjF2hz5z5j7Cgvmzuf6GKemYYizE5ZGhtWbOZvavGrY3gC41vc/d8919gLsPaK6BuXXHtuyd0wqAFi1b0PeYwyl9Z8f15HvntCKzRdVzTQblnsA7i1dS9sk23vr7mxxxyjdos09VTbhVu9Z06N4ppXHffOafDDzrWwAcceo3KPjHcgAyW2Rywd2XsfTh51m2cHGjnKPsWSUlGygsLKJv36o/EyeccCwrV77FV77S64s+Z5x+MqtWvZOuKcbClyVz7gIMAT7cqd2AfzTJjAKR07kDP5pyIRkZGVhGBq8//hIrnn2Vb55zEgD/uP+vdPlKd86ZMppEIkHJ2+uYe+XdAJQUrGPhlHn8/I9XY2ZUVlTy0LUz+XDdxjrHXTzvb5wzdQxXP3crWzd/wh8vuh2Ar512NL0HHkLrDm0Y+P2qEsgDl0+naMX7TfR/QJrCxZf+mtmz7mCvvVqwevUaRv30l+TfPZm+fXuTSCRYs2Ydo8d8OVdqNJa4ZM61LqUzsxnAPe7+YjXHHnD3H9U1QHNeSidN58u6lE5q1xhL6c494Hspx5z73n842KV0tWbO7j6qlmN1BmYRkT1N374tIhKg0GvJqVJwFpFYiUvNWcFZRGJFZQ0RkQCprCEiEqDKmNw5q+AsIrGisoaISIB0QVBEJECqOYuIBEhlDRGRAMXlUboKziISK5XKnEVEwqOyhohIgFTWEBEJkDJnEZEAaSmdiEiAdPu2iEiAVNYQEQmQgrOISIC0WkNEJEBxyZwz0j0BEZHG5PX4rzZm1tPM/mZmK81suZldHLV3NLNnzOzt6GeHpPeMN7MCM1tlZkN25zwUnEUkVio9kfJWhwrgMnc/FBgEjDGzfsA4YJG79wEWRa+JjuUC/YGhwDQzy2zoeSg4i0isuHvKWx2fU+zur0b7HwMrge7AMGBW1G0WMDzaHwbMdfcyd18NFAADG3oeCs4iEisJPOUtVWZ2IHAksBjo4u7FUBXAgc5Rt+7A2qS3FUZtDaLgLCKxUp+as5nlmdkrSVvezp9nZm2Ah4BL3H1LLUNbtdNpIK3WEJFYSdRjKZ275wP5NR03sxZUBeb73f3hqLnEzLq6e7GZdQVKo/ZCoGfS23sARfWZezJlziISK424WsOAGcBKd5+adGgBMDLaHwnMT2rPNbOWZtYL6AMsaeh5KHMWkVhJYRVGqo4Bfgy8YWavR21XA5OAeWY2ClgDjABw9+VmNg9YQdVKjzHuXtnQwRWcRSRW6lPWqI27v0j1dWSAE2t4z0RgYmOMr+AsIrGiR4aKiASosTLndFNwFpFYUeYsIhKgyoZfgwuKgrOIxIoeGSoiEqC4PDJUwVlEYkWZs4hIgLRaQ0QkQFqtISISoEa8fTutFJxFJFZUcxYRCZBqziIiAVLmLCISIK1zFhEJkDJnEZEAabWGiEiAdEFQRCRAKmuIiARIdwiKiARImbOISIDiUnO2uPwt0xyYWZ6756d7HhIW/V5IdTLSPYEvmbx0T0CCpN8L2YWCs4hIgBScRUQCpOC8Z6muKNXR74XsQhcERUQCpMxZRCRACs57iJkNNbNVZlZgZuPSPR9JPzObaWalZvZmuuci4VFw3gPMLBO4EzgF6AecbWb90jsrCcC9wNB0T0LCpOC8ZwwECtz9XXffDswFhqV5TpJm7v488EG65yFhUnDeM7oDa5NeF0ZtIiLVUnDeM6yaNi2TEZEaKTjvGYVAz6TXPYCiNM1FRJoBBec9YynQx8x6mdleQC6wIM1zEpGAKTjvAe5eAYwFngJWAvPcfXl6ZyXpZmZzgJeAg82s0MxGpXtOEg7dISgiEiBlziIiAVJwFhEJkIKziEiAFJxFRAKk4CwiEiAFZxGRACk4i4gESMFZRCRA/w+xZeHU6dfWowAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "import seaborn as sns\n",
- "sns.heatmap(cm, annot = True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 81,
- "id": "ebece630",
- "metadata": {},
- "outputs": [],
- "source": [
- "from sklearn.model_selection import GridSearchCV"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 82,
- "id": "61072235",
- "metadata": {},
- "outputs": [],
- "source": [
- "pGrid = {'n_neighbors': range(10,200),\n",
- " 'leaf_size': range(10, 51, 10), }\n",
- "\n",
- "\n",
- "gscv = GridSearchCV(estimator = KNeighborsClassifier(), param_grid = pGrid, cv = 5,\n",
- " scoring = 'recall', n_jobs = -1, verbose = True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 83,
- "id": "509a2400",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Fitting 5 folds for each of 950 candidates, totalling 4750 fits\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\neighbors\\_classification.py:179: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n",
- " return self._fit(X, y)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "GridSearchCV(cv=5, estimator=KNeighborsClassifier(), n_jobs=-1,\n",
- " param_grid={'leaf_size': range(10, 51, 10),\n",
- " 'n_neighbors': range(10, 200)},\n",
- " scoring='recall', verbose=True)"
- ]
- },
- "execution_count": 83,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "gscv.fit(X,y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "id": "599febe0",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'leaf_size': 10, 'n_neighbors': 11}"
- ]
- },
- "execution_count": 84,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "gscv.best_params_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c4066319",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "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.8.8"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
+ML Model