From 9ada7f978bf47ada59b58a4758d096f4af09bee2 Mon Sep 17 00:00:00 2001
From: silviagonzalez98 <80603632+silviagonzalez98@users.noreply.github.com>
Date: Tue, 10 Aug 2021 21:18:13 +0200
Subject: [PATCH 1/3] Add files via upload
---
Solutions (1).ipynb | 1103 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1103 insertions(+)
create mode 100644 Solutions (1).ipynb
diff --git a/Solutions (1).ipynb b/Solutions (1).ipynb
new file mode 100644
index 0000000..232328a
--- /dev/null
+++ b/Solutions (1).ipynb
@@ -0,0 +1,1103 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "3347211c",
+ "metadata": {},
+ "source": [
+ "# Lab | Imbalanced data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "a9a12465",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import scipy.stats as stats\n",
+ "\n",
+ "from sklearn import preprocessing\n",
+ "from sklearn.metrics import confusion_matrix\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "from imblearn.over_sampling import SMOTE\n",
+ "\n",
+ "\n",
+ "from imblearn.over_sampling import SMOTE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1a6ad47b",
+ "metadata": {},
+ "source": [
+ " ### 1. Load the dataset and explore the variables."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "b04c7d53",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customerID | \n",
+ " gender | \n",
+ " SeniorCitizen | \n",
+ " Partner | \n",
+ " Dependents | \n",
+ " tenure | \n",
+ " PhoneService | \n",
+ " MultipleLines | \n",
+ " InternetService | \n",
+ " OnlineSecurity | \n",
+ " ... | \n",
+ " DeviceProtection | \n",
+ " TechSupport | \n",
+ " StreamingTV | \n",
+ " StreamingMovies | \n",
+ " Contract | \n",
+ " PaperlessBilling | \n",
+ " PaymentMethod | \n",
+ " MonthlyCharges | \n",
+ " TotalCharges | \n",
+ " Churn | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 7590-VHVEG | \n",
+ " Female | \n",
+ " 0 | \n",
+ " Yes | \n",
+ " No | \n",
+ " 1 | \n",
+ " No | \n",
+ " No phone service | \n",
+ " DSL | \n",
+ " No | \n",
+ " ... | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " Month-to-month | \n",
+ " Yes | \n",
+ " Electronic check | \n",
+ " 29.85 | \n",
+ " 29.85 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 5575-GNVDE | \n",
+ " Male | \n",
+ " 0 | \n",
+ " No | \n",
+ " No | \n",
+ " 34 | \n",
+ " Yes | \n",
+ " No | \n",
+ " DSL | \n",
+ " Yes | \n",
+ " ... | \n",
+ " Yes | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " One year | \n",
+ " No | \n",
+ " Mailed check | \n",
+ " 56.95 | \n",
+ " 1889.5 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3668-QPYBK | \n",
+ " Male | \n",
+ " 0 | \n",
+ " No | \n",
+ " No | \n",
+ " 2 | \n",
+ " Yes | \n",
+ " No | \n",
+ " DSL | \n",
+ " Yes | \n",
+ " ... | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " Month-to-month | \n",
+ " Yes | \n",
+ " Mailed check | \n",
+ " 53.85 | \n",
+ " 108.15 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7795-CFOCW | \n",
+ " Male | \n",
+ " 0 | \n",
+ " No | \n",
+ " No | \n",
+ " 45 | \n",
+ " No | \n",
+ " No phone service | \n",
+ " DSL | \n",
+ " Yes | \n",
+ " ... | \n",
+ " Yes | \n",
+ " Yes | \n",
+ " No | \n",
+ " No | \n",
+ " One year | \n",
+ " No | \n",
+ " Bank transfer (automatic) | \n",
+ " 42.30 | \n",
+ " 1840.75 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 9237-HQITU | \n",
+ " Female | \n",
+ " 0 | \n",
+ " No | \n",
+ " No | \n",
+ " 2 | \n",
+ " Yes | \n",
+ " No | \n",
+ " Fiber optic | \n",
+ " No | \n",
+ " ... | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " No | \n",
+ " Month-to-month | \n",
+ " Yes | \n",
+ " Electronic check | \n",
+ " 70.70 | \n",
+ " 151.65 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 21 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customerID gender SeniorCitizen Partner Dependents tenure PhoneService \\\n",
+ "0 7590-VHVEG Female 0 Yes No 1 No \n",
+ "1 5575-GNVDE Male 0 No No 34 Yes \n",
+ "2 3668-QPYBK Male 0 No No 2 Yes \n",
+ "3 7795-CFOCW Male 0 No No 45 No \n",
+ "4 9237-HQITU Female 0 No No 2 Yes \n",
+ "\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": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data = pd.read_csv('files_for_lab/customer_churn.csv')\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d14c6bc6",
+ "metadata": {},
+ "source": [
+ "### 2. We will try to predict variable `Churn` using a logistic regression on variables `tenure`, `SeniorCitizen`,`MonthlyCharges`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "ed3a243b",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tenure | \n",
+ " SeniorCitizen | \n",
+ " MonthlyCharges | \n",
+ " Churn | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 29.85 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 34 | \n",
+ " 0 | \n",
+ " 56.95 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 53.85 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 45 | \n",
+ " 0 | \n",
+ " 42.30 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 70.70 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tenure SeniorCitizen MonthlyCharges Churn\n",
+ "0 1 0 29.85 No\n",
+ "1 34 0 56.95 No\n",
+ "2 2 0 53.85 Yes\n",
+ "3 45 0 42.30 No\n",
+ "4 2 0 70.70 Yes"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data1 = data[['tenure','SeniorCitizen','MonthlyCharges', 'Churn']]\n",
+ "data1.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "5e3d1612",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tenure | \n",
+ " seniorcitizen | \n",
+ " monthlycharges | \n",
+ " churn | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 29.85 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 34 | \n",
+ " 0 | \n",
+ " 56.95 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 53.85 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 45 | \n",
+ " 0 | \n",
+ " 42.30 | \n",
+ " No | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 70.70 | \n",
+ " Yes | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tenure seniorcitizen monthlycharges churn\n",
+ "0 1 0 29.85 No\n",
+ "1 34 0 56.95 No\n",
+ "2 2 0 53.85 Yes\n",
+ "3 45 0 42.30 No\n",
+ "4 2 0 70.70 Yes"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#Standardize column headers\n",
+ "data1.columns = [column.lower().replace(' ', '_') for column in data1.columns]\n",
+ "data1.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c39c50c1",
+ "metadata": {},
+ "source": [
+ "### 3. Extract the target variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "e40ea2b5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 No\n",
+ "1 No\n",
+ "2 Yes\n",
+ "3 No\n",
+ "4 Yes\n",
+ "Name: churn, dtype: object"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y = data1['churn']\n",
+ "Y.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34b8167e",
+ "metadata": {},
+ "source": [
+ "### 4. Extract the independent variables and scale them."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "a4b36427",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tenure | \n",
+ " seniorcitizen | \n",
+ " monthlycharges | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 29.85 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 34 | \n",
+ " 0 | \n",
+ " 56.95 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 53.85 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 45 | \n",
+ " 0 | \n",
+ " 42.30 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 70.70 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tenure seniorcitizen monthlycharges\n",
+ "0 1 0 29.85\n",
+ "1 34 0 56.95\n",
+ "2 2 0 53.85\n",
+ "3 45 0 42.30\n",
+ "4 2 0 70.70"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X = data1.drop('churn', axis=1)\n",
+ "X.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be22e619",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b1c32798",
+ "metadata": {},
+ "source": [
+ "### 5. Build the logistic regression model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "8f662c52",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "6a100638",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LogisticRegression(max_iter=1000, random_state=42)"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification = LogisticRegression(random_state=42, max_iter=1000)\n",
+ "\n",
+ "classification.fit(X_train, Y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c43b6ec6",
+ "metadata": {},
+ "source": [
+ "### 6. Evaluate the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "bc5e73db",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.8055358410220014"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification.score(X_test, Y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "85df7c42",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['No', 'No', 'No', ..., 'No', 'No', 'No'], dtype=object)"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "predictions = classification.predict(X_test)\n",
+ "predictions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "6bc1c855",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[956, 80],\n",
+ " [194, 179]])"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "confusion_matrix(Y_test, predictions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "3e6478dc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "cf_matrix = confusion_matrix(Y_test, predictions)\n",
+ "group_names = ['True A', 'False A', 'False B', 'True B']\n",
+ "group_counts = [\"{0:0.0f}\".format(value) for value in cf_matrix.flatten()]\n",
+ "group_percentages = [\"{0:.2%}\".format(value) for value in cf_matrix.flatten()/np.sum(cf_matrix)]\n",
+ "labels = [f\"{v1}\\n{v2}\\n{v3}\" for v1, v2, v3 in zip(group_names,group_counts,group_percentages)]\n",
+ "labels = np.asarray(labels).reshape(2,2)\n",
+ "sns.heatmap(cf_matrix, annot=labels, fmt='', cmap='Blues')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36aee38e",
+ "metadata": {},
+ "source": [
+ "### 7. Even a simple model will give us more than 70% accuracy. Why?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "904161a0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "No 5174\n",
+ "Yes 1869\n",
+ "Name: churn, dtype: int64"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "9be2632c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "No 0.73463\n",
+ "Yes 0.26537\n",
+ "Name: churn, dtype: float64"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y.value_counts(normalize=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5f68e4a3",
+ "metadata": {},
+ "source": [
+ "We can see that the model gives us a 73% of accuracy >> the size of target variable is imbalanced"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6887fdde",
+ "metadata": {},
+ "source": [
+ "### 8. Synthetic Minority Oversampling TEchnique (SMOTE) is an over sampling technique based on nearest neighbors that adds new points between existing points. Apply `imblearn.over_sampling.SMOTE` to the dataset. Build and evaluate the logistic regression model. Is it there any improvement?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "252203a4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Yes 5174\n",
+ "No 5174\n",
+ "Name: churn, dtype: int64"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "smote = SMOTE()\n",
+ "\n",
+ "X_sm, Y_sm = smote.fit_resample(X, Y)\n",
+ "Y_sm.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "ca01f44d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, Y_train, Y_test = train_test_split(X_sm, Y_sm, test_size=0.2, random_state=42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "787ae57d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LogisticRegression(max_iter=1000, random_state=42)"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification = LogisticRegression(random_state=42, max_iter=1000)\n",
+ "\n",
+ "classification.fit(X_train, Y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "e05d5dc8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.748792270531401"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification.score(X_test, Y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "846348e4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['Yes', 'No', 'No', ..., 'Yes', 'Yes', 'Yes'], dtype=object)"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "predictions = classification.predict(X_test)\n",
+ "predictions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "c095bbe1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[760, 261],\n",
+ " [259, 790]])"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "confusion_matrix(Y_test, predictions)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "747b79cc",
+ "metadata": {},
+ "source": [
+ "### 9. Tomek links are pairs of very close instances, but of opposite classes. Removing the instances of the majority class of each pair increases the space between the two classes, facilitating the classification process. Apply `imblearn.under_sampling.TomekLinks` to the dataset. Build and evaluate the logistic regression model. Is it there any improvement?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "74cfebb0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/silvia/opt/anaconda3/lib/python3.8/site-packages/imblearn/utils/_validation.py:587: FutureWarning: Pass sampling_strategy=majority as keyword args. From version 0.9 passing these as positional arguments will result in an error\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "No 4711\n",
+ "Yes 1869\n",
+ "Name: churn, dtype: int64"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from imblearn.under_sampling import TomekLinks\n",
+ "\n",
+ "tomel = TomekLinks('majority')\n",
+ "X_tomel, Y_tomel = tomel.fit_resample(X, Y)\n",
+ "Y_tomel.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "afa5e80a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, Y_train, Y_test = train_test_split(X_tomel, Y_tomel, test_size=0.2, random_state=42)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "0ff1788a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LogisticRegression(max_iter=1000, random_state=42)"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification = LogisticRegression(random_state=42, max_iter=1000)\n",
+ "\n",
+ "classification.fit(X_train, Y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "07a83ca8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.791033434650456"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "classification.score(X_test, Y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "ddd95aa9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['No', 'Yes', 'No', ..., 'Yes', 'No', 'No'], dtype=object)"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "predictions = classification.predict(X_test)\n",
+ "predictions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "554bb609",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[853, 99],\n",
+ " [176, 188]])"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "confusion_matrix(Y_test, predictions)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
From 94cc272547bcd9a590533c1020518b721998f984 Mon Sep 17 00:00:00 2001
From: silviagonzalez98 <80603632+silviagonzalez98@users.noreply.github.com>
Date: Tue, 10 Aug 2021 21:19:48 +0200
Subject: [PATCH 2/3] Delete Solutions.ipynb
---
Solutions.ipynb | 177 ------------------------------------------------
1 file changed, 177 deletions(-)
delete mode 100644 Solutions.ipynb
diff --git a/Solutions.ipynb b/Solutions.ipynb
deleted file mode 100644
index 21c44b8..0000000
--- a/Solutions.ipynb
+++ /dev/null
@@ -1,177 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "3347211c",
- "metadata": {},
- "source": [
- "# Lab | Imbalanced data"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "1a6ad47b",
- "metadata": {},
- "source": [
- " ### 1. Load the dataset and explore the variables."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a9a12465",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "d14c6bc6",
- "metadata": {},
- "source": [
- "### 2. We will try to predict variable `Churn` using a logistic regression on variables `tenure`, `SeniorCitizen`,`MonthlyCharges`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ed3a243b",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "c39c50c1",
- "metadata": {},
- "source": [
- "### 3. Extract the target variable."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e40ea2b5",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "34b8167e",
- "metadata": {},
- "source": [
- "### 4. Extract the independent variables and scale them."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "a4b36427",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "b1c32798",
- "metadata": {},
- "source": [
- "### 5. Build the logistic regression model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8f662c52",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "c43b6ec6",
- "metadata": {},
- "source": [
- "### 6. Evaluate the model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "bc5e73db",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "36aee38e",
- "metadata": {},
- "source": [
- "### 7. Even a simple model will give us more than 70% accuracy. Why?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "904161a0",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "6887fdde",
- "metadata": {},
- "source": [
- "### 8. Synthetic Minority Oversampling TEchnique (SMOTE) is an over sampling technique based on nearest neighbors that adds new points between existing points. Apply `imblearn.over_sampling.SMOTE` to the dataset. Build and evaluate the logistic regression model. Is it there any improvement?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "252203a4",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "id": "747b79cc",
- "metadata": {},
- "source": [
- "### 9. Tomek links are pairs of very close instances, but of opposite classes. Removing the instances of the majority class of each pair increases the space between the two classes, facilitating the classification process. Apply `imblearn.under_sampling.TomekLinks` to the dataset. Build and evaluate the logistic regression model. Is it there any improvement?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "74cfebb0",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.5"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
From daef64224cc97f5c46ba31d9457bb83d944552f8 Mon Sep 17 00:00:00 2001
From: silviagonzalez98 <80603632+silviagonzalez98@users.noreply.github.com>
Date: Tue, 10 Aug 2021 21:20:01 +0200
Subject: [PATCH 3/3] Rename Solutions (1).ipynb to Solutions.ipynb
---
Solutions (1).ipynb => Solutions.ipynb | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename Solutions (1).ipynb => Solutions.ipynb (100%)
diff --git a/Solutions (1).ipynb b/Solutions.ipynb
similarity index 100%
rename from Solutions (1).ipynb
rename to Solutions.ipynb