diff --git a/examples/feast-xgboost-churn-prediction-tutorial/Telecom Customer Churn Prediction (with Feast and XGBoost).ipynb b/examples/feast-xgboost-churn-prediction-tutorial/Telecom Customer Churn Prediction (with Feast and XGBoost).ipynb deleted file mode 100644 index 58097ca0b4..0000000000 --- a/examples/feast-xgboost-churn-prediction-tutorial/Telecom Customer Churn Prediction (with Feast and XGBoost).ipynb +++ /dev/null @@ -1,7506 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Telecom Customer Churn Prediction (with Feast and XGBoost)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial will demonstrate the use of Feast in productionizing a churn model. The tutorial will walk through:\n", - "\n", - "1. Churn Modelling (without Feast): In this section we explore the data, refine it, train a model, and evaluate its performance.\n", - "2. Churn Modelling (with Feast): In this section we introduce Feast for feature storage, management, as well as serving.\n", - "\n", - "This tutorial is an extension of [this](https://www.kaggle.com/pavanraj159/telecom-customer-churn-prediction/comments#6.-Model-Performances) Kaggle notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "fa7e507381a982dfb9bcba253537c50ecd956230" - }, - "source": [ - "## 1. Churn Modelling (without Feast)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Install dependencies for tutorial" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "!pip install sklearn python-slugify plotly statsmodels yellowbrick xgboost" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Import dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", - "_kg_hide-input": false, - "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5" - }, - "outputs": [], - "source": [ - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")\n", - "import plotly.offline as py\n", - "import plotly.graph_objs as go\n", - "import plotly.tools as tls\n", - "from slugify import slugify\n", - "from sklearn.preprocessing import LabelEncoder\n", - "from sklearn.preprocessing import StandardScaler\n", - "from xgboost import XGBClassifier\n", - "from feast import Client, FeatureSet, Entity, ValueType\n", - "import datetime as dt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.1 Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Retrieve the raw telco dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0", - "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
customer_idgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurity...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
07590-VHVEGFemale0YesNo1NoNo phone serviceDSLNo...NoNoNoNoMonth-to-monthYesElectronic check29.8529.85No
15575-GNVDEMale0NoNo34YesNoDSLYes...YesNoNoNoOne yearNoMailed check56.951889.5No
23668-QPYBKMale0NoNo2YesNoDSLYes...NoNoNoNoMonth-to-monthYesMailed check53.85108.15Yes
37795-CFOCWMale0NoNo45NoNo phone serviceDSLYes...YesYesNoNoOne yearNoBank transfer (automatic)42.301840.75No
49237-HQITUFemale0NoNo2YesNoFiber opticNo...NoNoNoNoMonth-to-monthYesElectronic check70.70151.65Yes
\n", - "

5 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " customer_id 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", - "\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", - "\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", - " 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", - "\n", - "[5 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "telcom = pd.read_csv('http://feast-examples.storage.googleapis.com/telco-churn-xgboost/telco_customer_churn.csv')\n", - "telcom.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "c8c010f36e29c116c6662301b08b0b0019d6e22e" - }, - "source": [ - "### 1.2 Data Manipulation" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "_uuid": "8b10c13086dff7182e399b849e31bc03df54a14e" - }, - "outputs": [], - "source": [ - "# Replacing spaces with null values in total charges column\n", - "telcom['TotalCharges'] = telcom[\"TotalCharges\"].replace(\" \",np.nan)\n", - "\n", - "# Dropping null values from total charges column which contain .15% missing data \n", - "telcom = telcom[telcom[\"TotalCharges\"].notnull()]\n", - "telcom = telcom.reset_index()[telcom.columns]\n", - "\n", - "# Convert to float type\n", - "telcom[\"TotalCharges\"] = telcom[\"TotalCharges\"].astype(float)\n", - "\n", - "# Replace 'No internet service' to No for the following columns\n", - "replace_cols = [ 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection',\n", - " 'TechSupport','StreamingTV', 'StreamingMovies']\n", - "for i in replace_cols : \n", - " telcom[i] = telcom[i].replace({'No internet service' : 'No'})\n", - " \n", - "# Replace binary values with strings\n", - "telcom[\"SeniorCitizen\"] = telcom[\"SeniorCitizen\"].replace({1:\"Yes\",0:\"No\"})\n", - "\n", - "# Tenure to categorical column\n", - "def tenure_lab(telcom) :\n", - " \n", - " if telcom[\"tenure\"] <= 12 :\n", - " return \"Tenure_0-12\"\n", - " elif (telcom[\"tenure\"] > 12) & (telcom[\"tenure\"] <= 24 ):\n", - " return \"Tenure_12-24\"\n", - " elif (telcom[\"tenure\"] > 24) & (telcom[\"tenure\"] <= 48) :\n", - " return \"Tenure_24-48\"\n", - " elif (telcom[\"tenure\"] > 48) & (telcom[\"tenure\"] <= 60) :\n", - " return \"Tenure_48-60\"\n", - " elif telcom[\"tenure\"] > 60 :\n", - " return \"Tenure_gt_60\"\n", - "telcom[\"tenure_group\"] = telcom.apply(lambda telcom:tenure_lab(telcom),\n", - " axis = 1)\n", - "\n", - "# Separating churn and non churn customers\n", - "churn = telcom[telcom[\"Churn\"] == \"Yes\"]\n", - "not_churn = telcom[telcom[\"Churn\"] == \"No\"]\n", - "\n", - "# Separating catagorical and numerical columns\n", - "Id_col = ['customerID']\n", - "target_col = [\"Churn\"]\n", - "cat_cols = telcom.nunique()[telcom.nunique() < 6].keys().tolist()\n", - "cat_cols = [x for x in cat_cols if x not in target_col]\n", - "num_cols = [x for x in telcom.columns if x not in cat_cols + target_col + Id_col]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "6dfa77b43fe1a1a301bab65186c2a9f90245ab7d" - }, - "source": [ - "### 1.3 Data Processing" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "_uuid": "8921591320c5e336ec5a2e1efc5ed3cb0f9ec1b2" - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
customer_idgenderseniorcitizenpartnerdependentsphoneserviceonlinesecurityonlinebackupdeviceprotectiontechsupport...paymentmethod_electronic_checkpaymentmethod_mailed_checktenure_group_tenure_0_12tenure_group_tenure_12_24tenure_group_tenure_24_48tenure_group_tenure_48_60tenure_group_tenure_gt_60tenuremonthlychargestotalcharges
07590-VHVEG001000100...1010000-1.280248-1.161694-0.994194
15575-GNVDE100011010...01001000.064303-0.260878-0.173740
23668-QPYBK100011100...0110000-1.239504-0.363923-0.959649
37795-CFOCW100001011...00001000.512486-0.747850-0.195248
49237-HQITU000010000...1010000-1.2395040.196178-0.940457
\n", - "

5 rows × 35 columns

\n", - "
" - ], - "text/plain": [ - " customer_id gender seniorcitizen partner dependents phoneservice \\\n", - "0 7590-VHVEG 0 0 1 0 0 \n", - "1 5575-GNVDE 1 0 0 0 1 \n", - "2 3668-QPYBK 1 0 0 0 1 \n", - "3 7795-CFOCW 1 0 0 0 0 \n", - "4 9237-HQITU 0 0 0 0 1 \n", - "\n", - " onlinesecurity onlinebackup deviceprotection techsupport ... \\\n", - "0 0 1 0 0 ... \n", - "1 1 0 1 0 ... \n", - "2 1 1 0 0 ... \n", - "3 1 0 1 1 ... \n", - "4 0 0 0 0 ... \n", - "\n", - " paymentmethod_electronic_check paymentmethod_mailed_check \\\n", - "0 1 0 \n", - "1 0 1 \n", - "2 0 1 \n", - "3 0 0 \n", - "4 1 0 \n", - "\n", - " tenure_group_tenure_0_12 tenure_group_tenure_12_24 \\\n", - "0 1 0 \n", - "1 0 0 \n", - "2 1 0 \n", - "3 0 0 \n", - "4 1 0 \n", - "\n", - " tenure_group_tenure_24_48 tenure_group_tenure_48_60 \\\n", - "0 0 0 \n", - "1 1 0 \n", - "2 0 0 \n", - "3 1 0 \n", - "4 0 0 \n", - "\n", - " tenure_group_tenure_gt_60 tenure monthlycharges totalcharges \n", - "0 0 -1.280248 -1.161694 -0.994194 \n", - "1 0 0.064303 -0.260878 -0.173740 \n", - "2 0 -1.239504 -0.363923 -0.959649 \n", - "3 0 0.512486 -0.747850 -0.195248 \n", - "4 0 -1.239504 0.196178 -0.940457 \n", - "\n", - "[5 rows x 35 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Customer id col\n", - "Id_col = ['customer_id']\n", - "\n", - "# Target columns\n", - "target_col = [\"churn\"]\n", - "\n", - "# Categorical columns\n", - "cat_cols = telcom.nunique()[telcom.nunique() < 6].keys().tolist()\n", - "cat_cols = [x for x in cat_cols if x not in target_col]\n", - "\n", - "# Numerical columns\n", - "num_cols = [x for x in telcom.columns if x not in cat_cols + target_col + Id_col]\n", - "\n", - "# Binary columns with 2 values\n", - "bin_cols = telcom.nunique()[telcom.nunique() == 2].keys().tolist()\n", - "\n", - "# Columns more than 2 values\n", - "multi_cols = [i for i in cat_cols if i not in bin_cols]\n", - "\n", - "# Label encoding Binary columns\n", - "le = LabelEncoder()\n", - "for i in bin_cols :\n", - " telcom[i] = le.fit_transform(telcom[i])\n", - " \n", - "# Duplicating columns for multi value columns\n", - "telcom = pd.get_dummies(data = telcom,columns = multi_cols )\n", - "\n", - "# Scaling Numerical columns\n", - "std = StandardScaler()\n", - "scaled = std.fit_transform(telcom[num_cols])\n", - "scaled = pd.DataFrame(scaled,columns=num_cols)\n", - "\n", - "# Dropping original values merging scaled values for numerical columns\n", - "df_telcom_og = telcom.copy()\n", - "telcom = telcom.drop(columns = num_cols,axis = 1)\n", - "telcom = telcom.merge(scaled,left_index=True,right_index=True,how = \"left\")\n", - "\n", - "# Clean up column names\n", - "telcom.columns = [slugify(col, lowercase=True, separator='_') for col in telcom.columns]\n", - "telcom.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "9ec25cff71c0eb0f0c839a726cb06cb43462a53f" - }, - "source": [ - "### 1.4 Descriptive Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
countuniquetopfreqmeanstdmin25%50%75%max
customer_id703270321934-SJVJK1NaNNaNNaNNaNNaNNaNNaN
gender7032NaNNaNNaN0.5046930.50001400111
seniorcitizen7032NaNNaNNaN0.16240.36884400001
partner7032NaNNaNNaN0.4825090.49972900011
dependents7032NaNNaNNaN0.2984930.45762900011
phoneservice7032NaNNaNNaN0.9032990.29557101111
onlinesecurity7032NaNNaNNaN0.2865470.4521800011
onlinebackup7032NaNNaNNaN0.3448520.47535400011
deviceprotection7032NaNNaNNaN0.3438570.47502800011
techsupport7032NaNNaNNaN0.2901020.45384200011
streamingtv7032NaNNaNNaN0.3843860.48648400011
streamingmovies7032NaNNaNNaN0.3883670.48741400011
paperlessbilling7032NaNNaNNaN0.5927190.49136300111
churn7032NaNNaNNaN0.2657850.44178200011
multiplelines_no7032NaNNaNNaN0.4813710.49968800011
multiplelines_no_phone_service7032NaNNaNNaN0.09670080.29557100001
multiplelines_yes7032NaNNaNNaN0.4219280.49390200011
internetservice_dsl7032NaNNaNNaN0.3435720.47493400011
internetservice_fiber_optic7032NaNNaNNaN0.4402730.49645500011
internetservice_no7032NaNNaNNaN0.2161550.4116500001
contract_month_to_month7032NaNNaNNaN0.5510520.49742200111
contract_one_year7032NaNNaNNaN0.2093290.40685800001
contract_two_year7032NaNNaNNaN0.2396190.42688100001
paymentmethod_bank_transfer_automatic7032NaNNaNNaN0.2192830.4137900001
paymentmethod_credit_card_automatic7032NaNNaNNaN0.2162970.41174800001
paymentmethod_electronic_check7032NaNNaNNaN0.336320.47248300011
paymentmethod_mailed_check7032NaNNaNNaN0.22810.41963700001
tenure_group_tenure_0_127032NaNNaNNaN0.30930.46223800011
tenure_group_tenure_12_247032NaNNaNNaN0.145620.3527500001
tenure_group_tenure_24_487032NaNNaNNaN0.2266780.41871200001
tenure_group_tenure_48_607032NaNNaNNaN0.1183160.32300500001
tenure_group_tenure_gt_607032NaNNaNNaN0.2000850.40009200001
tenure7032NaNNaNNaN-1.12664e-161.00007-1.28025-0.954296-0.1394170.9199261.61257
monthlycharges7032NaNNaNNaN6.06265e-171.00007-1.54728-0.9709770.1845440.8331481.79338
totalcharges7032NaNNaNNaN-1.11906e-161.00007-0.999069-0.830249-0.3908150.6668272.82426
\n", - "
" - ], - "text/plain": [ - " count unique top freq \\\n", - "customer_id 7032 7032 1934-SJVJK 1 \n", - "gender 7032 NaN NaN NaN \n", - "seniorcitizen 7032 NaN NaN NaN \n", - "partner 7032 NaN NaN NaN \n", - "dependents 7032 NaN NaN NaN \n", - "phoneservice 7032 NaN NaN NaN \n", - "onlinesecurity 7032 NaN NaN NaN \n", - "onlinebackup 7032 NaN NaN NaN \n", - "deviceprotection 7032 NaN NaN NaN \n", - "techsupport 7032 NaN NaN NaN \n", - "streamingtv 7032 NaN NaN NaN \n", - "streamingmovies 7032 NaN NaN NaN \n", - "paperlessbilling 7032 NaN NaN NaN \n", - "churn 7032 NaN NaN NaN \n", - "multiplelines_no 7032 NaN NaN NaN \n", - "multiplelines_no_phone_service 7032 NaN NaN NaN \n", - "multiplelines_yes 7032 NaN NaN NaN \n", - "internetservice_dsl 7032 NaN NaN NaN \n", - "internetservice_fiber_optic 7032 NaN NaN NaN \n", - "internetservice_no 7032 NaN NaN NaN \n", - "contract_month_to_month 7032 NaN NaN NaN \n", - "contract_one_year 7032 NaN NaN NaN \n", - "contract_two_year 7032 NaN NaN NaN \n", - "paymentmethod_bank_transfer_automatic 7032 NaN NaN NaN \n", - "paymentmethod_credit_card_automatic 7032 NaN NaN NaN \n", - "paymentmethod_electronic_check 7032 NaN NaN NaN \n", - "paymentmethod_mailed_check 7032 NaN NaN NaN \n", - "tenure_group_tenure_0_12 7032 NaN NaN NaN \n", - "tenure_group_tenure_12_24 7032 NaN NaN NaN \n", - "tenure_group_tenure_24_48 7032 NaN NaN NaN \n", - "tenure_group_tenure_48_60 7032 NaN NaN NaN \n", - "tenure_group_tenure_gt_60 7032 NaN NaN NaN \n", - "tenure 7032 NaN NaN NaN \n", - "monthlycharges 7032 NaN NaN NaN \n", - "totalcharges 7032 NaN NaN NaN \n", - "\n", - " mean std min \\\n", - "customer_id NaN NaN NaN \n", - "gender 0.504693 0.500014 0 \n", - "seniorcitizen 0.1624 0.368844 0 \n", - "partner 0.482509 0.499729 0 \n", - "dependents 0.298493 0.457629 0 \n", - "phoneservice 0.903299 0.295571 0 \n", - "onlinesecurity 0.286547 0.45218 0 \n", - "onlinebackup 0.344852 0.475354 0 \n", - "deviceprotection 0.343857 0.475028 0 \n", - "techsupport 0.290102 0.453842 0 \n", - "streamingtv 0.384386 0.486484 0 \n", - "streamingmovies 0.388367 0.487414 0 \n", - "paperlessbilling 0.592719 0.491363 0 \n", - "churn 0.265785 0.441782 0 \n", - "multiplelines_no 0.481371 0.499688 0 \n", - "multiplelines_no_phone_service 0.0967008 0.295571 0 \n", - "multiplelines_yes 0.421928 0.493902 0 \n", - "internetservice_dsl 0.343572 0.474934 0 \n", - "internetservice_fiber_optic 0.440273 0.496455 0 \n", - "internetservice_no 0.216155 0.41165 0 \n", - "contract_month_to_month 0.551052 0.497422 0 \n", - "contract_one_year 0.209329 0.406858 0 \n", - "contract_two_year 0.239619 0.426881 0 \n", - "paymentmethod_bank_transfer_automatic 0.219283 0.41379 0 \n", - "paymentmethod_credit_card_automatic 0.216297 0.411748 0 \n", - "paymentmethod_electronic_check 0.33632 0.472483 0 \n", - "paymentmethod_mailed_check 0.2281 0.419637 0 \n", - "tenure_group_tenure_0_12 0.3093 0.462238 0 \n", - "tenure_group_tenure_12_24 0.14562 0.35275 0 \n", - "tenure_group_tenure_24_48 0.226678 0.418712 0 \n", - "tenure_group_tenure_48_60 0.118316 0.323005 0 \n", - "tenure_group_tenure_gt_60 0.200085 0.400092 0 \n", - "tenure -1.12664e-16 1.00007 -1.28025 \n", - "monthlycharges 6.06265e-17 1.00007 -1.54728 \n", - "totalcharges -1.11906e-16 1.00007 -0.999069 \n", - "\n", - " 25% 50% 75% max \n", - "customer_id NaN NaN NaN NaN \n", - "gender 0 1 1 1 \n", - "seniorcitizen 0 0 0 1 \n", - "partner 0 0 1 1 \n", - "dependents 0 0 1 1 \n", - "phoneservice 1 1 1 1 \n", - "onlinesecurity 0 0 1 1 \n", - "onlinebackup 0 0 1 1 \n", - "deviceprotection 0 0 1 1 \n", - "techsupport 0 0 1 1 \n", - "streamingtv 0 0 1 1 \n", - "streamingmovies 0 0 1 1 \n", - "paperlessbilling 0 1 1 1 \n", - "churn 0 0 1 1 \n", - "multiplelines_no 0 0 1 1 \n", - "multiplelines_no_phone_service 0 0 0 1 \n", - "multiplelines_yes 0 0 1 1 \n", - "internetservice_dsl 0 0 1 1 \n", - "internetservice_fiber_optic 0 0 1 1 \n", - "internetservice_no 0 0 0 1 \n", - "contract_month_to_month 0 1 1 1 \n", - "contract_one_year 0 0 0 1 \n", - "contract_two_year 0 0 0 1 \n", - "paymentmethod_bank_transfer_automatic 0 0 0 1 \n", - "paymentmethod_credit_card_automatic 0 0 0 1 \n", - "paymentmethod_electronic_check 0 0 1 1 \n", - "paymentmethod_mailed_check 0 0 0 1 \n", - "tenure_group_tenure_0_12 0 0 1 1 \n", - "tenure_group_tenure_12_24 0 0 0 1 \n", - "tenure_group_tenure_24_48 0 0 0 1 \n", - "tenure_group_tenure_48_60 0 0 0 1 \n", - "tenure_group_tenure_gt_60 0 0 0 1 \n", - "tenure -0.954296 -0.139417 0.919926 1.61257 \n", - "monthlycharges -0.970977 0.184544 0.833148 1.79338 \n", - "totalcharges -0.830249 -0.390815 0.666827 2.82426 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "telcom.describe(include='all').T" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "82a7617e37906622dbe00a1783a13cbf382d2513" - }, - "source": [ - "### 1.5 Correlation Matrix" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "_uuid": "b52cf9c7f402ed706e82221e3f8601fdeea9ab27" - }, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "linkText": "Export to plot.ly", - "plotlyServerURL": "https://plot.ly", - "showLink": false - }, - "data": [ - { - "colorbar": { - "title": { - "side": "right", - "text": "Pearson Correlation coefficient" - } - }, - "colorscale": [ - [ - 0, - "#440154" - ], - [ - 0.1111111111111111, - "#482878" - ], - [ - 0.2222222222222222, - "#3e4989" - ], - [ - 0.3333333333333333, - "#31688e" - ], - [ - 0.4444444444444444, - "#26828e" - ], - [ - 0.5555555555555556, - "#1f9e89" - ], - [ - 0.6666666666666666, - "#35b779" - ], - [ - 0.7777777777777778, - "#6ece58" - ], - [ - 0.8888888888888888, - "#b5de2b" - ], - [ - 1, - "#fde725" - ] - ], - "type": "heatmap", - "x": [ - "gender", - "seniorcitizen", - "partner", - "dependents", - "phoneservice", - "onlinesecurity", - "onlinebackup", - "deviceprotection", - "techsupport", - "streamingtv", - "streamingmovies", - "paperlessbilling", - "churn", - "multiplelines_no", - "multiplelines_no_phone_service", - "multiplelines_yes", - "internetservice_dsl", - "internetservice_fiber_optic", - "internetservice_no", - "contract_month_to_month", - "contract_one_year", - "contract_two_year", - "paymentmethod_bank_transfer_automatic", - "paymentmethod_credit_card_automatic", - "paymentmethod_electronic_check", - "paymentmethod_mailed_check", - "tenure_group_tenure_0_12", - "tenure_group_tenure_12_24", - "tenure_group_tenure_24_48", - "tenure_group_tenure_48_60", - "tenure_group_tenure_gt_60", - "tenure", - "monthlycharges", - "totalcharges" - ], - "y": [ - "gender", - "seniorcitizen", - "partner", - "dependents", - "phoneservice", - "onlinesecurity", - "onlinebackup", - "deviceprotection", - "techsupport", - "streamingtv", - "streamingmovies", - "paperlessbilling", - "churn", - "multiplelines_no", - "multiplelines_no_phone_service", - "multiplelines_yes", - "internetservice_dsl", - "internetservice_fiber_optic", - "internetservice_no", - "contract_month_to_month", - "contract_one_year", - "contract_two_year", - "paymentmethod_bank_transfer_automatic", - "paymentmethod_credit_card_automatic", - "paymentmethod_electronic_check", - "paymentmethod_mailed_check", - "tenure_group_tenure_0_12", - "tenure_group_tenure_12_24", - "tenure_group_tenure_24_48", - "tenure_group_tenure_48_60", - "tenure_group_tenure_gt_60", - "tenure", - "monthlycharges", - "totalcharges" - ], - "z": [ - [ - 1, - -0.001819390613419179, - -0.0013790513218356025, - 0.010348917127614397, - -0.007514979909200033, - -0.01632782307070617, - -0.013092839264555001, - -0.0008067457759124324, - -0.008507162405232782, - -0.0071243969867245535, - -0.010105418366566195, - -0.011901894766838502, - -0.008544643224947218, - 0.0043346914502916285, - 0.0075149799091999425, - -0.008882737146286056, - 0.00758357610303961, - -0.011189259276385864, - 0.004744965758849955, - -0.0032507651194551004, - 0.0077548529142672145, - -0.003603167413572989, - -0.015973079031173835, - 0.001631872518613598, - 0.0008437084888753327, - 0.01319936726545174, - -0.0010503798619876774, - -0.0006494991207074467, - -0.010516394125351592, - -0.004318975744551275, - 0.01627881894278637, - 0.005285371870295646, - -0.013779327268354416, - 4.783950839776602e-05 - ], - [ - -0.001819390613419179, - 1, - 0.01695661453202187, - -0.21055006112684216, - 0.008391611911217043, - -0.0385763901686064, - 0.06666279065142021, - 0.059513871482029225, - -0.060576839406188035, - 0.10544501753678828, - 0.11984236746151568, - 0.15625775052783097, - 0.1505410534156757, - -0.13637672686229402, - -0.008391611911217034, - 0.14299625086621018, - -0.10827563872848943, - 0.25492331502717946, - -0.18251949495535458, - 0.13775207088551514, - -0.0464907545657889, - -0.11620511425710835, - -0.01623474200582214, - -0.024359419683712323, - 0.17132216591713703, - -0.15298719260173027, - -0.02771322371899571, - 0.0018604411671567017, - 0.02038346087056509, - 0.01418568213097567, - -0.0024069937431968856, - 0.01568347989913396, - 0.21987422950593646, - 0.10241060539532633 - ], - [ - -0.0013790513218356025, - 0.01695661453202187, - 1, - 0.45226888584550023, - 0.018397189302703662, - 0.14334606167364233, - 0.14184917072520303, - 0.1535564364182745, - 0.12020601780298455, - 0.12448262672518244, - 0.11810820943292764, - -0.013956696136191696, - -0.14998192562006138, - -0.13002839561671578, - -0.018397189302703666, - 0.1425612874681736, - -0.0010430787434336079, - 0.0012346095228208073, - -0.0002855204740384597, - -0.2802019157901561, - 0.08306706395255747, - 0.24733370647615796, - 0.11140561212215645, - 0.08232738919649572, - -0.08320661736633733, - -0.09694798339506473, - -0.30506147447521575, - -0.048481275955609554, - 0.028467762106169584, - 0.10534126166196492, - 0.28035324824529767, - 0.38191150910757077, - 0.09782497186892049, - 0.31907236323857324 - ], - [ - 0.010348917127614397, - -0.21055006112684216, - 0.45226888584550023, - 1, - -0.001077812708067608, - 0.08078553224088346, - 0.023638813060609963, - 0.013899668260943368, - 0.06305315799997827, - -0.01649868035801052, - -0.03837492560091315, - -0.11013068597336993, - -0.16312843938822, - 0.023387669506115295, - 0.0010778127080674446, - -0.024306661314620996, - 0.05159321756471237, - -0.16410089031864167, - 0.13838288994798562, - -0.2297147909213749, - 0.06922205672629726, - 0.2016993304297039, - 0.05236890928127545, - 0.06113408322897806, - -0.1492739811934336, - 0.05644841359590588, - -0.1453791450700764, - -0.0014594010172321779, - 0.02464494581436856, - 0.03141940765317757, - 0.1180897178470907, - 0.16338596691556453, - -0.11234295350128225, - 0.0646532494217739 - ], - [ - -0.007514979909200033, - 0.008391611911217043, - 0.018397189302703662, - -0.001077812708067608, - 1, - -0.09167570469500017, - -0.05213341919796151, - -0.07007561533228862, - -0.09513849428922488, - -0.021382711870578185, - -0.03347749718236395, - 0.016696123642784135, - 0.011691398865422323, - 0.31521775126801543, - -1, - 0.2795295400049995, - -0.45225528090657086, - 0.29018311793843365, - 0.1718171065699321, - -0.0012425134067734023, - -0.0031417807184111624, - 0.0044422513152849235, - 0.008271245210923577, - -0.006916252198127548, - 0.0027471183312986857, - -0.004462839400732194, - -0.00694955039725527, - 0.012306612692869211, - -0.014777815951004124, - -0.009750281447949313, - 0.020515848357693, - 0.007877333295041818, - 0.2480330664757158, - 0.11300826095473893 - ], - [ - -0.01632782307070617, - -0.0385763901686064, - 0.14334606167364233, - 0.08078553224088346, - -0.09167570469500017, - 1, - 0.28328454262626757, - 0.274875003842449, - 0.35445796164509147, - 0.1755144708953688, - 0.18742584957299618, - -0.004051250607988492, - -0.17126992353351678, - -0.15167751168612081, - 0.09167570469500017, - 0.0985919934252315, - 0.3203433737595294, - -0.03050626904076453, - -0.33279949932167546, - -0.24684428487400414, - 0.10065777311969464, - 0.19169819815673583, - 0.09436639279979232, - 0.11547320256635303, - -0.11229466175861408, - -0.07991768713640306, - -0.24240887436050382, - -0.0556619409198579, - 0.0076950987178344265, - 0.0716632710172793, - 0.26322845571231857, - 0.32829748818662485, - 0.2964469592375873, - 0.41261876950713655 - ], - [ - -0.013092839264555001, - 0.06666279065142021, - 0.14184917072520303, - 0.023638813060609963, - -0.05213341919796151, - 0.28328454262626757, - 1, - 0.30305766643807824, - 0.29370469187781045, - 0.2816010622259753, - 0.27452301070772545, - 0.12705603268686044, - -0.08230696876508349, - -0.2307241996493635, - 0.05213341919796151, - 0.2022283972825372, - 0.15676460995441888, - 0.16594028590307677, - -0.3809903317320751, - -0.16439302987919688, - 0.08411316021806066, - 0.11139068731904943, - 0.0869415675760231, - 0.09045518641091457, - -0.00036426636786500763, - -0.17407470231312427, - -0.26736609150996915, - -0.08408097138202993, - 0.023085000444599418, - 0.09919210454041022, - 0.2787875817043761, - 0.36113847824658735, - 0.4415290881871007, - 0.510100290145439 - ], - [ - -0.0008067457759124324, - 0.059513871482029225, - 0.1535564364182745, - 0.013899668260943368, - -0.07007561533228862, - 0.274875003842449, - 0.30305766643807824, - 1, - 0.33285005080469243, - 0.3899237975094597, - 0.4023088228216018, - 0.10407904724402045, - -0.06619251684228997, - -0.24084736328107104, - 0.07007561533228862, - 0.201732824517757, - 0.14514955473692903, - 0.17635617323471664, - -0.3801513548956378, - -0.22598757731112262, - 0.10291089629343353, - 0.16524753554250074, - 0.08304690185342707, - 0.11125168129784246, - -0.003308493511411254, - -0.18732483013668594, - -0.2739200544387702, - -0.07733200729381666, - 0.0449724925036831, - 0.07685425917962475, - 0.2755370112516221, - 0.3615199952862194, - 0.48260691224313995, - 0.5228814865154369 - ], - [ - -0.008507162405232782, - -0.060576839406188035, - 0.12020601780298455, - 0.06305315799997827, - -0.09513849428922488, - 0.35445796164509147, - 0.29370469187781045, - 0.33285005080469243, - 1, - 0.277548599200549, - 0.2801552432906342, - 0.03753587307318976, - -0.16471590834411207, - -0.15553386914722026, - 0.09513849428922488, - 0.10042125595413272, - 0.3121832985222757, - -0.020298967520709605, - -0.33569508671869736, - -0.28549086901033593, - 0.09625836225380952, - 0.24092408252256528, - 0.10047200087443556, - 0.11702370730984143, - -0.11480726996437085, - -0.08463055196615278, - -0.23862820953475447, - -0.07201850701116608, - 0.022136746625123563, - 0.06270980841796413, - 0.26539627802277554, - 0.325288454100009, - 0.33830139143424953, - 0.4328683682410939 - ], - [ - -0.0071243969867245535, - 0.10544501753678828, - 0.12448262672518244, - -0.01649868035801052, - -0.021382711870578185, - 0.1755144708953688, - 0.2816010622259753, - 0.3899237975094597, - 0.277548599200549, - 1, - 0.5333800979319763, - 0.22424119793848596, - 0.06325398027519404, - -0.26746641467807136, - 0.021382711870577976, - 0.25780350066730157, - 0.014973379079172382, - 0.3297441152730512, - -0.41495062156578044, - -0.11254989712217289, - 0.061929689963200855, - 0.07212357537070835, - 0.04612070051242859, - 0.040010276337768505, - 0.1447470086556032, - -0.2477115493728633, - -0.22076087097198827, - -0.050234026791169964, - 0.02882937792536747, - 0.08796930347195206, - 0.1981501311372027, - 0.280263628074823, - 0.6296678921767406, - 0.5157090769923935 - ], - [ - -0.010105418366566195, - 0.11984236746151568, - 0.11810820943292764, - -0.03837492560091315, - -0.03347749718236395, - 0.18742584957299618, - 0.27452301070772545, - 0.4023088228216018, - 0.2801552432906342, - 0.5333800979319763, - 1, - 0.21158250423808916, - 0.06085993668146301, - -0.2759953197780627, - 0.03347749718236395, - 0.2591943175468362, - 0.02562310861129719, - 0.3224574540559222, - -0.41844975538334045, - -0.11786687989290552, - 0.06477997824381859, - 0.07560257919382919, - 0.04875484714119087, - 0.048398314068082315, - 0.13742008269944622, - -0.2502897149395328, - -0.2213881765552116, - -0.054338325985925064, - 0.02504810987080452, - 0.08661557153323526, - 0.20754366554274195, - 0.2854022671060787, - 0.6272347301103788, - 0.5198665357835017 - ], - [ - -0.011901894766838502, - 0.15625775052783097, - -0.013956696136191696, - -0.11013068597336993, - 0.016696123642784135, - -0.004051250607988492, - 0.12705603268686044, - 0.10407904724402045, - 0.03753587307318976, - 0.22424119793848596, - 0.21158250423808916, - 1, - 0.19145432108006671, - -0.1519737778021082, - -0.016696123642784142, - 0.1637457730112591, - -0.06338966821876392, - 0.32647017160380964, - -0.3205922451174622, - 0.16829626845602835, - -0.052278164693773076, - -0.1462807050684952, - -0.017468900682392235, - -0.013726285095880284, - 0.20842668228002995, - -0.20398064814312206, - -0.003859801258113621, - 0.003328006906514837, - -0.005388027856510724, - 0.010626123397145876, - -0.001414839543993747, - 0.004823156615386272, - 0.3519304153712528, - 0.15782978286591698 - ], - [ - -0.008544643224947218, - 0.1505410534156757, - -0.14998192562006138, - -0.16312843938822, - 0.011691398865422323, - -0.17126992353351678, - -0.08230696876508349, - -0.06619251684228997, - -0.16471590834411207, - 0.06325398027519404, - 0.06085993668146301, - 0.19145432108006671, - 1, - -0.03265360299730401, - -0.01169139886542221, - 0.040032739872523634, - -0.12414142842590645, - 0.30746259069818205, - -0.22757762044656818, - 0.40456455007784087, - -0.17822502328994053, - -0.30155233962397837, - -0.1181359978280296, - -0.1346868372340906, - 0.30145463790858057, - -0.09077284582582087, - 0.3196275743451608, - 0.019928968647699895, - -0.07585881574899747, - -0.10079964105628228, - -0.2260781096915624, - -0.3540493589532626, - 0.1928582184700881, - -0.1994840835675715 - ], - [ - 0.0043346914502916285, - -0.13637672686229402, - -0.13002839561671578, - 0.023387669506115295, - 0.31521775126801543, - -0.15167751168612081, - -0.2307241996493635, - -0.24084736328107104, - -0.15553386914722026, - -0.26746641467807136, - -0.2759953197780627, - -0.1519737778021082, - -0.03265360299730401, - 1, - -0.3152177512680155, - -0.8230760279128654, - -0.06951498798055156, - -0.19053099387424138, - 0.3099843327828031, - 0.08679791861868207, - 0.0016944436455045328, - -0.1027560050227385, - -0.06966277653167001, - -0.06371157499118037, - -0.0809902106781048, - 0.22239547449983668, - 0.25617128287621094, - 0.05170274575687212, - -0.03215707580783382, - -0.08063023581160907, - -0.2427981631428492, - -0.323890766966285, - -0.3385136039067215, - -0.39676537714107735 - ], - [ - 0.0075149799091999425, - -0.008391611911217034, - -0.018397189302703666, - 0.0010778127080674446, - -1, - 0.09167570469500017, - 0.05213341919796151, - 0.07007561533228862, - 0.09513849428922488, - 0.021382711870577976, - 0.03347749718236395, - -0.016696123642784142, - -0.01169139886542221, - -0.3152177512680155, - 1, - -0.2795295400049995, - 0.45225528090657086, - -0.29018311793843365, - -0.1718171065699321, - 0.0012425134067734103, - 0.0031417807184113207, - -0.004442251315284906, - -0.008271245210923579, - 0.006916252198127564, - -0.0027471183312986857, - 0.004462839400732508, - 0.006949550397255344, - -0.012306612692869208, - 0.014777815951004133, - 0.009750281447949528, - -0.02051584835769357, - -0.007877333295041807, - -0.2480330664757158, - -0.1130082609547389 - ], - [ - -0.008882737146286056, - 0.14299625086621018, - 0.1425612874681736, - -0.024306661314620996, - 0.2795295400049995, - 0.0985919934252315, - 0.2022283972825372, - 0.201732824517757, - 0.10042125595413272, - 0.25780350066730157, - 0.2591943175468362, - 0.1637457730112591, - 0.040032739872523634, - -0.8230760279128654, - -0.2795295400049995, - 1, - -0.2003183214156725, - 0.3664202566051166, - -0.21079354712189471, - -0.08855832218643561, - -0.003594461398434266, - 0.10661820819152797, - 0.07542871730303179, - 0.06031899094084278, - 0.08358299305536028, - -0.22767156949803466, - -0.26333120743722876, - -0.04494367118136859, - 0.023690157563696343, - 0.07573985650934924, - 0.25792003827196397, - 0.33239924473562554, - 0.4909121973267493, - 0.4690421356971826 - ], - [ - 0.00758357610303961, - -0.10827563872848943, - -0.0010430787434336079, - 0.05159321756471237, - -0.45225528090657086, - 0.3203433737595294, - 0.15676460995441888, - 0.14514955473692903, - 0.3121832985222757, - 0.014973379079172382, - 0.02562310861129719, - -0.06338966821876392, - -0.12414142842590645, - -0.06951498798055156, - 0.45225528090657086, - -0.2003183214156725, - 1, - -0.6416356650534906, - -0.3799117751052334, - -0.06522632996531619, - 0.04729967349374622, - 0.030923714855574744, - 0.02475954021490298, - 0.05122176476699011, - -0.10429333541089097, - 0.04275388869901973, - -0.0014704079413737543, - -0.013428683581908657, - -0.0004678565419111244, - -0.00079001062411148, - 0.014665913237832425, - 0.013786269825793156, - -0.16136793538251534, - -0.052189866637419764 - ], - [ - -0.011189259276385864, - 0.25492331502717946, - 0.0012346095228208073, - -0.16410089031864167, - 0.29018311793843365, - -0.03050626904076453, - 0.16594028590307677, - 0.17635617323471664, - -0.020298967520709605, - 0.3297441152730512, - 0.3224574540559222, - 0.32647017160380964, - 0.30746259069818205, - -0.19053099387424138, - -0.29018311793843365, - 0.3664202566051166, - -0.6416356650534906, - 1, - -0.4657363343235562, - 0.24301351814831268, - -0.07680902975096314, - -0.20996452908904545, - -0.022778855291876635, - -0.050551991558036385, - 0.3357634768102139, - -0.3059839224841771, - -0.021440560786684968, - -0.0014940221824271288, - 0.005613761063888361, - 0.01746632456448475, - 0.0061120739544805805, - 0.017929529906438778, - 0.7871948529419658, - 0.3607687920142481 - ], - [ - 0.004744965758849955, - -0.18251949495535458, - -0.0002855204740384597, - 0.13838288994798562, - 0.1718171065699321, - -0.33279949932167546, - -0.3809903317320751, - -0.3801513548956378, - -0.33569508671869736, - -0.41495062156578044, - -0.41844975538334045, - -0.3205922451174622, - -0.22757762044656818, - 0.3099843327828031, - -0.1718171065699321, - -0.21079354712189471, - -0.3799117751052334, - -0.4657363343235562, - 1, - -0.217823505545489, - 0.038061459724733744, - 0.21754205606911817, - -0.0010943032992050863, - 0.0018701145623306124, - -0.2846082097225956, - 0.3196937439459745, - 0.027554030004254233, - 0.01729491162511594, - -0.006230482005525746, - -0.020153136101165186, - -0.024291768931540957, - -0.037528889581619734, - -0.7631910615169571, - -0.37487836259896 - ], - [ - -0.0032507651194551004, - 0.13775207088551514, - -0.2802019157901561, - -0.2297147909213749, - -0.0012425134067734023, - -0.24684428487400414, - -0.16439302987919688, - -0.22598757731112262, - -0.28549086901033593, - -0.11254989712217289, - -0.11786687989290552, - 0.16829626845602835, - 0.40456455007784087, - 0.08679791861868207, - 0.0012425134067734103, - -0.08855832218643561, - -0.06522632996531619, - 0.24301351814831268, - -0.217823505545489, - 1, - -0.5700527848944215, - -0.6219327447713561, - -0.18015909738683936, - -0.20496021669474843, - 0.33087881370583405, - 0.006208692442055045, - 0.49205202568054424, - 0.14000368638519403, - -0.05215631834144274, - -0.19870886170688193, - -0.47691223651608966, - -0.649345648869048, - 0.0589334582292538, - -0.4467758743246882 - ], - [ - 0.0077548529142672145, - -0.0464907545657889, - 0.08306706395255747, - 0.06922205672629726, - -0.0031417807184111624, - 0.10065777311969464, - 0.08411316021806066, - 0.10291089629343353, - 0.09625836225380952, - 0.061929689963200855, - 0.06477997824381859, - -0.052278164693773076, - -0.17822502328994053, - 0.0016944436455045328, - 0.0031417807184113207, - -0.003594461398434266, - 0.04729967349374622, - -0.07680902975096314, - 0.038061459724733744, - -0.5700527848944215, - 1, - -0.28884268256780254, - 0.05762874929825631, - 0.06758968145792751, - -0.10954646682258033, - 0.0001971241890499786, - -0.2512993032332009, - -0.017196458507178478, - 0.15389327309228798, - 0.15891681528381144, - 0.01614171428694319, - 0.2023384083649546, - 0.004809615120440435, - 0.17056928655718714 - ], - [ - -0.003603167413572989, - -0.11620511425710835, - 0.24733370647615796, - 0.2016993304297039, - 0.0044422513152849235, - 0.19169819815673583, - 0.11139068731904943, - 0.16524753554250074, - 0.24092408252256528, - 0.07212357537070835, - 0.07560257919382919, - -0.1462807050684952, - -0.30155233962397837, - -0.1027560050227385, - -0.004442251315284906, - 0.10661820819152797, - 0.030923714855574744, - -0.20996452908904545, - 0.21754205606911817, - -0.6219327447713561, - -0.28884268256780254, - 1, - 0.1550042180767056, - 0.17440993895950943, - -0.28114743393395547, - -0.007422540118618717, - -0.33385014178843664, - -0.14674905438081498, - -0.08589992270093438, - 0.08008211690632902, - 0.5403360993105428, - 0.5638005002286687, - -0.07325607300641665, - 0.35803561609140894 - ], - [ - -0.015973079031173835, - -0.01623474200582214, - 0.11140561212215645, - 0.05236890928127545, - 0.008271245210923577, - 0.09436639279979232, - 0.0869415675760231, - 0.08304690185342707, - 0.10047200087443556, - 0.04612070051242859, - 0.04875484714119087, - -0.017468900682392235, - -0.1181359978280296, - -0.06966277653167001, - -0.008271245210923579, - 0.07542871730303179, - 0.02475954021490298, - -0.022778855291876635, - -0.0010943032992050863, - -0.18015909738683936, - 0.05762874929825631, - 0.1550042180767056, - 1, - -0.27842319712065355, - -0.3772703602158491, - -0.28809669563791657, - -0.18585512574019983, - -0.04632871286727803, - 0.02172285552026243, - 0.060183035947993645, - 0.1842491799195877, - 0.24382246495742915, - 0.04240972759459293, - 0.18611944938877964 - ], - [ - 0.001631872518613598, - -0.024359419683712323, - 0.08232738919649572, - 0.06113408322897806, - -0.006916252198127548, - 0.11547320256635303, - 0.09045518641091457, - 0.11125168129784246, - 0.11702370730984143, - 0.040010276337768505, - 0.048398314068082315, - -0.013726285095880284, - -0.1346868372340906, - -0.06371157499118037, - 0.006916252198127564, - 0.06031899094084278, - 0.05122176476699011, - -0.050551991558036385, - 0.0018701145623306124, - -0.20496021669474843, - 0.06758968145792751, - 0.17440993895950943, - -0.27842319712065355, - 1, - -0.37397801626928234, - -0.28558254792863036, - -0.18416488323856553, - -0.03964706284937272, - 0.028232511385228868, - 0.048166948994686994, - 0.17929367300430438, - 0.23280034413314615, - 0.030054608328366407, - 0.1826633671546002 - ], - [ - 0.0008437084888753327, - 0.17132216591713703, - -0.08320661736633733, - -0.1492739811934336, - 0.0027471183312986857, - -0.11229466175861408, - -0.00036426636786500763, - -0.003308493511411254, - -0.11480726996437085, - 0.1447470086556032, - 0.13742008269944622, - 0.20842668228002995, - 0.30145463790858057, - -0.0809902106781048, - -0.0027471183312986857, - 0.08358299305536028, - -0.10429333541089097, - 0.3357634768102139, - -0.2846082097225956, - 0.33087881370583405, - -0.10954646682258033, - -0.28114743393395547, - -0.3772703602158491, - -0.37397801626928234, - 1, - -0.3869714587097063, - 0.1605298863682866, - 0.030386796069204806, - -0.011569992641797876, - -0.030584308144429393, - -0.1754558932547761, - -0.21019749610817867, - 0.27111737739356384, - -0.060436278689198375 - ], - [ - 0.01319936726545174, - -0.15298719260173027, - -0.09694798339506473, - 0.05644841359590588, - -0.004462839400732194, - -0.07991768713640306, - -0.17407470231312427, - -0.18732483013668594, - -0.08463055196615278, - -0.2477115493728633, - -0.2502897149395328, - -0.20398064814312206, - -0.09077284582582087, - 0.22239547449983668, - 0.004462839400732508, - -0.22767156949803466, - 0.04275388869901973, - -0.3059839224841771, - 0.3196937439459745, - 0.006208692442055045, - 0.0001971241890499786, - -0.007422540118618717, - -0.28809669563791657, - -0.28558254792863036, - -0.3869714587097063, - 1, - 0.18322236745325193, - 0.05037142820607642, - -0.03609490261093368, - -0.07217004405828796, - -0.16005348763614577, - -0.23218078070201725, - -0.37656828808083825, - -0.29470837017550655 - ], - [ - -0.0010503798619876774, - -0.02771322371899571, - -0.30506147447521575, - -0.1453791450700764, - -0.00694955039725527, - -0.24240887436050382, - -0.26736609150996915, - -0.2739200544387702, - -0.23862820953475447, - -0.22076087097198827, - -0.2213881765552116, - -0.003859801258113621, - 0.3196275743451608, - 0.25617128287621094, - 0.006949550397255344, - -0.26333120743722876, - -0.0014704079413737543, - -0.021440560786684968, - 0.027554030004254233, - 0.49205202568054424, - -0.2512993032332009, - -0.33385014178843664, - -0.18585512574019983, - -0.18416488323856553, - 0.1605298863682866, - 0.18322236745325193, - 1, - -0.2762680073398803, - -0.3623015030946614, - -0.2451384283025972, - -0.33468123603042815, - -0.7543297340826929, - -0.19188064290675352, - -0.5924430690900127 - ], - [ - -0.0006494991207074467, - 0.0018604411671567017, - -0.048481275955609554, - -0.0014594010172321779, - 0.012306612692869211, - -0.0556619409198579, - -0.08408097138202993, - -0.07733200729381666, - -0.07201850701116608, - -0.050234026791169964, - -0.054338325985925064, - 0.003328006906514837, - 0.019928968647699895, - 0.05170274575687212, - -0.012306612692869208, - -0.04494367118136859, - -0.013428683581908657, - -0.0014940221824271288, - 0.01729491162511594, - 0.14000368638519403, - -0.017196458507178478, - -0.14674905438081498, - -0.04632871286727803, - -0.03964706284937272, - 0.030386796069204806, - 0.05037142820607642, - -0.2762680073398803, - 1, - -0.2235164922454485, - -0.15123448603095185, - -0.20647658168386077, - -0.23667330012633156, - -0.04722022100509185, - -0.21074518016919763 - ], - [ - -0.010516394125351592, - 0.02038346087056509, - 0.028467762106169584, - 0.02464494581436856, - -0.014777815951004124, - 0.0076950987178344265, - 0.023085000444599418, - 0.0449724925036831, - 0.022136746625123563, - 0.02882937792536747, - 0.02504810987080452, - -0.005388027856510724, - -0.07585881574899747, - -0.03215707580783382, - 0.014777815951004133, - 0.023690157563696343, - -0.0004678565419111244, - 0.005613761063888361, - -0.006230482005525746, - -0.05215631834144274, - 0.15389327309228798, - -0.08589992270093438, - 0.02172285552026243, - 0.028232511385228868, - -0.011569992641797876, - -0.03609490261093368, - -0.3623015030946614, - -0.2235164922454485, - 1, - -0.19833089664036088, - -0.270776108381858, - 0.08315302530583908, - 0.020378382125023714, - 0.025594453789595965 - ], - [ - -0.004318975744551275, - 0.01418568213097567, - 0.10534126166196492, - 0.03141940765317757, - -0.009750281447949313, - 0.0716632710172793, - 0.09919210454041022, - 0.07685425917962475, - 0.06270980841796413, - 0.08796930347195206, - 0.08661557153323526, - 0.010626123397145876, - -0.10079964105628228, - -0.08063023581160907, - 0.009750281447949528, - 0.07573985650934924, - -0.00079001062411148, - 0.01746632456448475, - -0.020153136101165186, - -0.19870886170688193, - 0.15891681528381144, - 0.08008211690632902, - 0.060183035947993645, - 0.048166948994686994, - -0.030584308144429393, - -0.07217004405828796, - -0.2451384283025972, - -0.15123448603095185, - -0.19833089664036088, - 1, - -0.18321102469526726, - 0.3293670640558551, - 0.07004784345008332, - 0.2529046056409522 - ], - [ - 0.01627881894278637, - -0.0024069937431968856, - 0.28035324824529767, - 0.1180897178470907, - 0.020515848357693, - 0.26322845571231857, - 0.2787875817043761, - 0.2755370112516221, - 0.26539627802277554, - 0.1981501311372027, - 0.20754366554274195, - -0.001414839543993747, - -0.2260781096915624, - -0.2427981631428492, - -0.02051584835769357, - 0.25792003827196397, - 0.014665913237832425, - 0.0061120739544805805, - -0.024291768931540957, - -0.47691223651608966, - 0.01614171428694319, - 0.5403360993105428, - 0.1842491799195877, - 0.17929367300430438, - -0.1754558932547761, - -0.16005348763614577, - -0.33468123603042815, - -0.20647658168386077, - -0.270776108381858, - -0.18321102469526726, - 1, - 0.7272367846079387, - 0.18543957041906836, - 0.6393119430257832 - ], - [ - 0.005285371870295646, - 0.01568347989913396, - 0.38191150910757077, - 0.16338596691556453, - 0.007877333295041818, - 0.32829748818662485, - 0.36113847824658735, - 0.3615199952862194, - 0.325288454100009, - 0.280263628074823, - 0.2854022671060787, - 0.004823156615386272, - -0.3540493589532626, - -0.323890766966285, - -0.007877333295041807, - 0.33239924473562554, - 0.013786269825793156, - 0.017929529906438778, - -0.037528889581619734, - -0.649345648869048, - 0.2023384083649546, - 0.5638005002286687, - 0.24382246495742915, - 0.23280034413314615, - -0.21019749610817867, - -0.23218078070201725, - -0.7543297340826929, - -0.23667330012633156, - 0.08315302530583908, - 0.3293670640558551, - 0.7272367846079387, - 1, - 0.2468617666408947, - 0.8258804609332017 - ], - [ - -0.013779327268354416, - 0.21987422950593646, - 0.09782497186892049, - -0.11234295350128225, - 0.2480330664757158, - 0.2964469592375873, - 0.4415290881871007, - 0.48260691224313995, - 0.33830139143424953, - 0.6296678921767406, - 0.6272347301103788, - 0.3519304153712528, - 0.1928582184700881, - -0.3385136039067215, - -0.2480330664757158, - 0.4909121973267493, - -0.16136793538251534, - 0.7871948529419658, - -0.7631910615169571, - 0.0589334582292538, - 0.004809615120440435, - -0.07325607300641665, - 0.04240972759459293, - 0.030054608328366407, - 0.27111737739356384, - -0.37656828808083825, - -0.19188064290675352, - -0.04722022100509185, - 0.020378382125023714, - 0.07004784345008332, - 0.18543957041906836, - 0.2468617666408947, - 1, - 0.6510648032262032 - ], - [ - 4.783950839776602e-05, - 0.10241060539532633, - 0.31907236323857324, - 0.0646532494217739, - 0.11300826095473893, - 0.41261876950713655, - 0.510100290145439, - 0.5228814865154369, - 0.4328683682410939, - 0.5157090769923935, - 0.5198665357835017, - 0.15782978286591698, - -0.1994840835675715, - -0.39676537714107735, - -0.1130082609547389, - 0.4690421356971826, - -0.052189866637419764, - 0.3607687920142481, - -0.37487836259896, - -0.4467758743246882, - 0.17056928655718714, - 0.35803561609140894, - 0.18611944938877964, - 0.1826633671546002, - -0.060436278689198375, - -0.29470837017550655, - -0.5924430690900127, - -0.21074518016919763, - 0.025594453789595965, - 0.2529046056409522, - 0.6393119430257832, - 0.8258804609332017, - 0.6510648032262032, - 1 - ] - ] - } - ], - "layout": { - "autosize": false, - "height": 720, - "margin": { - "b": 210, - "l": 210, - "r": 0, - "t": 25 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Correlation Matrix for variables" - }, - "width": 800, - "xaxis": { - "tickfont": { - "size": 9 - } - }, - "yaxis": { - "tickfont": { - "size": 9 - } - } - } - }, - "text/html": [ - "
\n", - " \n", - " \n", - "
\n", - " \n", - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "correlation = telcom.corr()\n", - "matrix_cols = correlation.columns.tolist()\n", - "corr_array = np.array(correlation)\n", - "trace = go.Heatmap(z=corr_array,\n", - " x=matrix_cols,\n", - " y=matrix_cols,\n", - " colorscale=\"Viridis\",\n", - " colorbar=dict(title=\"Pearson Correlation coefficient\",\n", - " titleside=\"right\"\n", - " ),\n", - " )\n", - "layout = go.Layout(dict(title=\"Correlation Matrix for variables\",\n", - " autosize=False,\n", - " height=720,\n", - " width=800,\n", - " margin=dict(r=0, l=210,\n", - " t=25, b=210,\n", - " ),\n", - " yaxis=dict(tickfont=dict(size=9)),\n", - " xaxis=dict(tickfont=dict(size=9))\n", - " )\n", - " )\n", - "fig = go.Figure(data=[trace], layout=layout)\n", - "py.iplot(fig)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_uuid": "f944336cbe67efb3422b79864d9478e2cfbdc860" - }, - "source": [ - "### 1.6 Data Preparation for Training" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/user/venv/local-feast/lib/python3.7/site-packages/patsy/constraint.py:13: DeprecationWarning:\n", - "\n", - "Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working\n", - "\n" - ] - } - ], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.metrics import confusion_matrix,accuracy_score,classification_report\n", - "from sklearn.metrics import roc_auc_score,roc_curve,scorer\n", - "import statsmodels.api as sm\n", - "from sklearn.metrics import precision_score,recall_score\n", - "from yellowbrick.classifier import DiscriminationThreshold\n", - "\n", - "# Split into a train and test set\n", - "train, test = train_test_split(telcom,test_size = .25 ,random_state = 111)\n", - " \n", - "# Seperating dependent and independent variables\n", - "cols = [i for i in telcom.columns if i not in Id_col + target_col]\n", - "training_x = train[cols]\n", - "training_y = train[target_col]\n", - "testing_x = test[cols]\n", - "testing_y = test[target_col]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.7 Training" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[20:47:08] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n" - ] - } - ], - "source": [ - "model = XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n", - " colsample_bytree=1, gamma=0, learning_rate=0.9, max_delta_step=0,\n", - " max_depth=7, min_child_weight=1, missing=None, n_estimators=100,\n", - " n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n", - " reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n", - " silent=True, subsample=1)\n", - "\n", - "# Train model\n", - "model.fit(training_x, training_y)\n", - "predictions = model.predict(testing_x)\n", - "probabilities = model.predict_proba(testing_x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.8 Analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n", - " colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,\n", - " importance_type='gain', interaction_constraints='',\n", - " learning_rate=0.9, max_delta_step=0, max_depth=7,\n", - " min_child_weight=1, missing=None, monotone_constraints='()',\n", - " n_estimators=100, n_jobs=1, nthread=1, num_parallel_tree=1,\n", - " random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,\n", - " seed=0, silent=True, subsample=1, tree_method='exact',\n", - " validate_parameters=1, verbosity=None)\n", - "\n", - " Classification report : \n", - " precision recall f1-score support\n", - "\n", - " 0 0.81 0.86 0.83 1268\n", - " 1 0.56 0.47 0.51 490\n", - "\n", - " accuracy 0.75 1758\n", - " macro avg 0.69 0.67 0.67 1758\n", - "weighted avg 0.74 0.75 0.74 1758\n", - "\n", - "Accuracy Score : 0.7514220705346986\n", - "Area under curve : 0.6655250112663361 \n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/user/venv/local-feast/lib/python3.7/site-packages/plotly/tools.py:465: DeprecationWarning:\n", - "\n", - "plotly.tools.make_subplots is deprecated, please use plotly.subplots.make_subplots instead\n", - "\n", - "/Users/user/venv/local-feast/lib/python3.7/site-packages/plotly/basedatatypes.py:1823: DeprecationWarning:\n", - "\n", - "The append_trace method is deprecated and will be removed in a future version.\n", - "Please use the add_trace method with the row and col parameters.\n", - "\n", - "\n" - ] - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "linkText": "Export to plot.ly", - "plotlyServerURL": "https://plot.ly", - "showLink": false - }, - "data": [ - { - "colorscale": [ - [ - 0, - "rgb(0,0,255)" - ], - [ - 0.1, - "rgb(51,153,255)" - ], - [ - 0.2, - "rgb(102,204,255)" - ], - [ - 0.3, - "rgb(153,204,255)" - ], - [ - 0.4, - "rgb(204,204,255)" - ], - [ - 0.5, - "rgb(255,255,255)" - ], - [ - 0.6, - "rgb(255,204,255)" - ], - [ - 0.7, - "rgb(255,153,255)" - ], - [ - 0.8, - "rgb(255,102,204)" - ], - [ - 0.9, - "rgb(255,102,102)" - ], - [ - 1, - "rgb(255,0,0)" - ] - ], - "name": "matrix", - "showscale": false, - "type": "heatmap", - "x": [ - "Not churn", - "Churn" - ], - "xaxis": "x", - "y": [ - "Not churn", - "Churn" - ], - "yaxis": "y", - "z": [ - [ - 1090, - 178 - ], - [ - 259, - 231 - ] - ] - }, - { - "line": { - "color": "rgb(22, 96, 167)", - "width": 2 - }, - "name": "Roc : 0.6655250112663361", - "type": "scatter", - "x": [ - 0, - 0, - 0, - 0.0015772870662460567, - 0.0015772870662460567, - 0.0031545741324921135, - 0.0031545741324921135, - 0.003943217665615142, - 0.003943217665615142, - 0.003943217665615142, - 0.003943217665615142, - 0.00473186119873817, - 0.00473186119873817, - 0.005520504731861199, - 0.005520504731861199, - 0.006309148264984227, - 0.006309148264984227, - 0.007097791798107256, - 0.007097791798107256, - 0.008675078864353312, - 0.008675078864353312, - 0.00946372239747634, - 0.00946372239747634, - 0.01025236593059937, - 0.01025236593059937, - 0.011041009463722398, - 0.011041009463722398, - 0.011829652996845425, - 0.011829652996845425, - 0.013406940063091483, - 0.013406940063091483, - 0.017350157728706624, - 0.017350157728706624, - 0.018138801261829655, - 0.018138801261829655, - 0.01892744479495268, - 0.01892744479495268, - 0.01971608832807571, - 0.01971608832807571, - 0.02050473186119874, - 0.02050473186119874, - 0.021293375394321766, - 0.021293375394321766, - 0.02444794952681388, - 0.02444794952681388, - 0.025236593059936908, - 0.025236593059936908, - 0.026813880126182965, - 0.026813880126182965, - 0.027602523659305992, - 0.027602523659305992, - 0.028391167192429023, - 0.028391167192429023, - 0.02917981072555205, - 0.02917981072555205, - 0.030757097791798107, - 0.030757097791798107, - 0.031545741324921134, - 0.031545741324921134, - 0.03391167192429022, - 0.03391167192429022, - 0.03470031545741325, - 0.03470031545741325, - 0.03548895899053628, - 0.03548895899053628, - 0.03627760252365931, - 0.03627760252365931, - 0.03785488958990536, - 0.03785488958990536, - 0.04022082018927445, - 0.04022082018927445, - 0.04100946372239748, - 0.04100946372239748, - 0.0417981072555205, - 0.0417981072555205, - 0.04258675078864353, - 0.04258675078864353, - 0.04416403785488959, - 0.04416403785488959, - 0.044952681388012616, - 0.044952681388012616, - 0.04574132492113565, - 0.04574132492113565, - 0.04652996845425868, - 0.04652996845425868, - 0.050473186119873815, - 0.050473186119873815, - 0.051261829652996846, - 0.051261829652996846, - 0.05362776025236593, - 0.05362776025236593, - 0.05441640378548896, - 0.05441640378548896, - 0.055205047318611984, - 0.055205047318611984, - 0.055993690851735015, - 0.055993690851735015, - 0.056782334384858045, - 0.056782334384858045, - 0.057570977917981075, - 0.057570977917981075, - 0.0583596214511041, - 0.0583596214511041, - 0.061514195583596214, - 0.061514195583596214, - 0.062302839116719244, - 0.062302839116719244, - 0.0638801261829653, - 0.0638801261829653, - 0.06466876971608833, - 0.06466876971608833, - 0.06545741324921135, - 0.06545741324921135, - 0.06782334384858044, - 0.06782334384858044, - 0.07018927444794952, - 0.07018927444794952, - 0.07176656151419558, - 0.07176656151419558, - 0.07334384858044164, - 0.07334384858044164, - 0.07413249211356467, - 0.07413249211356467, - 0.07570977917981073, - 0.07570977917981073, - 0.07649842271293375, - 0.07649842271293375, - 0.07807570977917981, - 0.07807570977917981, - 0.08201892744479496, - 0.08201892744479496, - 0.083596214511041, - 0.083596214511041, - 0.08517350157728706, - 0.08517350157728706, - 0.0859621451104101, - 0.0859621451104101, - 0.08675078864353312, - 0.08675078864353312, - 0.08753943217665615, - 0.08753943217665615, - 0.08990536277602523, - 0.08990536277602523, - 0.09069400630914827, - 0.09069400630914827, - 0.0914826498422713, - 0.0914826498422713, - 0.09542586750788644, - 0.09542586750788644, - 0.09779179810725552, - 0.09779179810725552, - 0.09936908517350158, - 0.09936908517350158, - 0.10252365930599369, - 0.10252365930599369, - 0.10331230283911672, - 0.10331230283911672, - 0.10488958990536278, - 0.10488958990536278, - 0.10646687697160884, - 0.10646687697160884, - 0.10725552050473186, - 0.10725552050473186, - 0.10962145110410094, - 0.10962145110410094, - 0.11041009463722397, - 0.11041009463722397, - 0.11277602523659307, - 0.11277602523659307, - 0.11356466876971609, - 0.11356466876971609, - 0.11593059936908517, - 0.11593059936908517, - 0.11829652996845426, - 0.11829652996845426, - 0.12066246056782334, - 0.12066246056782334, - 0.12145110410094637, - 0.12145110410094637, - 0.1222397476340694, - 0.1222397476340694, - 0.12460567823343849, - 0.12460567823343849, - 0.12618296529968454, - 0.12618296529968454, - 0.12854889589905363, - 0.12854889589905363, - 0.12933753943217666, - 0.12933753943217666, - 0.13249211356466878, - 0.13249211356466878, - 0.13485804416403785, - 0.13485804416403785, - 0.13564668769716087, - 0.13564668769716087, - 0.13643533123028392, - 0.13643533123028392, - 0.138801261829653, - 0.138801261829653, - 0.14274447949526814, - 0.14274447949526814, - 0.1443217665615142, - 0.1443217665615142, - 0.14511041009463724, - 0.14511041009463724, - 0.14589905362776026, - 0.14589905362776026, - 0.14668769716088328, - 0.14668769716088328, - 0.14826498422712933, - 0.14826498422712933, - 0.15063091482649843, - 0.15063091482649843, - 0.1529968454258675, - 0.1529968454258675, - 0.15378548895899052, - 0.15378548895899052, - 0.1553627760252366, - 0.1553627760252366, - 0.15694006309148265, - 0.15694006309148265, - 0.15851735015772872, - 0.16009463722397477, - 0.16009463722397477, - 0.1640378548895899, - 0.1640378548895899, - 0.16561514195583596, - 0.16561514195583596, - 0.16640378548895898, - 0.16640378548895898, - 0.16876971608832808, - 0.16876971608832808, - 0.17034700315457413, - 0.17034700315457413, - 0.17113564668769715, - 0.17113564668769715, - 0.17271293375394323, - 0.17271293375394323, - 0.17429022082018927, - 0.17429022082018927, - 0.17586750788643532, - 0.17586750788643532, - 0.17665615141955837, - 0.17665615141955837, - 0.17823343848580442, - 0.17823343848580442, - 0.17902208201892744, - 0.17902208201892744, - 0.17981072555205047, - 0.1805993690851735, - 0.1829652996845426, - 0.1829652996845426, - 0.18454258675078863, - 0.18454258675078863, - 0.18533123028391169, - 0.18533123028391169, - 0.18848580441640378, - 0.18848580441640378, - 0.1892744479495268, - 0.1892744479495268, - 0.19085173501577288, - 0.19085173501577288, - 0.1916403785488959, - 0.1916403785488959, - 0.19400630914826497, - 0.19400630914826497, - 0.19479495268138802, - 0.19479495268138802, - 0.19558359621451105, - 0.19558359621451105, - 0.19873817034700317, - 0.19873817034700317, - 0.1995268138801262, - 0.1995268138801262, - 0.20189274447949526, - 0.20189274447949526, - 0.20268138801261829, - 0.20268138801261829, - 0.20347003154574134, - 0.20347003154574134, - 0.2058359621451104, - 0.2058359621451104, - 0.2082018927444795, - 0.2082018927444795, - 0.2113564668769716, - 0.2113564668769716, - 0.21293375394321767, - 0.21293375394321767, - 0.21845425867507887, - 0.21845425867507887, - 0.2200315457413249, - 0.2200315457413249, - 0.221608832807571, - 0.221608832807571, - 0.222397476340694, - 0.222397476340694, - 0.22318611987381703, - 0.22318611987381703, - 0.22555205047318613, - 0.22555205047318613, - 0.22712933753943218, - 0.22712933753943218, - 0.2279179810725552, - 0.2279179810725552, - 0.2334384858044164, - 0.2334384858044164, - 0.2358044164037855, - 0.2358044164037855, - 0.23738170347003154, - 0.23738170347003154, - 0.23817034700315456, - 0.23817034700315456, - 0.24290220820189273, - 0.24290220820189273, - 0.24369085173501578, - 0.24369085173501578, - 0.2444794952681388, - 0.2444794952681388, - 0.24526813880126183, - 0.24526813880126183, - 0.24684542586750788, - 0.24684542586750788, - 0.250788643533123, - 0.250788643533123, - 0.25236593059936907, - 0.25236593059936907, - 0.2539432176656151, - 0.2539432176656151, - 0.2547318611987382, - 0.2547318611987382, - 0.2586750788643533, - 0.2586750788643533, - 0.26025236593059936, - 0.26025236593059936, - 0.2610410094637224, - 0.2610410094637224, - 0.26498422712933756, - 0.26498422712933756, - 0.2665615141955836, - 0.2665615141955836, - 0.26735015772870663, - 0.26735015772870663, - 0.26813880126182965, - 0.26813880126182965, - 0.2689274447949527, - 0.2689274447949527, - 0.27208201892744477, - 0.27208201892744477, - 0.27602523659305994, - 0.27602523659305994, - 0.27996845425867506, - 0.27996845425867506, - 0.2823343848580442, - 0.2823343848580442, - 0.2831230283911672, - 0.2831230283911672, - 0.28785488958990535, - 0.28785488958990535, - 0.29652996845425866, - 0.29652996845425866, - 0.2996845425867508, - 0.2996845425867508, - 0.30126182965299686, - 0.30126182965299686, - 0.3020504731861199, - 0.3020504731861199, - 0.305993690851735, - 0.305993690851735, - 0.30757097791798105, - 0.30757097791798105, - 0.3194006309148265, - 0.3194006309148265, - 0.32097791798107256, - 0.32097791798107256, - 0.3225552050473186, - 0.3225552050473186, - 0.32413249211356465, - 0.32413249211356465, - 0.3249211356466877, - 0.3249211356466877, - 0.32965299684542587, - 0.32965299684542587, - 0.3312302839116719, - 0.3312302839116719, - 0.334384858044164, - 0.334384858044164, - 0.3351735015772871, - 0.3351735015772871, - 0.33753943217665616, - 0.33753943217665616, - 0.3383280757097792, - 0.3383280757097792, - 0.3501577287066246, - 0.3501577287066246, - 0.35331230283911674, - 0.35331230283911674, - 0.35646687697160884, - 0.35646687697160884, - 0.3588328075709779, - 0.3588328075709779, - 0.36198738170347006, - 0.36198738170347006, - 0.3635646687697161, - 0.3635646687697161, - 0.3659305993690852, - 0.3659305993690852, - 0.36829652996845424, - 0.36829652996845424, - 0.37302839116719244, - 0.37302839116719244, - 0.3777602523659306, - 0.3777602523659306, - 0.3824921135646688, - 0.3824921135646688, - 0.3840694006309148, - 0.3840694006309148, - 0.3864353312302839, - 0.3864353312302839, - 0.388801261829653, - 0.388801261829653, - 0.38958990536277605, - 0.38958990536277605, - 0.3943217665615142, - 0.3943217665615142, - 0.39668769716088326, - 0.39668769716088326, - 0.3998422712933754, - 0.3998422712933754, - 0.40536277602523657, - 0.40536277602523657, - 0.4061514195583596, - 0.4061514195583596, - 0.4069400630914827, - 0.4069400630914827, - 0.4235015772870662, - 0.4235015772870662, - 0.42586750788643535, - 0.42586750788643535, - 0.42665615141955837, - 0.42665615141955837, - 0.4274447949526814, - 0.4274447949526814, - 0.4282334384858044, - 0.4282334384858044, - 0.43217665615141954, - 0.43217665615141954, - 0.43454258675078866, - 0.43454258675078866, - 0.43769716088328076, - 0.43769716088328076, - 0.444006309148265, - 0.444006309148265, - 0.444794952681388, - 0.444794952681388, - 0.44558359621451105, - 0.44558359621451105, - 0.44637223974763407, - 0.44637223974763407, - 0.44873817034700314, - 0.44873817034700314, - 0.4503154574132492, - 0.4503154574132492, - 0.4518927444794953, - 0.4518927444794953, - 0.45347003154574134, - 0.45347003154574134, - 0.45425867507886436, - 0.45425867507886436, - 0.4558359621451104, - 0.4558359621451104, - 0.47003154574132494, - 0.47003154574132494, - 0.47318611987381703, - 0.47318611987381703, - 0.47870662460567825, - 0.47870662460567825, - 0.48580441640378547, - 0.48580441640378547, - 0.49290220820189273, - 0.49290220820189273, - 0.4960567823343849, - 0.4960567823343849, - 0.49842271293375395, - 0.49842271293375395, - 0.5023659305993691, - 0.5023659305993691, - 0.5063091482649842, - 0.5063091482649842, - 0.5126182965299685, - 0.5126182965299685, - 0.5134069400630915, - 0.5134069400630915, - 0.5165615141955836, - 0.5165615141955836, - 0.5205047318611987, - 0.5205047318611987, - 0.5331230283911672, - 0.5331230283911672, - 0.5528391167192429, - 0.5528391167192429, - 0.554416403785489, - 0.554416403785489, - 0.5662460567823344, - 0.5662460567823344, - 0.5717665615141956, - 0.5717665615141956, - 0.5741324921135647, - 0.5741324921135647, - 0.5757097791798107, - 0.5757097791798107, - 0.5891167192429022, - 0.5906940063091483, - 0.5954258675078864, - 0.5954258675078864, - 0.6041009463722398, - 0.6041009463722398, - 0.6072555205047319, - 0.6072555205047319, - 0.6088328075709779, - 0.6088328075709779, - 0.612776025236593, - 0.612776025236593, - 0.6151419558359621, - 0.6151419558359621, - 0.6238170347003155, - 0.6238170347003155, - 0.6246056782334385, - 0.6246056782334385, - 0.6348580441640379, - 0.6348580441640379, - 0.63801261829653, - 0.63801261829653, - 0.6482649842271293, - 0.6482649842271293, - 0.6529968454258676, - 0.6529968454258676, - 0.6648264984227129, - 0.6648264984227129, - 0.6758675078864353, - 0.6758675078864353, - 0.6892744479495269, - 0.6892744479495269, - 0.7011041009463722, - 0.7011041009463722, - 0.7089905362776026, - 0.7089905362776026, - 0.7342271293375394, - 0.7342271293375394, - 0.7570977917981072, - 0.7570977917981072, - 0.7941640378548895, - 0.7941640378548895, - 0.8138801261829653, - 0.8138801261829653, - 0.8422712933753943, - 0.8422712933753943, - 0.8698738170347003, - 0.8698738170347003, - 0.8738170347003155, - 0.8738170347003155, - 0.8832807570977917, - 0.8832807570977917, - 0.8848580441640379, - 0.8848580441640379, - 0.9069400630914827, - 0.9069400630914827, - 0.9353312302839116, - 0.9353312302839116, - 1 - ], - "xaxis": "x2", - "y": [ - 0, - 0.0020408163265306124, - 0.006122448979591836, - 0.006122448979591836, - 0.01020408163265306, - 0.01020408163265306, - 0.0163265306122449, - 0.0163265306122449, - 0.024489795918367346, - 0.02857142857142857, - 0.03877551020408163, - 0.03877551020408163, - 0.04081632653061224, - 0.04081632653061224, - 0.05714285714285714, - 0.05714285714285714, - 0.05918367346938776, - 0.05918367346938776, - 0.07142857142857142, - 0.07142857142857142, - 0.07551020408163266, - 0.07551020408163266, - 0.07755102040816327, - 0.07755102040816327, - 0.08571428571428572, - 0.08571428571428572, - 0.09183673469387756, - 0.09183673469387756, - 0.09387755102040816, - 0.09387755102040816, - 0.09591836734693877, - 0.09591836734693877, - 0.09795918367346938, - 0.09795918367346938, - 0.10408163265306122, - 0.10408163265306122, - 0.11632653061224489, - 0.11632653061224489, - 0.11836734693877551, - 0.11836734693877551, - 0.1326530612244898, - 0.1326530612244898, - 0.1346938775510204, - 0.1346938775510204, - 0.13877551020408163, - 0.13877551020408163, - 0.1489795918367347, - 0.1489795918367347, - 0.1510204081632653, - 0.1510204081632653, - 0.16938775510204082, - 0.17142857142857143, - 0.17346938775510204, - 0.17346938775510204, - 0.17959183673469387, - 0.17959183673469387, - 0.1816326530612245, - 0.1816326530612245, - 0.1836734693877551, - 0.1836734693877551, - 0.19183673469387755, - 0.19183673469387755, - 0.20408163265306123, - 0.20408163265306123, - 0.20612244897959184, - 0.20612244897959184, - 0.21224489795918366, - 0.21224489795918366, - 0.21428571428571427, - 0.21428571428571427, - 0.21836734693877552, - 0.21836734693877552, - 0.22448979591836735, - 0.22448979591836735, - 0.22857142857142856, - 0.22857142857142856, - 0.23469387755102042, - 0.23469387755102042, - 0.23877551020408164, - 0.23877551020408164, - 0.24081632653061225, - 0.24081632653061225, - 0.24897959183673468, - 0.24897959183673468, - 0.2510204081632653, - 0.2510204081632653, - 0.25918367346938775, - 0.25918367346938775, - 0.26326530612244897, - 0.26326530612244897, - 0.2857142857142857, - 0.2857142857142857, - 0.28775510204081634, - 0.28775510204081634, - 0.2897959183673469, - 0.2897959183673469, - 0.29591836734693877, - 0.29591836734693877, - 0.2979591836734694, - 0.2979591836734694, - 0.3040816326530612, - 0.3040816326530612, - 0.31020408163265306, - 0.31020408163265306, - 0.3122448979591837, - 0.3122448979591837, - 0.3142857142857143, - 0.3142857142857143, - 0.32040816326530613, - 0.32040816326530613, - 0.32653061224489793, - 0.32653061224489793, - 0.3306122448979592, - 0.3306122448979592, - 0.3326530612244898, - 0.3326530612244898, - 0.3346938775510204, - 0.3346938775510204, - 0.336734693877551, - 0.336734693877551, - 0.33877551020408164, - 0.33877551020408164, - 0.3408163265306122, - 0.3408163265306122, - 0.3469387755102041, - 0.3469387755102041, - 0.35306122448979593, - 0.35306122448979593, - 0.3551020408163265, - 0.3551020408163265, - 0.35918367346938773, - 0.35918367346938773, - 0.36122448979591837, - 0.36122448979591837, - 0.363265306122449, - 0.363265306122449, - 0.3653061224489796, - 0.3653061224489796, - 0.3693877551020408, - 0.3693877551020408, - 0.37142857142857144, - 0.37142857142857144, - 0.373469387755102, - 0.373469387755102, - 0.37551020408163266, - 0.37551020408163266, - 0.3816326530612245, - 0.3816326530612245, - 0.38571428571428573, - 0.38571428571428573, - 0.3877551020408163, - 0.3877551020408163, - 0.38979591836734695, - 0.38979591836734695, - 0.39183673469387753, - 0.39183673469387753, - 0.39387755102040817, - 0.39387755102040817, - 0.3979591836734694, - 0.3979591836734694, - 0.4, - 0.4, - 0.4020408163265306, - 0.4020408163265306, - 0.41020408163265304, - 0.41020408163265304, - 0.4122448979591837, - 0.4122448979591837, - 0.41836734693877553, - 0.41836734693877553, - 0.4204081632653061, - 0.4204081632653061, - 0.42244897959183675, - 0.42244897959183675, - 0.42448979591836733, - 0.42448979591836733, - 0.42653061224489797, - 0.42653061224489797, - 0.42857142857142855, - 0.42857142857142855, - 0.4326530612244898, - 0.4326530612244898, - 0.43673469387755104, - 0.43673469387755104, - 0.4387755102040816, - 0.4387755102040816, - 0.4448979591836735, - 0.4448979591836735, - 0.45102040816326533, - 0.45102040816326533, - 0.4530612244897959, - 0.4530612244897959, - 0.45510204081632655, - 0.45510204081632655, - 0.45714285714285713, - 0.45714285714285713, - 0.45918367346938777, - 0.45918367346938777, - 0.4714285714285714, - 0.4714285714285714, - 0.47346938775510206, - 0.47346938775510206, - 0.4816326530612245, - 0.4816326530612245, - 0.48367346938775513, - 0.48367346938775513, - 0.4857142857142857, - 0.4857142857142857, - 0.5020408163265306, - 0.5020408163265306, - 0.5040816326530613, - 0.5040816326530613, - 0.5061224489795918, - 0.5061224489795918, - 0.5102040816326531, - 0.5102040816326531, - 0.5122448979591837, - 0.5122448979591837, - 0.5224489795918368, - 0.5224489795918368, - 0.5244897959183673, - 0.5244897959183673, - 0.5244897959183673, - 0.5265306122448979, - 0.5265306122448979, - 0.5306122448979592, - 0.5306122448979592, - 0.536734693877551, - 0.536734693877551, - 0.5387755102040817, - 0.5387755102040817, - 0.5408163265306123, - 0.5408163265306123, - 0.5428571428571428, - 0.5428571428571428, - 0.5469387755102041, - 0.5469387755102041, - 0.5530612244897959, - 0.5530612244897959, - 0.5551020408163265, - 0.5551020408163265, - 0.5653061224489796, - 0.5653061224489796, - 0.5673469387755102, - 0.5673469387755102, - 0.5714285714285714, - 0.5714285714285714, - 0.573469387755102, - 0.573469387755102, - 0.5755102040816327, - 0.5755102040816327, - 0.5775510204081633, - 0.5775510204081633, - 0.5795918367346938, - 0.5795918367346938, - 0.5836734693877551, - 0.5836734693877551, - 0.5897959183673469, - 0.5897959183673469, - 0.5918367346938775, - 0.5918367346938775, - 0.5938775510204082, - 0.5938775510204082, - 0.5959183673469388, - 0.5959183673469388, - 0.5979591836734693, - 0.5979591836734693, - 0.6020408163265306, - 0.6020408163265306, - 0.6040816326530613, - 0.6040816326530613, - 0.6061224489795919, - 0.6061224489795919, - 0.6122448979591837, - 0.6122448979591837, - 0.6163265306122448, - 0.6163265306122448, - 0.6183673469387755, - 0.6183673469387755, - 0.6204081632653061, - 0.6204081632653061, - 0.6224489795918368, - 0.6224489795918368, - 0.6244897959183674, - 0.6244897959183674, - 0.6285714285714286, - 0.6285714285714286, - 0.6306122448979592, - 0.6306122448979592, - 0.6326530612244898, - 0.6326530612244898, - 0.6346938775510204, - 0.6346938775510204, - 0.636734693877551, - 0.636734693877551, - 0.6387755102040816, - 0.6387755102040816, - 0.6428571428571429, - 0.6428571428571429, - 0.6489795918367347, - 0.6489795918367347, - 0.6530612244897959, - 0.6530612244897959, - 0.6551020408163265, - 0.6551020408163265, - 0.6571428571428571, - 0.6571428571428571, - 0.6632653061224489, - 0.6632653061224489, - 0.6673469387755102, - 0.6673469387755102, - 0.6693877551020408, - 0.6693877551020408, - 0.6755102040816326, - 0.6755102040816326, - 0.6775510204081633, - 0.6775510204081633, - 0.6795918367346939, - 0.6795918367346939, - 0.6836734693877551, - 0.6836734693877551, - 0.6857142857142857, - 0.6857142857142857, - 0.6877551020408164, - 0.6877551020408164, - 0.689795918367347, - 0.689795918367347, - 0.6918367346938775, - 0.6918367346938775, - 0.6938775510204082, - 0.6938775510204082, - 0.6979591836734694, - 0.6979591836734694, - 0.7020408163265306, - 0.7020408163265306, - 0.7040816326530612, - 0.7040816326530612, - 0.7061224489795919, - 0.7061224489795919, - 0.7081632653061225, - 0.7081632653061225, - 0.710204081632653, - 0.710204081632653, - 0.7122448979591837, - 0.7122448979591837, - 0.7163265306122449, - 0.7163265306122449, - 0.7204081632653061, - 0.7204081632653061, - 0.7244897959183674, - 0.7244897959183674, - 0.7326530612244898, - 0.7326530612244898, - 0.7346938775510204, - 0.7346938775510204, - 0.736734693877551, - 0.736734693877551, - 0.7408163265306122, - 0.7408163265306122, - 0.7428571428571429, - 0.7428571428571429, - 0.7448979591836735, - 0.7448979591836735, - 0.746938775510204, - 0.746938775510204, - 0.7510204081632653, - 0.7510204081632653, - 0.7591836734693878, - 0.7591836734693878, - 0.7653061224489796, - 0.7653061224489796, - 0.7673469387755102, - 0.7673469387755102, - 0.7693877551020408, - 0.7693877551020408, - 0.773469387755102, - 0.773469387755102, - 0.7775510204081633, - 0.7775510204081633, - 0.7795918367346939, - 0.7795918367346939, - 0.7816326530612245, - 0.7816326530612245, - 0.7836734693877551, - 0.7836734693877551, - 0.7857142857142857, - 0.7857142857142857, - 0.789795918367347, - 0.789795918367347, - 0.7918367346938775, - 0.7918367346938775, - 0.7938775510204081, - 0.7938775510204081, - 0.7959183673469388, - 0.7959183673469388, - 0.7979591836734694, - 0.7979591836734694, - 0.8, - 0.8, - 0.8020408163265306, - 0.8020408163265306, - 0.8040816326530612, - 0.8040816326530612, - 0.8081632653061225, - 0.8081632653061225, - 0.810204081632653, - 0.810204081632653, - 0.8142857142857143, - 0.8142857142857143, - 0.8163265306122449, - 0.8163265306122449, - 0.8183673469387756, - 0.8183673469387756, - 0.8204081632653061, - 0.8204081632653061, - 0.8224489795918367, - 0.8224489795918367, - 0.8244897959183674, - 0.8244897959183674, - 0.826530612244898, - 0.826530612244898, - 0.8346938775510204, - 0.8346938775510204, - 0.8367346938775511, - 0.8367346938775511, - 0.8428571428571429, - 0.8428571428571429, - 0.8469387755102041, - 0.8469387755102041, - 0.8489795918367347, - 0.8489795918367347, - 0.8510204081632653, - 0.8510204081632653, - 0.8530612244897959, - 0.8530612244897959, - 0.8551020408163266, - 0.8551020408163266, - 0.8571428571428571, - 0.8571428571428571, - 0.8591836734693877, - 0.8591836734693877, - 0.8612244897959184, - 0.8612244897959184, - 0.863265306122449, - 0.863265306122449, - 0.8653061224489796, - 0.8653061224489796, - 0.8693877551020408, - 0.8693877551020408, - 0.8714285714285714, - 0.8714285714285714, - 0.8734693877551021, - 0.8734693877551021, - 0.8755102040816326, - 0.8755102040816326, - 0.8775510204081632, - 0.8775510204081632, - 0.8795918367346939, - 0.8795918367346939, - 0.8816326530612245, - 0.8816326530612245, - 0.8857142857142857, - 0.8857142857142857, - 0.8877551020408163, - 0.8877551020408163, - 0.889795918367347, - 0.889795918367347, - 0.8918367346938776, - 0.8918367346938776, - 0.8938775510204081, - 0.8938775510204081, - 0.8959183673469387, - 0.8959183673469387, - 0.9, - 0.9, - 0.9020408163265307, - 0.9020408163265307, - 0.9040816326530612, - 0.9040816326530612, - 0.9081632653061225, - 0.9081632653061225, - 0.9102040816326531, - 0.9102040816326531, - 0.9122448979591836, - 0.9122448979591836, - 0.9142857142857143, - 0.9142857142857143, - 0.9163265306122449, - 0.9163265306122449, - 0.9183673469387755, - 0.9183673469387755, - 0.9204081632653062, - 0.9204081632653062, - 0.9224489795918367, - 0.9224489795918367, - 0.9244897959183673, - 0.9244897959183673, - 0.926530612244898, - 0.926530612244898, - 0.9285714285714286, - 0.9285714285714286, - 0.9306122448979591, - 0.9306122448979591, - 0.9346938775510204, - 0.9346938775510204, - 0.936734693877551, - 0.936734693877551, - 0.9387755102040817, - 0.9387755102040817, - 0.9408163265306122, - 0.9408163265306122, - 0.9408163265306122, - 0.9408163265306122, - 0.9428571428571428, - 0.9428571428571428, - 0.9448979591836735, - 0.9448979591836735, - 0.9469387755102041, - 0.9469387755102041, - 0.9489795918367347, - 0.9489795918367347, - 0.9510204081632653, - 0.9510204081632653, - 0.9530612244897959, - 0.9530612244897959, - 0.9551020408163265, - 0.9551020408163265, - 0.9571428571428572, - 0.9571428571428572, - 0.9591836734693877, - 0.9591836734693877, - 0.963265306122449, - 0.963265306122449, - 0.9653061224489796, - 0.9653061224489796, - 0.9673469387755103, - 0.9673469387755103, - 0.9693877551020408, - 0.9693877551020408, - 0.9714285714285714, - 0.9714285714285714, - 0.9734693877551021, - 0.9734693877551021, - 0.9755102040816327, - 0.9755102040816327, - 0.9775510204081632, - 0.9775510204081632, - 0.9795918367346939, - 0.9795918367346939, - 0.9816326530612245, - 0.9816326530612245, - 0.9836734693877551, - 0.9836734693877551, - 0.9857142857142858, - 0.9857142857142858, - 0.9877551020408163, - 0.9877551020408163, - 0.9897959183673469, - 0.9897959183673469, - 0.9918367346938776, - 0.9918367346938776, - 0.9938775510204082, - 0.9938775510204082, - 0.9959183673469387, - 0.9959183673469387, - 0.9979591836734694, - 0.9979591836734694, - 1, - 1 - ], - "yaxis": "y2" - }, - { - "line": { - "color": "rgb(205, 12, 24)", - "dash": "dot", - "width": 2 - }, - "type": "scatter", - "x": [ - 0, - 1 - ], - "xaxis": "x2", - "y": [ - 0, - 1 - ], - "yaxis": "y2" - }, - { - "marker": { - "color": [ - 0.40381771326065063, - 0.28717586398124695, - 0.019390283152461052, - 0.018444739282131195, - 0.01538677979260683, - 0.014990395866334438, - 0.014325669966638088, - 0.013916175812482834, - 0.012448116205632687, - 0.01242363452911377, - 0.012042814865708351, - 0.012016979046165943, - 0.011734840460121632, - 0.011441107839345932, - 0.01139832753688097, - 0.009455341845750809, - 0.009003291837871075, - 0.008989614434540272, - 0.00892818532884121, - 0.008804365992546082, - 0.00837039016187191, - 0.008362136781215668, - 0.008307449519634247, - 0.008072943426668644, - 0.007484915666282177, - 0.007470999378710985, - 0.006756791844964027, - 0.006560647860169411, - 0.006558740511536598, - 0.006327662151306868, - 0.0055321562103927135, - 0.00406095152720809, - 0 - ], - "colorscale": [ - [ - 0, - "rgb(0,0,255)" - ], - [ - 0.1, - "rgb(51,153,255)" - ], - [ - 0.2, - "rgb(102,204,255)" - ], - [ - 0.3, - "rgb(153,204,255)" - ], - [ - 0.4, - "rgb(204,204,255)" - ], - [ - 0.5, - "rgb(255,255,255)" - ], - [ - 0.6, - "rgb(255,204,255)" - ], - [ - 0.7, - "rgb(255,153,255)" - ], - [ - 0.8, - "rgb(255,102,204)" - ], - [ - 0.9, - "rgb(255,102,102)" - ], - [ - 1, - "rgb(255,0,0)" - ] - ], - "line": { - "color": "black", - "width": 0.6 - } - }, - "name": "coefficients", - "type": "bar", - "x": [ - "internetservice_fiber_optic", - "contract_month_to_month", - "internetservice_dsl", - "tenure_group_tenure_0_12", - "phoneservice", - "contract_one_year", - "tenure", - "tenure_group_tenure_48_60", - "internetservice_no", - "seniorcitizen", - "onlinesecurity", - "techsupport", - "streamingmovies", - "multiplelines_no", - "contract_two_year", - "paymentmethod_electronic_check", - "onlinebackup", - "totalcharges", - "paymentmethod_bank_transfer_automatic", - "tenure_group_tenure_24_48", - "monthlycharges", - "paperlessbilling", - "streamingtv", - "multiplelines_yes", - "paymentmethod_mailed_check", - "gender", - "dependents", - "partner", - "tenure_group_tenure_12_24", - "deviceprotection", - "paymentmethod_credit_card_automatic", - "tenure_group_tenure_gt_60", - "multiplelines_no_phone_service" - ], - "xaxis": "x3", - "y": [ - 0.40381771326065063, - 0.28717586398124695, - 0.019390283152461052, - 0.018444739282131195, - 0.01538677979260683, - 0.014990395866334438, - 0.014325669966638088, - 0.013916175812482834, - 0.012448116205632687, - 0.01242363452911377, - 0.012042814865708351, - 0.012016979046165943, - 0.011734840460121632, - 0.011441107839345932, - 0.01139832753688097, - 0.009455341845750809, - 0.009003291837871075, - 0.008989614434540272, - 0.00892818532884121, - 0.008804365992546082, - 0.00837039016187191, - 0.008362136781215668, - 0.008307449519634247, - 0.008072943426668644, - 0.007484915666282177, - 0.007470999378710985, - 0.006756791844964027, - 0.006560647860169411, - 0.006558740511536598, - 0.006327662151306868, - 0.0055321562103927135, - 0.00406095152720809, - 0 - ], - "yaxis": "y3" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "Confusion Matrix", - "x": 0.225, - "xanchor": "center", - "xref": "paper", - "y": 1, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "Receiver operating characteristic", - "x": 0.775, - "xanchor": "center", - "xref": "paper", - "y": 1, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "Feature Importances", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.375, - "yanchor": "bottom", - "yref": "paper" - } - ], - "autosize": false, - "height": 900, - "margin": { - "b": 195 - }, - "paper_bgcolor": "rgba(240,240,240, 0.95)", - "plot_bgcolor": "rgba(240,240,240, 0.95)", - "showlegend": false, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Model performance" - }, - "width": 800, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 0.45 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0.55, - 1 - ], - "title": { - "text": "false positive rate" - } - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ], - "showgrid": true, - "tickangle": 90, - "tickfont": { - "size": 10 - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.625, - 1 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.625, - 1 - ], - "title": { - "text": "true positive rate" - } - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0, - 0.375 - ] - } - } - }, - "text/html": [ - "
\n", - " \n", - " \n", - "
\n", - " \n", - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[20:47:10] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:12] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:13] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:14] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:16] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:17] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:18] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:19] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:20] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:21] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:23] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:24] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:25] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:26] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:28] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:29] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:30] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:32] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:33] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:34] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:36] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:37] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:39] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:40] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:41] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:43] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:44] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:46] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:47] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:48] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:49] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:51] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:52] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:53] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:54] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:55] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:57] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:58] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:47:59] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:01] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:02] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:03] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:05] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:06] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:07] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:08] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:09] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:10] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:12] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[20:48:13] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/user/venv/local-feast/lib/python3.7/site-packages/yellowbrick/base.py:259: DeprecationWarning:\n", - "\n", - "this method is deprecated, please use show() instead\n", - "\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coefficients = pd.DataFrame(model.feature_importances_)\n", - "column_df = pd.DataFrame(cols)\n", - "coef_sumry = (pd.merge(coefficients, column_df, left_index=True,\n", - " right_index=True, how=\"left\"))\n", - "coef_sumry.columns = [\"coefficients\", \"features\"]\n", - "coef_sumry = coef_sumry.sort_values(by=\"coefficients\", ascending=False)\n", - "\n", - "print(model)\n", - "print(\"\\n Classification report : \\n\", classification_report(testing_y, predictions))\n", - "print(\"Accuracy Score : \", accuracy_score(testing_y, predictions))\n", - "# confusion matrix\n", - "conf_matrix = confusion_matrix(testing_y, predictions)\n", - "# roc_auc_score\n", - "model_roc_auc = roc_auc_score(testing_y, predictions)\n", - "print(\"Area under curve : \", model_roc_auc, \"\\n\")\n", - "fpr, tpr, thresholds = roc_curve(testing_y, probabilities[:, 1])\n", - "\n", - "# plot confusion matrix\n", - "trace1 = go.Heatmap(z=conf_matrix,\n", - " x=[\"Not churn\", \"Churn\"],\n", - " y=[\"Not churn\", \"Churn\"],\n", - " showscale=False, colorscale=\"Picnic\",\n", - " name=\"matrix\")\n", - "\n", - "# plot roc curve\n", - "trace2 = go.Scatter(x=fpr, y=tpr,\n", - " name=\"Roc : \" + str(model_roc_auc),\n", - " line=dict(color=('rgb(22, 96, 167)'), width=2))\n", - "trace3 = go.Scatter(x=[0, 1], y=[0, 1],\n", - " line=dict(color=('rgb(205, 12, 24)'), width=2,\n", - " dash='dot'))\n", - "\n", - "# plot coeffs\n", - "trace4 = go.Bar(x=coef_sumry[\"features\"], y=coef_sumry[\"coefficients\"],\n", - " name=\"coefficients\",\n", - " marker=dict(color=coef_sumry[\"coefficients\"],\n", - " colorscale=\"Picnic\",\n", - " line=dict(width=.6, color=\"black\")))\n", - "\n", - "# subplots\n", - "fig = tls.make_subplots(rows=2, cols=2, specs=[[{}, {}], [{'colspan': 2}, None]],\n", - " subplot_titles=('Confusion Matrix',\n", - " 'Receiver operating characteristic',\n", - " 'Feature Importances'))\n", - "\n", - "fig.append_trace(trace1, 1, 1)\n", - "fig.append_trace(trace2, 1, 2)\n", - "fig.append_trace(trace3, 1, 2)\n", - "fig.append_trace(trace4, 2, 1)\n", - "\n", - "fig['layout'].update(showlegend=False, title=\"Model performance\",\n", - " autosize=False, height=900, width=800,\n", - " plot_bgcolor='rgba(240,240,240, 0.95)',\n", - " paper_bgcolor='rgba(240,240,240, 0.95)',\n", - " margin=dict(b=195))\n", - "fig[\"layout\"][\"xaxis2\"].update(dict(title=\"false positive rate\"))\n", - "fig[\"layout\"][\"yaxis2\"].update(dict(title=\"true positive rate\"))\n", - "fig[\"layout\"][\"xaxis3\"].update(dict(showgrid=True, tickfont=dict(size=10),\n", - " tickangle=90))\n", - "py.iplot(fig)\n", - "\n", - "visualizer = DiscriminationThreshold(model)\n", - "visualizer.fit(training_x, training_y)\n", - "visualizer.poof()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Churn Modelling (with Feast)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the rest of the tutorial we will\n", - "1. Use our already processed feature data to define feature schemas (through a feature set)\n", - "1. Load/ingest the feature data into Feast\n", - "1. Create a training dataset based on an entity dataframe and train an XGBoost model\n", - "1. Make online predictions for our model using Feast for online serving" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1 Configure Feast" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Feast Core acts as the central feature registry\n", - "FEAST_CORE_URL = os.getenv('FEAST_CORE_URL', 'localhost:6565')\n", - "\n", - "# Feast Online Serving allows for the retrieval of real-time feature data\n", - "FEAST_ONLINE_SERVING_URL = os.getenv('FEAST_ONLINE_SERVING_URL', 'localhost:6566')\n", - "\n", - "# Feast Batch Serving allows for the retrieval of historical feature data\n", - "FEAST_HISTORICAL_SERVING_URL = os.getenv('FEAST_HISTORICAL_SERVING_URL', 'localhost:6567')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create the Feast client we will use to register our feature set" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "client = Client(core_url=FEAST_CORE_URL)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.2 Create a Feature Set" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we define a `customer_churn` feature set. A feature set is a storage level grouping of features. It is used when loading and ingesting data into Feast, and to describe the properties of features. \n", - "\n", - "During retrieval, features can be directly accessed from any feature sets." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "customer_churn_fs = FeatureSet('customer_churn')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All data loaded into Feast must have a time dimension. This allows us to ensure point-in-time correctness." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "telcom['datetime'] = pd.Series([dt.datetime.now()] * len(telcom))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we will infer the schema of the data from the Pandas DataFrame of features" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Entity customer_id(ValueType.STRING) manually updated (replacing an existing field).\n", - "Feature gender (ValueType.INT64) added from dataframe.\n", - "Feature seniorcitizen (ValueType.INT64) added from dataframe.\n", - "Feature partner (ValueType.INT64) added from dataframe.\n", - "Feature dependents (ValueType.INT64) added from dataframe.\n", - "Feature phoneservice (ValueType.INT64) added from dataframe.\n", - "Feature onlinesecurity (ValueType.INT64) added from dataframe.\n", - "Feature onlinebackup (ValueType.INT64) added from dataframe.\n", - "Feature deviceprotection (ValueType.INT64) added from dataframe.\n", - "Feature techsupport (ValueType.INT64) added from dataframe.\n", - "Feature streamingtv (ValueType.INT64) added from dataframe.\n", - "Feature streamingmovies (ValueType.INT64) added from dataframe.\n", - "Feature paperlessbilling (ValueType.INT64) added from dataframe.\n", - "Feature churn (ValueType.INT64) added from dataframe.\n", - "Feature multiplelines_no (ValueType.INT64) added from dataframe.\n", - "Feature multiplelines_no_phone_service (ValueType.INT64) added from dataframe.\n", - "Feature multiplelines_yes (ValueType.INT64) added from dataframe.\n", - "Feature internetservice_dsl (ValueType.INT64) added from dataframe.\n", - "Feature internetservice_fiber_optic (ValueType.INT64) added from dataframe.\n", - "Feature internetservice_no (ValueType.INT64) added from dataframe.\n", - "Feature contract_month_to_month (ValueType.INT64) added from dataframe.\n", - "Feature contract_one_year (ValueType.INT64) added from dataframe.\n", - "Feature contract_two_year (ValueType.INT64) added from dataframe.\n", - "Feature paymentmethod_bank_transfer_automatic (ValueType.INT64) added from dataframe.\n", - "Feature paymentmethod_credit_card_automatic (ValueType.INT64) added from dataframe.\n", - "Feature paymentmethod_electronic_check (ValueType.INT64) added from dataframe.\n", - "Feature paymentmethod_mailed_check (ValueType.INT64) added from dataframe.\n", - "Feature tenure_group_tenure_0_12 (ValueType.INT64) added from dataframe.\n", - "Feature tenure_group_tenure_12_24 (ValueType.INT64) added from dataframe.\n", - "Feature tenure_group_tenure_24_48 (ValueType.INT64) added from dataframe.\n", - "Feature tenure_group_tenure_48_60 (ValueType.INT64) added from dataframe.\n", - "Feature tenure_group_tenure_gt_60 (ValueType.INT64) added from dataframe.\n", - "Feature tenure (ValueType.DOUBLE) added from dataframe.\n", - "Feature monthlycharges (ValueType.DOUBLE) added from dataframe.\n", - "Feature totalcharges (ValueType.DOUBLE) added from dataframe.\n", - "\n" - ] - } - ], - "source": [ - "customer_churn_fs.infer_fields_from_df(telcom, entities=[Entity(name='customer_id', dtype=ValueType.STRING)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we will register our feature set with Feast. This will create the necessary tables in our historical store as well as start any ingestion jobs that populate the stores (BigQuery, Redis) with data that is ingested." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Feature set created: \"customer_churn\"\n" - ] - } - ], - "source": [ - "client.apply(customer_churn_fs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we will confirm that our feature set schema looks correct and that it is in a READY state" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"spec\": {\n", - " \"name\": \"customer_churn\",\n", - " \"entities\": [\n", - " {\n", - " \"name\": \"customer_id\",\n", - " \"valueType\": \"STRING\"\n", - " }\n", - " ],\n", - " \"features\": [\n", - " {\n", - " \"name\": \"tenure\",\n", - " \"valueType\": \"DOUBLE\"\n", - " },\n", - " {\n", - " \"name\": \"churn\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"monthlycharges\",\n", - " \"valueType\": \"DOUBLE\"\n", - " },\n", - " {\n", - " \"name\": \"paymentmethod_credit_card_automatic\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"paymentmethod_electronic_check\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"dependents\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"internetservice_no\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"onlinesecurity\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"streamingtv\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"multiplelines_no_phone_service\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"contract_two_year\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"totalcharges\",\n", - " \"valueType\": \"DOUBLE\"\n", - " },\n", - " {\n", - " \"name\": \"streamingmovies\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"internetservice_dsl\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"contract_one_year\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"tenure_group_tenure_24_48\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"multiplelines_no\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"techsupport\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"paperlessbilling\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"phoneservice\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"tenure_group_tenure_12_24\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"gender\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"partner\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"paymentmethod_mailed_check\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"contract_month_to_month\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"tenure_group_tenure_48_60\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"tenure_group_tenure_0_12\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"onlinebackup\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"seniorcitizen\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"multiplelines_yes\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"deviceprotection\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"paymentmethod_bank_transfer_automatic\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"internetservice_fiber_optic\",\n", - " \"valueType\": \"INT64\"\n", - " },\n", - " {\n", - " \"name\": \"tenure_group_tenure_gt_60\",\n", - " \"valueType\": \"INT64\"\n", - " }\n", - " ],\n", - " \"source\": {\n", - " \"type\": \"KAFKA\",\n", - " \"kafkaSourceConfig\": {\n", - " \"bootstrapServers\": \"localhost:9094\",\n", - " \"topic\": \"feast-features\"\n", - " }\n", - " },\n", - " \"project\": \"default\"\n", - " },\n", - " \"meta\": {\n", - " \"createdTimestamp\": \"2020-06-26T12:48:29Z\",\n", - " \"status\": \"STATUS_PENDING\"\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "customer_churn_fs = client.get_feature_set('customer_churn')\n", - "print(client.get_feature_set('customer_churn'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.3 Load Features Into Feast" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The ingest method pushes data to Feast for storage. All stores (online, historical) will be updated with this feature data" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Waiting for feature set to be ready for ingestion...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 7032/7032 [00:04<00:00, 1735.70rows/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ingestion complete!\n", - "\n", - "Ingestion statistics:\n", - "Success: 7032/7032\n", - "Removing temporary file(s)...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/plain": [ - "'ca7c1deb-4cdd-3989-8173-3a5c1f37adfb'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.ingest(customer_churn_fs, telcom)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.4 (Optional) Create a Model Class" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following is a wrapper class that we have created for this tutorial. It neatly wraps a Feast Client as well as model training and serving into a single object. \n", - "\n", - "This ChurnModel object can be used to\n", - "* Train a model\n", - "* Serve the model in production\n", - "\n", - "Do note that the use of this class is not a requirement. The Feast retrieval methods below can be used in a standalone manner as well." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "import joblib\n", - "import os\n", - "\n", - "from feast import Client\n", - "from feast.serving.ServingService_pb2 import GetOnlineFeaturesRequest\n", - "from feast.types.Value_pb2 import Value\n", - "from sklearn.model_selection import train_test_split\n", - "from xgboost import XGBClassifier\n", - "from pandas import DataFrame\n", - "\n", - "\n", - "class ChurnModel:\n", - " def __init__(self, features, target, model_path=None):\n", - " # Set up Feast clients to retrieve training and online serving data\n", - " self._feast_online_client = Client(serving_url=os.environ['FEAST_ONLINE_SERVING_URL'])\n", - " self._feast_batch_client = Client(serving_url=os.environ['FEAST_HISTORICAL_SERVING_URL'],\n", - " core_url=os.environ['FEAST_CORE_URL'])\n", - " \n", - " # Path to either save models after training or load models for serving\n", - " self._model = None\n", - " self._model_path = model_path\n", - " self._features = features\n", - " self._target = target\n", - "\n", - " def train(self, entity_df):\n", - " # Initialize a new XGBoost model\n", - " self._model = XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n", - " colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n", - " max_depth=7, min_child_weight=1, missing=None, n_estimators=50,\n", - " n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n", - " reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n", - " silent=True, subsample=1)\n", - "\n", - " # Get training dataset from Feast\n", - " train_x, test_x, train_y, test_y = self._get_training_data(entity_df)\n", - "\n", - " # Train model\n", - " self._model.fit(train_x, train_y, early_stopping_rounds=40, eval_set=[(test_x, test_y)])\n", - "\n", - " def _get_training_data(self, entity_df):\n", - " # Add the target variable to our feature list\n", - " features = self._features + [self._target]\n", - "\n", - " # Retrieve training dataset from Feast\n", - " dataset = self._feast_batch_client.get_historical_features(\n", - " feature_refs=features,\n", - " entity_rows=entity_df).to_dataframe()\n", - "\n", - " # Split into a train and test set\n", - " return train_test_split(dataset[self._features], dataset[self._target],\n", - " test_size=0.25, random_state=111)\n", - "\n", - " def predict(self, customer_ids):\n", - " # Load external model if no model exists\n", - " if not self._model:\n", - " self._model = joblib.load(self._model_path)\n", - "\n", - " # Get online features from Feast for the list of customers\n", - " prediction = self._model.predict(data=self._get_online_features(customer_ids))\n", - "\n", - " # Return churn predictions\n", - " return prediction\n", - "\n", - " def _get_online_features(self, customer_ids):\n", - " # Build request out of entities (customer ids)\n", - " entity_rows = []\n", - " for customer_id in customer_ids:\n", - " entity_rows.append(\n", - " {'customer_id': customer_id}\n", - " )\n", - "\n", - " # Retrieve online features from Feast for given entities\n", - " data = self._feast_online_client.get_online_features(feature_refs=self._features,\n", - " entity_rows=entity_rows)\n", - " # Convert to Pandas dataframe\n", - " features_dict = dict.fromkeys(self._features)\n", - " for row in data.field_values:\n", - " for feature in features_dict.keys():\n", - " if features_dict[feature] is None:\n", - " features_dict[feature] = []\n", - " features_dict[feature].append(row.fields[feature].int64_val)\n", - " return DataFrame.from_dict(features_dict)\n", - "\n", - " def save_model(self, model_path=None):\n", - " # Export trained model to local path\n", - " if not model_path:\n", - " model_path = self._model_path\n", - " joblib.dump(self._model, model_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.5 Define Features and Target" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we will create our list of features and target variable" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "features = [\n", - " 'gender',\n", - " 'seniorcitizen',\n", - " 'partner',\n", - " 'dependents',\n", - " 'phoneservice',\n", - " 'onlinesecurity',\n", - " 'onlinebackup',\n", - " 'deviceprotection',\n", - " 'techsupport',\n", - " 'streamingtv',\n", - " 'streamingmovies',\n", - " 'paperlessbilling',\n", - " 'multiplelines_no',\n", - " 'multiplelines_no_phone_service',\n", - " 'multiplelines_yes',\n", - " 'internetservice_dsl',\n", - " 'internetservice_fiber_optic',\n", - " 'internetservice_no',\n", - " 'contract_month_to_month',\n", - " 'contract_one_year',\n", - " 'contract_two_year',\n", - " 'paymentmethod_bank_transfer_automatic',\n", - " 'paymentmethod_credit_card_automatic',\n", - " 'paymentmethod_electronic_check',\n", - " 'paymentmethod_mailed_check',\n", - " 'tenure_group_tenure_0_12',\n", - " 'tenure_group_tenure_12_24',\n", - " 'tenure_group_tenure_24_48',\n", - " 'tenure_group_tenure_48_60',\n", - " 'tenure_group_tenure_gt_60',\n", - " 'tenure',\n", - " 'monthlycharges',\n", - " 'totalcharges']\n", - "\n", - "target = 'churn'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We create an instance of our ChurnModel class. This will also initialize the Feast clients" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "cm = ChurnModel(features=features, target=target)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.6 Train Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The entity DataFrame here is used to retrieve features. Each row in this dataframe represents some `customer_id` and timestamp on which we want to make a prediction. This DataFrame will be loaded into Feast, after which Feast will join features onto the DataFrame in a point-in-time correct way, and return it to the user for training their model." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "entity_df = telcom[['customer_id']].copy()\n", - "entity_df['datetime'] = pd.Series([dt.datetime.now()] * len(entity_df))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we train our model" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[04:13:07] WARNING: /workspace/src/learner.cc:480: \n", - "Parameters: { silent } might not be used.\n", - "\n", - " This may not be accurate due to some parameters are only used in language bindings but\n", - " passed down to XGBoost core. Or some parameters are not used but slip through this\n", - " verification. Please open an issue if you find above cases.\n", - "\n", - "\n", - "[0]\tvalidation_0-error:0.21388\n", - "Will train until validation_0-error hasn't improved in 40 rounds.\n", - "[1]\tvalidation_0-error:0.21786\n", - "[2]\tvalidation_0-error:0.21388\n", - "[3]\tvalidation_0-error:0.20876\n", - "[4]\tvalidation_0-error:0.21331\n", - "[5]\tvalidation_0-error:0.20762\n", - "[6]\tvalidation_0-error:0.20762\n", - "[7]\tvalidation_0-error:0.21217\n", - "[8]\tvalidation_0-error:0.21445\n", - "[9]\tvalidation_0-error:0.21047\n", - "[10]\tvalidation_0-error:0.21160\n", - "[11]\tvalidation_0-error:0.21502\n", - "[12]\tvalidation_0-error:0.21616\n", - "[13]\tvalidation_0-error:0.21274\n", - "[14]\tvalidation_0-error:0.21388\n", - "[15]\tvalidation_0-error:0.21331\n", - "[16]\tvalidation_0-error:0.21502\n", - "[17]\tvalidation_0-error:0.21672\n", - "[18]\tvalidation_0-error:0.21843\n", - "[19]\tvalidation_0-error:0.21786\n", - "[20]\tvalidation_0-error:0.21900\n", - "[21]\tvalidation_0-error:0.21729\n", - "[22]\tvalidation_0-error:0.21502\n", - "[23]\tvalidation_0-error:0.21729\n", - "[24]\tvalidation_0-error:0.21559\n", - "[25]\tvalidation_0-error:0.21502\n", - "[26]\tvalidation_0-error:0.21616\n", - "[27]\tvalidation_0-error:0.21672\n", - "[28]\tvalidation_0-error:0.21331\n", - "[29]\tvalidation_0-error:0.21445\n", - "[30]\tvalidation_0-error:0.21388\n", - "[31]\tvalidation_0-error:0.21331\n", - "[32]\tvalidation_0-error:0.21331\n", - "[33]\tvalidation_0-error:0.21445\n", - "[34]\tvalidation_0-error:0.21502\n", - "[35]\tvalidation_0-error:0.21445\n", - "[36]\tvalidation_0-error:0.21616\n", - "[37]\tvalidation_0-error:0.21616\n", - "[38]\tvalidation_0-error:0.21616\n", - "[39]\tvalidation_0-error:0.21559\n", - "[40]\tvalidation_0-error:0.21616\n", - "[41]\tvalidation_0-error:0.21616\n", - "[42]\tvalidation_0-error:0.21502\n", - "[43]\tvalidation_0-error:0.21616\n", - "[44]\tvalidation_0-error:0.21616\n", - "[45]\tvalidation_0-error:0.21616\n", - "Stopping. Best iteration:\n", - "[5]\tvalidation_0-error:0.20762\n", - "\n" - ] - } - ], - "source": [ - "cm.train(entity_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.7 Predict" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once the model is trained we can use it to make predictions using Feast Online Serving" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "churn_prediction = cm.predict(['9237-HQITU', '9305-CDSKC', '7892-POOKP', '4190-MFLUW', '6467-CHFZW', '8665-UTDHZ'])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0 0 0 1 1 1]\n" - ] - } - ], - "source": [ - "print(churn_prediction)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "local-feast", - "language": "python", - "name": "local-feast" - }, - "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.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb b/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb deleted file mode 100644 index c4d91340cf..0000000000 --- a/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb +++ /dev/null @@ -1,690 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Historical Feature Statistics with Feast, TFDV and Facets\n", - "\n", - "This tutorial covers how Feast can be used in conjunction with TFDV and Facets to retrieve statistics about feature datasets. \n", - "\n", - "The notebook showcases how Feast's integration with TFDV allows users to:\n", - "\n", - "1. Define TFX feature schemas and persist these properties in the Feature Store\n", - "2. Validate new data against the defined schema\n", - "3. Validate data already in Feast against the defined schema\n", - "\n", - "**Prerequisites**:\n", - "\n", - "- Feast running with at least 1 BigQuery warehouse store. This example uses a bigquery store with the name `historical`." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setting project to statistics...\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import pytest\n", - "import pytz\n", - "import uuid\n", - "import time\n", - "from datetime import datetime, timedelta\n", - "\n", - "from feast.client import Client\n", - "from feast.entity import Entity\n", - "from feast.feature import Feature\n", - "from feast.feature_set import FeatureSet\n", - "from feast.type_map import ValueType\n", - "from google.protobuf import json_format\n", - "from google.protobuf.duration_pb2 import Duration\n", - "from tensorflow_metadata.proto.v0 import statistics_pb2\n", - "from tensorflow_metadata.proto.v0 import schema_pb2\n", - "import tensorflow_data_validation as tfdv\n", - "\n", - "PROJECT_NAME = \"statistics\"\n", - "IRIS_DATASET = \"http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\n", - "BIGQUERY_STORE_NAME = \"historical\"\n", - "client = Client(core_url=\"localhost:6565\")\n", - "print(f\"setting project to {PROJECT_NAME}...\")\n", - "client.set_project(PROJECT_NAME)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we are using the iris dataset. More information about this dataset can be found [here](http://archive.ics.uci.edu/ml/datasets/iris)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sepal_lengthsepal_widthpetal_lengthpetal_widthclassdatetime
05.13.51.40.2Iris-setosa2020-05-25 07:31:28.230582+00:00
14.93.01.40.2Iris-setosa2020-05-25 07:31:28.230582+00:00
24.73.21.30.2Iris-setosa2020-05-25 07:31:28.230582+00:00
34.63.11.50.2Iris-setosa2020-05-25 07:31:28.230582+00:00
45.03.61.40.2Iris-setosa2020-05-25 07:31:28.230582+00:00
\n", - "
" - ], - "text/plain": [ - " sepal_length sepal_width petal_length petal_width class \\\n", - "0 5.1 3.5 1.4 0.2 Iris-setosa \n", - "1 4.9 3.0 1.4 0.2 Iris-setosa \n", - "2 4.7 3.2 1.3 0.2 Iris-setosa \n", - "3 4.6 3.1 1.5 0.2 Iris-setosa \n", - "4 5.0 3.6 1.4 0.2 Iris-setosa \n", - "\n", - " datetime \n", - "0 2020-05-25 07:31:28.230582+00:00 \n", - "1 2020-05-25 07:31:28.230582+00:00 \n", - "2 2020-05-25 07:31:28.230582+00:00 \n", - "3 2020-05-25 07:31:28.230582+00:00 \n", - "4 2020-05-25 07:31:28.230582+00:00 " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "iris_feature_names = [\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\"]\n", - "df = pd.read_csv(IRIS_DATASET, names=iris_feature_names + [\"class\"])\n", - "\n", - "# Add datetime to satisfy Feast\n", - "current_datetime = datetime.utcnow().replace(tzinfo=pytz.utc)\n", - "df['datetime'] = current_datetime - timedelta(days=1)\n", - "\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TFDV schema as part of the feature set definition\n", - "\n", - "An integral part of TFDV is the feature [schemas](https://github.com/tensorflow/metadata/blob/master/tensorflow_metadata/proto/v0/schema.proto) that describe the expected properties of the data in a dataset, such as:\n", - "- expected feature presence\n", - "- type\n", - "- expected domains of features\n", - "\n", - "These schemas, which can be [manually defined or generated by TFDV](https://www.tensorflow.org/tfx/data_validation/get_started#inferring_a_schema_over_the_data), can be then used to extend the definition of features within the feature set. As part of the spec, the schema is persisted within Feast, and is used for both in-flight data validation, as well as offline integration with TFDV.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Ignoring feature datetime of type datetime64[ns, UTC]\n", - "/Users/zhiling/.pyenv/versions/3.7.2/envs/test-feast/lib/python3.7/site-packages/tensorflow_data_validation/arrow/arrow_util.py:236: FutureWarning: Calling .data on ChunkedArray is provided for compatibility after Column was removed, simply drop this attribute\n", - " types.FeaturePath([column_name]), column.data.chunk(0), weights):\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Entity class(ValueType.STRING) manually updated (replacing an existing field).\n", - "Feature sepal_length (ValueType.DOUBLE) added from dataframe.\n", - "Feature sepal_width (ValueType.DOUBLE) added from dataframe.\n", - "Feature petal_length (ValueType.DOUBLE) added from dataframe.\n", - "Feature petal_width (ValueType.DOUBLE) added from dataframe.\n", - "\n", - "{\n", - " \"spec\": {\n", - " \"name\": \"iris\",\n", - " \"entities\": [\n", - " {\n", - " \"name\": \"class\",\n", - " \"valueType\": \"STRING\"\n", - " }\n", - " ],\n", - " \"features\": [\n", - " {\n", - " \"name\": \"sepal_length\",\n", - " \"valueType\": \"DOUBLE\",\n", - " \"presence\": {\n", - " \"minFraction\": 1.0,\n", - " \"minCount\": \"1\"\n", - " },\n", - " \"shape\": {\n", - " \"dim\": [\n", - " {\n", - " \"size\": \"1\"\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " {\n", - " \"name\": \"sepal_width\",\n", - " \"valueType\": \"DOUBLE\",\n", - " \"presence\": {\n", - " \"minFraction\": 1.0,\n", - " \"minCount\": \"1\"\n", - " },\n", - " \"shape\": {\n", - " \"dim\": [\n", - " {\n", - " \"size\": \"1\"\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " {\n", - " \"name\": \"petal_length\",\n", - " \"valueType\": \"DOUBLE\",\n", - " \"presence\": {\n", - " \"minFraction\": 1.0,\n", - " \"minCount\": \"1\"\n", - " },\n", - " \"shape\": {\n", - " \"dim\": [\n", - " {\n", - " \"size\": \"1\"\n", - " }\n", - " ]\n", - " }\n", - " },\n", - " {\n", - " \"name\": \"petal_width\",\n", - " \"valueType\": \"DOUBLE\",\n", - " \"presence\": {\n", - " \"minFraction\": 1.0,\n", - " \"minCount\": \"1\"\n", - " },\n", - " \"shape\": {\n", - " \"dim\": [\n", - " {\n", - " \"size\": \"1\"\n", - " }\n", - " ]\n", - " },\n", - " \"floatDomain\": {\n", - " \"min\": 0.0\n", - " }\n", - " }\n", - " ]\n", - " },\n", - " \"meta\": {}\n", - "}\n" - ] - } - ], - "source": [ - "# Infer a schema over the iris dataset. These values can be tweaked as necessary.\n", - "stats = tfdv.generate_statistics_from_dataframe(df)\n", - "schema = tfdv.infer_schema(statistics=stats)\n", - "width_domain = schema_pb2.FloatDomain(min=0)\n", - "tfdv.set_domain(schema, 'petal_width', width_domain)\n", - "\n", - "# Create a new FeatureSet or retrieve an existing FeatureSet in Feast\n", - "feature_set = FeatureSet(name=\"iris\")\n", - "feature_set.infer_fields_from_df(df[['datetime'] + iris_feature_names], \n", - " entities=[Entity(name=\"class\", dtype=ValueType.STRING)])\n", - "\n", - "# Update the entities and features with constraints defined in the schema\n", - "feature_set.import_tfx_schema(schema)\n", - "print(feature_set)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Computing statistics over an ingested dataset\n", - "\n", - "Feast is able to compute statistics for any data that has been ingested into the system. Statistics can be computed over either discrete datasets using *dataset_ids* or periods of time using a specified time range.\n", - "\n", - "These statistics are computed at a historical store (caveat: only BQ is supported at the moment). The feature statistics returned in the form of TFX's `DatasetFeatureStatisticsList`, which can then be directly fed back into TFDV methods to either visualise the data statistics, or validate the dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Feature set created: \"iris\"\n", - "Waiting for feature set to be ready for ingestion...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 150/150 [00:01<00:00, 122.33rows/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ingestion complete!\n", - "\n", - "Ingestion statistics:\n", - "Success: 150/150\n", - "Removing temporary file(s)...\n", - "\n", - "ingestion id: 73ed84b1-1218-3702-b4c6-673503233264\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "# Apply the featureset\n", - "client.apply(feature_set)\n", - "\n", - "# When a dataset is ingested into Feast, a unique ingestion id referencing the ingested dataset is returned. \n", - "ingestion_id = client.ingest(feature_set, df)\n", - "print(\"\\ningestion id: \" + ingestion_id)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Get statistics from Feast for the ingested dataset.\n", - "# The statistics are calculated over the data in the store specified.\n", - "stats = client.get_statistics(\n", - " feature_set_id='iris', \n", - " store=BIGQUERY_STORE_NAME, \n", - " features=iris_feature_names, \n", - " ingestion_ids=[ingestion_id])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualising statistics with facets\n", - "\n", - "Since Feast outputs statistics in a format compatible with the TFDV API, the stats object can be directly passed to `tfdv.visualize_statistics()` to visualise, in-line, the output statistics on [Facets](https://pair-code.github.io/facets/), allowing for easy and interactive exploration of the shape and distribution of the data inside Feast." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tfdv.visualize_statistics(stats)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Validating correctness of subsequent datasets \n", - "\n", - "While it is useful to explore dataset statistics using facets, since we have already defined a schema that specifies a dataset's bounds of correctness, we can leverage TFDV's `validate_statistics` to validate if subsequent datasets are problematic or not. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is possible to validate correctness of a new dataset prior to ingestion by retrieving the schema from the feature set, and comparing computed statistics against that schema. \n", - "\n", - "This can be useful if we want to avoid ingesting problematic data into Feast." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Ignoring feature datetime of type datetime64[ns, UTC]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Anomaly short descriptionAnomaly long description
Feature name
'petal_width'Out-of-range valuesUnexpectedly low values: -1<-1(upto six significant digits)
'class'New columnNew column (column in data but not in schema)
\n", - "
" - ], - "text/plain": [ - " Anomaly short description \\\n", - "Feature name \n", - "'petal_width' Out-of-range values \n", - "'class' New column \n", - "\n", - " Anomaly long description \n", - "Feature name \n", - "'petal_width' Unexpectedly low values: -1<-1(upto six significant digits) \n", - "'class' New column (column in data but not in schema) " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Ingest a new dataset with obviously incorrect data\n", - "df_2 = pd.DataFrame(\n", - " {\n", - " \"datetime\": current_datetime,\n", - " \"class\": [\"Iris-setosa\", \"Iris-virginica\", \"Iris-nonsensica\"],\n", - " \"sepal_length\": [4.3, 6.9, 12],\n", - " \"sepal_width\": [3.0, 2.8, 1.1],\n", - " \"petal_length\": [1.2, 4.9, 2.2],\n", - " \"petal_width\": [0.1, 1.8, -1.0]\n", - " }\n", - ")\n", - "\n", - "# Validate correctness\n", - "stats_2 = tfdv.generate_statistics_from_dataframe(df_2)\n", - "anomalies = tfdv.validate_statistics(statistics=stats_2, schema=feature_set.export_tfx_schema())\n", - "tfdv.display_anomalies(anomalies)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Alternatively, the data can be ingested into Feast, and the statistics computed at the store. This has the benefit of offloading statistics computation for large datasets to Feast." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\r", - " 0%| | 0/3 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Anomaly short descriptionAnomaly long description
Feature name
'petal_width'Out-of-range valuesUnexpectedly low values: -1<-1(upto six significant digits)
\n", - "" - ], - "text/plain": [ - " Anomaly short description \\\n", - "Feature name \n", - "'petal_width' Out-of-range values \n", - "\n", - " Anomaly long description \n", - "Feature name \n", - "'petal_width' Unexpectedly low values: -1<-1(upto six significant digits) " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Ingest the data into Feast\n", - "ingestion_id_2 = client.ingest(feature_set, df_2)\n", - "time.sleep(10) # Sleep is not necessary if not using DirectRunner\n", - "\n", - "# Compute statistics over the new dataset\n", - "stats_2 = client.get_statistics(\n", - " feature_set_id='iris', \n", - " store=BIGQUERY_STORE_NAME, \n", - " features=iris_feature_names, \n", - " ingestion_ids=[ingestion_id_2])\n", - "\n", - "# Detect anomalies in the dataset\n", - "anomalies = tfdv.validate_statistics(statistics=stats_2, schema=feature_set.export_tfx_schema())\n", - "tfdv.display_anomalies(anomalies)" - ] - } - ], - "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.7.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file