{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine Learning Homework 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instructions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This homework is due **before class on Friday, March 7.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Important notes:\n", "- Please submit the notebook with the output.\n", "- If the answer is not obvious from the printout, please type it.\n", "- The notebook should be self contained and we should be able to rerun it.\n", "- Import all the libraries that you find necessary to answer the questions.\n", "- If the subquestion is worth 1 point, no half points will be given: full point will be given for the correct answer. Similarly, if the question is worth 2, possible points are 0,1,2.\n", "- Acknowledge the use of outside sources and code assistants." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question 1 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Total 20 points**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the California house prices dataset from `sklearn.datasets` using `fetch_california_housing` as follows:
\n", " `from sklearn.datasets import fetch_california_housing`
\n", " `housing = fetch_california_housing()`\n", "1. Print out the dataset description and read it (1pt)\n", "2. Convert the dataset to pandas dataframe (all the features and the target) (1pt)\n", "3. Check the number of data points, data types, and print the first 15 lines of the dataset (1pt)\n", "4. Check the number of missing values per feature (1pt)\n", "5. Divide the dataset into train and test, where 30% of the dataset will be used for test, with the `random_state=42` (1pt)\n", "6. Train a Linear Regression model (1pt)\n", "7. What value of target is predicted by the model, when all the features have value 0 (1pt)\n", "8. What is the value of the coefficient associated with the feature HouseAge (1pt)\n", "9. Predict the target values of the data points from the training set (1pt)\n", "10. What is the value of the cost function for the obtained coefficients and the training dataset (1pt)\n", "11. Evaluate the model's performance (1pt)\n", "12. Generate polynomial features up to degree 2 of the training dataset (1pt)\n", "13. Scale the polynomial features from the previous step using the standard scaler (1pt)\n", "14. Train a Ridge regression model with the regularization strength equal to 0.001 on the scaled dataset. What would happen to the feature coefficients and the model if alpha approached infinity? (2pt)\n", "15. Train Lasso Regression with the regularization strength equal to 0.01 on the scaled dataset and set the maximum number of iterations to 100000 (1pt)\n", "16. Count how many coefficients (excluding intercept) are calculated (1pt)\n", "17. Check how many features will not be used to predict the target with this model (1pt)\n", "18. Plot the coefficients of Lasso and Ridge regression on the same plot, with label, Ridge in red, and Lasso in blue (2pt)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_california_housing\n", "housing = fetch_california_housing()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1. Print out the dataset description and read it (1pt)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".. _california_housing_dataset:\n", "\n", "California Housing dataset\n", "--------------------------\n", "\n", "**Data Set Characteristics:**\n", "\n", ":Number of Instances: 20640\n", "\n", ":Number of Attributes: 8 numeric, predictive attributes and the target\n", "\n", ":Attribute Information:\n", " - MedInc median income in block group\n", " - HouseAge median house age in block group\n", " - AveRooms average number of rooms per household\n", " - AveBedrms average number of bedrooms per household\n", " - Population block group population\n", " - AveOccup average number of household members\n", " - Latitude block group latitude\n", " - Longitude block group longitude\n", "\n", ":Missing Attribute Values: None\n", "\n", "This dataset was obtained from the StatLib repository.\n", "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n", "\n", "The target variable is the median house value for California districts,\n", "expressed in hundreds of thousands of dollars ($100,000).\n", "\n", "This dataset was derived from the 1990 U.S. census, using one row per census\n", "block group. A block group is the smallest geographical unit for which the U.S.\n", "Census Bureau publishes sample data (a block group typically has a population\n", "of 600 to 3,000 people).\n", "\n", "A household is a group of people residing within a home. Since the average\n", "number of rooms and bedrooms in this dataset are provided per household, these\n", "columns may take surprisingly large values for block groups with few households\n", "and many empty houses, such as vacation resorts.\n", "\n", "It can be downloaded/loaded using the\n", ":func:`sklearn.datasets.fetch_california_housing` function.\n", "\n", ".. rubric:: References\n", "\n", "- Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n", " Statistics and Probability Letters, 33 (1997) 291-297\n", "\n" ] } ], "source": [ "print(housing.DESCR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2. Convert the dataset to pandas dataframe (all the features and the target) (1pt)" ] }, { "cell_type": "code", "execution_count": 4, "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", "
MedIncHouseAgeAveRoomsAveBedrmsPopulationAveOccupLatitudeLongitudetarget
08.325241.06.9841271.023810322.02.55555637.88-122.234.526
18.301421.06.2381370.9718802401.02.10984237.86-122.223.585
27.257452.08.2881361.073446496.02.80226037.85-122.243.521
35.643152.05.8173521.073059558.02.54794537.85-122.253.413
43.846252.06.2818531.081081565.02.18146737.85-122.253.422
..............................
206351.560325.05.0454551.133333845.02.56060639.48-121.090.781
206362.556818.06.1140351.315789356.03.12280739.49-121.210.771
206371.700017.05.2055431.1200921007.02.32563539.43-121.220.923
206381.867218.05.3295131.171920741.02.12320939.43-121.320.847
206392.388616.05.2547171.1622641387.02.61698139.37-121.240.894
\n", "

20640 rows × 9 columns

\n", "
" ], "text/plain": [ " MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude \\\n", "0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 \n", "1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 \n", "2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 \n", "3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 \n", "4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 \n", "... ... ... ... ... ... ... ... \n", "20635 1.5603 25.0 5.045455 1.133333 845.0 2.560606 39.48 \n", "20636 2.5568 18.0 6.114035 1.315789 356.0 3.122807 39.49 \n", "20637 1.7000 17.0 5.205543 1.120092 1007.0 2.325635 39.43 \n", "20638 1.8672 18.0 5.329513 1.171920 741.0 2.123209 39.43 \n", "20639 2.3886 16.0 5.254717 1.162264 1387.0 2.616981 39.37 \n", "\n", " Longitude target \n", "0 -122.23 4.526 \n", "1 -122.22 3.585 \n", "2 -122.24 3.521 \n", "3 -122.25 3.413 \n", "4 -122.25 3.422 \n", "... ... ... \n", "20635 -121.09 0.781 \n", "20636 -121.21 0.771 \n", "20637 -121.22 0.923 \n", "20638 -121.32 0.847 \n", "20639 -121.24 0.894 \n", "\n", "[20640 rows x 9 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(housing.data, columns = housing.feature_names)\n", "df['target'] = housing.target\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3. Check the number of samples, the data types and print the first 15 lines of the dataset (1pt)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20640" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape[0]\n", "\n", "#or\n", "#df.info()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MedInc float64\n", "HouseAge float64\n", "AveRooms float64\n", "AveBedrms float64\n", "Population float64\n", "AveOccup float64\n", "Latitude float64\n", "Longitude float64\n", "target float64\n", "dtype: object" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 7, "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", "
MedIncHouseAgeAveRoomsAveBedrmsPopulationAveOccupLatitudeLongitudetarget
08.325241.06.9841271.023810322.02.55555637.88-122.234.526
18.301421.06.2381370.9718802401.02.10984237.86-122.223.585
27.257452.08.2881361.073446496.02.80226037.85-122.243.521
35.643152.05.8173521.073059558.02.54794537.85-122.253.413
43.846252.06.2818531.081081565.02.18146737.85-122.253.422
54.036852.04.7616581.103627413.02.13989637.85-122.252.697
63.659152.04.9319070.9513621094.02.12840537.84-122.252.992
73.120052.04.7975271.0618241157.01.78825337.84-122.252.414
82.080442.04.2941181.1176471206.02.02689137.84-122.262.267
93.691252.04.9705880.9901961551.02.17226937.84-122.252.611
103.203152.05.4776121.079602910.02.26368237.85-122.262.815
113.270552.04.7724801.0245231504.02.04904637.85-122.262.418
123.075052.05.3226501.0128211098.02.34615437.85-122.262.135
132.673652.04.0000001.097701345.01.98275937.84-122.261.913
141.916752.04.2629031.0096771212.01.95483937.85-122.261.592
\n", "
" ], "text/plain": [ " MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude \\\n", "0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 \n", "1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 \n", "2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 \n", "3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 \n", "4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 \n", "5 4.0368 52.0 4.761658 1.103627 413.0 2.139896 37.85 \n", "6 3.6591 52.0 4.931907 0.951362 1094.0 2.128405 37.84 \n", "7 3.1200 52.0 4.797527 1.061824 1157.0 1.788253 37.84 \n", "8 2.0804 42.0 4.294118 1.117647 1206.0 2.026891 37.84 \n", "9 3.6912 52.0 4.970588 0.990196 1551.0 2.172269 37.84 \n", "10 3.2031 52.0 5.477612 1.079602 910.0 2.263682 37.85 \n", "11 3.2705 52.0 4.772480 1.024523 1504.0 2.049046 37.85 \n", "12 3.0750 52.0 5.322650 1.012821 1098.0 2.346154 37.85 \n", "13 2.6736 52.0 4.000000 1.097701 345.0 1.982759 37.84 \n", "14 1.9167 52.0 4.262903 1.009677 1212.0 1.954839 37.85 \n", "\n", " Longitude target \n", "0 -122.23 4.526 \n", "1 -122.22 3.585 \n", "2 -122.24 3.521 \n", "3 -122.25 3.413 \n", "4 -122.25 3.422 \n", "5 -122.25 2.697 \n", "6 -122.25 2.992 \n", "7 -122.25 2.414 \n", "8 -122.26 2.267 \n", "9 -122.25 2.611 \n", "10 -122.26 2.815 \n", "11 -122.26 2.418 \n", "12 -122.26 2.135 \n", "13 -122.26 1.913 \n", "14 -122.26 1.592 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4. Check the number of missing values per feature (1pt)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MedInc 0\n", "HouseAge 0\n", "AveRooms 0\n", "AveBedrms 0\n", "Population 0\n", "AveOccup 0\n", "Latitude 0\n", "Longitude 0\n", "target 0\n", "dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.5. Divide the dataset into train and test, where 30% of the dataset will be used for test, with the random_state=42 (1pt)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X = df.drop(columns = 'target')\n", "y = df['target']\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(housing.data, housing.target, random_state=42, test_size=0.3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,:-1], df.iloc[:,-1], random_state=42, test_size=0.3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.6. Train a Linear Regression model (1pt)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LinearRegression()" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "lin_reg = LinearRegression()\n", "lin_reg.fit(X_train,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.7. What value of target is predicted by the model, when all the features have value 0 (1pt)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(-37.056241331525186)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lin_reg.intercept_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.8. What is the value of the coefficient associated with the feature HouseAge? (1pt)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup',\n", " 'Latitude', 'Longitude', 'target'],\n", " dtype='object')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns\n", "#df.columns.get_loc('HouseAge')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.009681867985916507)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lin_reg.coef_[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.9. Predict the target values of the data points from the training set (1pt)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "y_train_pred = lin_reg.predict(X_train)" ] }, { "cell_type": "code", "execution_count": 17, "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", "
MedIncHouseAgeAveRoomsAveBedrmsPopulationAveOccupLatitudeLongitude
70614.131235.05.8823530.9754901218.02.98529433.93-118.02
146892.863120.04.4012101.076613999.02.01411332.79-117.09
173234.202624.05.6175440.989474731.02.56491234.59-120.14
100563.109414.05.8695651.094203302.02.18840639.26-121.00
157503.306852.04.8012051.0662651526.02.29819337.77-122.45
...........................
112846.370035.06.1290320.926267658.03.03225833.78-117.96
119643.050033.06.8685971.2694881753.03.90423234.02-117.43
53902.934436.03.9867171.0796961756.03.33206834.03-118.38
8605.719215.06.3953491.0679791777.03.17889137.58-121.96
157952.575552.03.4025761.0587762619.02.10869637.77-122.42
\n", "

14448 rows × 8 columns

\n", "
" ], "text/plain": [ " MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude \\\n", "7061 4.1312 35.0 5.882353 0.975490 1218.0 2.985294 33.93 \n", "14689 2.8631 20.0 4.401210 1.076613 999.0 2.014113 32.79 \n", "17323 4.2026 24.0 5.617544 0.989474 731.0 2.564912 34.59 \n", "10056 3.1094 14.0 5.869565 1.094203 302.0 2.188406 39.26 \n", "15750 3.3068 52.0 4.801205 1.066265 1526.0 2.298193 37.77 \n", "... ... ... ... ... ... ... ... \n", "11284 6.3700 35.0 6.129032 0.926267 658.0 3.032258 33.78 \n", "11964 3.0500 33.0 6.868597 1.269488 1753.0 3.904232 34.02 \n", "5390 2.9344 36.0 3.986717 1.079696 1756.0 3.332068 34.03 \n", "860 5.7192 15.0 6.395349 1.067979 1777.0 3.178891 37.58 \n", "15795 2.5755 52.0 3.402576 1.058776 2619.0 2.108696 37.77 \n", "\n", " Longitude \n", "7061 -118.02 \n", "14689 -117.09 \n", "17323 -120.14 \n", "10056 -121.00 \n", "15750 -122.45 \n", "... ... \n", "11284 -117.96 \n", "11964 -117.43 \n", "5390 -118.38 \n", "860 -121.96 \n", "15795 -122.42 \n", "\n", "[14448 rows x 8 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.13761366, 1.76385736, 2.75114302, ..., 2.03900584, 2.84130506,\n", " 2.27916759], shape=(14448,))" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.10. What is the value of the cost function for the obtained coefficients and the training dataset (1pt)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(7561.471021289252)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SSE = ((y_train-y_train_pred)**2).sum()\n", "SSE " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.5233576288267755)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "MSE = ((y_train-y_train_pred)**2).sum()/len(y_train)\n", "MSE " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5233576288267755" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_squared_error\n", "error_train = mean_squared_error(y_train,y_train_pred)\n", "error_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.11. Evaluate the model's performance (1pt)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5957702326061662" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lin_reg.score(X_test,y_test) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.12. Generate polynomial features up to degree 2 of the training set (1pt) " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import PolynomialFeatures\n", "\n", "poly_converter = PolynomialFeatures(degree=2, include_bias = False)\n", "poly_converter.fit(X_train)\n", "\n", "X_train = poly_converter.transform(X_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.13. Scale the polynomial features from the previous step using the standard scaler (1pt)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "\n", "scaler = StandardScaler()\n", "scaler.fit(X_train)\n", "\n", "X_train = scaler.transform(X_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.14. Train a Ridge Regression with the regularization strength equal to 0.001 on the scaled dataset. What would happen to the feature coefficients and the model if alpha approached infinity? (2pt)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Ridge(alpha=0.001)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Ridge(alpha=0.001)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import Ridge\n", "\n", "ridge = Ridge(alpha=0.001)\n", "ridge.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The feature coefficients would shrink toward 0, culminating in the model being underfit as the high penalty would prevent it from properly capturing the relationships between the input features and the target. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.15. Train Lasso Regression with the regularization strength equal to 0.01 on the scaled dataset and set the maximum number of iterations to 100000 (1pt)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Lasso(alpha=0.01, max_iter=100000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Lasso(alpha=0.01, max_iter=100000)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import Lasso\n", "\n", "lasso = Lasso(alpha = 1e-2, max_iter = int(1e5))\n", "lasso.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.16. Count how many coefficients (excluding intercept) are calculated (1pt)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of coefficients: 44\n" ] } ], "source": [ "print(f\"Total number of coefficients: {len(lasso.coef_)}\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.17. Check how many features will not be used to predict the target with this model (1pt)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of Features with Coefficients equal to 0: 28\n" ] } ], "source": [ "print(f\"Number of Features with Coefficients equal to 0: {(lasso.coef_==0).sum()}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.18. Plot the coefficients of Lasso and Ridge regression on the same plot, with label, Ridge in red, and Lasso in blue (2pt)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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3r2u75wLZGRk6NChQ7rhhhtcap+UlKQ9e/aoevXqzhrCw8OVk5NTqI7mzZvL77wXRlRUlDIyMkrtu7TjcikI8wAAAMU4N1c+P7/w8vx8382d379/v/r166cWLVpoxYoVSkpK0osvvihJzjnbf/3rX/Xrr79q8ODB2rlzp9q3b6/nn39ektS3b1/t379f48ePd4bchx9+WFLpwbyk5U2aNNHevXudz12aC/s4//kcDoeioqK0ffv2Qrfk5GRNnDjRhT1TvMDAQLfaOxwOtWvXrkgdP//8swYNGuRsV61atUKPs9lscjgcpfZd2nG5FIR5AADgnogIKSCg9DYBAQXtLOrcqHyVEpJSlSq+GZ3fsmWLzp49q2eeeUbXXHONmjRpokOHDhVpFxMTo5EjR2rlypWaMGGCXn75Zee6K664QsOGDdMbb7yhBQsWaPHixZKkZs2aafv27c4Rfkn66quvVKVKFTVp0qTYegYNGqQTJ05o4cKFxa4/duyYJKlp06b68ssvC637+uuv1bRpU0lS27ZtlZ6erqpVq6px48aFbhGX8DqqXr26GjRo4PKpKtu2batffvlFtWvXLlJHWFiYy8/r7++v/As/Bar041JWXAEWAAC4JzZWSk6u0FeAzcsruOZVSYOtDod04EBBO2+c1TArK0vbt28vtCw8PFyNGjXS2bNn9fzzz6t///766quv9NJLLxVqN378ePXt21dNmjTR0aNH9dlnnzlD8+OPP6527dqpefPmys3N1fvvv+9cd/fdd2vq1KkaOnSopk2bpt9//11jx47V4MGDVadOnWLr7NixoyZNmqQJEybo4MGD+tOf/qTo6Gjt2bNHL730kq699lo9+OCDmjhxou68807nl1rfe+89rVy50vkF1h49eigxMVEDBgzQ7NmzlZCQoEOHDunDDz/UgAED1L59+zLvy2nTpmnkyJGqXbu2+vbtq+PHj+urr77S2LFji7S9++67NXfuXN1yyy2aMWOG6tWrp9TUVK1cuVITJ05UvXr1XHrOBg0a6PPPP9ddd90lu92uiIiIUo/LpSDMAwAA98XGWjqsX4zdXjCV5vffS25Tu7Z3grwkbdiwQW3atCm0bOjQoVq6dKnmzZun2bNna/LkyerSpYtmzZqlIUOGONvl5+dr9OjR+s9//qPQ0FD16dNH8+fPl1QwYjx58mTt27dPgYGB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TE4m0AMAPMrlMD906FBJUlxcnDp16qRq1ap5rSgAcJsvR8YzM0sP8lLB+sxMwjwAwKPcPs98165d5XA49PPPPysjI0MOh6PQ+i5dunisOABwCSPjAIBKyu0w/+2332rQoEHav3+/LjwRjs1ms/zZbABYECPjAIBKyu0wP3LkSLVv314ffPCBoqKiij2zDQAAAADvczvM//LLL/rXv/6lxo0be6MeAAAAAC5y+zzzHTt21J49e7xRCwAAAAA3uD0yP3bsWE2YMEHp6elq2bJlkbPatGrVymPFAQAAACiZ22H+tttukyQNHz7cucxmszmvDMsXYAFUOhERBWfLudjZdCIiLl9NAIBKwe0wn5KS4o06AMC6YmMLTnvJFWABAJeZ22G+fv363qgDAMquPIyMx8YS1gEAl53bYV6SXn/9db300ktKSUnRN998o/r162vBggWKi4vTLbfc4ukaAaB0jIwDACopt89ms2jRIj300EPq16+fjh075pwjX6NGDS1YsMDT9QGAa2JjpbZtS74R5AEAFZDbYf7555/Xyy+/rClTpsjPz8+5vH379tq5c6dHiwMAAABQMrfDfEpKitq0aVNkud1u18mTJz1SFAAAAICLczvMx8XFafv27UWWf/TRR2rWrJknagIAAADgAre/ADtx4kSNHj1aOTk5Msbou+++09tvv61Zs2bplVde8UaNAAAAAIrhdpi/5557dPbsWU2aNEmnTp3SoEGDVLduXT377LO66667vFEjAAAAgGLYjDGmrA/OzMyUw+FQ7dq1PVmTT2VnZyssLExZWVkKDQ31dTkAAMAFvH+jsirTeebPieDS5AAAAIDPuBTm27Ztq08//VQ1a9ZUmzZtZLPZSmy7detWjxUHAAAAoGQuhflbbrlFdrtdkjRgwABv1gMAAADARZc0Z74iYs4dAADWw/s3Kiu358xv3rxZDodDHTt2LLR806ZN8vPzU/v27T1WHACgkkpNlTIzS14fESHFxl6+egCgnHI7zI8ePVqTJk0qEuYPHjyo2bNna9OmTR4rDgBQCaWmSgkJUk5OyW0CAqTkZAI9gErP7SvA7tq1S23bti2yvE2bNtq1a5dHigIAVGKZmaUHealgfWkj9wBQSbgd5u12u3777bciy9PS0lS16iWd6RIAAACAG9wO8z179tTkyZOVlZXlXHbs2DE9+uij6tmzp0eLAwAAAFAyt4fSn3nmGXXp0kX169dXmzZtJEnbt29XnTp19Prrr3u8QAAAAADFczvM161bVzt27NCbb76p77//XoGBgbrnnnv05z//WdWqVfNGjZUDZ24AAACAm8o0yT04OFgjRozwdC2levLJJ/XBBx9o+/bt8vf317Fjx4q0SU1N1ejRo/XZZ58pMDBQgwYN0tNPPy1/f//LWqvbOHMDAAAAysClML969Wr17dtX1apV0+rVq0tte/PNN3uksAvl5eXpjjvuUGJiol599dUi6/Pz83XjjTfqiiuu0JdffqnDhw9r6NChMsbo+eef90pNHuPOmRsI8wAAAPiDS2F+wIABSk9PV+3atTVgwIAS29lsNuXn53uqtkKmT58uSVq6dGmx69euXatdu3bpwIEDio6OllQwv3/YsGF68sknuRocAFhFRETBXyMv9tfKiIjLVxMAlFMuhXmHw1Hs/8uTb775Ri1atHAGeUnq3bu3cnNzlZSUpO7duxf7uNzcXOXm5jrvZ2dne71WwG18pwKVSWxswbRCXvMAcFEuhfnw8HD9/PPPioiI0PDhw/Xss8+qevXq3q7NLenp6apTp06hZTVr1pS/v7/S09NLfNysWbOco/5AucR3KlAZxcbyegYAF7h0nvm8vDzniPWyZcuUc7H53S6aNm2abDZbqbctW7a43J/NZiuyzBhT7PJzzp0z/9ztwIEDZdoWwGu4GiYAACiBSyPziYmJGjBggNq1aydjjMaNG6fAwMBi2/7zn/90+cnHjBmju+66q9Q2DRo0cKmvyMhIbdq0qdCyo0eP6syZM0VG7M9nt9tlt9tdeg4AAACgPHEpzL/xxhuaP3++9u7dK0nKysryyOh8RESEIjz0BabExEQ9+eSTSktLU1RUlKSCL8Xa7Xa1a9fOI88BAAAAlCcuhfk6deroqaeekiTFxcXp9ddfV61atbxa2IVSU1N15MgRpaamKj8/X9u3b5ckNW7cWCEhIerVq5eaNWumwYMHa+7cuTpy5Igefvhh3XfffeX/TDacuQEAAABl4PYXYLt37+6TizA9/vjjWrZsmfN+mzZtJEnr169Xt27d5Ofnpw8++ECjRo1S586dC100qtzjzA0AAAAoA5sxxlysUUhIiHbs2KGGDRvKz89P6enpuuKKKy5HfZdddna2wsLClJWVVf5H9FE5bN0quTJV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AwcOONft2rVLWVlZatq0qSSpbdu2Sk5OVuPGjYvcqlQp+6+WVq1aafv27Tpy5MhF29apU0d169bVr7/+WqSGuLg4l5/T399f+fn5RZZXrVpVPXr00Jw5c7Rjxw7t27dPn332mVvb46rGjRurWrVqhb6EfPToUefpOyWpTZs2ys/PV0ZGRpHtPf+MQMOHD1eLFi302muvadKkSdq1a5dXagYA+B4j80Als3DhQnXq1ElXX321ZsyYoVatWuns2bNat26dFi1apN27d6tHjx5q1aqV7r77bi1YsMD5BdiuXbuqffv2kqTHH39cN910k2JiYnTHHXeoSpUq2rFjh3bu3KknnniizPX9+c9/1syZMzVgwADNmjVLUVFR2rZtm6KjowtNQTln2rRpGjdunEJDQ9W3b1/l5uZqy5YtOnr0qB566CGXnrNBgwY6ceKEPv30U7Vu3VpBQUH67LPP9Ouvv6pLly6qWbOmPvzwQzkcjkLTXjwpJCRE9957ryZOnKhatWqpTp06mjJlSqEPRk2aNNHdd9+tIUOG6JlnnlGbNm2UmZmpzz77TC1btlS/fv304osv6ptvvtGOHTsUExOjjz76SHfffbc2bdokf39/r9QOAPAdRuaBSiYuLk5bt25V9+7dNWHCBLVo0UI9e/bUp59+qkWLFkn676kia9asqS5duqhHjx5q2LCh3nnnHWc/vXv31vvvv69169apQ4cOuuaaazRv3jzVr1//kurz9/fX2rVrVbt2bfXr108tW7bUU089VWRayTl//etf9corr2jp0qVq2bKlunbtqqVLl7o1Mt+pUyeNHDlSAwcO1BVXXKE5c+aoRo0aWrlypa6//no1bdpUL730kt5++201b978kravNHPnzlWXLl108803q0ePHrr22mvVrl27Qm2WLFmiIUOGaMKECUpISNDNN9+sTZs2KSYmRj/99JMmTpyohQsXOr/v8OKLL+rYsWN67LHHvFY3AMB3bMaViZoAAAAAyh1G5gEAAACLIswDAAAAFkWYBwAAACyKMA8AAABYFGEeAAAAsCjCPAAAAGBRhHkAAADAogjzAAAAgEUR5gEAAACLIswDAAAAFkWYBwAAACzq/wOLDcqepY7cPgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#plt.figure(figsize=(5,4))\n", "plt.plot(ridge.coef_, 's', label = 'Ridge Coefficients', color = 'red')\n", "plt.plot(lasso.coef_, '^', label = 'Lasso Coefficients', color = 'blue')\n", "plt.xlabel(\"Coefficients' Index\")\n", "plt.ylabel(\"Coefficients' Magnitude\")\n", "plt.legend(loc=(1.01,0.915));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Question 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Total 18 points**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this question we will use a dataset with the medical details of patients for predicting the onset of diabetes within 5 years. The target is the last column of the dataset, where value 1 is interpreted as \"tested positive for diabetes\".\n", " 1. Import the csv file \"diabetes.csv\" into pandas dataframe (1pt)\n", " 2. How many duplicate rows do we have? If there are any, remove them. (1pt)\n", " 3. Generate descriptive statistics for all the numerical columns with one line of code (1pt)\n", " 4. Plot the distribution of the target value, per class percentages (1pt)\n", " 5. Split the dataset into training, validation and test set, with the ratio 50:30:20, and use the `random_seed=42` (1pt)\n", " 6. Train the logistic regression with solver='liblinear' with regularization strength equal to 0.01 with lasso regularization and that stops converging after 700 iterations (2pt) \n", " 7. Use the validation set to find the value of the threshold that maximizes f1 score (of Class 1). What is that threshold value? (1pt)\n", " 8. If we use the threshold value found above, how many false negatives do we have on the test dataset? (1pt)\n", " 9. What is the precision of our model with the value of threshold from step 7? (1pt)\n", " 10. What proportion (approximately) of patients with diabetes would we reach if we decided to contact 60% of the patients in the test set, ordered by the decreasing model score (1pt)\n", " 11. Use the data available (except the test set) with a cross validation method that finds the value of regularization strength of l1 penalty of Logistic regression that maximizes recall. Check at least 8 different values of the parameter and verify the best cross validation score (4pt)\n", " 12. What value of C gives the highest recall (1pt)\n", " 13. What was the second best mean test value of recall in cross validation (1pt)\n", " 14. What is f1 score of the best model (1pt)\n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1. Import the csv file \"diabetes.csv\" into pandas dataframe (1pt)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('diabetes.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2. How many duplicate rows do we have? If there are any, remove them. (1pt)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "771\n", "Number of duplicate rows: 3\n", "768\n" ] } ], "source": [ "print(len(df))\n", "print(f\"Number of duplicate rows: {df.duplicated().sum()}\")\n", "\n", "df.drop_duplicates(keep = 'first', inplace=True)\n", "print(len(df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3. Generate descriptive statistics for all the numerical columns with one line of code (1pt)" ] }, { "cell_type": "code", "execution_count": 33, "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", "
num_pregnancyglucose_concblood_pressureskin_foldserumbody_massdiabetes_pedigreeagetarget
count768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000
mean3.845052120.89453169.10546920.53645879.79947931.9925780.47187633.2408850.348958
std3.36957831.97261819.35580715.952218115.2440027.8841600.33132911.7602320.476951
min0.0000000.0000000.0000000.0000000.0000000.0000000.07800021.0000000.000000
25%1.00000099.00000062.0000000.0000000.00000027.3000000.24375024.0000000.000000
50%3.000000117.00000072.00000023.00000030.50000032.0000000.37250029.0000000.000000
75%6.000000140.25000080.00000032.000000127.25000036.6000000.62625041.0000001.000000
max17.000000199.000000122.00000099.000000846.00000067.1000002.42000081.0000001.000000
\n", "
" ], "text/plain": [ " num_pregnancy glucose_conc blood_pressure skin_fold serum \\\n", "count 768.000000 768.000000 768.000000 768.000000 768.000000 \n", "mean 3.845052 120.894531 69.105469 20.536458 79.799479 \n", "std 3.369578 31.972618 19.355807 15.952218 115.244002 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 1.000000 99.000000 62.000000 0.000000 0.000000 \n", "50% 3.000000 117.000000 72.000000 23.000000 30.500000 \n", "75% 6.000000 140.250000 80.000000 32.000000 127.250000 \n", "max 17.000000 199.000000 122.000000 99.000000 846.000000 \n", "\n", " body_mass diabetes_pedigree age target \n", "count 768.000000 768.000000 768.000000 768.000000 \n", "mean 31.992578 0.471876 33.240885 0.348958 \n", "std 7.884160 0.331329 11.760232 0.476951 \n", "min 0.000000 0.078000 21.000000 0.000000 \n", "25% 27.300000 0.243750 24.000000 0.000000 \n", "50% 32.000000 0.372500 29.000000 0.000000 \n", "75% 36.600000 0.626250 41.000000 1.000000 \n", "max 67.100000 2.420000 81.000000 1.000000 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4. Plot the distribution of the target value, per class percentages (1pt)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "target\n", "0 500\n", "1 268\n", "Name: count, dtype: int64\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHFCAYAAAAg3/mzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAANX9JREFUeJzt3X1cVGX+//H3gDDgDaSgCMpdtiqJt7ApuqZmUeq6WfnVdL9mqWtmtaus+yhzV8WtyHJN9wbNysxSw9abLXUryiha2FLT2sq1tlK8gRRdwZuChOv3hz/m6zCDMmhegq/n4zGPh3PNdc75nDPnzLy9zjmDwxhjBAAAYImf7QIAAMDljTACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowUo8sW7ZMDofD9QgKClLr1q01YMAAZWRk6ODBgx7TzJ49Ww6Hw6flnDx5UrNnz1ZOTo5P03lbVlxcnH7605/6NJ9zWblypRYsWOD1NYfDodmzZ1/Q5V1ob731lpKTk9WkSRM5HA6tX7/ea78DBw5o9uzZ2rFjx0Wt73w8+uijNa6PbXXdN3bv3i2Hw6F58+ads2/VMbp7927fCzzLspctW3ZB5ne5yMvL0+zZs3X06FHbpaCWCCP10HPPPaf8/HxlZ2frL3/5i7p166a5c+cqISFBb775plvfCRMmKD8/36f5nzx5Uunp6T6Hkbosqy7OFkby8/M1YcKEH7yGujLGaMSIEQoICNArr7yi/Px89evXz2vfAwcOKD09nTBygVzq+4Y3kZGRys/P15AhQ2yXUq/k5eUpPT2dMFKPNLJdAHyXmJio5ORk1/PbbrtNU6dO1U9+8hPdeuut+uKLLxQRESFJatu2rdq2bfuD1nPy5Ek1btz4oizrXHr16mV1+edy4MABHTlyRLfccosGDhxopYZvv/1WQUFBPo+Y1UfGGH333XcKDg6+5PcNb5xOZ72sWzq9nwUHB9suA/UEIyMNRExMjP7whz/o2LFjeuqpp1zt3k6dbN68Wf3791dYWJiCg4MVExOj2267TSdPntTu3bvVsmVLSVJ6errrlNCdd97pNr8PP/xQw4cPV/PmzdWuXbsal1Vl3bp16tKli4KCgnTllVfqj3/8o9vrNQ1v5+TkyOFwuEZp+vfvr40bN2rPnj1up6yqeBuK/+STT3TzzTerefPmCgoKUrdu3fT88897Xc6qVas0Y8YMRUVFKSQkRNdff7127dpV84Y/w3vvvaeBAweqWbNmaty4sXr37q2NGze6Xp89e7YrrD3wwANyOByKi4vzOq+cnBz9+Mc/liTdddddrvWsWretW7fq9ttvV1xcnIKDgxUXF6dRo0Zpz549bvOp2q5vvPGGxo0bp5YtW6px48YqKyuTMUaPPvqoYmNjFRQUpOTkZGVnZ6t///7q37+/23xKS0s1bdo0xcfHKzAwUG3atNGUKVN04sQJt21/4sQJPf/88656q8+nyvfff69WrVppzJgxHq8dPXpUwcHBSktLkyR99913+vWvf61u3bopNDRULVq0UEpKiv72t795TOtwOHTfffdp8eLFSkhIkNPpdL3X1feNQ4cOafLkybr66qvVtGlTtWrVStddd51yc3O91lxZWalHHnlEMTExru311ltvee1b3ZtvvqmBAwcqJCREjRs3Vp8+fWo1rbfTNFXH2aeffqpRo0YpNDRUERERGjdunEpKSs45z/79+ysxMVG5ubnq1auXgoOD1aZNG/3ud79TRUWFW9/y8nI9/PDD6tixo5xOp1q2bKm77rpLhw4dcutXdTp27dq16t69u4KCgpSeni5J2r9/vyZOnKjo6GgFBgYqKipKw4cP1zfffOOavjb7l/R/7+8LL7yghIQENW7cWF27dtWGDRvcts9vfvMbSVJ8fLxrX6z6DMnKylJqaqoiIyMVHByshIQEPfjggx7LkqSnn35a7du3l9Pp1NVXX62VK1fqzjvv9Dhua7udcBYG9cZzzz1nJJktW7Z4ff348ePG39/fDBw40NU2a9Ysc+bb/PXXX5ugoCBzww03mPXr15ucnByzYsUKM2bMGPPf//7XfPfdd+a1114zksz48eNNfn6+yc/PN//5z3/c5hcbG2seeOABk52dbdavX+91WcYYExsba9q0aWNiYmLM0qVLzaZNm8zPf/5zI8k88cQTHuv29ddfu03/9ttvG0nm7bffNsYY8+mnn5o+ffqY1q1bu2rLz8939ZdkZs2a5Xr+73//2zRr1sy0a9fOLF++3GzcuNGMGjXKSDJz5871WE5cXJz5+c9/bjZu3GhWrVplYmJizI9+9CNz6tSps743OTk5JiAgwCQlJZmsrCyzfv16k5qaahwOh3nppZeMMcbs3bvXrF271kgy999/v8nPzzcffvih1/mVlJS4tslvf/tb13ru3bvXGGPMyy+/bGbOnGnWrVtn3nnnHfPSSy+Zfv36mZYtW5pDhw55bNc2bdqYiRMnmr///e/mr3/9qzl16pSZPn26kWQmTpxoXnvtNfP000+bmJgYExkZafr16+eax4kTJ0y3bt1MeHi4mT9/vnnzzTfNwoULTWhoqLnuuutMZWWlMcaY/Px8ExwcbAYPHuyq99NPP61xm02dOtUEBwebkpISt/bMzEwjyXz88cfGGGOOHj1q7rzzTvPCCy+YzZs3m9dee81MmzbN+Pn5meeff95t2qp17dKli1m5cqXZvHmz+eSTT1yvVd837rnnHvPSSy+ZnJwcs2HDBjN+/Hjj5+fn2t+MOX3MSDLR0dHmJz/5iVmzZo15+eWXzY9//GMTEBBg8vLyPLb3mfvxCy+8YBwOhxk2bJhZu3atefXVV81Pf/pT4+/vb958880at8+Zy37uuedcbVXHWYcOHczMmTNNdna2mT9/vnE6neauu+466/yMMaZfv34mLCzMREVFmT/+8Y/m9ddfN7/85S+NJHPvvfe6+lVUVJibbrrJNGnSxKSnp5vs7GzzzDPPmDZt2pirr77anDx50tU3NjbWREZGmiuvvNIsXbrUvP322+aDDz4w+/btM5GRkW77TlZWlhk3bpzZuXOnMab2+1fVexgXF2euueYas3r1arNp0ybTv39/06hRI/Pll18aY04fZ/fff7+RZNauXevaF6v2s9///vfmySefNBs3bjQ5OTlm8eLFJj4+3gwYMMBtOz311FNGkrntttvMhg0bzIoVK0z79u1NbGysiY2NrdN2Qs0II/XIucKIMcZERESYhIQE1/PqAeGvf/2rkWR27NhR4zwOHTrk8cFdfX4zZ86s8bUzxcbGGofD4bG8G264wYSEhJgTJ064rdu5wogxxgwZMsTtw+BM1eu+/fbbjdPpNAUFBW79Bg0aZBo3bmyOHj3qtpzBgwe79Vu9erWR5BZ4vOnVq5dp1aqVOXbsmKvt1KlTJjEx0bRt29b1gVr15XJmEKvJli1bPL6IanLq1Clz/Phx06RJE7Nw4UJXe9V2veOOO9z6HzlyxDidTjNy5Ei39vz8fCPJLYxkZGQYPz8/j/2ual/atGmTq61JkyZm7Nix56zXGGM+/vhjI8ksWbLErf2aa64xSUlJZ13X77//3owfP950797d7TVJJjQ01Bw5csRjupr26erzHThwoLnllltc7VXvWVRUlPn2229d7aWlpaZFixbm+uuvd7VV349PnDhhWrRoYYYOHeq2rIqKCtO1a1dzzTXX1FjPmcv2FkYef/xxt76TJ082QUFBbl/e3vTr189IMn/729/c2n/xi18YPz8/s2fPHmOMMatWrTKSzJo1a9z6Ve2XmZmZrrbY2Fjj7+9vdu3a5dZ33LhxJiAgwHz22Wc11uPL/iXJREREmNLSUldbUVGR8fPzMxkZGa62J554wuvnSXWVlZXm+++/N++8846RZD766CNjzOn3p3Xr1qZnz55u/ffs2WMCAgLcPn982U6oGadpGhhjzFlf79atmwIDAzVx4kQ9//zz+uqrr+q0nNtuu63WfTt16qSuXbu6tY0ePVqlpaX68MMP67T82tq8ebMGDhyo6Ohot/Y777xTJ0+e9Ljg9mc/+5nb8y5dukiSx+mPM504cULvv/++hg8frqZNm7ra/f39NWbMGO3bt6/Wp3pq6/jx43rggQd01VVXqVGjRmrUqJGaNm2qEydOaOfOnR79q79f//znP1VWVqYRI0a4tffq1ctjCHrDhg1KTExUt27ddOrUKdfjxhtvdBv+9lXnzp2VlJSk5557ztW2c+dOffDBBxo3bpxb35dffll9+vRR06ZN1ahRIwUEBOjZZ5/1uq7XXXedmjdvXqsaFi9erB49eigoKMg137feesvrfG+99VYFBQW5njdr1kxDhw7Vu+++63F6o0peXp6OHDmisWPHum27yspK3XTTTdqyZYvX0wO14W1f/e6777zeVVdds2bNPKYfPXq0Kisr9e6770o6/b5fccUVGjp0qFvt3bp1U+vWrT3e9y5duqh9+/ZubX//+981YMAAJSQk1FiLr/vXgAED1KxZM9fziIgItWrV6qzH6Jm++uorjR49Wq1bt5a/v78CAgJcF5FXve+7du1SUVGRx/ERExOjPn36eNTvy3aCd4SRBuTEiRM6fPiwoqKiauzTrl07vfnmm2rVqpXuvfdetWvXTu3atdPChQt9WlZkZGSt+7Zu3brGtsOHD/u0XF8dPnzYa61V26j68sPCwtyeO51OSacvxqvJf//7XxljfFrO+Ro9erT+/Oc/a8KECXr99df1wQcfaMuWLWrZsqXXWqvXVlVP1YXOZ6re9s033+jjjz9WQECA26NZs2Yyxqi4uLjO6zFu3Djl5+fr3//+t6TTd4o5nU6NGjXK1Wft2rUaMWKE2rRpoxdffFH5+fnasmWLxo0bp+++++6c61qT+fPn65577lHPnj21Zs0a/fOf/9SWLVt00003ed2GNe3H5eXlOn78uNdlVF0XMXz4cI/tN3fuXBljdOTIkVrVW11d9tUq3t736sfkN998o6NHjyowMNCj9qKiIo/33dt2P3To0Dkvavd1/6q+3tLpda/Neh8/flx9+/bV+++/r4cfflg5OTnasmWL1q5dK+n/tp2vx4cv2wnecTdNA7Jx40ZVVFTUeNFglb59+6pv376qqKjQ1q1b9ac//UlTpkxRRESEbr/99loty5c7MYqKimpsq/pgqfofZ1lZmVu/8z2Qw8LCVFhY6NF+4MABSVJ4ePh5zV+SmjdvLj8/vx98OVVKSkq0YcMGzZo1Sw8++KCrvaysrMYvturvV9V2P/MiwipFRUVuoyPh4eEKDg7W0qVLvc77fNZt1KhRSktL07Jly/TII4/ohRde0LBhw9xGNl588UXFx8crKyvLbT2q7ytVartvvvjii+rfv78WLVrk1n7s2DGv/WvajwMDA91GxM5UtW3+9Kc/1XhXjLcvvB9aTe+79H/7Rnh4uMLCwvTaa695nceZoxOS9+3esmVL7du376y1/JD7V3WbN2/WgQMHlJOT43ZLffVbgM91fFSvz5ftBO8IIw1EQUGBpk2bptDQUN199921msbf3189e/ZUx44dtWLFCn344Ye6/fbbffofVm18+umn+uijj9xO1axcuVLNmjVTjx49JMn15ffxxx+rQ4cOrn6vvPKKx/xq+78gSRo4cKDWrVunAwcOuI0YLV++XI0bN74gt002adJEPXv21Nq1azVv3jzX7YyVlZV68cUX1bZtW4/h69qo6X1wOBwyxrher/LMM8/UeLqgup49e8rpdCorK0u33nqrq/2f//yn9uzZ4xZGfvrTn+rRRx9VWFiY4uPjz1mzL/tN8+bNNWzYMC1fvlwpKSkqKiryOEXjcDgUGBjo9mVXVFTk9W4aXzgcDo9t+PHHHys/P9/jtJ50eoTmiSeecAXnY8eO6dVXX1Xfvn3l7+/vdRl9+vTRFVdcoc8++0z33XffedV7IR07dkyvvPKK26malStXys/PT9dee62k0+/7Sy+9pIqKCvXs2bNOyxk0aJBeeOEF7dq1y+24PpMv+1dtne3YOfP1KmfegShJHTp0UOvWrbV69WrXXV3S6c/ZvLw8t8+SC7GdQBiplz755BPXecmDBw8qNzdXzz33nPz9/bVu3TrXrbneLF68WJs3b9aQIUMUExOj7777zvU/kuuvv17S6SQfGxurv/3tbxo4cKBatGih8PDwGm9DPZeoqCj97Gc/0+zZsxUZGakXX3xR2dnZmjt3rho3bixJ+vGPf6wOHTpo2rRpOnXqlJo3b65169bpvffe85hf586dtXbtWi1atEhJSUny8/Nz+92VM82aNUsbNmzQgAEDNHPmTLVo0UIrVqzQxo0b9fjjjys0NLRO61RdRkaGbrjhBg0YMEDTpk1TYGCgMjMz9cknn2jVqlV1+k2Pdu3aKTg4WCtWrFBCQoKaNm2qqKgoRUVF6dprr9UTTzzhel/eeecdPfvss7riiitqNe8WLVooLS1NGRkZat68uW655Rbt27dP6enpioyMlJ/f/53BnTJlitasWaNrr71WU6dOVZcuXVRZWamCggK98cYb+vWvf+36EO7cubNycnL06quvKjIyUs2aNavxS6jKuHHjlJWVpfvuu09t27Z17YdVqm4ZnTx5soYPH669e/fq97//vSIjI/XFF1/4tlGrzff3v/+9Zs2apX79+mnXrl2aM2eO4uPjderUKY/+/v7+uuGGG5SWlqbKykrNnTtXpaWlrltYvWnatKn+9Kc/aezYsTpy5IiGDx+uVq1a6dChQ/roo4906NAhj5GZiyEsLEz33HOPCgoK1L59e23atElPP/207rnnHsXExEiSbr/9dq1YsUKDBw/Wr371K11zzTUKCAjQvn379Pbbb+vmm2/WLbfcctblzJkzR3//+9917bXX6qGHHlLnzp119OhRvfbaa0pLS1PHjh192r9qq3PnzpKkhQsXauzYsQoICFCHDh3Uu3dvNW/eXJMmTdKsWbMUEBCgFStW6KOPPnKb3s/PT+np6br77rs1fPhwjRs3TkePHvV6fFyI7QRxa299UnWlftUjMDDQtGrVyvTr1888+uij5uDBgx7TVL/DJT8/39xyyy0mNjbWOJ1OExYWZvr162deeeUVt+nefPNN0717d+N0Oo0k1x0SVfM78/bRmpZlzOmr7IcMGWL++te/mk6dOpnAwEATFxdn5s+f7zH9559/blJTU01ISIhp2bKluf/++83GjRs97qY5cuSIGT58uLniiiuMw+FwW6a83DHxr3/9ywwdOtSEhoaawMBA07VrV487VKrupnn55Zfd2r3dzVCT3Nxcc91115kmTZqY4OBg06tXL/Pqq696nV9t7qYx5vSV+h07djQBAQFu67Zv3z5z2223mebNm5tmzZqZm266yXzyyScmNjbW7W6Ws92BVVlZaR5++GHTtm1bExgYaLp06WI2bNhgunbt6nY3iTGnbxv/7W9/azp06GACAwNNaGio6dy5s5k6daopKipy9duxY4fp06ePady4scddOTWpqKgw0dHRRpKZMWOG1z6PPfaYiYuLM06n0yQkJJinn37a6/6marenVn/tzH2jrKzMTJs2zbRp08YEBQWZHj16mPXr15uxY8e63S1R9Z7NnTvXpKenu7ZX9+7dzeuvv+62jJruCnvnnXfMkCFDTIsWLUxAQIBp06aNGTJkiMf+Vt3Z7qapfgzWtOzq+vXrZzp16mRycnJMcnKycTqdJjIy0jz00EPm+++/d+v7/fffm3nz5pmuXbuaoKAg07RpU9OxY0dz9913my+++MLVr+o492bv3r1m3LhxpnXr1iYgIMBERUWZESNGmG+++cbVp7b7V03vb/X93hhjpk+fbqKiooyfn5/bZ0heXp5JSUkxjRs3Ni1btjQTJkwwH374odfjfMmSJeaqq64ygYGBpn379mbp0qXm5ptv9riLq7bbCTVzGHOO2y8AXDa+/vprdezYUbNmzdJDDz1kuxz8APr376/i4mJ98skntkupd44ePar27dtr2LBhWrJkie1yGhRO0wCXqY8++kirVq1S7969FRISol27dunxxx9XSEiIxo8fb7s8wKqioiI98sgjGjBggMLCwrRnzx49+eSTOnbsmH71q1/ZLq/BIYwAl6kmTZpo69atevbZZ3X06FGFhoaqf//+euSRR6zc4QFcSpxOp3bv3q3JkyfryJEjrgveFy9erE6dOtkur8HhNA0AALCKHz0DAABWEUYAAIBVhBEAAGBVvbiAtbKyUgcOHFCzZs3q9ONRAADg4jPG6NixY4qKinL7sbjq6kUYOXDggNefZwYAAJe+vXv3nvWPJtaLMFL1h4b27t2rkJAQy9UAAIDaKC0tVXR09Dn/YGC9CCNVp2ZC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ALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMCqOoWRzMxMxcfHKygoSElJScrNza2x79q1a3XDDTeoZcuWCgkJUUpKil5//fU6FwwAABoWn8NIVlaWpkyZohkzZmj79u3q27evBg0apIKCAq/93333Xd1www3atGmTtm3bpgEDBmjo0KHavn37eRcPAADqP4cxxvgyQc+ePdWjRw8tWrTI1ZaQkKBhw4YpIyOjVvPo1KmTRo4cqZkzZ9aqf2lpqUJDQ1VSUqKQkBBfyq334h7caLsEXES7HxtiuwRcRBzfl5fL8fiu7fe3TyMj5eXl2rZtm1JTU93aU1NTlZeXV6t5VFZW6tixY2rRooUviwYAAA1UI186FxcXq6KiQhEREW7tERERKioqqtU8/vCHP+jEiRMaMWJEjX3KyspUVlbmel5aWupLmQAAoB6p0wWsDofD7bkxxqPNm1WrVmn27NnKyspSq1atauyXkZGh0NBQ1yM6OrouZQIAgHrApzASHh4uf39/j1GQgwcPeoyWVJeVlaXx48dr9erVuv7668/ad/r06SopKXE99u7d60uZAACgHvEpjAQGBiopKUnZ2dlu7dnZ2erdu3eN061atUp33nmnVq5cqSFDzn0Bj9PpVEhIiNsDAAA0TD5dMyJJaWlpGjNmjJKTk5WSkqIlS5aooKBAkyZNknR6VGP//v1avny5pNNB5I477tDChQvVq1cv16hKcHCwQkNDL+CqAACA+sjnMDJy5EgdPnxYc+bMUWFhoRITE7Vp0ybFxsZKkgoLC91+c+Spp57SqVOndO+99+ree+91tY8dO1bLli07/zUAAAD1ms9hRJImT56syZMne32tesDIycmpyyIAAMBlgr9NAwAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(df['target'].value_counts())\n", "#alternative: unique, counts = np.unique(df['target'], return_counts=True)\n", "\n", "df['target'].value_counts(normalize=True).plot(kind='bar')\n", "plt.xticks(rotation=0)\n", "plt.title('Distribution of target variable in percentage')\n", "plt.show()\n", "\n", "#Alternative code to display plot\n", "#sns.barplot(x = df['target'].value_counts().index, \n", "#y = df['target'].value_counts(normalize=True)).set(title = 'Distribution of target variable (in percentage)');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.5. Split the dataset into training, validation and test set, with the ratio 50:30:20, and use the random_seed=42 (1pt)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5\n", "0.3\n", "0.2\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X = df.drop(columns='target')\n", "y = df['target']\n", "\n", "X_trainval, X_test, y_trainval, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)\n", "\n", "X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, test_size = 0.375, random_state = 42) #30/(100-20)\n", "\n", "#to confirm\n", "\n", "print(round(len(X_train)/len(X),2))\n", "print(round(len(X_val)/len(X),2))\n", "print(round(len(X_test)/len(X),2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.6. Train the logistic regression with solver='liblinear' with regularization strength equal to 0.01 with lasso regularization and that stops converging after 700 iterations (2pt) " ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LogisticRegression(C=100.0, max_iter=700, penalty='l1', solver='liblinear')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=100.0, max_iter=700, penalty='l1', solver='liblinear')" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Standardization could be performed but it was not required. \n", "\n", "from sklearn.linear_model import LogisticRegression\n", "\n", "log_reg = LogisticRegression(solver = 'liblinear', C = (1/0.01), penalty = 'l1', max_iter = 700)\n", "log_reg.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.7. Use the validation set to find the value of the threshold that maximizes f1 score (of Class 1). What is that threshold value? (1pt)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import precision_recall_curve\n", "y_pred_proba_val= log_reg.predict_proba(X_val)\n", "precision, recall, threshold = precision_recall_curve(y_val, y_pred_proba_val[:,1])" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best threshold: 0.2626832463017761\n" ] } ], "source": [ "import numpy as np\n", "f1_scores = 2*recall*precision/(recall+precision)\n", "idx_best=np.nanargmax(f1_scores)\n", "best_threshold=threshold[idx_best]\n", "print('Best threshold: ', best_threshold)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.8. If we use the threshold value found above, how many false negatives do we have on the test dataset? (1pt)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "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tm/frmnTpik5OVnx8fFas2aNunTpori4OCUlJSkvL08zZ86Uw+HQuHHjVF9fr02bNunYsWOaNWuWJk+erHnz5mnatGn67//+b3355Zf6zW9+49PX27NnTzU1NenJJ5/U+PHj9f777+t3v/tds/1iYmL085//XE888YRiYmJ0991366KLLnIn9gceeEDXXXedMjIy9KMf/UhRUVH69NNPtW3bNv3617/2/T8CgE+YtQ58y2az6fXXX9dll12m2267Tb1799aNN96oL7/80j3L/IYbbtADDzygOXPmaNiwYdq7d69+9rOfnfW8999/v375y1/qgQceUL9+/XTDDTeooqJC0snx5yeeeELLli1Tenq6JkyYIEm6/fbb9fvf/14rV67UwIEDNWrUKK1cudJ9u1q7du305z//WTt27NCQIUM0b948LVy40Kev98ILL9TixYu1cOFCDRgwQM8++6wKCgqa7ZeQkKA5c+Zo8uTJysnJUXx8vJ577jn39quvvlp/+ctfVFJSohEjRuiiiy7S4sWL1a1bN5/iAdAyNiMQg20AACAkqMgBADAxEjkAACZGIgcAwMRI5AAAmBiJHAAAEyORAwBgYiRyAABMjEQOAICJkcgBADAxEjkAACZGIgcAwMT+P0SAuLVMsAmRAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n", "y_pred_proba_test= log_reg.predict_proba(X_test)\n", "y_pred_new = (y_pred_proba_test[:,1] >= best_threshold).astype(int)\n", "cm=confusion_matrix(y_test, y_pred_new)\n", "from sklearn.metrics import ConfusionMatrixDisplay\n", "ConfusionMatrixDisplay(cm).plot();" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False negatives: 12\n" ] } ], "source": [ "print(f\"False negatives: {cm[1][0]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.9. What is the precision of our model with the value of threshold from step 7? (1pt)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5375" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import precision_score\n", "\n", "precision_score(y_test, y_pred_new)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.10. What proportion (approximately) of patients with diabetes would we reach if we decided to contact 60% of the patients in the test set, ordered by the decreasing model score (1pt)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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fft2Bg8eTK1atTyvd+TIkbhcLn7//fezHr9nz57ExMR4HtepU4fatWuX+pt07tyZhQsX8p///IdNmzbhcDgq/Tp84Zprrimz7rbbbqOoqIjFixd71i1YsACz2cyIESMA2LdvH3v27PGccTv5b9W/f3/S09PZu3evf16EECeR5EaIc5CUlERkZCQHDhzwWRuJiYmlHoeFhZ12fXFxsVfazM/P57LLLuPHH3/kP//5D99++y2bN2/mk08+Adx3I1WF0Wjk5ptvZunSpVitVsBd5khJSaFPnz6e7Y4dO8Znn31WJhlp27YtwBlv427UqBFAmUSvVatWbN68mc2bN3PHHXeUei4tLY3LLruMI0eO8MILL7B+/Xo2b97MK6+8UuHXW6tWrTLrzGZzqX0XL17MLbfcwptvvknXrl1JTExk5MiRZGRknPa4/niPlVdGbNu2LRdffLEnEXW5XLz//vsMGTLE8947duwYAA888ECZv9XYsWOBM/+thPAVueZGiHNgMBi48sor+fzzzzl8+DANGjQ46z5msxmbzVZm/Zmuu6iK8PBwgDJtVeTL5uuvv+bo0aN8++23nrM1gCchORe33norzz77rOe6jOXLlzN+/HgMBoNnm6SkJNq3b8/MmTPLPUa9evVOe/zLL78co9HI8uXLufPOOz3rIyIi6NSpE+A+M3SyZcuWUVBQwCeffELjxo0963fs2FGVl3haSUlJzJ07l7lz55KWlsby5cuZPHkymZmZfPHFF+Xu44/32OnGOLr11lsZO3Ysu3fv5s8//yQ9PZ1bb7211OsBmDJlCldffXW5x2jVqtVZ4xXC2+TMjRDnaMqUKSiluOOOO7Db7WWedzgcfPbZZ57HTZo04eeffy61zddff01+fr5X4yoZaO7UtpYvX37WfUu+7Mxmc6n1r732WpltS7ap6NmcNm3a0KVLFxYsWMCHH36IzWYr9YUJ7lLcr7/+ynnnnUenTp3K/Hem5CYlJYXbbruNlStXsmjRogrFVN7rVUrxxhtvVGj/qmjUqBF33303V111Fdu2bTvjtoF6j914442Eh4ezcOFCFi5cSP369endu7fn+VatWtGiRQt27txZ7t+pU6dOpUp1QviLnLkR4hx17dqV+fPnM3bsWFJTU/n3v/9N27ZtcTgcbN++nddff5127doxaNAgwH3HzKOPPspjjz1Gjx492LVrFy+//DJxcXFejatu3br06tWLWbNmkZCQQOPGjfnqq688paUz6datGwkJCYwZM4Zp06ZhMpn44IMP2LlzZ5ltL7jgAgCefvpp+vXrh8FgoH379p7yWXluu+027rrrLo4ePUq3bt3K/Lp//PHHWbt2Ld26dePee++lVatWFBcXc/DgQVatWsWrr756xjMYc+fO5cCBA9x0000sX77cM4hfYWEhe/bsYdGiRYSHh2MymQC46qqrCAsL48Ybb2TSpEkUFxczf/58LBbLWfuqonJycujZsycjRoygdevWxMTEsHnzZr744ovTnvUoEaj3WHx8PMOGDWPhwoVYrVYeeOCBUne5gTvh7devH3369GHUqFHUr1+f7Oxsdu/ezbZt2/j4448r11FCeEOAL2gWImTs2LFD3XLLLapRo0YqLCxMRUVFqY4dO6rHHntMZWZmeraz2Wxq0qRJqmHDhioiIkL16NFD7dix47R3smzevLlUOyV3Nh0/frzU+ltuuUVFRUWVWpeenq6uvfZalZiYqOLi4tT//d//qS1btlTobqmNGzeqrl27qsjISJWcnKxGjx6ttm3bVmZfm82mRo8erZKTk5VOpzvtODcny8nJUREREQpQb7zxRrn9efz4cXXvvfeqpk2bKpPJpBITE1VqaqqaOnVqqbF2Tsflcql3331XXXXVVSopKUkZjUYVFxenOnfurB599FF1+PDhUtt/9tlnqkOHDio8PFzVr19fPfjgg+rzzz8vc8fZmca5OdXJr7+4uFiNGTNGtW/fXsXGxqqIiAjVqlUrNW3aNFVQUHDW16OU/95jJ1uzZo1n/KLff/+93G127typrr/+elW7dm1lMplU3bp11RVXXKFeffXVCr0uIbxNpl8QQgghREiRa26EEEIIEVIkuRFCCCFESJHkRgghhBAhRZIbIYQQQoQUSW6EEEIIEVIkuRFCCCFESKlxyY1SitzcXOQOeCGEECI01bjkJi8vj7i4OPLy8rx+bJvNxowZM8qd00V4j/Szf0g/+4f0s/9IX/tHdejnGpfcCCGEECK0SXIjhBBCiJAiyY0QQgghQookN0IIIYQIKZLcCCGEECKkSHIjhBBCiJAiyY0QQgghQookN0IIIYQIKZLcCCGEECKkSHIjhBBCiJAiyY0QQgghQookN0IIIYQIKQFNbr777jsGDRpEvXr10Ol0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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn_evaluation.plot import cumulative_gain\n", "cumulative_gain(y_test, y_pred_proba_test)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "If we decided to contact 60% of the patients in the test set, we would reach approximately 80% of the patients with diabetes.\n" ] } ], "source": [ "print(\"If we decided to contact 60% of the patients in the test set, we would reach approximately 80% of the patients with diabetes.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.11. Use the data available (except the test set) with a cross validation method that finds the value of regularization strength of l1 penalty of Logistic regression that maximizes recall. Check at least 8 different values of the parameter and verify the best cross validation score (4pt)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV, RandomizedSearchCV" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.002, 0.032, 0.062, 0.092, 0.122, 0.152, 0.182, 0.212])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(0.002, 0.22, 0.03)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "param_grid = {'C': np.arange(0.002, 0.22, 0.03)}\n", "\n", "grid_search = GridSearchCV(LogisticRegression(solver=\"liblinear\", penalty='l1'), param_grid, scoring='recall')" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(estimator=LogisticRegression(penalty='l1', solver='liblinear'),\n",
       "             param_grid={'C': array([0.002, 0.032, 0.062, 0.092, 0.122, 0.152, 0.182, 0.212])},\n",
       "             scoring='recall')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GridSearchCV(estimator=LogisticRegression(penalty='l1', solver='liblinear'),\n", " param_grid={'C': array([0.002, 0.032, 0.062, 0.092, 0.122, 0.152, 0.182, 0.212])},\n", " scoring='recall')" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.fit(X_trainval, y_trainval)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.5260243632336655)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.best_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomizedSearchCV(estimator=LogisticRegression(penalty='l1',\n",
       "                                                solver='liblinear'),\n",
       "                   n_iter=8,\n",
       "                   param_distributions={'C': <scipy.stats._distn_infrastructure.rv_continuous_frozen object at 0x0000013BEF7757F0>},\n",
       "                   scoring='recall')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "RandomizedSearchCV(estimator=LogisticRegression(penalty='l1',\n", " solver='liblinear'),\n", " n_iter=8,\n", " param_distributions={'C': },\n", " scoring='recall')" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import uniform\n", "distributions= dict(C=uniform(loc=0, scale=4))\n", "random_search = RandomizedSearchCV(LogisticRegression(solver=\"liblinear\", penalty='l1'), distributions, scoring='recall', n_iter=8)\n", "random_search.fit(X_trainval, y_trainval)\n" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.5685492801771871)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_search.best_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.12. What value of C gives the highest recall (1pt)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'C': np.float64(0.182)}" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.best_params_" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'C': np.float64(3.575115902312705)}" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_search.best_params_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.182\n", "3.575115902312705\n" ] } ], "source": [ "results_grid = pd.DataFrame(grid_search.cv_results_)\n", "results_random = pd.DataFrame(random_search.cv_results_)\n", "print(results_grid[results_grid['mean_test_score'] == results_grid['mean_test_score'].max()]['param_C'].reset_index(drop=True)[0])\n", "print(results_random[results_random['mean_test_score'] == results_random['mean_test_score'].max()]['param_C'].reset_index(drop=True)[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.13. What was the second best mean test value of recall in cross validation (1pt)" ] }, { "cell_type": "code", "execution_count": 54, "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", "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_Cparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score
00.0088880.0010850.0111840.0033610.002{'C': 0.002}0.1428570.1395350.0232560.0465120.0952380.0894800.0482078
10.0120310.0021450.0148280.0034780.032{'C': 0.032}0.3571430.2558140.1162790.2558140.3095240.2589150.0807157
20.0150790.0015700.0138930.0013860.062{'C': 0.062}0.3809520.3023260.2558140.2790700.4047620.3245850.0581426
30.0170140.0025640.0136070.0010330.092{'C': 0.092}0.4761900.4883720.3720930.3720930.4761900.4369880.0531735
40.0164180.0020780.0117360.0021200.122{'C': 0.122}0.5476190.5116280.3953490.4186050.4761900.4698780.0565864
50.0189390.0021370.0122010.0013500.152{'C': 0.152}0.6190480.5813950.4651160.4418600.5000000.5214840.0679512
60.0206710.0043310.0132390.0009000.182{'C': 0.182}0.5952380.6046510.4883720.4418600.5000000.5260240.0634841
70.0199810.0014290.0127670.0009190.212{'C': 0.212}0.5714290.6046510.4883720.4418600.5000000.5212620.0588373
\n", "
" ], "text/plain": [ " mean_fit_time std_fit_time mean_score_time std_score_time param_C \\\n", "0 0.008888 0.001085 0.011184 0.003361 0.002 \n", "1 0.012031 0.002145 0.014828 0.003478 0.032 \n", "2 0.015079 0.001570 0.013893 0.001386 0.062 \n", "3 0.017014 0.002564 0.013607 0.001033 0.092 \n", "4 0.016418 0.002078 0.011736 0.002120 0.122 \n", "5 0.018939 0.002137 0.012201 0.001350 0.152 \n", "6 0.020671 0.004331 0.013239 0.000900 0.182 \n", "7 0.019981 0.001429 0.012767 0.000919 0.212 \n", "\n", " params split0_test_score split1_test_score split2_test_score \\\n", "0 {'C': 0.002} 0.142857 0.139535 0.023256 \n", "1 {'C': 0.032} 0.357143 0.255814 0.116279 \n", "2 {'C': 0.062} 0.380952 0.302326 0.255814 \n", "3 {'C': 0.092} 0.476190 0.488372 0.372093 \n", "4 {'C': 0.122} 0.547619 0.511628 0.395349 \n", "5 {'C': 0.152} 0.619048 0.581395 0.465116 \n", "6 {'C': 0.182} 0.595238 0.604651 0.488372 \n", "7 {'C': 0.212} 0.571429 0.604651 0.488372 \n", "\n", " split3_test_score split4_test_score mean_test_score std_test_score \\\n", "0 0.046512 0.095238 0.089480 0.048207 \n", "1 0.255814 0.309524 0.258915 0.080715 \n", "2 0.279070 0.404762 0.324585 0.058142 \n", "3 0.372093 0.476190 0.436988 0.053173 \n", "4 0.418605 0.476190 0.469878 0.056586 \n", "5 0.441860 0.500000 0.521484 0.067951 \n", "6 0.441860 0.500000 0.526024 0.063484 \n", "7 0.441860 0.500000 0.521262 0.058837 \n", "\n", " rank_test_score \n", "0 8 \n", "1 7 \n", "2 6 \n", "3 5 \n", "4 4 \n", "5 2 \n", "6 1 \n", "7 3 " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = pd.DataFrame(grid_search.cv_results_)\n", "results" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5 0.521484\n", "Name: mean_test_score, dtype: float64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results[results.rank_test_score==2].mean_test_score" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.14. What is f1 score of the best model (1pt)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import f1_score" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "y_pred=grid_search.best_estimator_.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "F1 score is 0.6415094339622641\n" ] } ], "source": [ "print('F1 score is', f1_score(y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "#grid_search.score(X_test,y_test) this yields a different result because the score employed as recall." ] } ], "metadata": { "kernelspec": { "display_name": "ml25", "language": "python", "name": "ml25" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.1" } }, "nbformat": 4, "nbformat_minor": 4 }