{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "source": [ "pip install --upgrade scikit-learn" ], "metadata": { "id": "-x8MxrAMbOyM" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "63GSckRspoZJ" }, "source": [ "# Logistic Regression\n", "\n", "In this demo, we will train and test a logistic regression model on a toy classification dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "h9MDqr8IxNuh" }, "source": [ "### 1. Generate dataset\n", "\n", "We can use the [make_classification](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html) function from sklearn to generate the data." ] }, { "cell_type": "code", "metadata": { "id": "MefuasTHjBvI" }, "source": [ "from sklearn.datasets import make_classification\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "X, Y = make_classification(n_samples=1500, \n", " n_features=2, \n", " n_informative=2, \n", " n_redundant=0, \n", " n_classes=2\n", " )" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "source": [ "# 2. Split dataset into train/test sets" ], "metadata": { "id": "sGo3Xru3ct9l" } }, { "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.4)\n" ], "metadata": { "id": "gHey3Ca_ZJym" }, "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "v5_wyZRu6CF_" }, "source": [ "### 3. Define and train a logistic regression model on the train set" ] }, { "cell_type": "code", "metadata": { "id": "34kjAIGf6Ghn", "colab": { "base_uri": "https://localhost:8080/", "height": 93 }, "outputId": "b4c1ac94-31c3-4fd1-d66d-72e58c804459" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "model = LogisticRegression()\n", "model.fit(X_train, Y_train)" ], "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "LogisticRegression()" ], "text/html": [ "
LogisticRegression()
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.
" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "markdown", "metadata": { "id": "oKY3G5F66ci_" }, "source": [ "### 3. Evaluate the trained logistic regression model on the test set" ] }, { "cell_type": "code", "metadata": { "id": "RYHTLYBl6nzI", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "d05c7f91-3730-4b49-816f-f7149202347a" }, "source": [ "Y_pred = model.predict(X_test)\n", "from sklearn.metrics import accuracy_score\n", "\n", "print(accuracy_score(Y_test, Y_pred))" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.965\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Hza4V8n5T88u" }, "source": [ "### 4. Visualize the decision boundary (optional)\n", "\n", "Finally, we plot the data and the decision boundary\n", "\n" ] }, { "cell_type": "code", "source": [ "from sklearn.inspection import DecisionBoundaryDisplay\n", "\n", "DecisionBoundaryDisplay.from_estimator(\n", " model,\n", " X,\n", " cmap = \"coolwarm\",\n", " response_method=\"predict\",\n", " plot_method=\"pcolormesh\",\n", " shading=\"auto\",\n", ")\n", "plt.scatter(X[:, 0], X[:, 1], c=Y)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 302 }, "id": "S7HsSayPbFw4", "outputId": "e7f7aff7-a7c8-40a9-95b3-9408ce8b4d85" }, "execution_count": 6, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] } ] }