{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Feature Creation: MathematicalCombination\n", "The MathematicalCombination() applies basic mathematical operations **[‘sum’, ‘prod’, ‘mean’, ‘std’, ‘max’, ‘min’]** to multiple features, returning one or more additional features as a result.\n", "\n", "For this demonstration, we use the UCI Wine Quality Dataset.\n", "\n", "The data is publicly available on **[UCI repository](https://archive.ics.uci.edu/ml/datasets/Wine+Quality)**\n", "\n", "P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis.\n", "Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009." ] }, { "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\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import (\n", " accuracy_score,\n", " roc_curve,\n", " roc_auc_score,\n", " classification_report,\n", " confusion_matrix,\n", ")\n", "from sklearn.pipeline import Pipeline as pipe\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "from feature_engine.creation import MathematicalCombination\n", "from feature_engine.imputation import MeanMedianImputer\n", "\n", "pd.set_option('display.max_columns', None)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
07.40.700.001.90.07611.034.00.99783.510.569.45
17.80.880.002.60.09825.067.00.99683.200.689.85
27.80.760.042.30.09215.054.00.99703.260.659.85
311.20.280.561.90.07517.060.00.99803.160.589.86
47.40.700.001.90.07611.034.00.99783.510.569.45
\n", "
" ], "text/plain": [ " fixed acidity volatile acidity citric acid residual sugar chlorides \\\n", "0 7.4 0.70 0.00 1.9 0.076 \n", "1 7.8 0.88 0.00 2.6 0.098 \n", "2 7.8 0.76 0.04 2.3 0.092 \n", "3 11.2 0.28 0.56 1.9 0.075 \n", "4 7.4 0.70 0.00 1.9 0.076 \n", "\n", " free sulfur dioxide total sulfur dioxide density pH sulphates \\\n", "0 11.0 34.0 0.9978 3.51 0.56 \n", "1 25.0 67.0 0.9968 3.20 0.68 \n", "2 15.0 54.0 0.9970 3.26 0.65 \n", "3 17.0 60.0 0.9980 3.16 0.58 \n", "4 11.0 34.0 0.9978 3.51 0.56 \n", "\n", " alcohol quality \n", "0 9.4 5 \n", "1 9.8 5 \n", "2 9.8 5 \n", "3 9.8 6 \n", "4 9.4 5 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Read data\n", "data = pd.read_csv('winequality-red.csv', sep=';')\n", "\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**This Data contains 11 features, all numerical, with no missing values.**" ] }, { "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", "
quality_rangequality
005
105
205
316
405
\n", "
" ], "text/plain": [ " quality_range quality\n", "0 0 5\n", "1 0 5\n", "2 0 5\n", "3 1 6\n", "4 0 5" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's transform the Target, i.e Wine Quality into a binary classification problem:\n", "\n", "bins = [0,5,10]\n", "\n", "labels = [0, 1] # 'low'=0, 'high'=1\n", "\n", "data['quality_range']= pd.cut(x=data['quality'], bins=bins, labels=labels)\n", "\n", "data[['quality_range','quality']].head(5)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# drop original target\n", "\n", "data.drop('quality', axis=1, inplace = True) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sum and Mean Combinators:\n", "Let's create two new variables:\n", "- avg_acidity = mean(fixed acidity, volatile acidity)\n", "- total_minerals = sum(Total sulfure dioxide, sulphates)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Create the Combinators\n", "\n", "math_combinator_mean = MathematicalCombination(\n", " variables_to_combine=['fixed acidity', 'volatile acidity'],\n", " math_operations = ['mean'],\n", " new_variables_names = ['avg_acidity']\n", ")\n", "\n", "math_combinator_sum = MathematicalCombination(\n", " variables_to_combine=['total sulfur dioxide', 'sulphates'],\n", " math_operations = ['sum'],\n", " new_variables_names = ['total_minerals']\n", ")\n", "\n", "# Fit the Mean Combinator on training data\n", "math_combinator_mean.fit(data)\n", "\n", "# Transform the data\n", "data_t = math_combinator_mean.transform(data)\n", "\n", "# We can combine both steps in a single call with \".fit_transform()\" methode\n", "data_t = math_combinator_sum.fit_transform(data_t)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality_rangeavg_aciditytotal_minerals
07.40.700.001.90.07611.034.00.99783.510.569.404.0534.56
17.80.880.002.60.09825.067.00.99683.200.689.804.3467.68
27.80.760.042.30.09215.054.00.99703.260.659.804.2854.65
311.20.280.561.90.07517.060.00.99803.160.589.815.7460.58
47.40.700.001.90.07611.034.00.99783.510.569.404.0534.56
\n", "
" ], "text/plain": [ " fixed acidity volatile acidity citric acid residual sugar chlorides \\\n", "0 7.4 0.70 0.00 1.9 0.076 \n", "1 7.8 0.88 0.00 2.6 0.098 \n", "2 7.8 0.76 0.04 2.3 0.092 \n", "3 11.2 0.28 0.56 1.9 0.075 \n", "4 7.4 0.70 0.00 1.9 0.076 \n", "\n", " free sulfur dioxide total sulfur dioxide density pH sulphates \\\n", "0 11.0 34.0 0.9978 3.51 0.56 \n", "1 25.0 67.0 0.9968 3.20 0.68 \n", "2 15.0 54.0 0.9970 3.26 0.65 \n", "3 17.0 60.0 0.9980 3.16 0.58 \n", "4 11.0 34.0 0.9978 3.51 0.56 \n", "\n", " alcohol quality_range avg_acidity total_minerals \n", "0 9.4 0 4.05 34.56 \n", "1 9.8 0 4.34 67.68 \n", "2 9.8 0 4.28 54.65 \n", "3 9.8 1 5.74 60.58 \n", "4 9.4 0 4.05 34.56 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_t.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can check the mappings between each new variable and the operation it's created with in the **combination_dict_**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'avg_acidity': 'mean'}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math_combinator_mean.combination_dict_" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['fixed acidity', 'volatile acidity']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math_combinator_mean.variables_to_combine" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Combine with more than 1 operation\n", "\n", "We can also combine the variables with more than 1 mathematical operation. And the transformer has the option to create variable names automatically." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Create the Combinators\n", "\n", "multiple_combinator = MathematicalCombination(\n", " variables_to_combine=['fixed acidity', 'volatile acidity'],\n", " math_operations = ['mean', 'sum'],\n", " new_variables_names = None\n", ")\n", "\n", "\n", "# Fit the Combinator to the training data\n", "multiple_combinator.fit(data)\n", "\n", "# Transform the data\n", "data_t = multiple_combinator.transform(data)" ] }, { "cell_type": "code", "execution_count": 10, "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", "
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality_rangemean(fixed acidity-volatile acidity)sum(fixed acidity-volatile acidity)
07.40.700.001.90.07611.034.00.99783.510.569.404.058.10
17.80.880.002.60.09825.067.00.99683.200.689.804.348.68
27.80.760.042.30.09215.054.00.99703.260.659.804.288.56
311.20.280.561.90.07517.060.00.99803.160.589.815.7411.48
47.40.700.001.90.07611.034.00.99783.510.569.404.058.10
\n", "
" ], "text/plain": [ " fixed acidity volatile acidity citric acid residual sugar chlorides \\\n", "0 7.4 0.70 0.00 1.9 0.076 \n", "1 7.8 0.88 0.00 2.6 0.098 \n", "2 7.8 0.76 0.04 2.3 0.092 \n", "3 11.2 0.28 0.56 1.9 0.075 \n", "4 7.4 0.70 0.00 1.9 0.076 \n", "\n", " free sulfur dioxide total sulfur dioxide density pH sulphates \\\n", "0 11.0 34.0 0.9978 3.51 0.56 \n", "1 25.0 67.0 0.9968 3.20 0.68 \n", "2 15.0 54.0 0.9970 3.26 0.65 \n", "3 17.0 60.0 0.9980 3.16 0.58 \n", "4 11.0 34.0 0.9978 3.51 0.56 \n", "\n", " alcohol quality_range mean(fixed acidity-volatile acidity) \\\n", "0 9.4 0 4.05 \n", "1 9.8 0 4.34 \n", "2 9.8 0 4.28 \n", "3 9.8 1 5.74 \n", "4 9.4 0 4.05 \n", "\n", " sum(fixed acidity-volatile acidity) \n", "0 8.10 \n", "1 8.68 \n", "2 8.56 \n", "3 11.48 \n", "4 8.10 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Note the 2 additional variables at the end of the dataframe\n", "data_t.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'mean(fixed acidity-volatile acidity)': 'mean',\n", " 'sum(fixed acidity-volatile acidity)': 'sum'}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# and here the variable names and the operation that was\n", "# applied to create that variable\n", "\n", "multiple_combinator.combination_dict_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pipeline Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can put all these transformations into single pipeline:\n", "\n", "1. Create new variables\n", "2. Scale features\n", "3. Train a Logistic Regression model to predict wine quality\n", "\n", "See more on how to use Feature-engine within Scikit-learn Pipelines in these **[examples](https://github.com/solegalli/feature_engine/tree/master/examples/Pipelines)**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1439, 11), (160, 11))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = data.drop(['quality_range'], axis=1)\n", "\n", "y = data.quality_range\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X,\n", " y,\n", " test_size=0.1,\n", " random_state=0,\n", " shuffle=True,\n", " stratify=y\n", " )\n", "X_train.shape, X_test.shape" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "value_pipe = pipe([\n", "\n", " # Create the new features\n", " ('math_combinator_mean', MathematicalCombination(variables_to_combine=['fixed acidity', 'volatile acidity'],\n", " math_operations=['mean'],\n", " new_variables_names=['avg_acidity'])),\n", "\n", " ('math_combinator_sum', MathematicalCombination(variables_to_combine=['total sulfur dioxide', 'sulphates'],\n", " math_operations=['sum'],\n", " new_variables_names=['total_minerals'])),\n", "\n", " # scale features\n", " ('scaler', StandardScaler()),\n", "\n", " # LogisticRegression\n", " ('LogisticRegression', LogisticRegression())\n", "])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pipeline(steps=[('math_combinator_mean',\n", " MathematicalCombination(math_operations=['mean'],\n", " new_variables_names=['avg_acidity'],\n", " variables_to_combine=['fixed acidity',\n", " 'volatile '\n", " 'acidity'])),\n", " ('math_combinator_sum',\n", " MathematicalCombination(math_operations=['sum'],\n", " new_variables_names=['total_minerals'],\n", " variables_to_combine=['total sulfur '\n", " 'dioxide',\n", " 'sulphates'])),\n", " ('scaler', StandardScaler()),\n", " ('LogisticRegression', LogisticRegression())])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "value_pipe.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "pred_train = value_pipe.predict(X_train)\n", "pred_test = value_pipe.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression Model train accuracy score: 0.744266851980542\n", "\n", "LogisticRegression Model test accuracy score: 0.75\n" ] } ], "source": [ "print('Logistic Regression Model train accuracy score: {}'.format(\n", " accuracy_score(y_train, pred_train)))\n", "print()\n", "print('Logistic Regression Model test accuracy score: {}'.format(\n", " accuracy_score(y_test, pred_test)))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LogisticRegression Model test classification report: \n", "\n", " precision recall f1-score support\n", "\n", " 0 0.73 0.73 0.73 74\n", " 1 0.77 0.77 0.77 86\n", "\n", " accuracy 0.75 160\n", " macro avg 0.75 0.75 0.75 160\n", "weighted avg 0.75 0.75 0.75 160\n", "\n" ] } ], "source": [ "print('Logistic Regression Model test classification report: \\n\\n {}'.format(\n", " classification_report(y_test, pred_test)))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "score = round(accuracy_score(y_test, pred_test), 3)\n", "cm = confusion_matrix(y_test, pred_test)\n", "\n", "sns.heatmap(cm, annot=True, fmt=\".0f\")\n", "plt.xlabel('Predicted Values')\n", "plt.ylabel('Actual Values')\n", "plt.title('Accuracy Score: {0}'.format(score), size=15)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfEAAAFNCAYAAAAQOlZzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA980lEQVR4nO3deZyW8/7H8denPWlBIZJCmiZamER0KmuJFtJyOkfZtdlT1AmVSIg2lJyylCxRFFmS9EOU9tQ5aZGQOEmLtpnP74/7mnPGmOWeZu655p55Px+P+zH3dd3Xfd3vuWbqM9/vdV3fr7k7IiIiEn+KhR1AREREDo2KuIiISJxSERcREYlTKuIiIiJxSkVcREQkTqmIi4iIxCkVcRERkTilIi4SR8xso5n9bma7zOxHM5tkZoen26aJmc01s51mtsPM3jKzxHTbVDCzJ8zs22Bf3wTLlTP5XDOzW8xspZntNrPvzOxVMzs9lt+viGRNRVwk/lzu7ocDDYCGwD2pL5jZOcB7wAzgOKAmsAz4PzM7KdimFPAhUBdoCVQAzgF+Ac7K5DOfBG4FbgGOBE4F3gRa5zS8mZXI6XtEJGOmEdtE4oeZbQSud/cPguVHgLru3jpY/gRY4e49073vHWCbu19tZtcDDwInu/uuKD6zFrAGOMfdv8hkm3nAi+7+bLDcPch5XrDsQG/gNqAE8C6w293vSrOPGcDH7v64mR0HjAb+AuwCRrr7qOyPkEjRopa4SJwys2pAK2BdsHwY0AR4NYPNXwEuCp5fCLwbTQEPXAB8l1kBz4F2QGMgEZgKdDIzAzCzI4CLgZfNrBjwFpEehOODz7/NzC7J5eeLFDoq4iLx500z2wlsBn4C7gvWH0nk3/QPGbznByD1fPdRmWyTmZxun5mH3P0/7v478AngQNPgtQ7AZ+7+PdAIqOLug919v7uvByYAnfMgg0ihoiIuEn/auXt5oDmQwP+K83YgBaiawXuqAj8Hz3/JZJvM5HT7zGxOfeKR83gvA12CVX8FXgqenwgcZ2a/pj6Ae4Fj8iCDSKGiIi4Sp9z9Y2AS8GiwvBv4DLgqg807ErmYDeAD4BIzKxflR30IVDOzpCy22Q0clmb52Iwip1ueCnQwsxOJdLO/HqzfDGxw90ppHuXd/dIo84oUGSriIvHtCeAiM6sfLPcHugW3g5U3syPMbCiRq88fCLZ5gUihfN3MEsysmJkdZWb3mtmfCqW7/xsYB0w1s+ZmVsrMyphZZzPrH2y2FLjCzA4zs1OA67IL7u5LiPQOPAvMcfdfg5e+AHaaWT8zK2tmxc3sNDNrlOOjI1LIqYiLxDF33wY8DwwKlhcAlwBXEDmPvYnIbWjnBcUYd99H5OK2NcD7wG9ECmdlYGEmH3ULMAYYC/wKfAO0J3IBGsBIYD+wFZjM/7rGszMlyDIlzfeUDFxG5Ba6Dfyv0FeMcp8iRYZuMRMREYlTaomLiIjEKRVxERGROKUiLiIiEqdUxEVEROKUiriIiEicirvZhCpXruw1atQIO4aIiEi+WLx48c/uXiWj1+KuiNeoUYNFixaFHUNERCRfmNmmzF5Td7qIiEicUhEXERGJUyriIiIicUpFXEREJE6piIuIiMQpFXEREZE4pSIuIiISp2JWxM3sOTP7ycxWZvK6mdkoM1tnZsvN7IxYZRERESmMYtkSnwS0zOL1VkCt4HEj8FQMs4iIiBQ6MRuxzd3nm1mNLDZpCzzv7g58bmaVzKyqu/8Qq0wiIiJ5ZcrCb5mxdMuf1iceV4H7Lq+bLxnCPCd+PLA5zfJ3wbo/MbMbzWyRmS3atm1bvoQTERHJyoylW1j9w28ApKSksHHjRtasWZOvGeLiwjZ3H+/uSe6eVKVKhmPAi4iI5LvEqhXoXv1Xvnr0ar54+K/U3fo+97Y8Nd8+P8wivgU4Ic1ytWCdiIhIgbd//35WrVrFpZdeSsmSJfnwww+ZMmUKJUuWzLcMYRbxmcDVwVXqZwM7dD5cRETihZmxc+dvDBs2jOXLl3P++efne4ZY3mI2FfgMqG1m35nZdWZ2s5ndHGwyG1gPrAMmAD1jlUVERCQvzJ8/n+7du5OSkkLJkiVp3Lgx99xzD6VKlQolTyyvTu+SzesO9IrV54uISPQyu9JaIg4c2M8336xn69atlClTnyvGfMw3/9lPYtUKoeaKWREXEZH4kXqlddhFqeBxvv/+BzZs2EBycjLVq1fnxBNPpFixYiRWLUPbBhneVJVvVMRFRASIXGk97aZzwo5RoOzdu5fTTjuN2ieeyNixY0lISAg70h+oiIuIxLm86ApXK/x/tm/fzogRIxgwYADlypVjwYIFHHPMMZhZ2NH+JC7uExcRkcylHXTkUCVWrRB613DY3J3nn3+e2rVrM3z4cD766CMAjj322AJZwEEtcRGRQkFd4bmzcuVKevbsySeffMI555zDe++9R4MGDcKOlS0VcREp0grDVdnqCs+92267jVWrVvHss89yzTXXUKxYfHRUq4iLSJFWGK7KVld4zrk706dP55xzzuG4447j2Wef5fDDD6dy5cphR8sRFXERKfLUFV20rFu3jj59+vDuu+9y9913M3z4cGrUqBF2rEOiIi4ihU5OusjjvRUu0du7dy/Dhw/noYceolSpUowcOZLevXuHHStX4qPTX0QkB3Jytba6oouOgQMHcv/999O+fXvWrFnDbbfdRokS8d2Wje/0IiKZUBe5AGzevJnff/+dU089lb59+9KyZUsuvPDCsGPlGRVxEclTBeFqb3WRy4EDB3jyySe5//77ady4MR9++CHHHHMMxxxzTNjR8pS600UkT+XFwCO5pS7you2TTz6hYcOG9O3bl/PPP5+JEyeGHSlm1BIXKUAKQis2t1JbwerKljC88cYbXHHFFZx44onMmDGDNm3ahB0pptQSFylACkIrNrfUCpb8lpyczMaNGwFo1aoVDz30EKtWrSr0BRzUEhcpcNSKFYne4sWL6dGjB9u2bWP16tWULVuW/v37hx0r36glLiIicWf79u306tWLRo0asXnzZh588EHKlCkTdqx8p5a4iIjElfXr13POOefw888/06dPHwYPHkzFihXDjhUKFXEREYkLO3fupHz58tSoUYOOHTty7bXX0rBhw7BjhUrd6SIiUqDt2rWLu+++m5o1a/LDDz9QrFgxRo8eXeQLOKglLiIiBZS788Ybb3Drrbfy3Xffce2111KqVKmwYxUoKuIiIlLg7N+/n3bt2vHOO+9Qr149pk2bRpMmTcKOVeCoO11ERAqMlJQUAEqVKkWNGjUYOXIkixcvVgHPhIq4iIgUCHPmzKFu3bosX74cgHHjxhWKmcZiSUVcRERC9d1333HVVVfRsmVLUlJS2LNnT9iR4ob+vBGJsZyMh67Zt6SoGT16NPfccw/JyckMHTqUu+66i9KlS4cdK26oiIvEWOp46NEUZ407LkXNtm3baN68OaNHj6ZmzZphx4k7KuIi+UDjoYtEbNu2jbvvvpsOHTrQunVr7rvvPooVK4aZhR0tLqmIixwCdZGL5ExycjLPPvss99xzDzt37qR+/foAFC9ePORk8U0XtokcgpxMGaou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nWksMTGRhx9+mK5du7J27VrOPvvssKNJAZZpS9zdFwIJGayfDcyOZSgRkaJo5MiRVKhQgfnz59O0adOw40gc0LltEZGQ7Nu3j8cff5yrr76a448/nmnTpnHkkUdqpjGJmgbWFREJwQcffEC9evW49957efXVVwE45phjVMAlR1TERUTy0ffff0/nzp256KKLSElJ4d133+W2224LO5bEqUy7083siqze6O7T8z6OiEjhNnjwYN58800eeOAB7r77bsqUKRN2JIljWZ0TvzyL1xxQERcRicKnn35K+fLlOf300xkyZAh9+/bl5JNPDjuWFAJZXZ1+TX4GEREpbH7++Wf69+/PxIkTad++PdOnT6dKlSpUqVIl7GhSSGTVnX5HVm9098fzPo6ISPxLSUnhueeeo1+/fvz222/07duXQYMGhR1LCqGsutPL51sKEZFCZMKECdx88800bdqUcePGcdppp4UdSQqprLrTH8jPICIi8WzHjh1s2LCBBg0a0K1bNypVqkTHjh01TajEVLaDvZhZGeA6oC7w38so3f3aGOYSEYkL7s7LL7/MHXfcQdmyZfnXv/5FmTJl6NSpU9jRpAiIZsS2F4iMn34JMBjoCnwdy1BSOGQ05Sho2lEpPNasWUOvXr2YO3cuSUlJPPXUU5QooYEwJf9EM9jLKe7+D2C3u08GWgONYxtLCoOMphwFTTsqhcPSpUupV68eX331FU899RSff/45SUlJYceSIiaaPxkPBF9/DaYm/RE4OnaRpDDRlKNS2GzatIkTTzyR+vXrc//993P99ddz9NH6L1HCEU0RH29mRwADgZnA4YDulZA/yKjrXN3mUphs3LiRW265hXnz5rF27VqqVq3KvffeG3YsKeKyLeLu/mzwdD5wUmzjSLxK7TpPW7TVbS6Fwb59+3jssccYOnQoxYoV4/7776dy5cphxxIBors6fRjwiLv/GiwfAdzp7gNjnE3ijLrOpbDZtWsXjRo1Ys2aNVx55ZWMHDmSE044IexYIv8VzYVtrVILOIC7bwcujVkiEZGQ7d69G4DDDz+cK664gtmzZ/Paa6+pgEuBE00RL25mpVMXzKwsUDqL7UVE4tLBgwd58sknOeGEE1i6dCkADz74IK1atQo3mEgmormw7SXgQzP7Z7B8DTA5dpGkINO931JYffbZZ/To0YNly5ZxySWXUKGCfp+l4Mu2Je7uw4GhQJ3gMcTdH4l1MCmYdO+3FEa9e/emSZMm/Pzzz7z22mu88847nHSSruOVgi/aoYW+Bg66+wdmdpiZlXf3nbEMJgWXLmCTwsDd/zuu+bHHHstdd93Ffffdx+GHHx5yMpHoZdsSN7MbgNeAZ4JVxwNvxjCTiEhMLVu2jHPPPZe3334bgIEDBzJixAgVcIk70VzY1gs4F/gNwN3/jUZsE5E49Ntvv3HbbbdxxhlnsG7dOvbv3x92JJFciaaI73P3//6mm1kJwGMXSUQk77355pskJCQwatQobrrpJtauXcsVV1wRdiyRXInmnPjHZnYvUNbMLgJ6Am/FNpaISN769ddfOe6445gxYwaNGjUKO45InoimJd4f2AasAG4CZrv7gGh2bmYtzWytma0zs/6ZbNPRzFab2SozmxJ1chGRLOzZs4cBAwbw9NNPA3D11VezcOFCFXApVKK5xSzF3Se4+1Xu3gHYZGbvZ/c+MysOjAVaAYlAFzNLTLdNLeAe4Fx3rwvcdgjfg4jIH7z11lskJiYybNgwVq1aBUCxYsUoXrx4yMlE8lamRdzMzjezf5nZLjN70cxON7NFwEPAU1Hs+yxgnbuvD86pvwy0TbfNDcDYYChX3P2nQ/s2REQi04S2bduWNm3aUK5cOebNm8fo0aPDjiUSM1m1xB8DbgSOInKL2WfAJHc/092nR7Hv44HNaZa/C9aldSpwqpn9n5l9bmYto48uIvJHGzZs4MMPP+SRRx5h6dKlNGvWLOxIIjGV1YVt7u7zgudvmtkWdx8Tg8+vBTQHqgHzzez0tBOuAJjZjUT+oKB69ep5HEFE4tncuXNZunQpd9xxB82bN+fbb7/lyCOPDDuWSL7IqiVeycyuSH0AJdItZ2cLkHbKn2rBurS+A2a6+wF33wD8i0hR/wN3H+/uSe6eVKVKlSg+WkQKux9++IGuXbtywQUXMH78ePbu3QugAi5FSlZF/GPg8jSP+WmeXxbFvr8EaplZTTMrBXQGZqbb5k0irXDMrDKR7vX10ccXkaLm4MGDjBo1ioSEBF5//XXuu+8+lixZQpkyZcKOJpLvMu1Od/drcrNjdz9oZr2BOUBx4Dl3X2Vmg4FF7j4zeO1iM1sNJAN93f2X3HyuiBRumzZtom/fvrRo0YLRo0dTq9afOu9EioxoJ0A5JO4+G5idbt2gNM8duCN4iIhk6JdffuGVV16hR48enHzyySxZsoQ6der8dwITkaIqmsFeRERCkZKSwnPPPUft2rXp06cPa9euBSAxMVEFXAQVcREpoJYtW0bTpk257rrrqFOnDkuWLKF27dphxxIpUKLqTjezBHdfk/o11qFEpGjbt28fl1xyCcnJyUyaNImrr75aLW+RDETbEp+S7quISJ5yd95++22Sk5MpXbo0r7/+OmvXrqVbt24q4CKZyGl3uv4liUieW7t2LRdddBGXX345L7/8MgDnnnuu7vkWyUZMr06X+DZl4bfMWPrH8XlW//AbiVUrhJRICps9e/YwbNgwHnnkEQ477DDGjh1L586dw44lEjdUxCVTM5Zu+VPRTqxagbYN0g+BL3JoOnTowDvvvMPf//53RowYwTHHHBN2JJG4ktMi7jFJIQVWYtUKTLvpnLBjSCGyadMmjjzySMqXL8/AgQPp16+fJioROUTRnhO3dF9FRHJk//79PPzww9SpU4ehQ4cC0KRJExVwkVyItiXeNN1XEZGoffTRR/Ts2ZM1a9bQvn17evXqFXYkkUIhqpa4u+9K+1VEJFojRozg/PPPZ9++fbz99ttMnz5dUwqL5BFd2CYiee7gwYPs2rWLSpUqcfnll7Nz507uueceypYtG3Y0kUJFw66KSJ5auHAhZ511Ftdffz0ACQkJDB48WAVcJAbUEpcM7wcH3RMuOfPLL79w7733MmHCBKpWrUr//v3DjiRS6KklLv+9Hzw93RMu0VqwYAEJCQlMnDiRO+64gzVr1tCxY8ewY4kUemqJC6D7weXQHDx4kBIlSpCQkMDZZ5/Ngw8+SL169cKOJVJkRF3Ezewwd98TyzASexpKVfLCzp07ue+++/j888/55JNPqFy5Mm+99VbYsUSKnGy7082siZmtBtYEy/XNbFzMk0lMZNR1rm5ziZa788orr5CQkMATTzzB6aefzr59+8KOJVJkRdMSHwlcAswEcPdlZvaXmKaSmFLXuRyKrVu38ve//53333+fhg0bMn36dBo3bhx2LJEiLdrBXjanW5UcgywiUoBVqlSJHTt2MGbMGL788ksVcJECIJoivtnMmgBuZiXN7C7g6xjnEpECYNasWTRv3pxdu3ZRunRpPv/8c3r16kXx4sXDjiYiRFfEbwZ6AccDW4AGQM8YZhKRkH377be0b9+eyy67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EZF8oiIex9ydNWvW8PTTT3P99ddTvHjxsCOJiEg+UhGPMzNnzmTOnDmMHTuWU045hY0bN1KqVKmwY4mISAh0TjxObNiwgTZt2tC2bVs+/vhjtm/fDqACLiJShKmIF3D79u1j2LBh1K1bl7lz5/Loo4+yZMkSjjjiiLCjiYhIyNSdXsDt2bOHJ554gtatWzNy5EiqVasWdiQRESkg1BIvgL7//nv69+/PwYMHOeKII1ixYgWvvvqqCriIiPyBingBcvDgQZ544gkSEhJ44oknWLx4MQDHHHNMyMlERKQgUhEvID799FPOPPNMbr/9ds4991xWrVpF48aNw44lIiIFmM6JFwApKSnceOON7Nixg9dff5327dtrtDUREcmWinhIUlJSmDx5MldeeSUVKlRg+vTpHHfccRx++OFhRxMRkTih7vQQLFmyhCZNmnDttdcyadIkAE499VQVcBERyREV8Xy0Y8cObr31VpKSktiwYQPPP/88ffr0CTuWiIjEKXWn56OePXsydepUevbsydChQ6lUqVLYkUREJI6piMfYmjVrKFeuHCeccAKDBw/m9ttvJykpKexYIiJSCKg7PUb27NnDgAEDqFevHvfccw8AJ598sgq4iIjkGbXEY+Ctt96iT58+bNq0iW7duvHII4+EHUlERAohtcTz2Lhx42jTpg2HH344H3/8MZMmTeLoo48OO5aIiBRCaonngX379rF161aqV69O586d2bdvH71796ZkyZJhRxMRkUJMLfFc+uCDD6hXrx7t2rUjJSWFI488kttvv10FXEREYk5F/BB9//33dOnShYsuuojk5GSGDRtGsWI6nCIikn/UnX4IFi1axPnnn8/+/fu5//776devH2XKlAk7loiIFDEq4jnw22+/UaFCBerVq0fXrl258847OeWUU8KOJSIiRZT6f6Pwyy+/cMMNN1C3bl127txJqVKleOqpp1TARUQkVCriWUhJSWHixInUrl2bf/7zn3Tu3FnnvUVEpMBQd3omfv31Vy699FI+++wzzjvvPJ566ilOO+20sGOJiIj8l4p4OikpKRQrVoyKFStSo0YNbrrpJq6++mrMLOxoIiIifxDTvmEza2lma81snZn1z+D10mY2LXh9oZnViGWerLg7L7/8MrVr12bz5s2YGVOmTKFbt24q4CIiUiDFrIibWXFgLNAKSAS6mFli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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Predict probabilities for the test data\n", "probs = value_pipe.predict_proba(X_test)[:, 1]\n", "\n", "# Get the ROC Curve\n", "fpr, tpr, thresholds = roc_curve(y_test, probs)\n", "\n", "# Plot ROC curve\n", "plt.figure(figsize=(8, 5))\n", "plt.plot([0, 1], [0, 1], 'k--')\n", "plt.plot(fpr, tpr)\n", "plt.xlabel('False Positive Rate = 1 - Specificity Score')\n", "plt.ylabel('True Positive Rate = Recall Score')\n", "plt.title('ROC Curve')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "fenotebook", "language": "python", "name": "fenotebook" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "197.6px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }