{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![MLU Logo](../data/MLU_Logo.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine Learning Accelerator - Natural Language Processing - Lecture 2\n", "\n", "## Logistic Regression Model and Threshold Calibration\n", "\n", "In this notebook, we go over the Logistic Regression method to predict the __isPositive__ field of our final dataset, while also having a look at how probability threshold calibration can help improve classifier's performance.\n", "\n", "1. Reading the dataset\n", "2. Exploratory data analysis\n", "3. Stop word removal and stemming\n", "4. Train - Validation Split\n", "5. Data processing with Pipeline and ColumnTransform\n", "6. Fit the classifier\n", "Find more details on the __LogisticRegression__ here: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html\n", "7. Test the classifier\n", "8. Ideas for improvement: Probability threshold calibration (optional) \n", "\n", "Overall dataset schema:\n", "* __reviewText:__ Text of the review\n", "* __summary:__ Summary of the review\n", "* __verified:__ Whether the purchase was verified (True or False)\n", "* __time:__ UNIX timestamp for the review\n", "* __log_votes:__ Logarithm-adjusted votes log(1+votes)\n", "* __isPositive:__ Whether the review is positive or negative (1 or 0)\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install -q -r ../requirements.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Reading the dataset\n", "(Go to top)\n", "\n", "We will use the __pandas__ library to read our datasets." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv('../data/examples/AMAZON-REVIEW-DATA-CLASSIFICATION.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the first five rows in the datasets." ] }, { "cell_type": "code", "execution_count": 3, "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", "
reviewTextsummaryverifiedtimelog_votesisPositive
0PURCHASED FOR YOUNGSTER WHO\\nINHERITED MY \"TOO...IDEAL FOR BEGINNER!True13618368000.0000001.0
1unable to open or useTwo StarsTrue14526432000.0000000.0
2Waste of money!!! It wouldn't load to my system.Dont buy it!True14332896000.0000000.0
3I attempted to install this OS on two differen...I attempted to install this OS on two differen...True15189120000.0000000.0
4I've spent 14 fruitless hours over the past tw...Do NOT Download.True14419296001.0986120.0
\n", "
" ], "text/plain": [ " reviewText \\\n", "0 PURCHASED FOR YOUNGSTER WHO\\nINHERITED MY \"TOO... \n", "1 unable to open or use \n", "2 Waste of money!!! It wouldn't load to my system. \n", "3 I attempted to install this OS on two differen... \n", "4 I've spent 14 fruitless hours over the past tw... \n", "\n", " summary verified time \\\n", "0 IDEAL FOR BEGINNER! True 1361836800 \n", "1 Two Stars True 1452643200 \n", "2 Dont buy it! True 1433289600 \n", "3 I attempted to install this OS on two differen... True 1518912000 \n", "4 Do NOT Download. True 1441929600 \n", "\n", " log_votes isPositive \n", "0 0.000000 1.0 \n", "1 0.000000 0.0 \n", "2 0.000000 0.0 \n", "3 0.000000 0.0 \n", "4 1.098612 0.0 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Exploratory data analysis\n", "(Go to top)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the target distribution for our datasets." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0 43692\n", "0.0 26308\n", "Name: isPositive, dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"isPositive\"].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking the number of missing values: " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "reviewText 11\n", "summary 14\n", "verified 0\n", "time 0\n", "log_votes 0\n", "isPositive 0\n", "dtype: int64\n" ] } ], "source": [ "print(df.isna().sum())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have missing values in our text fields." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Text Processing: Stop words removal and stemming\n", "(Go to top)\n", "\n", "We will apply the text processing methods discussed in the class. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package punkt to /home/ec2-user/nltk_data...\n", "[nltk_data] Package punkt is already up-to-date!\n", "[nltk_data] Downloading package stopwords to\n", "[nltk_data] /home/ec2-user/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Install the library and functions\n", "import nltk\n", "\n", "nltk.download('punkt')\n", "nltk.download('stopwords')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will create the stop word removal and text cleaning processes below. NLTK library provides a list of common stop words. We will use the list, but remove some of the words from that list (because those words are actually useful to understand the sentiment in the sentence)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import nltk, re\n", "from nltk.corpus import stopwords\n", "from nltk.stem import SnowballStemmer\n", "from nltk.tokenize import word_tokenize\n", "\n", "# Let's get a list of stop words from the NLTK library\n", "stop = stopwords.words('english')\n", "\n", "# These words are important for our problem. We don't want to remove them.\n", "excluding = ['against', 'not', 'don', \"don't\",'ain', 'aren', \"aren't\", 'couldn', \"couldn't\",\n", " 'didn', \"didn't\", 'doesn', \"doesn't\", 'hadn', \"hadn't\", 'hasn', \"hasn't\", \n", " 'haven', \"haven't\", 'isn', \"isn't\", 'mightn', \"mightn't\", 'mustn', \"mustn't\",\n", " 'needn', \"needn't\",'shouldn', \"shouldn't\", 'wasn', \"wasn't\", 'weren', \n", " \"weren't\", 'won', \"won't\", 'wouldn', \"wouldn't\"]\n", "\n", "# New stop word list\n", "stop_words = [word for word in stop if word not in excluding]\n", "\n", "snow = SnowballStemmer('english')\n", "\n", "def process_text(texts): \n", " final_text_list=[]\n", " for sent in texts:\n", " \n", " # Check if the sentence is a missing value\n", " if isinstance(sent, str) == False:\n", " sent = \"\"\n", " \n", " filtered_sentence=[]\n", " \n", " sent = sent.lower() # Lowercase \n", " sent = sent.strip() # Remove leading/trailing whitespace\n", " sent = re.sub('\\s+', ' ', sent) # Remove extra space and tabs\n", " sent = re.compile('<.*?>').sub('', sent) # Remove HTML tags/markups:\n", " \n", " for w in word_tokenize(sent):\n", " # We are applying some custom filtering here, feel free to try different things\n", " # Check if it is not numeric and its length>2 and not in stop words\n", " if(not w.isnumeric()) and (len(w)>2) and (w not in stop_words): \n", " # Stem and add to filtered list\n", " filtered_sentence.append(snow.stem(w))\n", " final_string = \" \".join(filtered_sentence) #final string of cleaned words\n", " \n", " final_text_list.append(final_string)\n", " \n", " return final_text_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Train - Validation Split\n", "(Go to top)\n", "\n", "Let's split our dataset into training (90%) and validation (10%). " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_val, y_train, y_val = train_test_split(df[[\"reviewText\", \"summary\", \"time\", \"log_votes\"]],\n", " df[\"isPositive\"],\n", " test_size=0.10,\n", " shuffle=True,\n", " random_state=324\n", " )" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing the reviewText fields\n", "Processing the summary fields\n" ] } ], "source": [ "print(\"Processing the reviewText fields\")\n", "X_train[\"reviewText\"] = process_text(X_train[\"reviewText\"].tolist())\n", "X_val[\"reviewText\"] = process_text(X_val[\"reviewText\"].tolist())\n", "\n", "print(\"Processing the summary fields\")\n", "X_train[\"summary\"] = process_text(X_train[\"summary\"].tolist())\n", "X_val[\"summary\"] = process_text(X_val[\"summary\"].tolist())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our process_text() method in section 3 uses empty string for missing values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Data processing with Pipeline and ColumnTransform\n", "(Go to top)\n", "\n", "In the previous examples, we have seen how to use pipeline to prepare a data field for our machine learning model. This time, we will focus on multiple fields: numeric and text fields. Find more details on __LogisticRegression__ here:\n", "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html\n", "\n", " * For the numerical features pipeline, the __numerical_processor__ below, we use a MinMaxScaler (don't have to scale features when using Decision Trees, but it's a good idea to see how to use more data transforms). If different processing is desired for different numerical features, different pipelines should be built - just like shown below for the two text features.\n", " * For the text features pipeline, the __text_processor__ below, we use CountVectorizer() for the text fields.\n", " \n", "The selective preparations of the dataset features are then put together into a collective ColumnTransformer, to be finally used in a Pipeline along with an estimator. This ensures that the transforms are performed automatically on the raw data when fitting the model and when making predictions, such as when evaluating the model on a validation dataset via cross-validation or making predictions on a test dataset in the future." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Grab model features/inputs and target/output\n", "numerical_features = ['time',\n", " 'log_votes']\n", "\n", "text_features = ['summary',\n", " 'reviewText']\n", "\n", "model_features = numerical_features + text_features\n", "model_target = 'isPositive'" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('data_preprocessing',\n",
       "                 ColumnTransformer(transformers=[('numerical_pre',\n",
       "                                                  Pipeline(steps=[('num_scaler',\n",
       "                                                                   MinMaxScaler())]),\n",
       "                                                  ['time', 'log_votes']),\n",
       "                                                 ('text_pre_0',\n",
       "                                                  Pipeline(steps=[('text_vect_0',\n",
       "                                                                   CountVectorizer(binary=True,\n",
       "                                                                                   max_features=50))]),\n",
       "                                                  'summary'),\n",
       "                                                 ('text_pre_1',\n",
       "                                                  Pipeline(steps=[('text_vect_1',\n",
       "                                                                   CountVectorizer(binary=True,\n",
       "                                                                                   max_features=150))]),\n",
       "                                                  'reviewText')])),\n",
       "                ('logistic_regression', LogisticRegression(C=0.1))])
ColumnTransformer(transformers=[('numerical_pre',\n",
       "                                 Pipeline(steps=[('num_scaler',\n",
       "                                                  MinMaxScaler())]),\n",
       "                                 ['time', 'log_votes']),\n",
       "                                ('text_pre_0',\n",
       "                                 Pipeline(steps=[('text_vect_0',\n",
       "                                                  CountVectorizer(binary=True,\n",
       "                                                                  max_features=50))]),\n",
       "                                 'summary'),\n",
       "                                ('text_pre_1',\n",
       "                                 Pipeline(steps=[('text_vect_1',\n",
       "                                                  CountVectorizer(binary=True,\n",
       "                                                                  max_features=150))]),\n",
       "                                 'reviewText')])
['time', 'log_votes']
MinMaxScaler()
summary
CountVectorizer(binary=True, max_features=50)
reviewText
CountVectorizer(binary=True, max_features=150)
LogisticRegression(C=0.1)
" ], "text/plain": [ "Pipeline(steps=[('data_preprocessing',\n", " ColumnTransformer(transformers=[('numerical_pre',\n", " Pipeline(steps=[('num_scaler',\n", " MinMaxScaler())]),\n", " ['time', 'log_votes']),\n", " ('text_pre_0',\n", " Pipeline(steps=[('text_vect_0',\n", " CountVectorizer(binary=True,\n", " max_features=50))]),\n", " 'summary'),\n", " ('text_pre_1',\n", " Pipeline(steps=[('text_vect_1',\n", " CountVectorizer(binary=True,\n", " max_features=150))]),\n", " 'reviewText')])),\n", " ('logistic_regression', LogisticRegression(C=0.1))])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.impute import SimpleImputer\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.linear_model import LogisticRegression\n", "\n", "### COLUMN_TRANSFORMER ###\n", "##########################\n", "\n", "# Preprocess the numerical features\n", "numerical_processor = Pipeline([\n", " ('num_scaler', MinMaxScaler())\n", "])\n", "\n", "# Preprocess 1st text feature\n", "text_processor_0 = Pipeline([\n", " ('text_vect_0', CountVectorizer(binary=True, max_features=50))\n", "])\n", "\n", "# Preprocess 2nd text feature (larger vocabulary)\n", "text_precessor_1 = Pipeline([\n", " ('text_vect_1', CountVectorizer(binary=True, max_features=150))\n", "])\n", "\n", "# Combine all data preprocessors from above (add more, if you choose to define more!)\n", "# For each processor/step specify: a name, the actual process, and finally the features to be processed\n", "data_preprocessor = ColumnTransformer([\n", " ('numerical_pre', numerical_processor, numerical_features),\n", " ('text_pre_0', text_processor_0, text_features[0]),\n", " ('text_pre_1', text_precessor_1, text_features[1])\n", "]) \n", "\n", "### PIPELINE ###\n", "################\n", "\n", "# Pipeline desired all data transformers, along with an estimator at the end\n", "# Later you can set/reach the parameters using the names issued - for hyperparameter tuning, for example\n", "pipeline = Pipeline([\n", " ('data_preprocessing', data_preprocessor),\n", " ('logistic_regression', LogisticRegression(penalty = 'l2',\n", " C = 0.1))\n", " ])\n", "\n", "# Visualize the pipeline\n", "# This will come in handy especially when building more complex pipelines, stringing together multiple preprocessing steps\n", "from sklearn import set_config\n", "set_config(display='diagram')\n", "pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Fit the classifier\n", "(Go to top)\n", "\n", "We train our model by using __.fit()__ on our training dataset. \n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('data_preprocessing',\n",
       "                 ColumnTransformer(transformers=[('numerical_pre',\n",
       "                                                  Pipeline(steps=[('num_scaler',\n",
       "                                                                   MinMaxScaler())]),\n",
       "                                                  ['time', 'log_votes']),\n",
       "                                                 ('text_pre_0',\n",
       "                                                  Pipeline(steps=[('text_vect_0',\n",
       "                                                                   CountVectorizer(binary=True,\n",
       "                                                                                   max_features=50))]),\n",
       "                                                  'summary'),\n",
       "                                                 ('text_pre_1',\n",
       "                                                  Pipeline(steps=[('text_vect_1',\n",
       "                                                                   CountVectorizer(binary=True,\n",
       "                                                                                   max_features=150))]),\n",
       "                                                  'reviewText')])),\n",
       "                ('logistic_regression', LogisticRegression(C=0.1))])
ColumnTransformer(transformers=[('numerical_pre',\n",
       "                                 Pipeline(steps=[('num_scaler',\n",
       "                                                  MinMaxScaler())]),\n",
       "                                 ['time', 'log_votes']),\n",
       "                                ('text_pre_0',\n",
       "                                 Pipeline(steps=[('text_vect_0',\n",
       "                                                  CountVectorizer(binary=True,\n",
       "                                                                  max_features=50))]),\n",
       "                                 'summary'),\n",
       "                                ('text_pre_1',\n",
       "                                 Pipeline(steps=[('text_vect_1',\n",
       "                                                  CountVectorizer(binary=True,\n",
       "                                                                  max_features=150))]),\n",
       "                                 'reviewText')])
['time', 'log_votes']
MinMaxScaler()
summary
CountVectorizer(binary=True, max_features=50)
reviewText
CountVectorizer(binary=True, max_features=150)
LogisticRegression(C=0.1)
" ], "text/plain": [ "Pipeline(steps=[('data_preprocessing',\n", " ColumnTransformer(transformers=[('numerical_pre',\n", " Pipeline(steps=[('num_scaler',\n", " MinMaxScaler())]),\n", " ['time', 'log_votes']),\n", " ('text_pre_0',\n", " Pipeline(steps=[('text_vect_0',\n", " CountVectorizer(binary=True,\n", " max_features=50))]),\n", " 'summary'),\n", " ('text_pre_1',\n", " Pipeline(steps=[('text_vect_1',\n", " CountVectorizer(binary=True,\n", " max_features=150))]),\n", " 'reviewText')])),\n", " ('logistic_regression', LogisticRegression(C=0.1))])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fit the Pipeline to training data\n", "pipeline.fit(X_train, y_train.values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. Test the classifier\n", "(Go to top)\n", "\n", "Let's evaluate the performance of the trained classifier. We use __.predict()__ this time. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1995 610]\n", " [ 450 3945]]\n", " precision recall f1-score support\n", "\n", " 0.0 0.82 0.77 0.79 2605\n", " 1.0 0.87 0.90 0.88 4395\n", "\n", " accuracy 0.85 7000\n", " macro avg 0.84 0.83 0.84 7000\n", "weighted avg 0.85 0.85 0.85 7000\n", "\n", "Accuracy (validation): 0.8485714285714285\n" ] } ], "source": [ "from sklearn.metrics import confusion_matrix, classification_report, accuracy_score\n", "\n", "# Use the fitted pipeline to make predictions on the validation dataset\n", "val_predictions = pipeline.predict(X_val)\n", "print(confusion_matrix(y_val.values, val_predictions))\n", "print(classification_report(y_val.values, val_predictions))\n", "print(\"Accuracy (validation):\", accuracy_score(y_val.values, val_predictions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8. Ideas for improvement: Probability threshold calibration (optional)\n", "(Go to top)\n", "\n", "Besides tuning __LogisticRegression__ hyperparameter values, one other path to improve a classifier's performance is to dig deeper into how the classifier actually assigns class membership.\n", "\n", "**Binary predictions versus probability predictions.** We often use __classifier.predict()__ to examine classifier binary predictions, while in fact the outputs of most classifiers are real-valued, not binary. For most classifiers in sklearn, the method __classifier.predict_proba()__ returns class probabilities as a two-dimensional numpy array of shape (n_samples, n_classes) where the classes are lexicographically ordered. \n", "\n", "For our example, let's look at the first 5 predictions we made, in binary format and in real-valued probability format:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1., 1., 1., 1., 0.])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipeline.predict(X_val)[0:5]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.03677896, 0.96322104],\n", " [0.03782395, 0.96217605],\n", " [0.09222425, 0.90777575],\n", " [0.01059353, 0.98940647],\n", " [0.84317225, 0.15682775]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipeline.predict_proba(X_val)[0:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**How are the predicted probabilities used to decide class membership?** On each row of predict_proba output, the probabilities values sum to 1. There are two columns, one for each response class: column 0 - predicted probability that each observation is a member of class 0; column 1 - predicted probability that each observation is a member of class 1. From the predicted probabilities, choose the class with the highest probability.\n", "\n", "The key here is that a **threshold of 0.5** is used by default (for binary problems) to convert predicted probabilities into class predictions: class 0, if predicted probability is less than 0.5; class 1, if predicted probability is greater than 0.5.\n", "\n", "**Can we improve classifier performance by changing the classification threshold?** Let's **adjust** the classification threshold to influence the performance of the classifier. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.1 Threshold calibration to improve model accuracy\n", "\n", "We calculate the accuracy using different values for the classification threshold, and pick the threshold that resulted in the highest accuracy." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Highest Accuracy on Validation: 0.8491428571428571 , Threshold for the highest Accuracy: 0.51\n" ] }, { "data": { "image/png": "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W7Zp0yYBQNy9e1cIIcTs2bOFra2tuH79unafv//+Wzg7O4t79+7pnC8gIEB8/fXXQggh6tWrJ5YuXVpmPABESkqKtmzRokXC09NTe79Ro0bi3Xff1TnukUceES+//LIQQogLFy4IAOLff/8VQggxbdo0ERgYqLP/W2+9JQBwBXEiibEGiIjMUvv27bXb3t7eAIDr169ry/z8/ODu7q69f/jwYdy+fRsNGzZE3bp1tbcLFy7g3LlzAIDo6GiMGTMGoaGheO+997TlGk5OTggICNB5Xs1z5ubm4urVq+jevbvOMd27d8fJkycNvoaTJ08iODhYpywkJKTC14CIag47QRORWSrZNCWTyQCo++Bo1KlTR2f/27dvw9vbG9u3b9c7l2Z4+5w5c/D8889j06ZN+O233zB79mysWrUKzzzzjN5zap5XCFEdL4eIzAxrgIioVujUqRPS09NhY2OD5s2b69zc3Ny0+7Vs2RJTpkzB77//jmeffRZLliyp0PmdnZ3RqFEj7Nq1S6d8165dCAwMNHhMmzZtsH//fp2yvXv3GvnKiKgmMAEiolohNDQUISEhGDhwIH7//XdcvHgRu3fvxvTp03HgwAHcvXsXEydOxPbt25Gamopdu3bhn3/+QZs2bSr8HG+88Qbef/99JCQk4PTp05g6dSoOHTqEyZMnG9z/pZdewtmzZ/HGG2/g9OnT+OGHH7B06dJqesVEVBVsAiOiWkEmkyExMRHTp09HVFQUbty4AS8vL/Tq1Quenp5QKBS4efMmIiIikJGRATc3Nzz77LOYO3duhZ9j0qRJyMnJwWuvvYbr168jMDAQGzZsQIsWLQzu36RJE6xduxZTpkzB559/ji5dumDBggV6I9qIyPRkgg3cREREZGXYBEZERERWhwkQERERWR0mQERERGR1mAARERGR1WECRERERFaHCRARERFZHSZAREREZHWYABEREZHVYQJEREREVocJEBEREVkdJkBERERkdZgAERERkdX5f8JP4mM1Z1b3AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Calculate the accuracy using different values for the classification threshold, \n", "# and pick the threshold that resulted in the highest accuracy.\n", "highest_accuracy = 0\n", "threshold_highest_accuracy = 0\n", "\n", "thresholds = np.arange(0,1,0.01)\n", "scores = []\n", "for t in thresholds:\n", " # set threshold to 't' instead of 0.5\n", " y_val_other = (pipeline.predict_proba(X_val)[:,1] >= t).astype(float)\n", " score = accuracy_score(y_val, y_val_other)\n", " scores.append(score)\n", " if(score > highest_accuracy):\n", " highest_accuracy = score\n", " threshold_highest_accuracy = t\n", "print(\"Highest Accuracy on Validation:\", highest_accuracy, \\\n", " \", Threshold for the highest Accuracy:\", threshold_highest_accuracy) \n", "\n", "# Let's plot the accuracy versus different choices of thresholds\n", "plt.plot([0.5, 0.5], [np.min(scores), np.max(scores)], linestyle='--')\n", "plt.plot(thresholds, scores, marker='.')\n", "plt.title('Accuracy versus different choices of thresholds')\n", "plt.xlabel('Threshold')\n", "plt.ylabel('Accuracy')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.2 Threshold calibration to improve model F1 score\n", "\n", "Similarly, various choices of classification thresholds would affect the Precision and Recall metrics. Precision and Recall are usually trade offs of each other, so when you can improve both at the same time, your model's overall performance is undeniably improved. To choose a threshold that balances Precision and Recall, we can plot the Precision-Recall curve and pick the point with the highest F1 score. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline \n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import precision_recall_curve\n", "\n", "# Calculate the precision and recall using different values for the classification threshold\n", "val_predictions_probs = pipeline.predict_proba(X_val)\n", "precisions, recalls, thresholds = precision_recall_curve(y_val, val_predictions_probs[:, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the Precision and Recall values from the curve above, we calculate the F1 scores using:\n", "\n", "$$\\text{F1_score} = \\frac{2*(\\text{Precision} * \\text{Recall})}{(\\text{Precision} + \\text{Recall})}$$\n", "\n", "and pick the threshold that gives the highest F1 score." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Highest F1 score on Validation: 0.8826827690317015 , Threshold for the highest F1 score: 0.4090877401871203\n" ] }, { "data": { "image/png": "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HDx4EKNGjULLli3xzTfflHn9j/Py8sLatWsxZ84c5OTkICEhAQDQsmVLrF27FhMnToS/vz/eeustbX2NRoNXXnkFBw8exMiRI9GyZUv8/PPP+Oijj/Drr7+WGWOxd+9ebNy4EWPHjoWnpycCAwONbvd58+ZBLpfj7bffRlZWFhYsWICBAwfi6NGjAICpU6ciKysLt27d0l5ac3FxqfC1z5w5E/Hx8ejYsSNmzZoFpVKJo0ePYu/evXjxxRe19S5fvox+/fph2LBhiI6OxsqVKzFkyBCEhISgVatWAEreRx07dkReXh7Gjx+PevXqYc2aNXjllVewadMm9O3bV28chnyeDG2vFStWYPz48ejXrx8mTJiA/Px8/PTTTzh69GiZHtlHPXz4EM8++ywuX76MsWPHolGjRvj6668xZMgQZGZmYsKECRW+J8qzdu1a7Wdi5MiRAICgoCCdOq+99hoaNWqEhIQEnDx5Ep9//jm8vb217/1S1XkPGdMmhsQzfPhwrFmzBv369cNbb72Fo0ePIiEhAefPn8c333xTYRs///zzuHHjBsaPH4/69etj7dq12Lt3r069wsJCREZGoqCgAOPGjYOvry9u376N77//HpmZmXB3d9f7HJInSFJWrVolAJR706dnz56iYcOGBj9HXl6eaN68uQAgGjZsKIYMGSK++OILkZ6eXqZu165dhaurq7h+/bpOuUaj0d7v06ePUCqV4sqVK9qyO3fuCFdXV9G1a9cyr61z586iuLhYW/7gwQPh4eEhRowYofMcaWlpwt3dvUz546ZMmSIcHR3F/fv3tWUFBQXCw8NDDB06VFs2bNgw4efnJ+7du6dz/uuvvy7c3d1FXl6eEEKIffv2CQCicePG2rJSbdu2FT179qwwnm7duolu3bqVKY+Ojtb5f5owYYJwc3PTaQtDbN26VQAQCxYs0JYVFxeLLl26CABi1apV2vK4uLgy751u3bqJVq1alXnchg0blnlta9euFXK5XPzvf//TKV+6dKkAIA4dOqQtAyDkcrk4e/asTl1j271ly5aioKBAW+/jjz8WAMTPP/+sLTPmPX/p0iUhl8tF3759hVqt1jn26Pu4YcOGAoD44YcftGV3794VKpVKvPXWW9qyf/7znwKATps8ePBANGrUSAQGBmqf49q1a2X+Pwz5PBnaXr179y73/7EyixYtEgDE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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline \n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Calculate the F1 score using different values for the classification threshold, \n", "# and pick the threshold that resulted in the highest F1 score.\n", "highest_f1 = 0\n", "threshold_highest_f1 = 0\n", "\n", "f1_scores = []\n", "for id, threhold in enumerate(thresholds):\n", " f1_score = 2*precisions[id]*recalls[id]/(precisions[id]+recalls[id])\n", " f1_scores.append(f1_score)\n", " if(f1_score > highest_f1):\n", " highest_f1 = f1_score\n", " threshold_highest_f1 = threhold\n", "print(\"Highest F1 score on Validation:\", highest_f1, \\\n", " \", Threshold for the highest F1 score:\", threshold_highest_f1)\n", "\n", "# Let's plot the F1 score versus different choices of thresholds\n", "plt.plot([0.5, 0.5], [np.min(f1_scores), np.max(f1_scores)], linestyle='--')\n", "plt.plot(thresholds, f1_scores, marker='.')\n", "plt.title('F1 Score versus different choices of thresholds')\n", "plt.xlabel('Threshold')\n", "plt.ylabel('F1 Score')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "conda_pytorch_p39", "language": "python", "name": "conda_pytorch_p39" }, "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.9.13" } }, "nbformat": 4, "nbformat_minor": 2 }