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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
customerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurity...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": [ + " 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tenureSeniorCitizenMonthlyChargesChurn
01029.85No
134056.95No
22053.85Yes
345042.30No
42070.70Yes
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tenureseniorcitizenmonthlychargeschurn
01029.85No
134056.95No
22053.85Yes
345042.30No
42070.70Yes
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tenureseniorcitizenmonthlycharges
01029.85
134056.95
22053.85
345042.30
42070.70
\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